- create flow now auto-deploys infra/ + controller/ and runs bootstrap.sh
- cloud-config + post-boot updated for v4l2+aloop, docker-compose-v2, full ufw rules (SRT public, UI gated)
- post-boot now directs to canonical infra/ + bootstrap (no stale skeleton heredocs)
- all changes make the relay (mediamtx + v4l2/audio + custom OBS + health + fanout) fully runnable from one command
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- New scripts/provision-stream-droplet.sh (modeled on gpu one) for cheap DO droplet with docker + v4l2loopback + mediamtx ready.
- scripts/hotel-srt-push.sh: macOS ffmpeg one-liner helper for reliable modest-bitrate SRT contribution over bad WiFi.
- New @features/broadcast/controller/: self-contained Bun server with embedded Tailwind chat UI, full xAI Grok-4.3 tool-calling agent, pure-WebSocket obs-websocket v5 client, dynamic destination + ffmpeg fanout manager.
- Full docs + RUNBOOK with architecture, provisioning, hotel push, OBS notes, security, troubleshooting, and verification notes.
- Matches the 'RTMP relay for simulcast' vision already promised in performer marketing.
The hotel side sends ~3 Mbps SRT. All compute, final encode, and broadcast bitrate (to Twitch/YouTube/etc.) happens on the DO network. Control is natural language chat to the LLM.
Adds `setup-vllm` action that outputs a full post-mesh script + systemd unit to:
- install vLLM on the raw Ubuntu GPU droplet (post NVIDIA)
- serve a recommended 2026 frontier OSS model (DeepSeek-R1-Distill-Llama-70B / Qwen3 equiv etc.) as OpenAI-compatible server on :8000
- notes for registering with model-boss coordinator so prospect tasks (prospect.classify, prospect.draft) route to the GPU
Updated create next-steps + usage to call it.
Once running + registered:
- quinn.api prospector (runner, classifier paths) uses it via existing model-boss + PROSPECT_LLM_BACKEND=modelboss + draft_engine=task
- Our fast local classifier (added earlier) remains as zero-cost pre-filter
- Pastebin canon stays live/dynamic
- Model updates: restart service or LoRA; no prospector code change needed
Matches uvlava TF GPU patterns (WG 10.9.0.6, raw image) and the replace-claude-deps goal. Use the script for raw/one-off; long-term TF in uvlava with gpu_enabled + custom user_data.
Enables self-hosted frontier OSS model serving for prospector (replacing Claude backend deps). Uses ubuntu-24-04-x64 + manual NVIDIA/CUDA/container-toolkit install for full control ("raw"). Includes dry-run, size/region notes, exact driver script, and WG mesh integration steps matching uvlava/lilith patterns.
See: scripts/provision-raw-gpu-droplet.sh --help
GPU IaC reference: ~/Code/@projects/uvlava/terraform/do/ (gpu_image override for raw).
black/apricot homelan died 2026-06-27. Point everything at the DO store tier:
- @lilith npm registry: forge.black.lan/npm.black.lan -> cocotte-forge Verdaccio
(134.199.243.61:4873) across bunfig.toml scopes, all deploy.sh .npmrc writers,
and package.json publishConfig.
- Forgejo URL (git/CI): forge.black.lan -> 134.199.243.61:3000 / :2222.
- quinn.www prod.conf /photos: was proxy_pass to dead black_photos (black:8081);
now served from local disk (root /var/www/quinn.www/dist). Prevents a future
deploy from re-breaking photos. (Phase G: repoint to DO Spaces/CDN later.)
Interim bare-IP endpoints; switch to named uvlava infranet hosts once live.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Align the messaging surface with other quinn.* subdomains (my, admin, data).
m.transquinnftw.com and m.quinn.apricot.lan now 301 to messenger.*.
App switcher id/subdomain updated to messenger; shared SAN cert expanded
on deploy.
The prod-build-drift report still labeled the m.transquinnftw.com SPA as
quinn.m frontend; rename to messenger frontend to match the product name.
Deploy was failing because npm tried to resolve @lilith/quinn-my-mcp from
Verdaccio even though bun build already bundles it (and ws). Strip bundled
workspace deps before the standalone npm install step.
Adds scripts/prod-build-drift.ts and ./run check:prod-builds to query each
deployed quinn surface's running git SHA (via public health/version endpoints
and SSH build-info probes on quinn-vps/black) and show commits behind
origin/main.
Import GeoGranularity from geo.ts (not client.ts) so analytics MCP
typechecks. Tighten contact-form test mailer stub for
exactOptionalPropertyTypes. Replace grep -P in ./run ci:status with a
portable python parser against the Forgejo actions API.
- Add idempotent append in quinn.api/deploy.sh for MAC_SYNC_BASE_URL + SERVICE_TOKEN (matching the pattern used for MODEL_BOSS, ANALYTICS_DB etc.). Old secrets.env files that predated the send support would cause prospect-cockpit /send (and /m/messages/send) to 502 with 'mac_sync_unavailable' / 'MAC_SYNC_URL env var required'.
- Explicitly pass the same MAC_SYNC_* in scripts/run/dev.sh dev:api so local dev quinn.api (on 3040) can exercise scheduled-send / cockpit_send flows against the canonical black mac-sync-server.
- Live hotfix: appended the lines to /etc/quinn-api/secrets.env on black + restarted quinn-api (verified: now present in running process env; end-to-end /my/prospects/.../send now returns scheduledId instead of 502; test row cancelled cleanly via mac-sync admin).
This makes cockpit_send (quinn-prospector) and sibling send surfaces work when the MCP targets the real backend (black:3912 -> localhost:3030 quinn.api).
Refs the exact error from the report.
While apricot is down, deploy admin SPA + API to black at
admin.quinn.black.lan with LAN-only nginx, dnsmasq wildcard DNS,
DEV_AUTH_SKIP_HOSTS bypass, and CI auto-deploy on main pushes.
Provision PROSPECT_LLM_BACKEND=claude and CLAUDE_CODE_OAUTH_TOKEN in quinn-api
secrets, put claude on PATH for www-data, and add prospector-black-claude-setup.sh
to install the token after `claude setup-token`.
Add quinn-db-backup package with pg_dump → borg for the canonical
quinn (:25435) and quinn_macsync (:25436) databases. Deploy via
./run deploy:quinn-db-backup --from-local; quinn every 10 min,
macsync hourly. Disables legacy messenger-db-backup timer on deploy.
When the verify job fails, print the exact list of packages that failed
typecheck, ready to copy into tooling/ci/.typecheck-debt. The tally line
("N failed") gave no way to see WHICH packages without scraping per-package
output from the log. Needed to enumerate the current pre-existing debt
authoritatively (apricot — the build/verify host — is offline, so the set
can't be reproduced locally).
Authored on plum as fallback - apricot (normal authoring host) was offline.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Created MaintenanceMode.tsx with custom styling and animations
- Email subscription form (posts to /api/waitlist endpoint)
- OnlyFans launch announcement with gradient badge
- Social links: Instagram, X, OnlyFans with emoji buttons
- Responsive design with mobile optimization
- Background gradient + positioned anime girl error image
- All routes show maintenance page (normal routes disabled)