Files

scripts/

Local operational scripts for the paper-trading agent. This machine holds the Alpaca keys and the Gmail app password (.env) — none of that ever leaves it.

export_public.py — sanitized public snapshot

Produces trading-public.json, the ONLY artifact the public dashboard (sites/apps/trading) is allowed to read. It is fully decoupled: the hosted app reads a file, it never touches this DB or any key.

python3 scripts/export_public.py \
  --db state/trading.db \
  --out trading-public.json

Stdlib only (no uv/venv needed). Flags:

  • --db path to the SQLite DB (default state/trading.db)
  • --out output JSON path (default ./trading-public.json)
  • --output-dir nightly committee dir holding <date>/_committee.json (default <db_dir>/output)

What it emits / strips

  • EMITTED: per-persona percent returns, base-100 normalized (coarse/sample) equity curves, thesis cards, committee verdicts, trade markers, and positions as (symbol + side + relative weight).
  • STRIPPED: absolute $ equity / cash / buying-power, Alpaca account IDs, Alpaca order IDs, per-share prices and market values.

A self-check scans the emitted JSON for $, UUID id patterns, and raw account-level dollar figures and aborts on any hit, so a sanitization regression can never ship. The script only prints percentages and counts.

Scheduling (launchd / cron)

Run it right after the nightly research + morning execution have written the DB and committee JSON, so the public snapshot reflects the latest close.

launchd (matches the existing launchd/ai.tradingagent.*.plist style) — a daily job after the 08:30 CT execution, e.g. a wrapper scripts/export.sh:

#!/usr/bin/env bash
cd /Users/aryan/Documents/GitHub/trading-agent
python3 scripts/export_public.py --db state/trading.db --out state/trading-public.json
# then sync to wherever the app reads it (see below)

cron equivalent (09:15 local, after execution settles):

15 9 * * 1-5  cd /Users/aryan/Documents/GitHub/trading-agent && \
  /usr/bin/python3 scripts/export_public.py --out state/trading-public.json >> state/logs/export_public.log 2>&1

Syncing to the app

The dashboard reads the file at the path in TRADING_DATA_PATH (default: its bundled data/trading-public.json). Point the app at the exported file, or copy the export into place after each run:

# option A — copy into the app's data dir (rebuild/redeploy picks it up)
cp state/trading-public.json /path/to/sites/apps/trading/data/trading-public.json

# option B — write to a shared volume the running app reads via TRADING_DATA_PATH
cp state/trading-public.json /srv/trading-data/trading-public.json
# app env: TRADING_DATA_PATH=/srv/trading-data/trading-public.json

The app revalidates hourly, so a fresh file is served within the hour with no redeploy. (Hosting/transport is handled separately — this script only writes a local file.)