{"id":51203594,"url":"https://github.com/stackoverprof/runway","last_synced_at":"2026-06-28T02:01:36.963Z","repository":{"id":367433479,"uuid":"1280746626","full_name":"stackoverprof/runway","owner":"stackoverprof","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-26T01:34:04.000Z","size":15,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-26T02:16:16.819Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stackoverprof.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-25T22:41:49.000Z","updated_at":"2026-06-26T01:34:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/stackoverprof/runway","commit_stats":null,"previous_names":["stackoverprof/runway"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/stackoverprof/runway","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stackoverprof%2Frunway","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stackoverprof%2Frunway/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stackoverprof%2Frunway/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stackoverprof%2Frunway/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stackoverprof","download_url":"https://codeload.github.com/stackoverprof/runway/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stackoverprof%2Frunway/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34874557,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-28T02:00:05.809Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-28T02:01:36.426Z","updated_at":"2026-06-28T02:01:36.956Z","avatar_url":"https://github.com/stackoverprof.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Runway\n\nA native macOS cockpit for running a fleet of coding agents next to a live\nGitHub activity feed for your team's repo. Built in SwiftUI (macOS 14+, Swift 6).\n\n```\n┌─────────────────────────┬──────────────────────────────────┐\n│  Activity        [repo▾]│  ┌────────────────────────────┐  │\n│  RECENTLY IN THE OFFICE │  │ ● agent1                ✎  │  │\n│   ● alice    active now │  │  …live terminal…           │  │\n│   ● bob      idle 4h    │  └────────────────────────────┘  │\n│                         │  ┌────────────────────────────┐  │\n│  ● pushed  feature/…    │  │ ● agent2                ✎  │  │\n│  ● opened PR #1234 …    │  │  …live terminal…           │  │\n│  ● merged  #1230 → main │  └────────────────────────────┘  │\n│  …                      │              [ + ]               │\n└─────────────────────────┴──────────────────────────────────┘\n   GitHub activity feed         Agent terminal cards\n```\n\n## The features and panes\n\n### Left — GitHub activity feed\n\nA custom feed for one repo, polled every 45s through your own `gh` CLI (no PAT,\nno token setup — it reuses your existing `gh auth`).\n\n- **Presence** (\"RECENTLY IN THE OFFICE\") — teammates active in the last ~6h,\n  each shown as *active now* / *🔥 on a roll* / *idle Nh*, with real GitHub\n  avatars.\n- **Timeline** of pushes, PRs (opened / merged), branch creates, reviews, and\n  issue open/close — color-coded by intent: **green** = creation,\n  **blue** = push / progress, **purple** = closure / merge.\n- **PR Merged Styling** — branch merge events get a customized deep-purple card theme (`#0a051a`), a subtle top-to-bottom glow gradient, and a decorative background pattern of scaled merge vector paths.\n- **Searchable repo switcher** in the header, **overscroll-to-refresh**, and\n  **load skeletons** so the pane never jumps from empty to full.\n\n\u003e Note: the feed reads GitHub's *events* API, which lags by a minute or two and\n\u003e only covers recent activity (roughly the last 300 events / 90 days). So\n\u003e presence is a good \"who's around\" signal, not real-time precision, and very\n\u003e quiet collaborators may not appear.\n\n### Right — agent terminal cards\n\nA scrollable column of resizable cards, each a real GPU terminal\n([libghostty](https://github.com/ghostty-org/ghostty) via GhosttyKit) — run\nClaude Code, Codex, or any shell, one agent per card.\n\n- Add / close / rename / describe cards (or let the running agent label\n  itself — see below); focus glow on the active one.\n- **Accordion** and **solo** layouts; drag the bottom edge to resize; drag a\n  file in to drop its path.\n- A persistent **quick terminal** overlay (⌘⌥Q) that keeps running in the\n  background.\n- Layout (cards, names, sizes, mode) **persists** across relaunches.\n\n### Global settings \u0026 profiles pane (⌘,)\n\nA dedicated preferences window offering two main areas of configuration:\n- **General Settings**: Customize alert sounds (e.g. Glass, Ping, Submarine), toggle sound effects, enable/disable native macOS notifications, and manage autostart command preferences (select from pre-set CLI configurations like Claude, Gemini, Cursor, Copilot, etc.).\n- **People Profiles**: Manage profiles of teammates who appear in the office presence list. Assign custom display names and upload custom profile photos to personalize your timeline feed.\n\n### Native macOS notifications\n\nReplaced in-app toast overlays with native macOS Notification Center integrations (`UNUserNotificationCenter`). Receive time-sensitive notifications (e.g. offline alerts, agent attention status) with customizable system sound alerts.\n\n### Agent status \u0026 self-labeling\n\nEvery card exposes a control channel at `$RUNWAY_CONTROL` (a file path unique to\nthat card, set in its shell environment). **Anything running inside a card can\nupdate that card live** by writing JSON to it — so a session can proactively\npresent itself however it likes:\n\n```sh\n# A running agent renaming + describing its own card to reflect current work:\necho '{\"name\":\"refactor-auth\",\"description\":\"running the test suite\"}' \u003e \"$RUNWAY_CONTROL\"\n\n# State drives the header dot:\necho '{\"state\":\"running\"}' \u003e \"$RUNWAY_CONTROL\"\n```\n\n- `name` / `description` — the card header text (each capped at 40 chars). A\n  session can rename itself as it moves between tasks, so you can tell your\n  agents apart at a glance instead of staring at four identical `agentN` boxes.\n- `state` — the header dot: `idle`, `running`, or `needs-action`.\n\nFor **Claude Code**, `state` is reported automatically with zero setup: Runway\npoints each card's shell at a private `ZDOTDIR` that sources your real zsh config\nand wraps `claude` to inject state-reporting hooks. Your `~/.claude` and\n`~/.zshrc` are never modified. (You can have the agent set its own `name` /\n`description` the same way — just ask it to write to `$RUNWAY_CONTROL`.)\n\n## Keyboard\n\n| Shortcut | Action |\n| --- | --- |\n| `⌘N` / `⌘W` | new card / close focused card |\n| `⌘⌥↑` / `⌘⌥↓` | move focus between cards |\n| `⌘⌥⇧↑` / `⌘⌥⇧↓` | reorder the focused card |\n| `⌘1`–`⌘9` | jump to a card |\n| `⌘⌥A` | accordion layout |\n| `⌘⌥⏎` | solo / zoom the focused card |\n| `⌘⌥Q` | toggle the quick terminal |\n| `⌘,` | open settings \u0026 profiles window |\n| `⌘` + scroll | scroll the card list (it's otherwise locked) |\n\n## Install\n\nGrab the latest [**release**](https://github.com/stackoverprof/runway/releases/latest)\n(`Runway-v…-arm64.zip`), then:\n\n1. Unzip and move `Runway.app` to `/Applications`.\n2. The app is ad-hoc signed, so macOS flags it as \"damaged\"/unverified on first\n   launch. Clear the download quarantine once, then open it normally:\n   ```sh\n   xattr -dr com.apple.quarantine /Applications/Runway.app\n   ```\n\n**Requirements:** an Apple Silicon Mac (the build is arm64-only) and the\n[`gh`](https://cli.github.com) CLI authenticated (`brew install gh \u0026\u0026 gh auth login`),\nwhich the activity feed shells out to.\n\n## Build \u0026 run\n\nThis machine targets the Command Line Tools toolchain, so Runway builds as a\nSwift Package — no Xcode project required.\n\n```sh\n./run.sh                 # quick: swift run, launches the window\n./build-app.sh           # assemble a self-contained dist/Runway.app\nopen dist/Runway.app\n./watch.sh               # rebuild + relaunch on every save (~3s; state resets)\n```\n\n`build-app.sh` bundles the libghostty framework into the `.app` and re-signs it\nad-hoc, so the bundle runs standalone (without the `.build` directory).\n\nOnce full Xcode is installed, `open Package.swift` works too.\n\n**Requirements:** macOS 14+, the [`gh`](https://cli.github.com) CLI authenticated\n(`gh auth login`) for the activity feed.\n\n## Project layout\n\n```\nSources/Runway/\n  RunwayApp.swift        App entry, split layout, right pane, window + key monitors\n  LeftPane.swift         Activity feed UI: header, presence, timeline, skeletons\n  GitHubFeed.swift       Data layer — polls the `gh` CLI, parses events \u0026 presence\n  Workspace.swift        App state: cards, focus, accordion/solo, persistence\n  AgentControl.swift     Agent status channel + zero-setup Claude Code hooks\n  QuickTerminal.swift    The ⌘⌥Q background terminal overlay\n  TerminalSurface.swift  Swappable terminal protocol + the GhosttyKit backing\n  TerminalTheme.swift    Terminal theme/colors applied to every surface\n  InlineField.swift      Inline-editable name/description fields\n  Settings.swift         Preferences UI: General controls \u0026 People profiles editor\n  Toast.swift            Native macOS notifications dispatch center\n```\n\nGhosttyKit is pinned to a specific commit in `Package.swift` — libghostty's C\nAPI is still alpha, so we deliberately avoid tracking a moving branch.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstackoverprof%2Frunway","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstackoverprof%2Frunway","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstackoverprof%2Frunway/lists"}