@justcallme/setup
Just Call Me — Desktop Setup Wizard
A lightweight cross-platform installer that connects Claude Code and/or OpenAI
Codex to Just Call Me, so your phone rings when a long task finishes. It's the
implementation of the Installer Screens.dc.html design — the full 8-page wizard —
plus the small backend that does the real wiring.
Welcome → Choose agent → System check → Install → Pair → Configure → Test → Done
What "lightweight" means here
No Electron, no bundled runtime, no build step. It's a zero-dependency Node HTTP
server (server.mjs) that serves the UI and exposes a handful of /api actions.
It opens in a small Chrome/Edge app window (--app mode with a throwaway
--user-data-dir, so the size flags actually apply). It rides on the Node you already
have; Node is the one prerequisite the installer itself needs (both agents need it too).
The wizard is throwaway; what it sets up persists. Run it once and delete it — the
only thing left behind is the product: the hook scripts it copies to ~/.justcallme/hooks/
and the registrations pointing there. That split is what lets the same code ship as a
git clone, an npx invocation, or a downloaded run-once binary.
Ways to install (pick one)
All paths run the same wizard; the difference is just how it reaches the user.
| Audience | Command / action |
|---|---|
| Just download & run (macOS) | double-click the .app / justcallme-setup-macos-* binary |
| Just download & run (Windows) | double-click justcallme-setup-win-x64.exe |
| One-liner (macOS/Linux) | curl -fsSL https://getjustcall.me/install.sh | sh |
| One-liner (Windows) | irm https://getjustcall.me/install.ps1 | iex |
| Node users | npx @justcallme/setup |
| From a clone | node installer/server.mjs (Node ≥ 20) |
The downloadable binaries are throwaway: run once, then delete. Node users need
nothing installed (the binaries bundle their own runtime); npx/clone use the Node
you already have. The server binds to 127.0.0.1 on a random free port (PORT pins
it); --no-open runs it headless.
The curl/irm scripts live in web/public/ (served from getjustcall.me) and pull
the binary for the detected OS/arch from getjustcall.me/dl/….
What it actually does
Every side-effecting step reuses the repo's own hook libraries, so the installer does exactly what the product does at runtime — nothing bespoke:
| Step | Action | Reuses |
|---|---|---|
| System check | Resolve Node, git, Claude, Codex with paths + versions — Claude Code is found even when it lives inside the desktop app and isn't on PATH | hooks/lib/claude-bin.mjs, hooks/lib/codex-bin.mjs |
| Install | Copy the hook scripts to ~/.justcallme/hooks/, then register the Stop + SessionStart hooks in ~/.claude/settings.json pointing there (merge, backup, idempotent) |
lib/install-hooks.mjs, lib/claude-hooks.mjs |
| Pair | Device-code QR flow; the poll secret stays server-side; the key is saved where every hook already looks | hooks/lib/creds.mjs, hooks/lib/qr.mjs |
| Configure | Add the one-line Codex notify to ~/.codex/config.toml (backup, idempotent, won't clobber a different notifier) |
lib/codex-config.mjs |
| Test | Health check (helper alive · key valid · agent configured), then a real POST /notify that actually rings your phone |
hooks/lib/daemon.mjs, lib/health.mjs |
Config edits are cautious: the prior file is copied to *.jcm-bak before any write,
and re-running is a no-op.
Build the run-once binaries
Bun compiles the wizard into one self-contained executable per platform — Node/Bun
runtime + code + the embedded hooks and UI, all in a single file. Download → run →
delete; the only thing left on the machine is what it installs to ~/.justcallme.
bun run build # win + both macs → installer/dist/
bun run build win # just Windows x64
bun run build mac-arm # just Apple silicon
build.mjs first runs scripts/gen-embedded.mjs, which bakes the hooks/ tree and
the ui/ files into lib/*.generated.mjs (git-ignored) so the binary can serve the UI
and write the hooks with no repo present. Verified: the compiled .exe serves the
embedded UI + assets and, on Install, extracts the hooks to ~/.justcallme/hooks/ and
registers them — starting from nothing but the one file.
Cross-compiling works from any OS. Signing does not: notarizing the mac build needs a Mac, and Authenticode-signing the
.exeneedssigntool/osslsigncode.
Layout
installer/
server.mjs zero-dep HTTP server + /api, opens the frameless window
lib/
detect.mjs Node/git/Claude/Codex detection (resolved paths + versions)
claude-hooks.mjs register/verify Stop + SessionStart in ~/.claude/settings.json
codex-config.mjs add the notify line to ~/.codex/config.toml
pair.mjs the /pair device-code flow (secret kept server-side)
qr-svg.mjs local QR → inline SVG (no third-party QR service)
health.mjs the Test step's health check + the real test call
ui/
index.html the window shell (page-drawn chrome)
styles.css Warm Signal tokens · light + dark · all component states
app.js the 8-screen state machine (talks to /api; demo fallback)
assets/ logo + marks (from the design handoff)
bin/
Just Call Me Setup.command macOS launcher
Just Call Me Setup.cmd Windows launcher (double-click)
just-call-me-setup.ps1 Windows launcher (PowerShell)
Notes
- Theme follows the OS (light + dark), and honours
prefers-reduced-motion. - Offline-friendly: the QR is generated locally; the Newsreader web font is progressive enhancement over a Georgia fallback.
- Demo mode: opened as a plain file with no server,
ui/index.htmlstill walks through all 8 screens on canned data — handy for design review. - Endpoints (all on
127.0.0.1):GET /api/context,GET /api/check,POST /api/locate,POST /api/install(SSE),POST /api/pair/start,GET /api/pair/poll,GET /api/configure,POST /api/configure/codex,GET /api/health,POST /api/test-call.