Codync
免费开源的 1:1 Grok Bot 与 Muse 替代方案。可在 iPhone、Mac 或 Linux 桌面上将 Claude 代码、Codex、Cursor 以及 40 多个编码代理作为持久机器人使用。支持群组聊天、线程、应用。
AI 翻译
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证a control tower for your Claude agents
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Tower — a control tower for your Claude agents. When you're running many agents across terminal tabs and projects, Tower brings them into one view: what each is doing, which one needs you (blocked, asking, done), and which are colliding on the same repo — so none run off unwatched.
See it running → The site replays the real dashboard, popover and terminal UI.
One line — installs Tower to /Applications, puts the tower command on your
PATH, and starts it:
curl -fsSL https://ghhrmnzdh.github.io/tower/install.sh | sh
No password, no sudo, no Gatekeeper warning, nothing to drag or un-quarantine.
Run the same line again to upgrade. The radar then appears in your menu bar;
type tower for the terminal dashboard.
Tower isn't notarized (that needs a paid Apple Developer account), and macOS
quarantines anything downloaded in a browser — that's what triggers the
"unidentified developer" block. A file fetched with curl is never quarantined,
so macOS never runs that check. Same binary, fewer hoops.
The script is short and does nothing clever:
read it first if you'd rather not
pipe a stranger's shell script into sh — a reasonable instinct.
Prefer to build it? One command, ~20s. Needs Xcode Command Line Tools for
swiftc (xcode-select --install):
git clone https://github.com/ghhrmnzdh/tower && cd tower
./build.sh # → creates Tower.app
Just want the terminal dashboard? It's pure Python, stdlib only — no build,
no app, no swiftc. From a checkout: python3 src/tower-tui.py.
On Ubuntu or Debian? There's a package on every release — daemon, dashboard and the radar for your top bar, all in one:
curl -fLO https://github.com/ghhrmnzdh/tower/releases/latest/download/tower_all.deb
sudo apt install ./tower_all.deb
tower-tray # the radar in your top bar
Ubuntu 22.04 → 26.04, amd64 and arm64. See Linux.
Requires macOS 14+ on Apple Silicon, Python 3.8+, and Claude Code. (Linux and Windows are community editions: Linux has the daemon, dashboard and a top-bar radar, packaged; Windows has the daemon and dashboard as a preview.)
The biggest release yet: a new Mac app, a much lighter one, and Tower beyond the Mac.
tower fills any terminal, from
one card in a narrow pane to four columns on a wide screen, with the same
guard, agents, usage and network as the app..deb, contributed by the
community (PR #2). Windows has the
daemon and the dashboard, as a preview that has not yet run on a real Windows
PC.The last release ran warm after a long day. On one Mac, 15,751 of the 16,036 transcripts it checked every second were its own usage probes. Now Tower only does work for what changed, and draws nothing that nobody can see. Before and after, measured side by side on the same Mac:
| Before | Now | Change | |
|---|---|---|---|
| Daemon CPU | 17.3% | 1.5% | 11.5× less |
| Daemon memory | 156 MB | 28 MB | 5.6× less |
| App CPU, over a long session | 36–40% | ~8% | ~5× less |
| App CPU, popover closed | ~21% | ~0% | idle |
Process scan (libproc, was ps) | ~35 ms | ~1 ms | 35× faster |
| Usage index refresh | ~500 ms | ~11 ms | 45× faster |
| Agent status | guessed from transcripts | ~70 ms, via hooks | event-driven |
How:
kqueue watches for
commands, libproc replaces ps, and state.json is written only when
something changed.The local cost estimate also stopped double-counting. Claude Code repeats a message's usage on every content block, so each message is now counted once.
One daemon, four jobs:
claude -p /usage)
plus a clearly-labeled local token/cost estimate.One daemon, one source of truth, and a front-end for wherever you are:
Tower.app — a native menu-bar app with a full dashboard window
(Swift/AppKit + SwiftUI, macOS 14+). No dock icon, no browser, no terminal
required.curses TUI with mouse support that fills
any terminal, for when you live in the shell. Runs on macOS, Linux and Windows.tower-tray, the Linux counterpart of the menu-bar
app (community edition).Both read the same ~/.tower/state.json and drive the daemon through the
same command files, so you can use either (or both) interchangeably. Either
front-end starts the background daemon automatically if it isn't running, and
from the popover, Terminal Dashboard… opens the TUI for you.
Tower is the app formerly known as Geo Guard (then Corral), grown up. Your
~/.corralor~/.geo-guardstate migrates automatically on first launch.
Tower's identity is a radar on a control tower — its five states are the guard (cleared, verifying, held on the connection, held off-country, or unguarded). The menu bar is that radar; it animates only while a state has something to say. Alongside it, one still mark per Claude model:
| Model | Mark |
|---|---|
| Fable | a gold spiral |
| Opus | three orbiting rings + core, rosso |
| Sonnet | a single steel S stroke |
| Haiku | three crayon ticks + core |
See docs/DESIGN.md for the whole design system, or open Tower Identity Study.html to watch the marks live.
| Doc | What it covers |
|---|---|
| docs/ARCHITECTURE.md | The daemon, IPC, routing, the fail-closed gate, net probes, agent monitoring |
| docs/DESIGN.md | The design system — the radar, model marks, attention semantics, motion tokens |
| docs/APP.md | The macOS menubar app — build, popover, dashboard, notifications |
| docs/TUI.md | The terminal dashboard — cards, actions menu, mouse |
| windows_plan.md | The Windows port — what already runs, and the plan for the native tray |
| CLAUDE.md | Quick orientation + invariants for contributors |
The radar's state is the guard (full color — amber for a hold, red for unguarded):
| Radar | Meaning |
|---|---|
| clear — calm ring + blips | Guarding · in-country and a path to Anthropic is open |
| verify — a rotating sweep | Confirming your location; held until sure |
| 🟠 holdNet — amber dashed ring + pings | No usable path (offline / captive / API) — held pending |
| 🟠 holdGeo — amber ring + fence + off-country blip | Wrong country / VPN — held, not failed |
| 🔴 off — red dashed ring, hollow core | Routing off — Claude connects directly, unguarded |
Badge: needs-you count (red if something failed) · optional usage %.
Per agent: project, model (its mark), live activity (editing src/Model.swift), status, a n ✓ completed-tools momentum counter, age, and
whether that agent is actually behind the guard (a chat started before you
turned Tower on is still on a direct connection until you restart it).
Plus: same-repo collision banners (escalating when two agents edit the same
file), a "while you were away" event history in the dashboard, and macOS
notifications when an agent flips to blocked / asking / failed / done.
Statuses are derived read-only from Claude Code's own session transcripts —
Tower never writes into ~/.claude and never injects input. The
"waiting for approval" state is an honest heuristic (a pending tool call with
a stalled transcript can also be a slow tool).
The guard is fail-closed. A Claude request proceeds only when Tower can affirmatively confirm two things at once: you are inside the target country, and the network has a usable path to Anthropic. Anything uncertain — the location still checking, cached, or errored; the net offline, captive, or unable to reach Anthropic's edge — is held. There is no allow-through fallback.
A held request is PENDING, not FAILED. Tower holds it for a few seconds
(so a sub-second blip clears with no visible retry), then answers 503 + Retry-After. Claude Code turns a 503 into its own native "Retrying · attempt
x/y" spinner, so the turn survives and resumes by itself the moment the guard
clears. (Tower never returns 403 — Claude reads that as broken auth and kills
the turn.)
CONNECT, so it sees each request's hostname
(enough to allow or hold) but never decrypts your traffic.anthropic, claude.ai, or claude.com is treated as a
Claude Code request.| Situation | Claude Code | Other traffic |
|---|---|---|
| Confirmed inside target country, path to Anthropic open | ✅ allowed | ✅ allowed |
| Confirmed outside target country | ⏸ held (503-pending) | ✅ allowed (⏸ with Block ALL) |
| Location unknown / unconfirmed / stale | ⏸ held (fail-closed) | ✅ allowed |
| No usable path (offline, captive portal, edge unreachable) | ⏸ held | ✅ allowed |
| Live Claude tunnels being reset upstream | ⏸ held | ✅ allowed |
| Slow but reachable connection | ✅ allowed | ✅ allowed |
| Routing or enforcement off | ✅ allowed (unguarded) | ✅ allowed |
Limitation: this is a proxy, not an OS-level kill switch. It guards Claude Code because Claude Code obeys the proxy env. A program told to ignore the proxy could still reach the network.
Tower is careful never to leave Claude Code in a broken state:
settings.json when the proxy is actually accepting connections, and only
ever as env keys — never a shell alias.settings.json first, so Claude goes back to a direct
connection.settings.json to settings.json.tower.bak before its
first edit.claude -p /usage runs
sandboxed.Requires Xcode Command Line Tools (swiftc) to build the app, and
Python 3.8+ at runtime.
./build.sh # compiles src/*.swift → Tower.app (~20s)
tower/
├── Tower.app/ # built product (regenerate with build.sh)
├── Tower (Terminal).command # double-click → terminal dashboard
├── Tower Identity Study.html # the radar + model marks, live
├── build.sh # assembles the .app from src/
├── release.sh # builds, packages and publishes a release
├── site/ # the landing page + install.sh (→ gh-pages)
├── packaging/deb/ # the Debian/Ubuntu package (build.sh, unit, docs)
├── docs/ # ARCHITECTURE, DESIGN, APP, TUI, LINUX
├── windows_plan.md # plan to port this to Windows
└── src/
├── towerd.py # the daemon (proxy + geo + usage + net + agents + IPC)
├── *.swift # native menubar app (AppKit + SwiftUI); Glyph.swift = the marks
├── tower-tui.py # terminal dashboard (curses)
├── tower-tray.py # Linux top-bar radar (GTK3 + AppIndicator)
├── _linux.py # the Linux edges (systemd-inhibit, /proc)
├── _win.py, _wincurses.py # the Windows edges (mutex, keep-awake, curses shim)
├── Info.plist
└── AppIcon.icns
┌───────────────────────┐
writes ───▶ │ ~/.tower/state.json │ ◀── reads (menubar + TUI, 1×/s)
└───────────────────────┘
towerd.py src/*.swift / tower-tui.py
┌───────────────────────┐
reads ◀──── │ ~/.tower/cmd/*.json │ ◀── writes commands (route, focus…)
└───────────────────────┘
The daemon is stdlib-only and holds all logic and state. The front-ends are thin: read one JSON file, write command files. That's what keeps the codebase small and the Windows port straightforward.
.deb; see
Linux below.PATH (macOS ships one; Homebrew or python.org also fine).xcode-select --install).No root, no daemons installed system-wide, and no password for anything — keep-awake's lid-closed mode included. Nothing leaves your machine but the public-IP country lookup and the network probes.
All three parts run on Linux, packaged: the daemon, the terminal dashboard, and the radar in your top bar — the Linux counterpart of the macOS menu-bar app. It is a community edition: the package is installed and run in CI on every release, but it gets far fewer hands on real desktops than the Mac app does, so issues and fixes from Linux users are what keep it honest.
curl -fLO https://github.com/ghhrmnzdh/tower/releases/latest/download/tower_all.deb
sudo apt install ./tower_all.deb
tower-tray # the radar in your top bar
tower # the terminal dashboard
systemctl --user enable --now tower-tray # the radar there from login
tower_all.deb carries no version in its name on purpose, so that URL is
always the newest one — the same reason Tower.app.zip doesn't either. CI
builds it from the tag and attaches it to the release, after running the
install/run/remove matrix below against it.
One package, everything in it. Either front-end starts the daemon on demand.
Requirements. Depends is only python3 (>= 3.9) and procps — both on a
stock Ubuntu, and procps just for the ps table the agent monitor reads.
Everything the top bar needs is a Recommends (python3-gi,
python3-gi-cairo, gir1.2-gtk-3.0, gir1.2-ayatanaappindicator3-0.1), so
apt pulls it by default on a desktop while --no-install-recommends still arms
the guard on a headless build box without dragging GTK onto a server. tmux
(to raise an agent's tab) and systemd (the user units) are Recommends too;
gnome-shell-extension-appindicator is a Suggests, since as a Recommends it
would pull all of GNOME Shell. Without the GTK set, tower-tray exits with one
line naming those four packages. No root at runtime, no pip, no PPA, no
third-party Python — and Claude Code itself is the one thing apt cannot install
for you. Full table: docs/LINUX.md.
Ubuntu 22.04, 24.04 and 26.04 are tested in CI — install without
recommends, run, un-route on SIGTERM, remove; plus both halves of that
bargain: with no toolkit tower-tray names the packages it wants, and with the
toolkit added its typelibs really import and it exits for the honest reason (no
session). All on each release's own Python. Architecture: all: nothing is
compiled, so one build covers amd64 and arm64.
The top bar is a StatusNotifierItem, which KDE, XFCE, Cinnamon and Budgie show
natively. GNOME shows one only through its shipped appindicator extension —
Ubuntu's session enables it by default; if the radar doesn't appear, sudo apt install gnome-shell-extension-appindicator.
Installing starts nothing on purpose — the daemon opens a proxy and edits
~/.claude/settings.json, so switching it on stays your call. "On by default"
still holds where it counts: opening either front-end starts the daemon.
Stopping it (systemctl --user stop tower, Q in the dashboard, Quit
Tower in the menu — the last two confirmed twice) un-routes Claude Code
before the daemon exits; chats already pinned to the proxy keep working
through a lingering relay, unguarded, until Tower is reopened. Upgrading the
package leaves a running guard alone.
Build it from a checkout — the only build dependency is dpkg itself:
packaging/deb/build.sh # → dist/tower_<version>_all.deb
packaging/deb/build.sh --install
The top-bar radar is src/tower-tray.py — GTK3 through
the distro's own python3-gi, with the mark itself a Cairo port of
drawRadar() in src/Glyph.swift, so it is the same five
states and the same keep-awake lamp, not a lookalike. Reduce Motion (the
desktop's own setting) freezes each state at its legible still frame, and the
two dangerous switch-offs are confirmed twice with the agent counts quoted,
exactly as in the app.
Three OS edges differ from macOS, in src/_linux.py:
keep-awake is systemd-inhibit (idle, sleep and the lid, no password, and
released even if the daemon is killed), and reading a process's cwd and
focusing a tab go through /proc and tmux instead of libproc and
osascript.
There is no TCC on Linux either, so the agent monitor reads git roots and
branches for agents working anywhere. Everything else — the proxy, the
fail-closed gate, geolocation, the network probe, /usage, the transcript
index — is the same shared daemon.
Details, including where Claude Code has to be findable from a systemd user unit: docs/LINUX.md.
The daemon and the terminal dashboard run on Windows 10/11 today — the same
guard, the same fail-closed proxy, the same live state, still dependency-free.
Routing ported for free: Claude Code reads the same settings.json on every
platform. What's missing is the native tray app (the menubar app is Swift,
macOS-only), so on Windows the TUI is the front-end.
There's no build step — grab the source and run:
python src\tower-tui.py
or double-click Tower (Terminal).cmd, which finds Python for you.
⚠️ Community preview — please read. The Windows port is written and reviewed, but it has never been run on real Windows hardware. Expect rough edges, and please open an issue with what you hit — that feedback is exactly what promotes it out of preview. Nothing here weakens the guard: the fail-closed rule is in the shared daemon, and the Windows-only shims (single-instance mutex, process enumeration) are written to fail closed too.
Under the hood, only the OS-specific edges differ — src/_win.py
(named-mutex single instance, SetThreadExecutionState keep-awake,
Win32_Process agent scan, console VT/UTF-8) and
src/_wincurses.py (a drop-in curses subset over ANSI +
msvcrt). towerd.py itself stays one portable file behind an IS_WINDOWS
flag. The plan for the native tray is windows_plan.md.
Q in
the terminal.~/.tower/, and if env.HTTPS_PROXY still
points at 127.0.0.1 in ~/.claude/settings.json, remove it (or restore
~/.claude/settings.json.tower.bak).Tower.app (and the tower symlink the installer
put on your PATH). Nothing else is left behind.~/.tower/.tui_seen.Open source. Use it, fork it, port it. It has been: on
Linux the daemon, the dashboard and
the top-bar radar are packaged for Debian/Ubuntu as a community edition; on
Windows the daemon and dashboard are a
community preview, and the native tray is still missing —
windows_plan.md covers what that takes.