.6 was reassigned to com.uvlava.ct.redroid; the on-demand GPU lands at .9, the
canonical model-boss endpoint (http://10.9.0.9:8000) that prospector
MODEL_BOSS_URL + mr-number RATING_LLM_URL now point at.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
After the per-show relay droplet is created, provision-stream-droplet.sh now
calls the self-hosted dyndns2 updater (dns.ct.uvlava.com) to point
live.ct.uvlava.com at the new droplet IP. live.transquinnftw.com is a static
CNAME onto it, so the platform ingest name follows the per-show, region-nearest
droplet automatically — no manual joker.com edit per show.
Token from DNS_UPDATER_TOKEN or ~/.vault/dns-updater-live.token. Non-fatal:
a DNS hiccup warns loudly but does not fail provisioning.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The REST API (/actions/tasks) hides runs that fail at parse/dispatch time,
so it reported 0 runs while the forge DB held 151 failed + 8 stuck runs —
all from the same root cause: ZERO runners registered on ct-forge
(action_task=0, nothing ever executed a step).
- infrastructure/forge-ci-doctor.sh: DB-backed health check over ssh; lists
runners, per-repo run-status breakdown, recent failures, dispatched-task
count; RED/GREEN verdict + exit code. shellcheck-clean.
- scripts/run/ci.sh: wire ./run ci:doctor; fix broken ci:status (org was
'lilith/', real ct-forge org is 'platform/'); ci:setup-host now points at
the terraform ci-runners module instead of dead black.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Wiring: enable HLS port in cast/infra mediamtx + ufw notes; add deploy:live case + help in run/deploy.sh; update live deploy script.
Ties the quinn.cast relay (on-demand DO) to the VIP shows live feature (fanout to live.transquinnftw.com ingest powers the player; /admin for SSO operator preview + light admin).
- 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)