Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

coastcap — morning audit

Every morning, an agent reconstructs yesterday from my Coast screen history, finds the loose ends — things I left unfinished, never sent, or forgot to follow up on — and publishes a recap page with cropped screenshot evidence. A push notification lands on my phone when it's ready. Marking an item complete on the page feeds back into the next morning's audit.

demo

(full quality: docs/demo.mp4)

How a morning runs

  1. 9:00 — launchd starts a headless OpenCode run (run.sh + prompt-template.md) with a random jitter.
  2. The agent reads its memory: previous audits (history/), the previous recap JSON, and which items I marked complete on the page (state/interactions.json).
  3. It dispatches two subagents in parallel over the Coast CLI: one hunts communication loose ends (unsent replies, people waiting on me), the other work-in-progress loose ends (abandoned terminals, half-typed prompts, errored flows). Carryover items from previous days get re-verified against the new day's evidence.
  4. For the items where a screenshot helps, it locates the exact frame, crops to the evidence region using Coast's OCR box coordinates (scripts/crop-evidence.py), then looks at each crop with vision and only ships images that actually show the claimed evidence.
  5. It writes site/data/<date>.json. The Bun server renders it as a per-day page (/july-28th-2026) with an archive at /.
  6. A 10-minute two-way sync (scripts/sync.sh) pushes the site to an exe.dev box (auth-gated HTTPS) and merges item interactions in both directions. The first sync after a new recap fires a Hark push notification with a tap-through to the day's page.
  7. Tapping a row on the page blurs it and offers Mark complete — that interaction syncs back and becomes "cleared" in tomorrow's audit.

Components

Path What it is
run.sh Morning entrypoint: date substitution, jitter, headless opencode2 run --auto
prompt-template.md The agent's brief: memory, subagents, synthesis rules, crop verification, output schema
scripts/crop-evidence.py Frame + on-screen text → OCR-box union → padded sips crop
scripts/sync.sh Two-way state merge + site push to the box + once-per-day Hark notification
scripts/fetch-brand-assets.sh Pulls the Coast typeface subsets + mark from coast.app (not vendored)
scripts/hark-icon.html Renders the notification icon (Chrome headless → 512px PNG)
server/server.ts Bun server: static site, /api/recap/*, /api/recaps, /api/interactions
site/index.html The recap UI: archive + day views, mark-complete flow, lightbox, staggered entrances
launchd/*.plist The three services: 9:00 audit, persistent web server, 10-minute sync

Setup sketch

Machine-specific paths live in the plists, run.sh, and prompt-template.md — adjust before use.

  1. Coast running with CLI access enabled (coast on PATH).
  2. OpenCode V2 (opencode2) with the coast-cli-skill skill installed globally.
  3. Bun for the server, Node 22+ for harkctl.
  4. scripts/fetch-brand-assets.sh to pull fonts + mark.
  5. An exe.dev box (ssh exe.dev new) with the server under systemd; keep the HTTP proxy private.
  6. npx harkctl auth login, then bootstrap the three launchd agents.

Privacy

The interesting data never leaves the machines I control, and none of it is in this repo: recap JSONs, screenshot crops, audit history, and interaction state are all gitignored. The exe.dev box is auth-gated. Review anything you generate before sharing it — screen history is the most sensitive data there is.

Coast's name, mark, and the Suisse Intl typeface belong to Attention Engineering and Swiss Typefaces respectively; this is a personal project that fetches those assets from coast.app at setup time rather than redistributing them.

About

No description, website, or topics provided.

Resources

Stars

9 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages