npm.io
0.1.2 • Published yesterdayCLI

@justcallme/setup

Licence
UNLICENSED
Version
0.1.2
Deps
0
Size
471 kB
Vulns
0
Weekly
0

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 .exe needs signtool/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.html still 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.

Keywords