Your coding agents, your repos, your machine β in a browser tab you can open from anywhere.
Ralphy is one small binary that turns the computer where your code lives into a workspace you can reach from any other screen. It runs a resident daemon on your box and serves a workbench: projects, a file explorer with a real editor, your git changes, your issue board, live runs, spend β and real agent terminals (Claude, Codex, OpenCode, Copilot, Cursor, Gemini, Kimi) side by side in one tab.
The terminals belong to the daemon, not to the browser. Close the laptop, pick up the tablet, open the same URL: the sessions are still running, with their scrollback, and your window layout comes back with them.
And when you're done for the day, the same binary can work your backlog while you sleep.
π your machine π any screen you happen to have
βββββββββββββββββββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ
β ralphy daemon β β desktop β β notebook β β tablet β
β Β· your repos β ββββββΆ β β β β β / phone β
β Β· your agent sessions β ββββββββββββ ββββββββββββ ββββββββββββ
β Β· your gh login β one workbench, same sessions,
βββββββββββββββββββββββββββββ same layout, no upload
Three things worth knowing up front:
- π No cloud of ours. The daemon runs on your box, binds to loopback by default, and
reads the same repos and the same
ghlogin you already use. Your code goes only to the agent you chose, and issue data only to GitHub. - π³ No API key, no per-token bill. Ralphy drives the agent CLIs you're already signed into, on the subscription you already pay for.
- π» Windows, Linux, and macOS, one binary, no runtime to install.
One line installs it for your user. On Linux and macOS:
curl -fsSL https://raw.githubusercontent.com/paulocorcino/ralphy/main/assets/install/install.sh | shOn Windows, in PowerShell:
irm https://raw.githubusercontent.com/paulocorcino/ralphy/main/assets/install/install.ps1 | iexThe script downloads the newest release for your computer, checks its SHA-256, puts
ralphy on your PATH, and ends with ralphy doctor. It needs no root and no
administrator, and asks before it goes on as either. To also start the daemon at sign-in,
end the Linux and macOS line with | RALPHY_DAEMON=1 sh, or on Windows run
$env:RALPHY_DAEMON = '1' first. To read the script before it runs, download it, read it,
then run the file. Run it again to repair an install.
Prefer to do it by hand? Grab the archive for your platform from the
Releases page β Windows, Linux
(x64 and ARM64), or macOS (Intel & Apple Silicon) β unzip it anywhere, then let it put
itself on your PATH:
./ralphy installIt links ralphy into ~/.cargo/bin when you have one, otherwise ~/.local/bin. When that
folder is not on your PATH, it adds it: to your shell start-up files on Linux and macOS, or
to your user Path on Windows. Then open a new terminal. --no-modify-path leaves your
PATH alone.
Already have it? ralphy update takes the newest release: it checks the published
checksum, replaces the binary in place, and restarts the daemon if one is running.
ralphy update --check just tells you what is new.
(Prefer to build from source? See docs/BUILDING.md.)
- π€ At least one coding-agent CLI, signed in. That's the brain behind the terminals and the runs. Claude Code is the default; Codex, OpenCode, Copilot, Cursor, Gemini and Kimi work too. β which agents, and how to pick one
- π The
ghCLI, logged in β needed for the issue board and the overnight run. Check withgh auth status. (Not using GitHub? The consoles, explorer, notes and changes work without it.)
No API keys anywhere. Git and Python must be installed too. ralphy doctor checks all of
this and prints the version of each tool it finds.
ralphy daemon setup # baptize it: pick a name and an avatar, mint an access token
ralphy daemon add . # register the repo you're standing in (repeat per project)
ralphy daemon # run it β then open http://127.0.0.1:7257Open the page, pick your project in the sidebar, and open an agent from the Consoles menu. That's it: an agent is working on your machine, and you are watching it from a browser.
Want it up whenever you log in? ralphy daemon install registers it with your OS (Task
Scheduler on Windows, a systemd user unit on Linux/WSL, a launchd agent on macOS), and
ralphy daemon uninstall takes it back out. β docs/daemon.md
ralphy uninstall # stop the daemon, remove ralphy, and take it off your PATH
ralphy uninstall --purge # also delete ~/.ralphy (settings, token, peers, logs), after it asksIt keeps ~/.ralphy unless you add --purge, and it never changes a project's .ralphy/
folder or its GitHub labels.
Claude and Codex side by side on one project, and a second Claude in its own worktree.
- Consoles β actual agent CLIs running as terminals on a large stage you can pan. Group
them into fences, or pop a fence out into its own window for a second monitor.
Maximize one console and put others beside it as columns. Each console has a short
name, such as
myrepo #1, so you can tell them apart. - Any command, not only agents β Runβ¦ opens a console with a command you type, such
as
htoporlazygit. - One copy of the project per agent β create a git worktree from the branch picker
or from a console's title bar. The agent works in its own folder, on its own branch, and
never touches the files of another agent. Files, Changes and the diff follow the copy you
pick. A new copy can take your
.envand sharenode_modules. β worktrees - See who needs you β a dot on each console and project shows whether the agent is working, waiting for your answer, or done. (Claude consoles today.)
- ποΈ Projects β every repo you registered, in one list: branch, uncommitted changes, and whether it has a GitHub remote.
- π Explorer β the real file tree, with a real editor (Monaco): open, read, edit, save. Search file names or file contents. Open two files side by side. Images render inline, and files in any text encoding open and save correctly.
- πΏ Changes β the working tree of the project or of a worktree: read the diff, stage, commit, fast-forward pull, and push when you say so.
- Notes β markdown cards on the same stage as your consoles: task lists, tables, and diagrams (Mermaid). Each note is a file saved in your project. A note can stay on top of a maximized console while you work.
A fence groups consoles by task, even from different projects. The note is a file in the project, shown in its footer.
The Board: read an issue without leaving the workbench. The ready-for-agent label is the
one that puts an issue in the queue of the overnight run.
- π§© Board β your AFK/HITL backlog as a kanban. Open an issue, read it, and send it to a run without leaving the page.
βΆοΈ Runs β the loop, live: which issue is being worked, which phase it's in (planning, executing, verifying), and what it cost.- π Spend β the token ledger and a dollar estimate, per run, per model, per project, and per worktree.
- π°οΈ Fleet β two daemons, one workbench: a WSL box (or a second machine) shows up as a peer, with its repos and its consoles.
Two consoles of the same repo on two screens is the point: you drive one agent by hand while Ralphy's run works the queue in the other.
Open the workbench on another device and you get the same sessions and the same layout. The consoles are made for touch too:
- On a phone, a maximized console uses the whole screen.
- A key bar gives you the keys a phone keyboard does not have: Esc, Tab, Shift, Enter, Ctrl and the arrows.
- Paste text or a screenshot straight into an agent.
- Lock a console or a fence, so a finger cannot move it by mistake.
OpenCode and Claude Code on a phone, through a tunnel, with the key bar at the bottom.
The workbench is a web app on your own machine, so anything that can reach that machine can open it. Ralphy has no cloud service in the middle: you choose how your machine is reached. Two ways, in order of least surprise:
- On your own network β bind it to a LAN address:
ralphy daemon --bind 0.0.0.0. A non-loopback bind requires the access token minted byralphy daemon setup, or the daemon refuses to start. - From anywhere β put a tunnel in front of it (dev tunnels, ngrok, Cloudflare Tunnel).
Tunnels that preserve the original hostname need you to declare it:
ralphy daemon --allowed-host my-tunnel.example.dev. Declare the exact name, never a wildcard. This stops other websites from reaching your daemon through your browser (DNS rebinding).
Once it's reachable beyond loopback, turn on require-login: a password plus a code from an authenticator app (TOTP), enrolled from the Security panel with a QR you scan once. It's opt-in on purpose β Ralphy never decides for you how reachable your machine should be. β docs/daemon.md
The other half of Ralphy: point it at your GitHub issues and let it work them while you're asleep. For each issue it plans the work, lets an agent write the code, commits, re-runs the tests itself, and closes the issue if they pass. In the morning you skim the branch and merge what you like.
That's Geoffrey Huntley's "Ralph" loop β plan β execute β commit β verify β repeat β as a batteries-included implementation over your real issues, with guardrails so it's safe to leave running.
- π’
AFK(orready-for-agent) β "away from keyboard, agent go." It joins the queue. - π΄
HITL(orready-for-human) β "human in the loop." Ralphy never touches it.
Unlabeled issues are ignored. A few more labels fine-tune things (triage, staged plans, "stop before this one"), but those two are the daily driver. The full label rules β
ralphy init # guided setup: environment check, labels, repo prep
ralphy run --only-issue 13 --dry-run # 1οΈβ£ plan one issue β no code, no commits
ralphy run --only-issue 13 # 2οΈβ£ actually do that one
ralphy run --deadline-hours 8 # 3οΈβ£ the whole queue, overnightOnce you trust it, this is the everyday shape of a run:
ralphy run --agent <agent> --branch-mode <current|new>- π€
--agentβ who writes the code. Same issues, different brain. You can also plan with one agent and write the code with another. β see all agents - πΏ
--branch-modeβ where the commits land.new(default) cuts a freshafk/run-<stamp>branch so the branch you're on stays untouched;currentcommits right onto the branch you're already on. Either way Ralphy refuses to start on a dirty repo.
π Every other flag β deadlines, planning models, stopping before an issue β lives in the
run options reference, and ralphy run --help prints the same
list. β° Want it on a timer? β docs/scheduling.md
Ralphy works issues, so first you need some. Inside your agent, go from fuzzy to ready in
three moves: grill-with-docs (co-author a short doc so the agent really understands
what you want) β to-prd (shape it into a spec) β to-issues (split it into small,
independent, labeled issues). ralphy init can install those skills for you.
Open the Changes panel in the workbench and read the diff. Or use the shell:
git log --oneline origin/main..afk/run-<stamp> # see what landed
git diff origin/main..afk/run-<stamp>
# π Happy? Merge it. # π Not happy? Delete the branch β
git checkout main # your main was never touched.
git merge afk/run-<stamp> git branch -D afk/run-<stamp>- π§Ή Won't start on a dirty repo β your uncommitted work is never at risk.
- π« The run never pushes and never opens a PR β it commits locally. Pushing is a deliberate act you take, from the workbench or the shell.
- β±οΈ Time budgets β a hung issue can't run forever.
- π Stops at the first failure β one stuck issue ends the run instead of burning the whole night, and hands you the branch as-is.
- β Runner-enforced tests β an issue closes only when Ralphy itself watched the tests pass. β docs/verify-gate.md
- π§― Command guardrails β Claude Code sessions block
git push, pull request writes,reset --hardand other destructive commands mid-run. Codex, OpenCode and Copilot sessions block pushes and pull request writes. Kimi, Cursor and Gemini rely on their own vendor's controls. β SECURITY.md - π£οΈ Only your team talks to the agent β issue comments from people who are not collaborators on the repo never reach it.
- Your code, your sessions and your logins. Ralphy has no account, no cloud service of its own, and no telemetry.
- What does leave, and where it goes. Your prompts and the code the agent reads go to
that agent's vendor, under your own login. Issue reads, comments and labels go to GitHub
through
gh.ralphy usagedownloads model prices from models.dev. Telegram, the event sink and remote images in the workbench send data only after you turn them on. - The files git and Ralphy own. The workbench cannot write into
.gitor.ralphy. - Checking for updates is anonymous. The daemon asks GitHub for new releases every six hours, with nothing that identifies you. You can turn it off. β release watch
- You can check what you download.
ralphy updaterefuses a file whose checksum does not match. To confirm a release archive was built by this repository:gh attestation verify <archive> --repo paulocorcino/ralphy.
Ralphy can post a live status card to a Telegram chat and keep it updated the whole way through a run β planning, coding, and the final summary. It also tells you when an agent in a console is waiting for your answer. It's read-only; the bot just tells you how things are going.
ralphy telegram setup # store your bot token, then send /start to link your chat
ralphy telegram test # send a ping to confirm it worksMore on the Telegram monitor β
Documentation index: user guides, development rules, research and validation evidence.
| Feature | What it's for | Start here |
|---|---|---|
| π₯οΈ The daemon & fleet | autostart, worktrees, WSL peers, reaching it remotely | docs/daemon.md |
| π€ Choose your agent | seven vendors β even plan with one and code with another | docs/agents.md |
| π The verify gate | why "green" means the tests actually passed, not the agent said so | docs/verify-gate.md |
| π Cost reporting | tokens per run, with a $ estimate | docs/usage-and-cost.md |
| βοΈ Persistent settings | stop retyping the same flags every run | docs/configuration.md |
| β° Scheduled runs | drain the queue nightly on a timer | docs/scheduling.md |
| π‘ Event streaming | POST every run event to a dashboard or webhook | docs/events.md |
| π§ Knowledge cache | Ralphy remembers hard-won setup facts across runs | ralphy consolidate --help |
| ποΈ Architecture | ports & adapters β the decisions, and why | docs/adr/ |
- The Ralph loop β the unattended plan-execute-commit pattern is Geoffrey Huntley's.
- Triage vocabulary β the labels (
ready-for-agent,ready-for-human, β¦) are Matt Pocock's, from his engineering skills.
GPLv3 β see LICENSE. Copyright (C) 2026 Paulo Corcino.





