AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證iOS and iPadOS terminal for driving AI coding agents from your phone: SSH, a tmux session per agent, and push alerts when an agent finishes or needs input.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
An iOS/iPadOS terminal built for driving AI coding agents (Claude Code, Codex,
aider, etc.) from your phone. SSH transport, tmux-per-session, a
push-notification relay so you get an APNs alert the moment your agent finishes
a task or needs input, and an optional agent mode: a chat with an orchestrator
that runs subagents in Podman on one of your own machines.
Swift Package Manager multi-module, assembled into a single iOS target:檢視完整 README ↗An iOS/iPadOS terminal built for driving AI coding agents (Claude Code, Codex, aider, etc.) from your phone. SSH transport, tmux-per-session, a push-notification relay so you get an APNs alert the moment your agent finishes a task or needs input, and an optional agent mode: a chat with an orchestrator that runs subagents in Podman on one of your own machines.
Swift Package Manager multi-module, assembled into a single iOS target:
RemoteHost, Identity, Session, PushSubscription, agent mode types).Services.swift (HostRepository, SessionManaging, PushServicing, …) with AppServices.live wiring the real stores.Features/Servers, Terminal, Agents, Notifications, General) is an AppFeature that contributes home sections and Settings entries; FeatureSet.live lists them, so a feature is added or removed in one place. Views read services from the environment, never from singletons directly.Two Go services live under server/:
server/sshido-relay/ forwards JSON POSTs from your machines to APNs. Markdown in a message is turned into plain text before it reaches the lock screen.server/sshido-agents/ is the agent mode daemon and agent image, run in Podman on your host.┌────────────────┐ hook ┌──────────────┐ APNs ┌────────┐
│ Claude Code │ ────────► │ sshido-relay │ ───────► │ iPhone │
│ on remote host │ (POST) │ (Cloud Run) │ │ │
└────────────────┘ └──────────────┘ └────────┘
The whole flow is driven from the iPhone app and a prompt you paste into your agent. Users do not clone this repo or run an installer — the agent sets itself up on the remote host.
Open sshido → Settings › Notifications and tap the send button.
The App Store build always uses the hosted relay at https://push.sshido.com
(free, runs on Cloud Run), and the address can't be changed there. A build you
sign yourself can point at a relay you run — see
Running your own relay below.
After subscribing, the app holds a Notify URL (e.g.
https://push.sshido.com/n/<capability-token>). That URL is your personal push
endpoint — treat it like a secret.
SSH into your remote host from the sshido app, launch Claude Code, then:
The agent creates ~/.sshido/notify.url, writes ~/.claude/hooks/notify.sh,
merges three hooks (Notification, Stop, StopFailure) into
~/.claude/settings.json, and runs a verification curl. Expect HTTP 204 and
a test push on your phone when it finishes.
Every hook is gated on $SSHIDO_SESSION, which sshido exports in the shells
it opens. So pushes only fire from sessions launched through the iOS app —
never from local terminal work on the same host.
The exact prompt text lives in PushSetupPrompt
(Sources/AppUI/Features/Notifications/NotificationsFeature.swift) if you want
to audit what your agent will do before pasting. The same steps are in the app
under Settings › Notifications › How push works.
Start working. When Claude Code needs input or finishes, you get a push.
If nothing arrives after a real task:
~/.sshido/notify.url on the remote host matches your Notify URL,curl -fsS -X POST -H 'content-type: application/json' -d '{"title":"x","body":"y"}' "$(cat ~/.sshido/notify.url)" and expect HTTP 204,The relay's source is public at server/sshido-relay/,
so you can check what push.sshido.com does with your data: it keeps a random
subscriber ID, your APNs device token, a notification count and a mute flag.
Alert titles and text pass through to Apple's push service and are not stored.
Public status: status.sshido.com (uptime probe
against push.sshido.com/health).
push.sshido.com is a single Cloud Run service built from
server/sshido-relay/. Apple only accepts pushes for an app signed with the
key of the team that ships it, so a relay you run yourself can reach your
own build of sshido, not the App Store build, which is locked to
push.sshido.com. To run your own you need:
.p8 key,XcodeProject/Signing.local.xcconfig),sqlite storage) or a GCP project (firestore on Cloud Run).Full walkthrough and the deploy script:
server/sshido-relay/README.md.
Short version on Cloud Run:
cd server/sshido-relay
GCP_PROJECT=your-project \
APNS_KEY_ID=XXXXXXXXXX \
APNS_TEAM_ID=XXXXXXXXXX \
APNS_PRODUCTION=true \
./deploy-cloud-run.sh
Use the resulting URL as the push server in Settings › Notifications of your build.
Agent mode turns one of your SSH hosts into a place where coding agents run. You chat with an orchestrator; it works out what you need, starts subagents when that helps, checks their evidence and gives each a pass or fail verdict. Every agent has its own Podman container with a shell, the internet, a browser and a virtual desktop you can watch from the phone. sshido never pays for or proxies a model: frontier harnesses (Claude Code, Codex, Gemini CLI, Grok) use your own logins, and local models use your own OpenAI-compatible endpoint.
Install Podman on the host (brew install podman && podman machine init --memory 8192 && podman machine start on a Mac).
Build the two images:
cd server/sshido-agents
podman build -f images/daemon/Containerfile -t localhost/sshido-agents:latest .
podman build -f images/agent/Containerfile -t localhost/sshido-agent:latest .
In the app, open Settings › Agents, turn agents on, pick the host and tap the box button under Host.
Choose frontier or local models for the orchestrator and subagents, and sign in to the frontier harnesses you picked.
The app walks through the same steps under Settings › Set up a host.
Details, environment variables and tests:
server/sshido-agents/README.md and
ADR 0008.
make generate # regenerate Xcode project from XcodeProject/project.yml
open XcodeProject/sshido.xcodeproj
The app target pulls source from Sources/{Models,Core,UI,AppUI}/. The Go
services in server/ are built separately and are not linked into the app.
UI animations are Lottie files generated by scripts/make_animations.py into
Sources/AppUI/Resources/Animations/; rerun it after editing an animation.
App Store screenshots are captured by the screenshots scheme
(ScreenshotTests/).
Built-in mascot sprite GIFs are not committed to this repo (their itch.io
licenses don't permit redistribution). The app builds and runs without
them; if you want mascots in your local build, see docs/sprites.md.