Active · May 25, 2026
Talkak
The cockpit around your own Claude Code / Codex — a native AI work operating system that gates risky agent actions behind your approval, re-runs the commands behind a 'done' claim to catch false ones, and captures decisions into a searchable project-memory graph. Tauri + Rust, macOS.
Approval-gated agent actions · Re-runs your 'done' claims · Auto-captured decision graph · tmux-persistent panes · 0% token markup · BYO Claude/Codex
- Role
- Solo (AI-pair-programmed with Claude Code)
- Stack
- Tauri 2 · Rust · React 19 · TypeScript · xterm.js · portable-pty · tmux
A native macOS app that wraps your own claude / codex binary in an operating layer. It runs multiple terminal panes per workspace — each on a persistent tmux session so an agent's work survives an app restart — then adds the three things a raw terminal doesn't: an approval gate that holds risky actions until you press approve, a verification pass that re-runs the commands behind a "done" claim and catches the false ones, and an append-only event/graph store that turns the work into searchable project memory. Built to scratch my own itch — I was running ~12 macOS desktops in parallel and losing the thread of what each agent had actually done.
What it does
- Multi-pane agent workspace. react-mosaic + xterm.js over per-pane PTYs (
portable-pty); each pane is a tmux session keyeddalkkak-<id>that outlives the app. Multi-startup sidebar,⌘1..9navigation, automatic reattach on launch. - Approval gate. Agent-proposed email replies, calendar events, and document edits stage as pending and only execute after you approve — "AI drafts the reply, you press approve, or it never sends." Nothing side-effectful reaches the outside world unattended.
- Verification, not trust. When an agent claims "tests pass" / "done," Talkak re-runs the underlying command and flags the claim if it doesn't hold — a confident-but-wrong agent gets caught instead of believed.
- Decisions remember themselves. Work items, actions, decisions, evidence, approvals, and verification receipts are captured append-only into a per-project event/graph you can search later — the operating memory, not just a scrollback buffer.
- Per-turn recap (
⌘I), Usage Pulse, and two-layer observability: Claude Code hooks →logs/*.jsonl, Rusttracing→ a daily-rolling runtime log.
Why
The core verb is "drive the user's local claude binary and keep a verifiable record of what it did." A browser tab can't own the process tree or re-run a shell command — web-only is technically incapable of the approval + verification layer. Tauri (Rust backend + system WebKit) gives a ~10 MB bundle that still owns the file system and process tree. Multi-startup as a first-class citizen separates it from Warp / iTerm, which assume one project per window.
Status
A 14-day local-app trial is available now (macOS 13+, Apple Silicon). 0% token markup — you bring your own Claude Code / Codex and Talkak never resells tokens. Paid checkout is pending: the subscription terms aren't launch-ready yet.
Engineering bits worth pointing at
- Lifecycle decouple. Terminal state is decoupled from the React lifecycle via async Rust↔JS IPC: xterm and the PTY live in a module-level registry, outside React, and Mosaic split/stack remounts never touch the running process — no process-state loss. VS Code Server's terminal-hosting pattern. (log)
- Subprocess env hygiene. Tauri's GUI app inherits a minimal PATH and a near-empty environment. Without explicit
TERM,LANG, and PATH augmentation,claude --resumefroze for 15 seconds and tmux silently failed to spawn. (log 1, log 2) - Bug-as-asset. Every shipped bug got a six-section post-mortem (symptom / root cause / fix / instruction-blame / avoidability / lessons), enforced by
CLAUDE.mdRULE #6.
Project log
Chronological record of troubleshooting, retros, and updates while building this.
Decisions & milestones
Architecture overview — DalkkakAI as of 2026-05-31
SnapshotMay 31, 2026 · 3 min
Tauri 2 desktop app: React 19 renderer hosts xterm panes that attach to PTYs owned by a Rust backend, which spawns each pane into a per-pane tmux session.
ADR-001: hooks (not TUI scraping) for per-session status
DecisionMay 30, 2026 · 6 min
Per-session live status (working / needs-you / done) will be driven by Claude Code hooks emitting structured events, not by scraping the TUI. TUI scraping was proven unreliable (spinner repaints, never crosses \n); hooks are free, structured, and reversible. Verified end-to-end the next day: 37 events across 3 correctly-tagged panes, stale-working bug gone.
Build log
Week of Jul 20, 20263 entries · 3 Tech retro
Agent constitution v1 enacted: one AGENTS.md for every agent, gates wired the same day
Tech retroJul 20, 2026 · 1 min
The repo's rules moved from a 22.8KB Claude-only file to a 7.2KB agent-neutral AGENTS.md constitution, with the size ratchet, dead-rule detector, byte budget, and CI gate shipped in the same commit — because a law that names a nonexistent gate is itself a violation.
자기신고의 종말 — done-marker가 독립 재실행을 거쳐 마스터를 깨운다
Tech retroJul 20, 2026 · 1 min
The collaboration loop finally closes: worker done-markers trigger an independent re-run of the packet's acceptance commands, the verdict receipt promotes/demotes registry status (PASS→ready, FAIL→blocked), and the orchestrator pane is woken automatically — with a planted false-claim test proving the detector rings.
Repo token diet Stage 0: reference-graph doc archive, log rotation, .ignore search surface
Tech retroJul 20, 2026 · 1 min
Measured where agent sessions melt tokens, then executed the safe first stage: 60% of design docs proved orphaned by a reference-graph audit and were archived, three append-forever logs were rotated, and a root .ignore shrank every agent's search surface without touching git tracking.
Week of Jul 13, 202612 entries · 3 Update · 5 Troubleshoot · 3 Tech retro · 1 UX retro
Checkpoints you cannot forget: turning human release gates into hooks that refuse commands
Tech retroJul 18, 2026 · 1 min
Documented checklists failed four times in one day; the only things that actually stopped bad actions were hooks. So the human checkpoints became mechanical: a pre-commit gate that rejects new append-writes without a limits row, and a PreToolUse hook that blocks installing to /Applications until a human answers 'what will annoy me tomorrow morning' and 'what is the rollback path'.
Operator console goes first-class: Work-Console format, clipboard image paste, and a 30-second ghost-repo timeout
UpdateJul 18, 2026 · 2 min
Three-front wave: the operator console re-built in the product's SurfaceFrame screen grammar inside the project area, clipboard-image paste into any agent pane (Codex included), and a root-caused fix for a 30s registry hang traced to a stray .git in the home directory.
Every store gets a limit: a 4-way audit of everything DalkkakAI grows, and the GC that enforces it
Tech retroJul 18, 2026 · 1 min
After the 255MB-journal freeze, we audited every accumulating store (9 HIGH + 15 MEDIUM unbounded), shipped a startup GC for the safe ones, capped telemetry at birth, partition-loaded the MCP index (48MB vs 170MB RSS measured), and wrote the limits spec with a rule: no new append-file without a limit row.
The gate that could never turn green: three structural defects behind the record-incomplete storm
TroubleshootJul 17, 2026 · 2 min
Every provider-confirmed turn showed 'record incomplete' because Ready was structurally unreachable: advisory items clamped the summary state, a Required check waited on a value written only after the gate was read, and a 3s cold-start MCP probe timed out. Red→green fix with guard tests.
Operator console, promoted to a command center: auto-join, ghost cleanup, live status, direct dispatch
UpdateJul 17, 2026 · 2 min
Five upgrades that turn the operator console from a viewer into a cockpit: workers auto-join their live panes by worktree path, dead-wave ghosts archive in one click, the orchestrator shows a live activity chip, and the drawer can dispatch directly to a worker — gated so text never lands in a bare shell.
The orchestrator pane died silently: a success-path fallback is worse than a failure
TroubleshootJul 17, 2026 · 2 min
The operator console's orchestrator pane degraded to a bare non-tmux shell with zero indication, then typed `codex` into it every 5 seconds forever. Three compounding defects: a double spawn, a `-D` client kick whose loser exits cleanly, and a wrapper that treats clean exits as success.
Five months of write-only memory: 81 writes, 2 reads — and the defaults that caused it
TroubleshootJul 17, 2026 · 2 min
Capture and partitioning worked; consumption was structurally dead (read:write 2:81). Root: global-by-default search, no startup identity in panes, pull-only recall, 220K-char responses. Fix: scoped-by-default reads, boot-time auto recall, compact responses with an out-of-scope note, and read-side metering.
97 panes vs a 256 fd limit — the EMFILE meltdown a silent-failure audit caught
TroubleshootJul 16, 2026 · 1 min
Right after a release install, the app burned 320% CPU at load 134. The trigger wasn't the new feature: 97 accumulated tmux panes blew through macOS's default 256-fd soft limit, and every open() in the process started failing with EMFILE. A June observability commit made the failure visible; the fix is the multiplexer standard — raise RLIMIT_NOFILE at startup.
운영자 콘솔 v2 — 마스터 오케스트레이터 실PTY + 워커 실CLI 관측
UpdateJul 16, 2026 · 1 min
One conversation surface per project: a real agent PTY on top, the parallel-mission board below, and click-through to every worker's real CLI (pane capture or headless dispatch-log tail). Built entirely on existing engines — zero new engine code.
A docs commit that silently reverted 411 files — postmortem of a multi-session merge campaign
TroubleshootJul 14, 2026 · 3 min
Landing four parallel AI-session work streams onto main in one night: a synthetic-base trick that collapsed 35 of 38 add/add conflicts to zero, and a ref-only branch advance that turned the next session's docs commit into a silent 411-file revert.
When a rules-based business designer looked like live AI
UX retroJul 14, 2026 · 2 min
The Backend Factory lab had conversational AI copy even though its provider was null. We corrected the screen and added a canonical contract boundary that cannot publish or execute.
The test was not the product: Work Desk needed a native delivery gate
Tech retroJul 14, 2026 · 2 min
A green component suite could not prove that an employee assignment reached a real PTY, that a configured provider consumed the task exactly once, or that every protocol adapter failed closed. We added those gates without pretending the final click-through was complete.
Week of Jun 29, 20269 entries · 1 Update · 5 Troubleshoot · 2 Tech retro · 1 UX retro
One malformed summary card took down the whole app: the dispatcher that defended four kinds and forgot the fifth
TroubleshootJul 3, 2026 · 2 min
A concept-kind dk-summary card missing its `tradeoffs` field crashed the entire app with 'undefined is not an object (p.pros)'. The shared card renderer defensively shaped four card kinds but passed the fifth (concept) raw — and the same renderer feeds three surfaces, so one bad card from a BYO LLM nuked all of them. Fixed with a null-safe ConceptCard plus a per-card error boundary.
Two Korean-input bugs: the Enter that submitted mid-syllable, and the PTY boundary that ate 한글
TroubleshootJul 3, 2026 · 2 min
A code audit surfaced two Korean-input defects that shipped for months: 16 input handlers submitted on Enter without checking IME composition (so confirming a Korean syllable sent the form), and the PTY read loop decoded fixed 4096-byte chunks with lossy UTF-8, silently turning a 한글 char split across the boundary into U+FFFD. Fixed with a shared IME-safe Enter helper and a carry-buffer decoder.
The first eval measured the enforcer: a 20-minute scoreboard found three flaws code review missed
Tech retroJul 2, 2026 · 2 min
After a day of the honesty verifier falsely accusing an honest agent, we built eval v1 as read-back lenses over nodes the app already keeps: a Lab judgment-trend chart and a dk-verify scoreboard. The scoreboard's first run over 491 real receipts immediately surfaced three structural flaws — permanent 'failed' verdicts, an unverifiable Java stack, and a week-old misjudgment pattern.
The memory that froze at session start: graph_search served a load-once snapshot for days
TroubleshootJul 2, 2026 · 2 min
Verification receipts written today were on disk but invisible to graph_search — the local MCP server loaded the operating-memory graph once at startup and served that snapshot for the whole multi-day agent session. Fixed with an mtime signature over exactly the files the loader reads, reloading only on real change; proven by unit tests and a stdio E2E against the built server.
Session Flow was reading the laundered text: the feature that never rendered a single card
TroubleshootJul 2, 2026 · 1 min
The Session Flow view showed '0 steps' for every session because it re-parsed <dk-summary> blocks out of transcript text that the Claude reader had already stripped them from — the parsed payload was sitting in a `summary` field one hop away. The feature had only ever been verified against empty states.
I froze the maintainer's Mac — an AI agent has to treat RAM as a shared budget
Tech retroJun 30, 2026 · 2 min
During one session I relaunched pnpm tauri dev four times, ran repeated production builds, vitest, Chrome automation, and a subagent — on a 32 GB Mac that already had 7 large-context agent sessions resident. Peak demand blew past RAM into a 2 GB swap and froze the machine. No single process was huge; the sum was. The fix is behavioral, and it's now a repo rule.
The Lab 'remembered' each session — until you closed it
TroubleshootJun 30, 2026 · 3 min
Per-session state in the Lab drawer was supposed to survive switching between terminal panes. Dogfooding the live app revealed it vanished on every close — the drawer was mounted conditionally, so closing it unmounted the component and wiped the in-memory snapshot store. The internal `if (!open) return null` guard was dead code.
I lost the thread of my own product — so I built the lens, not another store
UX retroJun 30, 2026 · 2 min
Mid-session I couldn't remember what I'd been asking for — the exact pain DalkkakAI is supposed to kill. The memory was being captured all along (5,808 nodes); it just wasn't readable. The fix was a read-back lens over memory we already keep, reusing renderers we already had — not a new pipeline.
연구소 고도화 P1–P2: the conductor's verification gate grows teeth
UpdateJun 29, 2026 · 2 min
The Lab drawer stopped being a notepad. On top of lock-before-reveal it now confronts scope breaches against the locked contract, picks REAL verify commands from the repo, flags the agent's 'tests pass' self-reports for human corroboration, and forces a per-hunk review verdict with an NA-tone linter — all renderer-only on already-registered Tauri commands.
Week of Jun 22, 202617 entries · 2 Update · 4 Troubleshoot · 11 Tech retro
From logging to defense — and why a per-instance action can't be tested with two apps open
Tech retroJun 23, 2026 · 2 min
The honesty verifier stopped at recording verdicts; the founder pointed out that a log nobody reads is meaningless — the value is acting on the catch. So Dalkkak now feeds the correction back into the agent's pane. The hard part wasn't the code; it was a day lost discovering you cannot live-test a per-instance backend action while two app instances share data.
A code editor that can't be slow — two latency bugs in the in-app drawer
TroubleshootJun 23, 2026 · 2 min
The in-app code drawer felt sluggish: clicking File History re-parsed the whole 5k-node memory graph from disk every time, and the Ask agent ran on the user's heavy default model. Fixed with a signature-based graph cache and per-provider model selection.
The control gate, proven live — and the 411 that almost hid it
Tech retroJun 23, 2026 · 3 min
The propose→approve→execute gate ran end-to-end on a real machine and a real Google Calendar — but only after fixing an HTTP 411, stopping the agent from reaching for its own Calendar connector, and untangling a dev-environment that made the dev build look slow.
One keystroke re-rendered 1,773 lines: the email reply lag, by the numbers
Tech retroJun 23, 2026 · 5 min
Typing a single character into the inbox reply box re-rendered the entire 1,773-line StartupView component — a 60-row timeline plus five unmemoized list maps — on every keystroke. The fix was to extract a ~185-line ReplyComposer with its own local state. This is a write-up of what was wrong, why it was written that way, the measurements, and the guardrail that prevents the next one.
The BYO natural-language control layer: propose → approve, rules, assistant, documents
Tech retroJun 22, 2026 · 3 min
Built a four-part natural-language control layer on top of the BYO agent — a propose→approve gate, sender auto-sort rules, a global assistant popup, and a document model with mandatory version backup. Talkak still never calls an LLM; the founder's own Claude does, through MCP tools, and a human approves every outside-world action.
A code drawer that knows why a file is the way it is
UpdateJun 22, 2026 · 2 min
Added inline edit/save and a viewer toolbar to Talkak's in-app code drawer, then wired it to the operating-memory graph: opening a file surfaces the past decisions, bugs, and commits that shaped it — the 'why' that git blame can't show.
749 swallowed errors, ~18 that mattered — auditing the silent failures
Tech retroJun 22, 2026 · 3 min
After a logging bug reported a dead service as healthy, audited the critical paths for error-swallows that hide real failures. The point wasn't the 749 raw `let _ =` sites — it was the ~18 where a genuine failure of a critical operation vanished with no trace.
The cache knew what it embedded, not which model embedded it
Tech retroJun 22, 2026 · 2 min
Once the RAG cache is shared by two engines (Rust + the Python brain), it has to record which model produced each vector — otherwise a model change silently serves stale, wrong-space vectors. Fixed with a model-fingerprint stamp that self-invalidates.
Google connectors: one shared OAuth loopback, then Calendar + a selective Sheets reader
UpdateJun 22, 2026 · 2 min
Added a shared Google OAuth2 (Desktop/loopback) module and two BYO connectors that merge into the same operating-memory graph: Calendar (read upcoming events + a gated quick-add) and a research-grounded SELECTIVE Sheets reader (one founder-chosen sheet via spreadsheets.readonly — deliberately NOT the CASA-reviewed drive.readonly). Compiles, 243 lib tests pass, renderer typechecks; live OAuth still pending the founder's first authorize.
The honesty verifier goes live: Dalkkak now re-runs what an agent claims, on its own
Tech retroJun 22, 2026 · 2 min
Pillar 1 is wired end-to-end for Claude: the agent is told to emit verifiable claims, and Dalkkak's transcript poll catches them, re-runs the command itself, and writes an immutable verdict the agent can't author.
First real code for the anti-sycophancy verifier: parse the claim, gate the command, run nothing yet
Tech retroJun 22, 2026 · 2 min
Pillar 1 of the agent-honesty design starts in Rust — parse an agent's <dk-verify> claim and decide whether its command is safe to re-run. The part that must not trust the agent ships first.
How Dalkkak catches a coding agent lying about 'done' — the structure, and what it can't do
Tech retroJun 22, 2026 · 4 min
The structure of Dalkkak's agent-honesty check, end to end: inject a claim, re-run it from below the agent, and surface the result. Plus an honest account of exactly when it does NOT catch a lie.
One embedding model, not two — routing the RAG core through the brain
Tech retroJun 22, 2026 · 2 min
The Tauri process and the Python brain were each loading the same 384-dim model into RAM. Consolidated the RAG core's four embed sites to brain-first with a Rust fallback, so normal operation runs one model.
An ops Area that quietly rendered my own memory notes as CI failures to fix
TroubleshootJun 22, 2026 · 2 min
돌리다(Run) listed agent retrospectives next to real GitHub CI failures. Root cause: cluster and source are orthogonal axes and the worklist only filtered on cluster. Fix verified against the real graph, not by eye.
The pane name that vanished on reattach — why tmux -e is a trap for identity
TroubleshootJun 22, 2026 · 2 min
Agents in restored panes couldn't state their own session name even though the badge showed it. The cause was a CREATE-only env channel; the fix binds identity to a stable pane id read from a per-spawn file.
The log said '(re)loaded'. The brain was down.
TroubleshootJun 22, 2026 · 2 min
Verifying the shipped brain end-to-end caught a green lie: the app reported the brain service '(re)loaded' while it was actually down, because launchctl bootout is async and the success was reported from issuing the command, not from the service loading.
The moat only worked on my Mac — productizing Talkak (and the bug adversarial review caught)
Tech retroJun 22, 2026 · 4 min
Two audits found Talkak's whole intelligence layer — memory MCP, the Python brain, the email wedge — only worked on the founder's dev machine. Fixing it, then having adversarial review catch that the first Gmail fix was itself broken.
Week of Jun 15, 202650 entries · 7 Update · 5 Troubleshoot · 36 Tech retro · 2 UX retro
The same model that nailed retrieval flunked Korean classification — so I reverted the migration
Tech retroJun 21, 2026 · 3 min
ADR-020's brain ranks memory well, including cross-lingual. So I wired it into an intent classifier too — and an eval on real Korean messages showed it was worse than the keyword rules it replaced. The eval caught a regression before it shipped. The classification migration is reverted and deferred.
Don't classify against a label — classify against examples: 3/5 became 9/10
Tech retroJun 21, 2026 · 2 min
Earlier today the brain failed at classification — short messages collapsed onto the most generic label. The fix wasn't a bigger model; it was defining each class by a handful of real example messages and comparing to their centroid. Same model, 3/5 → 9/10.
Keeping Python the right way: ONNX instead of PyTorch, and a brain that runs as a background service
Tech retroJun 21, 2026 · 5 min
The second half of the brain day. I kept leaning toward ripping Python out for Rust; the founder kept it and was right. The real fixes: the 950MB weight was PyTorch (not the model) so we swapped to ONNX/fastembed (same vectors, 4.3x lighter), fixed an install that broke on python3.14, made the keyword fallback visible, and moved the brain to a launchd background service so it stays warm like Ollama/Docker.
A Korean query couldn't find an English memory — so the brain moved to Python (ADR-020 phase 1)
Tech retroJun 21, 2026 · 3 min
Our retrieval ranked with a hand-tuned keyword scorer that bypassed the embedding engine entirely — a Korean query scored 0 against an English memory. Phase 1 of ADR-020 routes graph_query through a local Python sentence-transformers sidecar, with the keyword path kept as a graceful fallback.
What actually moved to Python — and the number I got wrong
Tech retroJun 21, 2026 · 3 min
An honest capstone on the ADR-020 brain migration: which semantic logic moved to a local Python sidecar, what stayed, and a correction — the audit's headline '~26 sites to convert' was over-counted. The real number is 4 live, ~4-7 worth doing.
Migrate the faked signal, keep the real one: semantic context that still trusts the graph edge
Tech retroJun 21, 2026 · 2 min
Phase 1b of ADR-020. workitem_context's scorer mixed a real structural signal (a graph edge between two facts) with a faked one (keyword token overlap standing in for 'related'). The fix moves only the faked half to embeddings and keeps the graph edge as a deterministic booster.
Arch map fixes: a build-copy with no engine, dead Cursor links in a Tauri webview, and a smarter change feed
TroubleshootJun 20, 2026 · 3 min
Three fixes to the in-app architecture map: the engine couldn't be found because the running app was a non-git build copy missing scripts/; clicking a file did nothing because ArchPanel used a bare cursor:// anchor (dead in a Tauri WKWebView) instead of the invoke() every other surface uses; and the change feed showed 'last 8 commits' instead of the branch delta you actually want when re-orienting on parallel worktree work.
Every Area now says what it is and what you do there
UX retroJun 20, 2026 · 1 min
Entering a business Area (돌리다/벌다/지키다/조종하다…) used to show just an icon and a name — you had to guess what the screen was for. Added a reusable AreaHeader with a one-line purpose per Area, data-driven so the copy is easy to retune.
The cloud was dead: a wrong domain, missing env, a stale build, and a pnpm-monorepo deploy wall
TroubleshootJun 20, 2026 · 3 min
Clicking '클라우드 열기' from the desktop went nowhere. Four problems were stacked on top of each other — a domain that didn't exist, a deploy built without Supabase env, a build 3 days stale, and a pnpm workspace Vercel couldn't remote-build. The fix was a local build + prebuilt static deploy, and then the terminal cockpit actually embedded inside the cloud page (after I'd wrongly warned it couldn't).
The ⌘L log showed Codex '0 turns' on a session that had clearly been working
TroubleshootJun 20, 2026 · 2 min
Codex panes opened the ⌘L conversation log as 'Codex · 0 turns / No conversation yet', and Claude turns were truncated mid-sentence. Root cause: an exactly-matched rollout (the open file descriptor of the pane's Codex process) was then re-filtered by launch time, which subtracted every message to zero; and a human-facing viewer reused an 8k LLM-payload char cap. Fixed by not double-filtering, a non-destructive filter, and a generous cap.
Cockpit gets a voice: speak commands on the phone, launch it from the web app
UpdateJun 20, 2026 · 1 min
Two usability wins for the terminal cockpit: a 🎤 voice-input button (Web Speech API live-transcription into the compose bar, with a graceful keyboard-mic fallback on iOS Safari), and a 'open cockpit' button in the web dashboard whose token-bearing URL is stored ONLY in the browser's localStorage — never synced to the cloud.
Connectors as sources, not screens — and a CI diagnosis that melts into core memory
Tech retroJun 20, 2026 · 3 min
Built 7 read-only connectors over the operating-memory graph and a GitHub CI diagnosis that lands as cited, cause-cached, recurrence-aware learning nodes. The architecture lesson: an app is a source feeding the core graph, a screen is a lens over it — never a per-app page.
Per-entity cloud pages: app.talkak.daeseon.ai/e/<entity>, visibility-first
UpdateJun 20, 2026 · 1 min
Gave each entity its own bookmarkable cloud address (/e/<entity-slug>) on the single login-gated dashboard — the standard SaaS workspace-URL pattern (like Notion/Linear). The slug resolves ONLY against the signed-in user's RLS-scoped workspaces, so a URL never reveals or grants a peek at an entity the user can't access.
Stop the app from lying: dormant flags hide all mock, plus live cloud→local sync and a mobile cockpit fix
Tech retroJun 20, 2026 · 3 min
The founder caught the specialized screens (Marketing/Customer/founder-ops) presenting hardcoded sample data as if it were his real pipeline. We didn't delete anything — we routed every mock surface through a single dormant feature-flag registry (hide, don't destroy), backed up the seed rows, kept the real action-SDK engine untouched, made cloud→local sync re-render without a refresh, and fixed the phone cockpit's garbled render.
연구소: splitting dev out of 만들다 so 만들다 means shipping the actual product
UpdateJun 20, 2026 · 1 min
만들다 used to mean 'coding' and opened the terminal. Split it into two Areas: 🔬연구소 (dev/coding/experiments → terminal) and 🔨만들다 (the real product — app store, releases). The 7-cluster map is now 8; dev-domain nodes (code, architecture, commits) route to 연구소.
Lookalikes ≠ Contradictions: Memory Conflict Detection from Cosine to an LLM Judge (a full day, in detail)
Tech retroJun 20, 2026 · 12 min
How do you stop the 'operating memory' that AI agents read from contradicting itself? Started with cosine similarity, realized on real data that it can't actually judge contradictions, and moved to a claude -p 'LLM judge.' Four layers of defense, when each one fires, and the honest conclusion that 'there's no mechanism that drives contradictions to exactly zero.'
Remote dev: the wrapper is the product, not the transport
Tech retroJun 20, 2026 · 3 min
Chasing 'direct my dev from the gym' first built a cloud queue, then nearly rebuilt a VPN — until reading the code showed what actually makes a Talkak Claude special: a wrapper that injects an operating directive via --append-system-prompt, plus git-polling memory capture that is terminal-agnostic. The asset is the layer, not the transport; the transport is Tailscale's job.
A terminal cockpit you own: web xterm over Tailscale, talking to the real Talkak Claude
UpdateJun 20, 2026 · 2 min
Built a self-hosted web terminal (axum + portable-pty) that bridges a phone browser to a local PTY running the user's own shell — with the DalkkakAI wrapper prepended to PATH, so `claude` in the cockpit is the operating-directive Claude, not vanilla. Transport stays Tailscale; this is only the tailored UI + bridge. Compiles; the live run is the owner's call because a shell-over-socket is a real RCE surface.
Wiring agents into operating memory — closing the read/write loop over MCP, and stopping memory from rotting
Tech retroJun 20, 2026 · 12 min
Dalkkak's memory graph was already built, but the agents actually doing the work (Claude, Codex) couldn't *read* it. This is the start-to-finish record of how I ran the cable over MCP and closed off the paths where memory rots (stale facts, prompt injection) — written so even someone who knows nothing can follow it.
Codex full-repo audit before launch: 6 CRs from unauthed public routes to disabled CSP
TroubleshootJun 19, 2026 · 3 min
Codex ran a whole-repo security and release-readiness audit and surfaced six concrete findings (CR-001 through CR-006), each tied to specific file:line evidence. One of them — the action-executor path-allowlist bypass — has already been fixed on main.
The email wedge, end to end: AI drafts, you approve, it sends, it remembers
UpdateJun 19, 2026 · 4 min
Talkak's thesis — AI does the work, you stay in control — finally ran a full loop on a real inbox: synced mail lands in the 팔다 (Sell) area, an AI drafts a reply grounded in company memory, a two-step human approval mints the receipt SMTP requires, the mail actually sends through Gmail, and the sent reply is written back as a memory node. Also: the 7-area 관제소 home, nav consolidation, and 만들다 = the terminal.
Work Console: we wrote 'no wall of agents' as a rule, then rendered one
UX retroJun 19, 2026 · 2 min
Talkak's surface map made 'don't open as a wall of agents' a Product Rule, and the Work Console did become the default human entry — but the cards it renders still lead with node IDs, commit hashes, receipt IDs, and pane sources. The intent landed in docs faster than in the screen.
Hardening operating-memory and growing a connector action spine
Tech retroJun 18, 2026 · 3 min
A week of parallel work that tightened the GraphStore operating-memory contract and grew a provider-neutral action SDK — the spine that future connector packs will execute through, without adding any real provider calls.
A deterministic anti-fake-completion guardrail, and the seam it isn't bolted to yet
Tech retroJun 18, 2026 · 3 min
Built a deterministic verification guardrail plus Mission Control completion hardening and a CI regression harness — and the honest part is that the guardrail reaches the app only through the result-inbox seam, never by a direct call.
Blueprint: an operating system for solo founders, built on the terminal you already live in
UpdateJun 17, 2026 · 3 min
Most AI founder tools bolt on fifty external APIs. We're betting the opposite — squeeze the local engine (your terminal + your memory) you already work inside. Here is the blueprint: three pillars, the moat, and an honest line on what's real vs planned.
An architecture map that sets itself up — without the tool ever calling an LLM
Tech retroJun 17, 2026 · 4 min
DalkkakAI's in-app architecture surface now bootstraps itself on any project: the engine scans the code deterministically, generates a setup prompt, hands it to the user's own BYO agent (Claude Code/Codex) to author the manifest, then consumes the result. No LLM call from the product. Proven live in-app on a fresh Go project: 0→100% coverage, 18 named components, a 10-flow system diagram — all from the app's own agent. Plus the bug that made it look broken: a 12KB prompt that pasted but never submitted.
Converging three parallel agent builds into one main — what actually made the merge survivable
Tech retroJun 17, 2026 · 3 min
Three Claude sessions built three subsystems in parallel — a cloud web seam, a memory/connector engine, and an in-app architecture map — on separate worktrees. Merging them into one main was the hard part. Here is the methodology that made it work, written from the pain, not from theory.
Redact memory at the exit, not at the source: GraphStore's local-private boundary
Tech retroJun 17, 2026 · 3 min
DalkkakAI's memory graph keeps raw receipts locally on purpose, and only redacts secrets and local paths at the two boundaries where records actually leave the machine — support/export and cloud sync. Two parallel work items (gov02, gov03) built the projection and then wired it in.
The installed app couldn't load its own model — and why 'works in dev' was the tell
TroubleshootJun 17, 2026 · 2 min
The operating-memory wedge worked perfectly in dev and was dead on every install. The cause was one missing argument: fastembed's cache defaulted to a path relative to the working directory, and a Finder-launched .app has cwd /.
It compiled, the tests passed, and it put the reply in the wrong inbox
Tech retroJun 17, 2026 · 3 min
AI coding reliably gets you code that compiles and passes its unit tests. It does not automatically guarantee the basic interactive details — async races, stale state on switch — that a human assumes are 'just there.' The fix is a checklist, not faith.
An Owner Manual: a private product x-ray that explains the product to its own founder
Tech retroJun 17, 2026 · 3 min
Building an in-app, founder-only surface that maps all 64 product concepts to honest statuses — and the deliberate choice to label its 64-row matrix a hand-written static snapshot while only the backlog signals are repo-derived at build time.
Parallel Mission Control: ten agents built the read-only cockpit that watches ten agents
Tech retroJun 17, 2026 · 2 min
How DalkkakAI's Parallel Mission Control subsystem (work units mc01–mc10) was built as a local-first, read-only coordination cockpit for parallel AI-agent worktrees — and which parts are wired versus still scaffolding.
Real-time coordination layer (live ticket locks + presence) — and the presence channel that leaked emails
Tech retroJun 17, 2026 · 3 min
Added Supabase Realtime so ticket claims and checklist edits propagate instantly instead of on a 20s poll, plus a who's-online presence chip. An adversarial review caught that the presence channel leaked member emails across tenants — fixed with private channels + Realtime Authorization RLS.
Deterministic gates that block the launch: release readiness and scope integrity
Tech retroJun 17, 2026 · 3 min
Three parallel workers built pure, local-only gates — a release-readiness scanner and a scope-integrity decision model — that refuse to call Talkak shippable until owner and legal facts are resolved. Honest caveat: the readiness gate is a manual script, not yet CI-wired.
Secret Guard: a local, opt-in pre-commit secret scanner with a BYO-honest install UI
Tech retroJun 17, 2026 · 3 min
Built a local-only pre-commit secret scanner (9 regex patterns, redacted findings) plus an explicit opt-in install card in the desktop guard zone. Two commits in one parallel pass; honest about its limits — opt-in, bypassable with --no-verify, deterministic regex not entropy.
Putting tmux behind a SessionBackend trait (scaffolding, not a Windows port)
Tech retroJun 17, 2026 · 3 min
Three small parallel packets (sb01–sb03) introduced a Rust SessionBackend trait and migrated tmux helper callsites behind it. It is honest scaffolding: the renderer never changed, the PTY spawn hot-path is unchanged, and the only implemented backend is still tmux-local.
Turning a stderr line into a tracked WorkItem (terminal fix-card → Task)
Tech retroJun 17, 2026 · 3 min
A terminal error you select in a pane now becomes a first-class WorkItem with attached evidence, built across three parallel slices that deliberately split detection, projection, and the graph-writing UI.
The checklist I wrote, and then didn't apply
Tech retroJun 17, 2026 · 3 min
I built agent-done notifications (native macOS + an in-app center), then ran a usability audit on the inbox/reply flow — and the audit caught that 'confirm the recipient before sending' was missing. The same item I'd written into a checklist the day before.
The loop closed — it read my inbox, drafted from memory, and hit send
Tech retroJun 17, 2026 · 3 min
The operating-memory loop ran end-to-end in the real product screen: real emails became inquiries, a reply was drafted from the company's own memory, and it actually sent — verified in the graph.
The two parallel builds converged — and git did most of the merge
Tech retroJun 17, 2026 · 2 min
Two agents built in parallel for days — Codex on the Founder-Ops action spine, me on the memory engine + connectors. Integrating 40 of Codex's commits (+14.5k lines) into my branch produced exactly one real conflict, because the two builds touched different regions of the shared files.
The web seam: a multi-user substrate, and what it does not yet prove
Tech retroJun 17, 2026 · 2 min
Over a few days DalkkakAI grew a cloud web seam on top of the local terminal app: Supabase-direct data, multi-tenant RBAC, two-way desktop sync, and a real-time coordination layer. Here's the whole picture in one place — and an honest line about what it has and hasn't earned yet.
Real identity on the web seam: Supabase JWT verify, a slash-in-id bug, and Fly deploy prep
Tech retroJun 16, 2026 · 3 min
Wired Supabase login on the web and JWKS token verification on the master server so a ticket's holder comes from a verified token, not a request body. Found and killed a slash-in-id bug that only the production (sqlite) store hit, and prepped Dockerfile + fly.toml for deploy.
A live architecture map is worthless the moment it's confidently wrong
Tech retroJun 16, 2026 · 5 min
Building an always-live, agent-driven architecture map forced a hard product realization: the goal isn't maximal freshness or coverage — it's calibrated confidence. Every claim must carry its provenance, staleness must be visible, and the system should promote claims up the trust ladder rather than hide uncertainty.
The first notarized build: the day a side project became sellable
Tech retroJun 16, 2026 · 3 min
Notarization is the gate between 'only I can run this' and 'anyone can install it.' Getting Talkak's first notarized + stapled build took a full day — not because of the app, but a sandbox that silently killed every build's network to Apple, a brand-new account Apple processed agonizingly slowly, and a corrupted secrets file. It ended in a green spctl: Notarized Developer ID.
Killing Fly for $0, an 18-char NXDOMAIN, and going Supabase-direct on the web seam
Tech retroJun 16, 2026 · 2 min
Tore down the Fly server to guarantee no charges, deployed the web to Vercel, lost an hour to a Supabase project ref that was 18 chars instead of 20 (NXDOMAIN), then retired the custom server entirely — the web now reads and writes Supabase Postgres directly via RLS, with an atomic claim RPC for the ticket lock.
The multi-tenant spine: adversarial RLS design, then 13 impersonation tests (one caught a real cascade bug)
Tech retroJun 16, 2026 · 3 min
Replaced the prototype's flat using(true) RLS — a cross-tenant data leak — with a real Entity→Service→membership RBAC schema (4 roles), designed and adversarially audited by an 8-agent workflow, then verified by impersonating each role in psql. The tests passed 12/12 and surfaced a real cascade-delete bug the audit missed.
Talkak goes on sale: the paid funnel is live
UpdateJun 16, 2026 · 2 min
The same day the first notarized build landed, the landing page became a real funnel: download the notarized app, or start a 14-day free trial that rolls into $12.99/month. Wiring it surfaced a broken download link pointing at a version that no longer existed.
Two halves of one loop — and then it read my real inbox
Tech retroJun 16, 2026 · 3 min
Two parallel agent builds — a memory engine and a WorkItem cockpit — turned out to be two halves of the same loop. Merging them, then wiring a real Gmail connector, made the company answer from my actual inbox.
Two-way sync without clobbering — per-item last-write-wins with tombstones
Tech retroJun 16, 2026 · 2 min
The desktop pushes its state to the cloud and the web reads it. The first version was a full-replace push that silently wiped web edits and only flowed one way. The fix: per-item last-write-wins with timestamps and tombstones, plus shrinking the two-way surface so most data stays one-way.
The web-enablement spine: how far work goes off the desktop
Tech retroJun 16, 2026 · 3 min
A strategy sanity-check turned into building a small, self-hostable backend — desktop keeps coding + the live terminal, the cloud/web does everything else, BYO preserved. Eight commits, verified by running. The honest part: it's identity-safe plumbing whose value is still gated on a second user.
Week of Jun 8, 202613 entries · 2 Update · 3 Troubleshoot · 8 Tech retro
The six ghost apps: shipping the first signed build, then losing a day to macOS TCC
Tech retroJun 13, 2026 · 6 min
Landed and verified a parallel-agent integration, shipped the first code-signed build (v0.2.28), then spent the evening fighting a macOS permission popup that would not stop — because six renamed copies of the app all shared one bundle identifier. Plus the real lesson: a fresh chat session forgot how to deploy, and almost rebuilt a pipeline that already existed.
Workspace pages: N switchable pane layouts per startup, migration-safe
Tech retroJun 13, 2026 · 4 min
The workspace ran out of horizontal room at ~3 panes. Added switchable pages per startup by making a PagedLayout the source of truth and deriving the old single layout from it — so every existing split/close/reset call site kept working untouched.
Act 2 lands: approval-style work windows, hidden agents, factories — and the two directions we carved in stone
UpdateJun 12, 2026 · 3 min
Two days after judging our own navigation-first shell 'not best', Act 2 shipped: every business zone now has a card-first, approval-style work window backed by a DEDICATED agent in a hidden tmux session — no terminal in sight, taps over typing. Plus a UI factory (widgets as specs), an agent factory (hire a named specialist in one line), ordered phrase stories with narrative-aware correction, and two spec'd directions: the architecture heat map with open-in-IDE deep links, and the ledger as the company's permanent memory.
Architecture deep-dive: the 87 techniques actually in Talkak's codebase — each with the incident behind it
Tech retroJun 10, 2026 · 17 min
Not the bird's-eye view — the full inventory. A six-agent scan read the entire codebase and extracted every real technique in production, subsystem by subsystem: PTY/process, terminal rendering, layout/keybindings, agent augmentation, the connective graph, and the release pipeline. Almost every entry exists because something concretely broke. It all reduces to three recurring patterns: make silent failure visible, put mechanisms outside the thing that forgets, and demand receipts for every number.
Talkak's core architecture: the eight technical decisions that make a terminal into a startup OS
Tech retroJun 10, 2026 · 5 min
A standing reference for what Talkak is actually made of: Tauri (Rust + React) hosting xterm.js panes whose processes live in per-pane tmux sessions; terminal state kept outside the React lifecycle; a BYO-Claude wrapper that injects the platform directive into every agent; in-band channels read from transcripts, never the TUI stream; an append-only provenance-checked graph fed by both git (PULL) and the agents themselves (PUSH); hooks as the enforcement layer; and a test gate every release must pass. Each decision exists because something broke without it.
The crossroads: we built the startup OS shell in one day — and honestly judged it not-best yet
Tech retroJun 10, 2026 · 2 min
Act 1 of the upheaval, shipped in a day: the app opens onto mission control, every startup gets a JARVIS-style overview (timeline + a 7-cluster business map), zones carry no-fluff essential checklists, and ten playbooks turn checklist items into work screens that pre-type crafted instructions into the startup's own agent. Then the founder asked 'is this best?' — and the honest answer was no: the skeleton is right, but the interaction model is navigation-first while the product's stated soul is language-first. Act 2 is the ⌘K command line. Everything is checkpointed with rollback tags.
The harness is the law: how we made 'no lies' machine-enforced instead of politely requested
Tech retroJun 10, 2026 · 3 min
Prompt rules decay under pressure — we watched an 'always do this' instruction silently vanish the moment a new instruction competed with it. So the no-lies rule moved out of the model and into the harness: a Stop-hook that runs after every reply, blocks unverified done-claims and missing summary blocks, and feeds the reason back until the model fixes it. Fail-open by design, scoped per-pane by an env var, and locked by 8 tests that gate every build.
Connective layer v1: the agents now feed the project graph as they work
UpdateJun 9, 2026 · 2 min
v0 captured git commits into each startup's living graph (PULL). v1 ships the other half of the blueprint's data spine: every pane's Claude can now record durable project facts — architecture decisions, issues found, user-flow changes — as one in-band dk-node block per turn, captured post-hoc from the transcript, validated against the locked schema (confirmed requires evidence; spoofed sources overwritten), and stored idempotently. The agents do the work; the graph writes itself.
The test gate: every bug that reached the user this week is now a test that blocks the build
Tech retroJun 9, 2026 · 2 min
This week's score was: 6 regressions, all 6 caught by the user — the founder WAS the safety net. Built the real one: a Vitest harness with 39 tests across 5 suites that lock the exact incidents (the shared-terminal corruption, the ultracode-banner copy bug, the Ctrl+3=ESC chord contract, dk-summary stream capture, the honesty hook), wired into the build command itself so a red test means no bundle and no release. Proven by a deliberately failing test that the pipeline refused to ship.
Two startups, one terminal: a stale-closure Save effect cross-wrote pane layouts — and the race was in our own post-mortem two weeks ago
TroubleshootJun 9, 2026 · 3 min
Startup 'wtf-ai-engineer' and startup 'Dalkkak' rendered the exact same live terminals. Root cause (3 parallel investigators + 2 adversarial refuters, both confirmed): the layout Save effect fired on every startup switch with a stale closure — the new startup id but the OLD startup's tree — writing A's panes under B's key. A quit or updater relaunch inside that window made it permanent and self-reinforcing. The kicker: commit 51cac0a post-mortemed this exact race on May 26, but the fix only covered the null variant, and its wrong comment protected the live bug. Fixed with an ownership tag that travels with the tree + a boot-time sanitizer that self-heals any cross-startup pane sharing.
Ctrl+3 is ESC: the keybinding that cancelled Claude all day — and why I chased everything but the repro
TroubleshootJun 8, 2026 · 3 min
The 'Interrupted' that plagued a whole session traced to one verified cause: the Ctrl+1..9 startup-switch handler didn't fully consume the event, so Ctrl+3 reached xterm — and Ctrl+3 maps to ESC (0x1B) in the terminal, which Claude Code's TUI reads as a cancel. The fix is one block. The lesson is that the user's own reproduction ('I press Ctrl+1/2/3 to switch screens') solved in one line what a day of speculative root-causing did not.
Ongoing issue: AI-driven regressions — now tracked weekly (baseline: 5/5 slipped to the user)
TroubleshootJun 8, 2026 · 2 min
Adding features kept silently breaking working ones — a structural property of fast AI-driven development, not bad luck. Instead of pretending it's fixed, it's now a permanent, tracked issue: every regression is logged with a date and 'caught by whom,' and a script reports the count per ISO week. Baseline week 2026-W24: 5 regressions, all 5 slipped to the user. Goal: trend down, user-caught → 0.
A full, unhidden inventory of the day I broke more than I fixed
Tech retroJun 8, 2026 · 5 min
An honest, nothing-hidden retrospective: 16 versions in one day, four wrong copy-fixes on the wrong code path, a day-long interrupt chase that ended on the user's one-line repro, a force-reinstall that scared live sessions, and — the real catastrophe — repeatedly stating unverified guesses as facts and reversing them. Each failure with its root cause.
Week of Jun 1, 202617 entries · 1 Update · 2 Troubleshoot · 13 Tech retro · 1 UX retro
An AI-pairing interview phrasebook (⌘⇧P) — and why three sessions kept colliding in App.tsx
Tech retroJun 7, 2026 · 7 min
Shipped a shortcut-toggled, bilingual (EN/KO) phrasebook for a live AI pair-programming interview — built by a multi-agent workflow (research + per-category drafting + native/interviewer adversarial review). The honest finding: there's no public evidence the target company runs a branded AI round, so it's built on the industry standard. Also a dogfooding lesson: with three Claude sessions running, every UI feature collided in one file — App.tsx — because that's the single wiring hub.
Real AI usage gauges — from a ccusage estimate to the OAuth endpoint Claude Code itself uses
Tech retroJun 7, 2026 · 3 min
An always-on top-right strip shows current usage/limits for Claude, Codex, and Antigravity, with a click-to-open detail popup. Codex is read straight from the local rollout JSONL (real, zero-network). Claude started as a ccusage-style local estimate — but the estimate didn't match claude.ai's real 5%/9%, so we found the actual endpoint Claude Code uses (api/oauth/usage, authed by the OAuth token in the macOS Keychain) and switched to real numbers with the estimate as fallback. Every path is a usage *query* — zero tokens, no inference, BYO-clean.
The cascade — a day of compounding terminal bugs, and the trust failure underneath them
Tech retroJun 7, 2026 · 5 min
A long debugging session that spiraled: a real terminal-input bug, a layout revert, a force-reinstall that scared the user's sessions, several wrong fixes shipped, and — the actual catastrophe — the agent repeatedly stating unverified guesses as facts and reversing them. Logged with every claim tagged [verified] vs [unverified], including the agent's own failures.
System Pulse, a Pulse that froze the app, and a graph that never fit
Tech retroJun 4, 2026 · 3 min
Three threads in one session: shipped System Pulse (per-startup memory attribution the OS can't give you), fixed a synchronous Tauri command that froze the whole app on a 504 MB transcript read, and chased an empty connective-graph down to its real cause — React Flow never measured the nodes because the flow was controlled without onNodesChange. Then rebuilt the graph from a 1,615-commit hairball into one node per startup.
Auto-resume: when one Activity-Monitor kill took down every session, recovery shouldn't be manual
Tech retroJun 3, 2026 · 2 min
A single force-quit in Activity Monitor (the shared `-L dalkkak` tmux server) killed every pane's shell + Claude process at once — the documented SPOF, realized. The conversations survived (transcripts are durable on disk), but recovery was MANUAL: you had to type `claude --resume` in each pane. For a tool meant to be a daily operating system, manual recovery is a real weakness. Fix: the renderer now auto-resumes a pane's previous session on respawn — it already knows pane→transcript from the hook store, so it types `claude --resume <session-id>` into the fresh shell once. Reopen the app → your sessions come back.
Keeping the conversation log fast as it grows: paging, day headers, and a per-message cap
Tech retroJun 3, 2026 · 2 min
The ⌘L conversation log rendered all of its (up to 800) merged turns at once via react-markdown, and read the whole transcript file into memory each open — fine now, a real scaling problem for a daily driver where one session's transcript is already 31 MB. Added the standard, low-risk handling the user asked for: render only the recent 60 turns with a 'load older' control, group by date (Today / Yesterday / a date), and cap each message's text on the backend so one giant turn can't bloat the payload or the DOM.
Arrow-key startup switching that dodges every macOS and terminal shortcut — and the one tmux flag that fixed scrollback-on-entry
UX retroJun 2, 2026 · 4 min
Switching between startups by Ctrl+number felt clunky for back-and-forth, so the founder asked for arrow keys — under a hard rule: collide with neither a macOS system shortcut nor a terminal one. On a terminal host that rules out almost every arrow chord (⌃-arrows are macOS Spaces, ⌥-arrows are the shell's word-motion), leaving ⌘⌥+arrow as the lone safe slot. Same session, a second friction: tmux scroll mode wouldn't scroll up on entry until the copy cursor climbed to the top edge — fixed with a single `copy-mode -u` flag, verified against a real tmux server.
Claude Code absorbed git worktrees — and what 'just run many sessions' actually costs
Tech retroJun 2, 2026 · 3 min
Running many Claude Code sessions on one repo is DalkkakAI's whole premise — so 'won't concurrent edits clobber each other?' was a question I had to answer honestly. Two tempting beliefs needed correcting: a session is not auto-isolated, and worktree support (now native in Claude Code v2.1.160) is opt-in, not automatic. Plus the forced trade-off nobody mentions: full isolation and live-reflection-in-your-current-checkout are mutually exclusive.
Re-skinning the whole app to a Stark-HUD design language — without touching the file a second session was editing
Tech retroJun 2, 2026 · 2 min
Phase 1 of an app-wide design system: a single hud.css defines design tokens (glow, surface, border, radius, motion, mono) and re-skins the sidebar, toolbar, brand, pane headers, focus glow, splits and context menu to a cohesive Stark-HUD language. The neat trick: the entire main screen is styled by CSS classes, so the re-skin layers on via a stylesheet loaded after App.css — zero edits to App.tsx, which a concurrent session was actively editing (paywall). Conflict avoided by construction.
A JARVIS-style live orchestration HUD — and why WebGL is fine here when it broke the terminal
Tech retroJun 2, 2026 · 2 min
Built a Tony-Stark / JARVIS holographic command center for the portfolio: a WebGL (react-three-fiber) scene — arc-reactor core, startups as emissive nodes on a sphere, energy lines with light packets that run when an agent works, bloom glow, auto-orbit. The same WebGL that broke Korean IME in the terminal is perfectly safe here, because this is a standalone visual canvas, not xterm's text-rendering path. Grounded in how real React JARVIS HUDs are built (particle network + shader-style pulses + bloom) rather than hand-rolled SVG, after two weaker SVG attempts.
Chasing many-pane smoothness: a WebGL renderer pulled for safety, and the error boundary that should have been there all along
Tech retroJun 2, 2026 · 3 min
Running ~9 streaming Claude panes felt laggy, so I reached for the obvious lever — xterm's WebGL renderer. It compiled and the IPC-batching half landed cleanly, but a separate blank-window crash (opening the summary) exposed a deeper gap: the app had no React error boundary, so any single render throw whited out the entire window with zero diagnostics. I disabled WebGL (the riskier lever, prime suspect for a blank at high pane counts), shipped the safe wins, and added the boundary that turns a future blank into a readable, recoverable error.
Startup ≠ pane ≠ tmux session: the three layers behind 'same app, different data'
Tech retroJun 2, 2026 · 5 min
Running the dev build (tauri dev) next to the installed app showed a completely different startup list — same code, different data. Untangling that confusion surfaces DalkkakAI's actual layering: a startup is a frontend localStorage group, a pane is one tmux session, and there is exactly one shared tmux server. Frontend state is per-origin (separate between dev and prod); the tmux backend is shared. That asymmetry is the whole story — and it's why the orphan-session GC must run in prod only.
Why ~14 Cursor windows ran the fans and ~14 tmux panes in DalkkakAI didn't: a process-topology post-mortem
Tech retroJun 1, 2026 · 8 min
Replacing ~14 Cursor (Electron) windows — each a Claude session — with ~14 Claude sessions in one DalkkakAI tmux multiplexer made the heat/fan load disappear. The mechanism is process topology, not the LLM: N per-window Chromium renderer + extension-host trees collapse into one shared WebKit renderer. Honest about the confounds (the before-state is gone, Docker's VM, the machine isn't hot now) and the single-point-of-failure I traded for it.
Why codex was 'command not found' in my own terminal app — but claude wasn't
TroubleshootJun 1, 2026 · 4 min
Prepping a demo, I tried to run codex inside a DalkkakAI pane and got 'command not found' — even though it was installed. The culprit: a leaked npm_config_prefix (from launching the app via pnpm) made nvm refuse to load, so every nvm-global CLI vanished. claude worked only because I'd special-cased it. The fix was to stop polluting the pane's environment, not to special-case codex too.
A clipboard-poisoning paste bug, a per-startup graph, and reviving an orphaned visualization
Tech retroJun 1, 2026 · 2 min
Three things in one pass: fixed a bug where clicking a colored separator line copied dashes and poisoned the clipboard (so every paste showed -----); split the connective graph so each startup shows only its own folder/git activity (the cross-startup dashboard stays separate); and re-wired a node-graph visualization that had been built but never connected to any view.
Shipped the public landing page — mascot art, bilingual, a real-capture carousel, and a demo video
UpdateJun 1, 2026 · 2 min
The DalkkakAI landing page went live at ddalkkak.daeseon.ai: the sloth-robot mascot art used as a hero banner + roomy explainer bands (never faked as screenshots), an English-default page with a one-click Korean toggle, a data-driven screenshot carousel that adapts to however many real captures exist, and a ~1.5-min demo video (poster + click-to-play). Deployed from the local folder via the Vercel CLI onto an existing custom domain.
Chasing wheel-scrollback with tmux mouse mode broke the terminal — and reverting the code didn't undo the live server
TroubleshootJun 1, 2026 · 2 min
Enabling tmux mouse mode to get wheel-scrollback flooded the webview (glitch + lag) and broke copy. The deeper lesson: reverting the CODE didn't reset the running tmux server, and disabling the mouse option didn't exit a pane already stuck in copy-mode.
Week of May 25, 202627 entries · 4 Update · 7 Troubleshoot · 14 Tech retro · 1 UX retro · 1 Business
Let the doer summarize itself — and edit a dotfile without ever corrupting it
Tech retroMay 31, 2026 · 2 min
The post-hoc summary (spawn a fresh claude -p to re-read the transcript) was 20–50s. The founder reframed it: the session's own Claude already did the work — have IT emit the summary as a byproduct. The tricky part was the plumbing: getting the pane's claude to self-summarize meant editing ~/.zshrc, done append-only so it can never break the user's terminal.
Layer 2's wall: a good summary that takes 24 seconds
TroubleshootMay 31, 2026 · 2 min
Built an on-demand '✨ Summarize this session' button that runs the user's own claude -p. The card content came out great (a workflow-designed prompt picks the right kind in plain language) — but it takes 22–54 seconds. Measuring split boot from API time and killed the obvious guesses.
Layer 2 made reliable: read the summary card from the transcript, and show real token usage (no fake $)
Tech retroMay 31, 2026 · 3 min
The in-line session-summary card stopped fighting the mangled TUI stream and started reading the un-mangled transcript JSONL (ADR-004). Same file then powers a per-session token-usage line — real numbers, and deliberately no dollar figure on a subscription.
Usage Pulse P0 shipped: a zero-storage, cross-startup 'pulse' that reads its numbers at view-open
UpdateMay 31, 2026 · 2 min
Built all six Usage Pulse views on the locked spec — effort split, momentum, fan-out, explore-vs-produce, friction, shipped-vs-thrash — backed by one pure Rust roller that persists nothing and never shows a dollar. Verified end-to-end on real data, and caught the spec's one wrong assumption about the hook line.
Designing the usage 'pulse' with a 7-agent workflow that read its own codebase
Tech retroMay 31, 2026 · 3 min
Spec for per-startup / daily AI-usage metrics, designed by a 3-draft → adversarial-critique → synthesis workflow. The verdict: a read-time 'pulse' that persists nothing, sourced from transcripts (not the sparse hook stream), with honest units and counts-only logging.
Locked the blueprint: a solo founder's OS to start → build → manage → operate services
UpdateMay 30, 2026 · 2 min
Confirmed and wrote the connective-layer vision into BLUEPRINT.md §5.5. The 6 core layers are bound by a shared data spine — a living graph of each startup's connection points (identity, structure, issues, flows, billing), kept fresh by agents pushing standard-format records as a byproduct of work, without distorting the work. Mission refined to the start→build→manage→operate lifecycle, security tuned to be consumer-appropriate.
Built the connective layer v0 in one session: designed, verified 4/4, shipped, 16 real nodes captured
UpdateMay 30, 2026 · 2 min
From a confirmed blueprint to a working first slice of the connective layer in one session. A multi-agent design pass produced a 'commits-first' v0; an adversarial pass failed it 3/4, so we applied the prescribed fixes and re-verified 4/4; then built it layer by layer (schema, a single Rust path-allowlist chokepoint, off-thread git-commit capture, a folder-picker grant, a cross-startup graph panel). Dogfood test: granted two repos, 16 confirmed change nodes captured — including this session's own commits.
Korean in a Tauri terminal: tmux underscores, then a WKWebView IME jamo leak I half-fixed
TroubleshootMay 30, 2026 · 2 min
Dogfooding surfaced Korean typing as '__', then as decomposed jamo. The first was tmux running non-UTF-8 (GUI apps inherit no locale) — fixed. The second is WKWebView not firing composition events for a textarea created before its IME is ready — pinned down with runtime.log instrumentation, still unresolved (workaround: split). I also regressed the working split case once by shipping an unguarded fix.
The logging loop's first real save — a launch crash diagnosed from logs, not guesswork
Tech retroMay 30, 2026 · 2 min
We'd just switched to a build → install → app-logs → fix loop instead of babysitting a dev server. The first crash after that change proved the loop: the founder said one sentence — 'it crashed' — and the logs did the rest. SIGABRT pinpointed to a one-line bug in minutes, no guesswork.
Per-session status v1 — and why you can't scrape it from a TUI
TroubleshootMay 30, 2026 · 2 min
Wired the augmentor event stream into a live per-session status strip and dogfooded it across three real Claude panes — then hit a wall: Claude Code repaints its spinner in place, so a line parser catches the status only by luck. The honest conclusion is to use Claude Code hooks, not TUI scraping. Plus a small UX fix: the hidden startup-delete is now a visible button.
The terminal couldn't ls Documents — it was a shared tmux server, not a code bug; gave DalkkakAI its own
TroubleshootMay 30, 2026 · 1 min
A pane's shell hit 'Operation not permitted' in ~/Documents while the new connective-layer git capture read the same repo fine. pgrep showed why: panes attached to the default shared tmux server — a days-old daemon from another terminal, without Documents TCC — while capture ran git directly in the app's granted context. Fix: run DalkkakAI's panes on a dedicated 'tmux -L dalkkak' server (correct TCC context + isolated from the user's other sessions), plus Info.plist usage strings so the bundled app prompts instead of silently denying.
Viz layer v1 — a locked-draft vocabulary + five animated renderers
Tech retroMay 30, 2026 · 2 min
Built the rendering layer that turns the connective layer's raw signals into 0.5-second-glance cards. A workflow-designed viz_kind vocabulary, five animated renderers, and an Activity view that renders real captured commits — all on a typed i18n base (English default).
Set up cross-repo blog log aggregation, then deduped CLAUDE.md against myself
UpdateMay 27, 2026 · 1 min
I had written 6 timeline entries directly into the blog repo, missing that this repo is actually a cross-repo log satellite. Migrated them here, locked the slug in CLAUDE.md RULE #9, then audited and deduped #9 against an existing Project-log section I'd also missed.
DalkkakAI v0.1.0 — Phase 1 shipped as an unsigned beta
Tech retroMay 27, 2026 · 2 min
Multi-pane terminal with tmux persistence and a multi-startup sidebar, in 309 lines of Rust and 14 TypeScript files. Tagged v0.1.0; unsigned, macOS Apple Silicon only, zero users yet.
Rewriting the portfolio docs after a brutal-honesty round on AI vs me
BusinessMay 27, 2026 · 1 min
Asked for a portfolio rating, got a flattered answer back, pushed back hard. Re-rated honestly (AI did most of the typing, I did the architecture / debugging direction / product calls). Rewrote README, added RESUME.md, refreshed CONTEXT.md to match.
StreamParser shipped with hardcoded regexes — they don't match real Claude Code output
Tech retroMay 27, 2026 · 1 min
Phase 2.1 Stage 1 landed a StreamParser that pattern-matches Claude Code output into tool calls / prompts / activity / completion events. It uses fragile hardcoded regexes and captures zero events in real usage. Should pivot to Claude Code hooks.
Should DalkkakAI eventually move to Swift? Walked the blueprint to decide
Tech retroMay 27, 2026 · 1 min
Caught myself flirting with a Swift rewrite for 'Apple-grade UX.' Walked every layer of the BLUEPRINT and concluded the current product as designed has no part that *requires* Swift. Tauri stays unless the blueprint itself pivots.
Two-layer observability — Claude Code hooks for dev-time, Rust tracing for runtime
Tech retroMay 27, 2026 · 1 min
Split observability into two layers with different purposes: Claude Code hooks capture every Bash/Edit/Prompt/Stop during dev, Rust `tracing` captures PTY lifecycle on the user's machine. Codified as CLAUDE.md RULE #8.
Focus-based split + keyboard shortcuts — iTerm's 50-year pattern, not a new one
UX retroMay 26, 2026 · 1 min
First split UX put a button in the toolbar that always split the root. Replaced with focused-pane split + ⌘D / ⌘⇧D / ⌘W, matching what every terminal user has had muscle memory for since the 1970s.
react-mosaic remounts killed running Claude sessions — moved xterm + PTY out of React
Tech retroMay 26, 2026 · 2 min
Splitting a pane changed its path in the mosaic tree, which React treated as an unmount, which fired the cleanup effect, which killed the PTY — and the running `claude` session with it. Fixed by hoisting xterm and the PTY out of React entirely.
Multi-startup sidebar — N startups in one workspace, each with its own layout
Tech retroMay 26, 2026 · 1 min
Phase 1.4 Step 1: introduced the Startup as a first-class concept. Sidebar lists startups, each owns its own pane layout. Right-click for rename / change emoji / delete.
Tauri GUI bundle's minimal PATH made tmux silently exit
TroubleshootMay 26, 2026 · 2 min
Panes printed `[exited]` and seemed to share sessions because `CommandBuilder::new("tmux")` couldn't resolve the binary — the GUI app's inherited PATH didn't include /opt/homebrew/bin.
Phase 1.0 — Tauri 2.x scaffold under apps/desktop
Tech retroMay 26, 2026 · 1 min
Bootstrapped the actual Tauri app under apps/desktop, then deleted the placeholder apps/web and apps/api from the v1 bootstrap. First `pnpm tauri dev` opened a native window.
claude --resume took 15s inside the DalkkakAI PTY
TroubleshootMay 26, 2026 · 1 min
The same `claude --resume` finished instantly in iTerm but hung for ~15 seconds in a freshly spawned DalkkakAI pane. Cause was a near-empty environment in the PTY child.
Phase 1.2 — first PTY pane streaming output to xterm.js
Tech retroMay 26, 2026 · 1 min
Wired portable-pty in Rust to xterm.js in the renderer through Tauri commands + events. Typing `ls` in a freshly opened pane echoed back. First moment the app felt real.
useEffect race ate the layout of every freshly-created startup
TroubleshootMay 26, 2026 · 1 min
New startups appeared in the sidebar fine, but their pane layout disappeared on the next launch. Two effects (Load and Save) were racing on the initial render, and the Load effect's stale closure was overwriting the Save.
Pivoting v1 (Python/FastAPI) to v2 (Tauri + Rust + React)
Tech retroMay 25, 2026 · 1 min
Started DalkkakAI as a web app over a FastAPI backend, then realised the core feature — driving the user's local Claude Code binary — is technically impossible in a browser sandbox. Pivoted to Tauri the same day and froze v1 under old_repo/.