Appdock banner
Lukehle Lukehle

Appdock

Communication community

Description

Starter kit for agent-built local apps on Mac: zero-dependency localhost server, SQLite seam, incident-hardened human-approval queue, headless-Claude chat, Dock-pinnable .app + launchd, and a reuse-don't-regenerate agent manual — precoded parts so the tokens go to your domain logic.

Installation

This entry records only its repository, not the path inside it, so there is no exact command to give. Open the source below and copy the folder into ~/.claude/skills/, or the file into ~/.claude/agents/.

README

appdock

A starter kit for **agent-built local apps on a Mac** — the precoded, tested parts that every localhost ops app needs, so Claude spends tokens on your domain logic instead of regenerating (and subtly breaking) the same scaffolding every project. Extracted from three production local-first apps; every safety rule in here encodes a real incident.

**Zero dependencies by default.** Node ≥ 22.13.0 and a browser — nothing to install, nothing for an agent to version-wrangle, every file readable in one sitting. A pinned batteries tier exists for when an app genuinely outgrows lean ([batteries/](batteries/README.md)).

Start an app

git clone https://github.com/Lukehle/appdock
./appdock/new-app.sh "Ops HUD" ~/apps/ops-hud
cd ~/apps/ops-hud && npm test        # 27 tests green before you write a line
npm start                            # http://127.0.0.1:7480

On the Mac, `new-app.sh` also builds **"Ops HUD.app"** — a Dock-pinnable launcher that starts the server if it's down and opens the UI as a chromeless app window. The whole app folder (bundle included) can live in a **shared Google Drive folder**; each user's data stays local, and [docs/DRIVE.md](docs/DRIVE.md) covers the sharing patterns and the one rule that prevents database corruption.

What's precoded

Part The short version
Approval queue (approvals/queue.js) Every outward action stages for a named human: approval binds to a hash of what will actually leave; dispatch is mutexed at the database; verification is tri-state and "couldn't confirm" is never auto-retried. The crown jewel — docs/PARTS.md explains why.
Localhost server (server.js) 127.0.0.1-only with Host checking; every mutation also requires a per-install bearer token stored mode-0600 where supported; CSP'd, traversal-safe static serving.
SQLite seam (db/) Node's built-in node:sqlite with better-sqlite3 fallback; WAL; ordered checksum-protected migratio