Skip to content

Infrastructure Overview

Everything James builds runs on a small fleet of synced machines plus a VPS. The guiding principle: everything should work from everywhere it possibly could. Tokens, scripts, configs — if a capability can run on the VPS and the Studio, it runs on both. No stranded capabilities.

MachineRoleWhere It Lives
MacBook ProPrimary laptopWith James
Mac StudioDesk workstationHome office
Remote MacDev workstation + OpenClaw agentHome office (headless, VNC)
VPS (Hostinger)Always-on services, Supabase, n8n, webhooksUbuntu 24.04

See Machines for IPs, SSH commands, and git identity tags.

Three pieces, working together:

  1. pullall — Pulls every repo under ~/apps/ and clones any new ones from GitHub. Run at session start.
  2. gpush — Wraps git push so it automatically runs post-push-sync.sh and syncs other machines over SSH.
  3. Webhook receiver on the VPS — Listens for GitHub push events on port 9877, validates the HMAC-SHA256 signature, and runs git pull on the matching repo. Self-updating, no SSH needed from the pushing machine.

Each repo gets a distinct port — no conflicts, no guessing. Managed by ~/apps/cc/pop-it-open.py.

RepoPortFramework
themarketingshow3100Next.js
mytechsupport3200Next.js
cascadewindowcleaning3300Next.js
youtube-clipseeker3400Next.js
gokartpark3500Next.js
allthingshandy4321Astro
life-score5173Vite + React

Convention: Next.js repos use the 3xxx range in 100 increments. Astro and Vite keep framework defaults.

Hostinger box, Ubuntu 24.04.3 LTS, 95 GB disk. Runs:

  • Supabase stack (self-hosted) — Studio, Kong, Postgres, auth, storage, realtime, all via Docker. Exposed at db.jameshurst.com.
  • n8n — workflow automation at n8n.srv1249251.hstgr.cloud.
  • Webhook receiver — port 9877, self-updater for all synced repos.
  • AI Assistant scanner — runs on a cron, uses claude -p on the Max plan (no API cost).
  • Upwork Proposal Pro — systemd service, long-lived OAuth token.

More detail in the source of truth: ~/apps/cc/infrastructure-guide.md.