Project Friday.
A personal AI development environment I’m building on a private Unraid server. Three projects: memory, environments, voice. Mostly built by me using Claude Code.
- Friday-ai
- v1.5.0 in production
- MCP tools
- 72
- Postgres tables
- 33
- Friday-Website
- W1 shipped

§ Stack
Three projects on one Unraid server.
Each is independently useful. Together they form the environment: one substrate, one tunnel, one set of secrets, one operator.
§ Memory
What Friday-ai is.
Shipped · v1.5.0Memory is what makes the rest of the stack worth building. Friday-ai stores what an agent decided across sessions: architectural decisions in markdown, dated operational notes, commands that have actually been verified, error fingerprints paired with the fix that resolved them. The next agent reads its own brain before it starts work.
Pre-Friday-ai, every new Claude Code session asked me what we’d decided about JWT key rotation. Now it reads ADR-081 first.
Anything an agent writes lands in a review queue, not the brain directly. I (or another agent) approve or reject before it persists. The audit log records who decided what, when, with what evidence. Channels expose subsections of the brain to scoped consumers, so no agent sees more than its task needs.

What’s inside
- Recall: pgvector search backed by a Qdrant rerank
- Candidates + approval: every write goes through a review queue
- Channels: multi-agent chat with threaded replies and reactions, scoped by role
- Guest access: invite-based scoped tokens for outside collaborators
- Audit log: who decided what, when, with what evidence
- Vault: encrypted secret surface, tiered by sensitivity
Friday-ai
§ Sessions
What Sandcastle is.
Shipped · v1.6.25Sessions are throwaway development environments for AI agents. An agent calls one tool, gets a fresh container in seconds, does work, walks away. Fourteen runners cover the projects I actually use: Vite preview servers, Flutter web, Python services, Postgres-backed apps, a few that just need a shell.
Each session has its own friday_net IP, its own Cloudflare Tunnel ingress, and a live preview URL the agent can hand back to me to eyeball. Cleanup is automatic. If a session goes idle, it gets torn down. If a session fails, the next one reuses none of its state.
The point is that an agent can’t accidentally leak state across tasks. Each environment is bounded, scoped, disposable. The MCP surface is one tool call to spin up, one tool call to shut down. Everything else is the agent doing actual work inside.

What’s inside
- 14 runners: Vite, Next, Flutter web, FastAPI, Django, Go, plain shell, more
- MCP-native: one tool call up, one tool call down
- Per-session ingress: friday_net IP + Cloudflare Tunnel + preview URL
- Auto-cleanup: idle teardown, no state leakage across tasks
- Codemagic CI: real Android and iOS builds from inside a session
- CI cache: a persistent build cache, faster repeat builds
Sandcastle
§ Voice
What Friday-nexus will be.
Mid-build · v2.1Honest section. What’s here is in motion.
Voice is the interface I want, mid-build. Wake-word activated and running. Cross-platform via Tauri 2: desktop on macOS, Windows, and Linux, live-validated on Windows so far. Mobile (iOS, Android) is planned, not started. Speech streams through Pipecat, which routes each turn down one of two paths: a fast path on Gemini for quick replies, and a slow path that hands the turn to a Claude agent able to reach the brain and the session runners over MCP. Either way the answer comes back as speech.
The voice loop runs end to end for real now, not just in fixtures: I say the wake word, Friday answers out loud, and I can talk over her to cut a reply short. Barge-in took a few rounds to get right. The avatar caught up too. What renders today is a reactive orb that pulses with the voice, built in WebGL2. A textured 3D head, a VRM model, is built behind it and waiting on visual validation before it goes on screen. The 3D avatar the name implies is closer than it was, still not shipped.
The name comes from a different fictional AI. I’m not aspiring to Iron Man, just to a stack I can talk to without typing.

What’s inside
- Wake-word: openWakeWord, always-on, runs local
- Cross-platform: Tauri 2 desktop (macOS, Windows, Linux), live on Windows; mobile planned, not started
- Orchestrator: Pipecat, streams speech in and out
- Fast path: Gemini, for quick replies
- Slow path: a Claude agent reaching the brain and sessions over MCP
- Avatar (today): reactive WebGL2 orb, voice-driven, live today
- Avatar (next): textured 3D head (VRM), built, visual validation pending
Friday-nexus
§ How it works
The dogfood loop.
A round of work starts with an agent reading the brain. The agent (usually Claude Code in this house) opens a Sandcastle session for the task, has a fresh container in a few seconds, gets a friday_net IP, a Cloudflare Tunnel ingress, a live preview URL. The agent does the work.
Whatever the agent decided lands in a candidate queue: ADR drafts, dated ops-notes, working commands, error fingerprints with the fix that resolved them. I (or another agent) approve or reject. Approved candidates go to the brain. The session torches itself when done.
Tomorrow’s agent reads what today’s agent decided. The brain compounds. The agents get faster, not because the model got smarter, but because the agent stops re-deriving what we already figured out.
The loop reaches past this website. Friday-ai’s memory also backs Alpha Neural, a private automated-trading system I’m building on the same Unraid server. Every decision it makes records what it assumed and how it turned out, and the next session reads those post-mortems before it proposes anything. It’s a research build, not a signals service, and it isn’t public.
We use Friday to build Friday.
§ Architecture
Where this lives.
One physical box at home. One Docker bridge. One tunnel. No public ports. The whole stack reads top-down.
Public clients
Browsers · AI agents · MCP clients · HTTPS only
Cloudflare edge
DNS (apex + 4 subdomains) · TLS termination · single tunnel UUID
Private Unraid server · one box · 32 GB · 16 threads
Tunnel + router
friday-cloudflared → friday-traefik (Host header routes by hostname)
Application containers
friday-public-web · friday-api · friday-web · friday-nexus-* · sandcastle-*
Shared substrate · friday_net bridge
Postgres + pgvector · Qdrant · Redis · age vault · Prometheus / Grafana / Loki / Alloy
What rides third-party
Most layers are stuff I wrote. The voice pipeline leans on upstream tooling: Friday-nexus streams through Pipecat, an open-source voice-agent orchestrator I didn’t build, and the model work splits between Gemini on the fast path and Claude agents on the slow path. The Postgres + pgvector + Qdrant + Redis layer is upstream too. Everything else is repo code: the brain schema, the candidate-approval queue, the session runners, the tunnel-ingress layout, the deploy pipeline.
Where the details live
80+ architectural decision records are documented across the three implementation repos: zone migration, Mode B JWT pattern, blue/green deploys, the apex-CNAME flattening gotcha, every choice made. The repos are private today; the high-level shapes live on this page, the specifics live in the code. If you’ve read this far and want in, the codev portal is the next gate. See the footer.
§ Built with Friday
What the stack has built.
The three projects above are the substrate. The rest of my work runs on it: a private trading-research system, a 4x4 off-road club app, a voice-and-vision assistant for smart glasses, a multi-agent decision skill, and more, plus a few things I collaborate on.
- Alpha Neural
- Ad4x4
- Friday Vision
- DayTraders Desk
- Driven
- Ze Council
§ Build log
What just shipped, in order.
Every meaningful change to this site and the stack behind it, newest first. Operator-curated; the numbers stay concrete.
Latest · Built with Friday page (2026-06-20)
Read the full build log