Codync
免費、開源的 1:1 替代方案,取代 Grok Bot 與 Muse。從 iPhone、Mac 或 Linux 桌面將 Claude Code、Codex、Cursor 與 40+ 程式碼代理人作為持續機器人傳訊。群組聊天、主題串…
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Github Workspace for your repos!
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Your GitHub pull requests, sorted by what actually needs you.
GitHub tells you a pull request exists. It does not tell you which ones are yours to move. ghspace sorts everything you can see into buckets that answer one question: what should I do next?
Plus a browse view over every open pull request you can see, filterable by repository, author, involvement, draft status and title.
📖 Full architecture documentation: bun run dev:docs → http://localhost:3001
The badge above is a snapshot, regenerated by bun run badge — it is not live.
Code health explains what the two
analysers check and what they deliberately do not, and the docs site serves an
interactive map of the module graph at /fallow-map.html.
MVP 1 of a wider GitHub workspace. Pull requests only; Actions and repository views come later.
Three decisions shape everything else.
Postgres is the cache-of-record. Page renders read only from the database, never from GitHub. An outage or a rate limit degrades the dashboard to slightly stale data with a visible "synced 4m ago" marker, instead of an error page.
The GitHub App is the query point. Pull requests are fetched per installation, not per user — one sync of an organisation serves every ghspace user in it, runs with nobody signed in, and spends a rate limit budget dedicated to that installation. Users then filter the cached data, which is a database query rather than another API call.
Involvement is derived, not asked for. Because the sync fetches repositories whole, "which PRs involve me" is computed locally from who opened it, who is assigned, whose review is pending, and who has reviewed.
apps/web Next.js — sign-in, triage view, browse view (reads Postgres only)
apps/worker Bun — background sync loop, token refresh
apps/docs Next.js + fumadocs — architecture documentation
packages/core schema, GitHub clients, sync logic, triage rules, read queries
The worker is a separate process rather than a cron route so that self-hosting
is docker compose up with web + worker + postgres, and so nothing about the
deployment target leaks into the sync logic.
A GitHub App only sees accounts where it is installed — user access tokens included:
"The app can only access resources in an account where it is installed. If your app is only installed on a user's personal account, it cannot access resources in an organization that the user is a member of unless the app is also installed on that organization."
So installing ghspace on the organisations you work in is what makes their pull requests exist as far as ghspace is concerned. The dashboard shows its own coverage for exactly this reason.
The app uses two tokens for two jobs:
| Installation token | User token | |
|---|---|---|
| Acts as | the app itself | the signed-in user |
| Sees | everything the installation granted | installation ∩ that user's own access |
| Rate limit | 5,000/hr dedicated, scaling to 12,500 | 5,000/hr shared across all apps for that user |
| Used for | fetching pull requests | identity, and the access allowlist |
[!IMPORTANT] An installation token can read every repository in the installation. The
user_repository_accesstable is the only thing that knows which of them a given user is entitled to, and every read path returning pull requests must filter through it. See the Access model page in the docs.
1. Create a GitHub App at https://github.com/settings/apps/new:
http://localhost:3000/api/auth/callback.pemThen install it — on your own account, and on every organisation whose pull requests you want to see.
2. Configure:
cp .env.example .env
openssl rand -base64 32 # -> ENCRYPTION_KEY
openssl rand -base64 32 # -> SESSION_SECRET
base64 -i your-app.private-key.pem | tr -d '\n' # -> GH_APP_PRIVATE_KEY
# then fill in GH_APP_SLUG / GH_APP_ID / GH_APP_CLIENT_ID / GH_APP_CLIENT_SECRET
3. Run:
bun install
bun run db:up # Postgres via docker or podman
bun run db:migrate
bun run dev:web # http://localhost:3000
bun run dev:worker # second terminal
bun run dev:docs # http://localhost:3001 — architecture docs
Sign in, then either wait for the worker's first cycle or hit Refresh.
To sync once without the worker running:
cd apps/worker
bun run sync # every user's access, then every installation
bun run sync <login> # one user's access, then every installation
Three moving parts — web app, worker, Postgres — and every deployment is a different answer to where each runs.
Self-hosted, the whole stack on your own hardware:
cp .env.example .env # fill in the GitHub App values, generate the secrets
docker compose up # postgres + migrations + web on :3000 + worker
Zero cost: Vercel Hobby for the web app, Supabase free for Postgres, and
.github/workflows/sync.yml — a scheduled GitHub Action — in place of the
worker. Set DATABASE_POOL_MAX=1 and use the transaction-mode pooler on
serverless, where every function instance opens its own pool.
[!IMPORTANT] These stay interchangeable only because ghspace uses the Postgres connection string and nothing else. No
@supabase/supabase-js, no Supabase Auth, and above all no Row Level Security — RLS would mean rewriting the access boundary as provider-specific SQL policies and would end self-hostability. See the Portability page in the docs.
Switching between them is one line of .env.
| Command | Does |
|---|---|
bun run dev:web / dev:worker / dev:docs | run one process |
bun run db:up / db:down / db:reset | local Postgres lifecycle |
bun run db:generate | generate a migration after a schema change |
bun run db:migrate | apply migrations |
bun run typecheck | typecheck every workspace |
cd packages/core && bun test | run tests |
docker compose up | the whole stack, as a self-host install would run it |
Two signals are lost compared to a per-user involves:@me search, because
GitHub only exposes them through search qualifiers:
searchPullRequests() is kept as the recovery path for both. See the Sync
pipeline page in the docs.
Webhooks for near-realtime updates, GitHub Actions and repository views, multi-user onboarding, and Enterprise packaging.