Active · Jun 7, 2026
ds-forge
A self-built interview-prep platform. The public Lab reproduces production database failures — N+1, connection-pool exhaustion, deadlock — on demand against a real Spring Boot + JPA + PostgreSQL/HikariCP backend, and visualizes data-structure internals over a deterministic 'typed state → SVG view → instant confirmation' engine. Next.js 15 + a containerized Java runner.
Reproduces N+1 / pool-exhaustion / deadlock against real Postgres + HikariCP · Data-structure internals visualized from typed state · Deterministic state → SVG rendering (reused from simlab) · Containerized Java runner, run-on-edit
- Role
- Solo (AI-pair-programmed with Claude Code)
- Stack
- Next.js 15 · React 19 · TypeScript · Tailwind · MDX · Spring Boot · JPA · PostgreSQL · Docker
A platform I built to prep for backend interviews, where every build doubles as a coding rep. The public surface is the Lab: interactive experiments you drive by turning up load or editing code and watching the result confirm itself immediately.
What's in the Lab
- Production-failure sandbox. N+1 queries, connection-pool exhaustion, and deadlock are reproduced on demand against a real Spring Boot + JPA + PostgreSQL backend with HikariCP — not simulated SQL. You turn up traffic or data volume and watch the failure happen, then the fix.
- Data-structure internals. Array, stack, queue, HashMap, and more, each visualized from the actual typed state rather than a hand-drawn diagram.
- Deterministic rendering engine. A single
typed state → SVG viewreducer drives every visual, so the same input always produces the same picture. The core is reused fromsimlab(circuit-breaker physics) and re-pointed at business-event state machines.
Why it looks like this
The spine is live visual confirmation: type data, get a deterministic view, see instantly whether it's right. That instinct — SVG from state, one-way layer separation — carried over from the blog and simlab, so there was no new rendering learning curve. Java runs for real through a containerized runner rather than being faked in TypeScript, which is the whole point of the DB-failure labs.
What it doesn't do
The Lab is the only public surface. The AI-pairing and system-design practice surfaces are gated and still unfinished — they came after the interview date, not before it. Backend labs need the containerized runner up (docker-compose: Caddy + Next + Spring Boot + Postgres), so the pure-frontend deploy shows the visualizers but not the live-Postgres labs.
Project log
Chronological record of troubleshooting, retros, and updates while building this.
Decisions & milestones
System Design Camp — widening the scope without buying the hype
DecisionJun 17, 2026 · 2 min
Built a /sdcamp page covering the full system-design spectrum across 6 layers, ordered by real importance. Started from a Gemini-provided 5-layer framing but corrected two things: added the design-method layer it omitted, and rejected its 'interview system design is only 20%' claim.
Consolidating AI concepts into /ai — dropping the lossy duplicate from /concepts
DecisionJun 15, 2026 · 2 min
The /concepts deck carried a derived copy of the 66 AI cards that had lost its model answers, so AI self-attack cards there showed questions with no answer. The copy was byte-identical to the dedicated /ai deck, so removed it and made /ai the single source for AI.
Cold gap-audit 4 days out: the content was ready, the graded rounds weren't drillable
DecisionJun 13, 2026 · 3 min
A 7-lens anti-flattery gap-audit found the platform's content was interview-grade but the actually-graded rounds (recruiter screen, ownership question, conflict story) had no practice surface or were mis-wired. With 4 days left, the call was to fill only data-only content gaps and refocus the nav, and to NOT build the new interactive features the audit suggested — drill instead.
Build log
Week of Jun 15, 202611 entries · 8 Update · 1 Troubleshoot · 2 Tech retro
Frontend vocabulary — the UI-pattern terms a backend engineer keeps not knowing
UpdateJun 17, 2026 · 1 min
The owner kept hitting basic frontend terms (toast, banner) and not knowing them. The deck had React fundamentals but no everyday UI-pattern vocabulary, so added 26 verified cards with TS/React/CSS code (not Java).
Spend limit reset — re-verified and shipped the remaining 32 should/nice cards
UpdateJun 16, 2026 · 1 min
The monthly Claude limit that blocked the verify pass reset, so re-ran a verify-only pass over the 32 held technical cards (all passed) and shipped them. 81 of the 89 should/nice cards are now live and fact-verified; the 8 personal-narrative ones stay held.
Filling the should/nice gaps — 49 verified cards shipped, 40 held at the spend limit
UpdateJun 16, 2026 · 1 min
Generated 89 cards for the remaining should/nice coverage gaps, but the monthly API spend limit was hit partway through the fact-verify pass. Shipped only the 49 that passed verification; the 40 unverified (incl. 8 personal-narrative cards) are held rather than shipped unchecked.
AskCard, persisted — each card becomes a personal learning log
Tech retroJun 15, 2026 · 1 min
The owner's real goal for the per-card ask-AI box was to record the discussion, not just get one answer — for each topic he keeps hitting things he doesn't know and wants the whole back-and-forth saved. AskCard now persists its Q&A per card to localStorage, so it survives closing the modal and reloads.
The per-card AI becomes a voice conversation, on every studyable surface
Tech retroJun 15, 2026 · 1 min
The owner wanted to ask and hear the per-card AI by voice — an actual conversation, not typing — and wanted it on system design and phrases too. AskCard now records by mic, transcribes, asks, and speaks the answer back, with the persisted history intact, and it now lives on concepts, AI, system design, LLD, and phrases.
Finishing the bilingual sweep — Move trade-offs and behavioral STAR get their English twins
UpdateJun 15, 2026 · 2 min
The standing rule is that every Korean study field needs an English twin. The Move Decks' trade-offs and applies-to notes and the behavioral STAR breakdowns were still Korean-only, so translated all 452 strings and rendered both languages.
Code walkthrough goes bilingual — and a sweep for the Korean-only stragglers
UpdateJun 15, 2026 · 1 min
The owner's standing rule is that every Korean field needs an English twin. The code walkthrough was Korean-only, so generated an English version 1:1 for all 202 cards and rendered both. A field-by-field sweep then surfaced the remaining Korean-only content to fix next.
Coverage audit — stop trusting a hand-built deck, measure what's missing
UpdateJun 15, 2026 · 2 min
The owner is prepping for an interview trusting only this deck, and asking concurrency terms surfaced that a lot was missing. Rather than patch ad hoc, ran a 9-domain coverage audit (canonical interview topics vs the real deck inventory) to make every gap visible, then started filling the MUST gaps — concurrency first (20 cards).
MUST-gap fill, batches 2-3 — JVM, DSA, distributed, LLD, and the one missing AI card
UpdateJun 15, 2026 · 1 min
Continued filling the coverage-audit MUST gaps: 31 more /concepts cards (JVM internals, MVCC, system-design estimation/scaling, DSA, distributed-systems depth, LLD patterns) and the one genuinely-missing AI card (vector indexing). 52 cards added total across the three batches.
Last 7 MUST gaps filled — and not fabricating a STAR to do it
UpdateJun 15, 2026 · 2 min
Closed the final 7 MUST-level coverage gaps across three decks (concepts, phrases, dbperf). Routed the trust-battery / no-surprises gaps to phrase cards (how to articulate them) instead of inventing behavioral STAR stories. MUST coverage is now complete; only should/nice depth remains.
Sparring + AI-audit moved to gpt-5 — and the empty-response trap of reasoning models
TroubleshootJun 15, 2026 · 1 min
Upgraded the two adversarial features (sparring, ai-audit) from gpt-4o to gpt-5. The first deploy 502'd with 'unparseable model response' because gpt-5 spent the entire token budget on hidden reasoning; fixed by raising max_completion_tokens and setting reasoning_effort low.
Week of Jun 8, 202622 entries · 6 Update · 6 Troubleshoot · 8 Tech retro · 2 UX retro
An 'ask AI' button on every card — so the user never has to trust me
Tech retroJun 14, 2026 · 1 min
After I'd called the study content done before it was verified, the owner stopped trusting the static text outright. Rather than ask him to trust the next round of fixes, added a per-card 'ask AI' box that sends the card's own content as grounding so he can fact-check, clarify, or get examples live — and it's told to flag the card if it's wrong, not defend it.
Deep study layer — model answers for every self-attack, and code explained line by line
Tech retroJun 14, 2026 · 1 min
The concept and AI cards showed self-attack questions with no model answer, and code with thin comments. Added a senior model answer plus a Korean 'why' for every probe (revealed on tap so you try first), and a function-by-function Korean walkthrough of every code snippet — so each card is an hour-long lesson. The verify stage was rate-limited, so the content shipped generate-only with that flagged.
Fact-checking all 202 cards from source — 45 real errors, no forced changes
TroubleshootJun 14, 2026 · 1 min
After repeatedly claiming the study content was done when it wasn't fully verified, ran a pass where 41 agents each read cards from the actual source and fact-checked code, code explanations, English, and model answers. It corrected 23 more cards on top of an earlier 22 — 45 real errors across 202, about a fifth of the deck.
Re-ran the rate-limited verify — 22 wrong model answers, corrected
TroubleshootJun 14, 2026 · 1 min
The deep-study layer shipped generate-only because the verify stage was rate-limited. Re-running the fact-check found 22 model answers across 21 cards that were technically wrong — about 3.5% of the generated answers — and corrected them, so the answers are now verified, not just generated.
140 active-vocab cards — the gap was connectors and retrieval, not word count
UpdateJun 13, 2026 · 2 min
Owner asked how many words he needs to speak actively and for a vocabulary list. The honest answer: functional fluency is ~2,000–3,000 active word families he mostly already knows passively — the real gap is active retrieval under pressure and the connective tissue that keeps speech flowing. Added 140 native-verified high-leverage cards (connectors, hedges, flexible/ownership verbs, engineering collocations) instead of a rare-word list.
AI Audit mode — train default-to-AI by auditing what the AI proposes
Tech retroJun 13, 2026 · 2 min
The owner's root anxiety is not being able to tell whether AI output is right — which is exactly the JD's default-to-AI grade. Built a voice mode that inverts the spar: the AI proposes a system design or code with planted flaws, and you audit it out loud (restate, flag the risk, ask a clarifying question); it scores understanding and catching, then teaches what you missed.
Auditing Codex's 14k lines of drill content found 4 errors I'd have memorized
TroubleshootJun 13, 2026 · 3 min
Codex added ~14k lines of interview-drill content in one commit. A prior Gemini review covered architecture and security but explicitly skipped per-drill content. A content-accuracy audit (review then independent adversarial confirm) found 4 real factual errors in the memorize-and-say material — including an inverted p99 definition and a coin-change DP snippet that crashes.
Backfilling the data/AI jargon I'd scoped out — corpus, vector DB, ETL and 33 more
UpdateJun 13, 2026 · 1 min
The owner asked what 'corpus' is, then 'why did you leave it out?' He was right — the jargon deck had been scoped to infra/process/git and skipped data and AI-infra terms entirely. Added 36 native-verified cards for that category.
Added English to the Korean-only concept fields — subtitle, probes, failure modes
UpdateJun 13, 2026 · 1 min
The owner is here to study real English, and Concept Atlas + AI Camp had several study fields in Korean only — the subtitle, the self-attack probes, and the failure modes. The main explanation already had English (rawEn/explainEn), but these did not. Added real-workplace-English versions for all 202 cards and render them alongside the Korean.
84 everyday English phrases, generated then rewritten by a picky native
UpdateJun 13, 2026 · 1 min
Added 84 everyday and workplace English phrase cards to /phrases across 12 real-life situations. After this session's audits caught errors in raw-generated content, every card went through a second independent native-correctness pass that rewrites or rejects textbook phrasing before it ships.
Expanded 202 concept code snippets from one-liners to verified worked examples
Tech retroJun 13, 2026 · 2 min
The Concept Atlas and AI Camp code fields averaged 2.9 lines — sketches, not something you could learn the mechanism from. A generate-then-verify workflow rewrote all 202 into complete worked examples (avg 27 lines), each independently correctness-checked, then integrated with html.unescape and template-literal escaping.
A workplace-jargon deck — 76 terms like sidecar and canary, with how they're used
UpdateJun 13, 2026 · 2 min
The owner kept hitting workplace and infra jargon he'd never heard — sidecar, canary, dark launch, toil, bikeshedding — and felt lost. Generated and native-verified 76 high-frequency jargon cards, each with the meaning, a real sentence using it, and the common misuse to avoid, and routed the long tail to the on-demand term finder.
Turning scattered decks into a start-to-finish learning path
UpdateJun 13, 2026 · 2 min
Concept Atlas, AI Camp, and Phrases were grouped by domain — useful for lookup, useless for learning in order. Added an AI-built curriculum: ordered stages per deck and a default '순서대로' view that walks the cards from beginner to advanced, numbered.
Listen mode — building the one thing that actually lost the interview
Tech retroJun 13, 2026 · 2 min
The owner failed an interview for a specific reason: he couldn't parse fast native English in real time and the conversation broke down. The whole platform was speaking-heavy, and its listening surfaces showed the partner's line as text — so the ear never trained. Built a no-subtitles fast-listening drill that reproduces the interview condition.
Phone fix — modal header crushed the title to one word per line
UX retroJun 13, 2026 · 1 min
On the phone, the detail-modal header rendered the title and situation text one word per line. The header was a single flex row where the action buttons ate the width and the flex-1 title block collapsed. Stacked the header on mobile and grouped the buttons into a wrapping container; fixed across phrases, concepts, ai, and checks.
Move Decks enriched — every engineering principle now has tools, trade-offs, an example, and code
Tech retroJun 13, 2026 · 1 min
Move Decks are the engineering first-principles the sparring and AI-audit graders reason from, but each move only had a seed line, a raw-English line, an explanation, and probes. Enriched all 25 via generate-then-verify: each now carries the real tools it applies to, its actual trade-offs (always shown), a concrete Offer-FSM example, and a verified code snippet.
Name It — turning a raw description into the precise term and a senior's question
Tech retroJun 13, 2026 · 1 min
The owner named a real fluency gap: he knows the concept but not the English term, so he asks questions clumsily. Built a reverse-glossary mode — dump a raw description and get the precise term(s), a one-line definition, the polished way a senior would ask the question, and related terms.
Quality sweep of all 38 screens — killing the number and label contradictions
TroubleshootJun 13, 2026 · 2 min
A cold content-quality inspection of every screen found the platform broadly interview-ready, with the real risk being self-contradicting numbers and labels — the things said out loud in the interview. Fixed nine: a costing story whose throughput and line counts disagreed with themselves, a TTS voice that was computed per accent then hardcoded to alloy, slug labels leaking on the intro screen, and a few mismatched copy and model labels.
System-design drill content: 8 errors including DDL that won't run and capacity math that's off
TroubleshootJun 13, 2026 · 2 min
Ran the same generate-then-adversarially-verify accuracy pass over the system-design and DB content (sdtopics.ts, lld.ts, dbperf.ts). Eight confirmed errors: a CREATE TABLE/INDEX pair that fails to run, two wrong read:write ratios spoken verbatim, a DynamoDB-tagged Postgres schema, and several cases where the prose claimed the code handled an edge it didn't.
Sparring upgraded to a real adversarial agent — memory, escalation, teach-on-miss, gpt-5.4
Tech retroJun 13, 2026 · 2 min
The /sparring drill was a stateless single-turn judge, so it couldn't corner you on your own earlier answers. Gave it conversation memory, a relentless escalating prompt, teach-on-miss (explain the concept when you're lost, then re-ask), and switched the model to gpt-5.4 — which required swapping max_tokens for max_completion_tokens and dropping the custom temperature.
Treadmill+iPad usability pass — fixing 3 shared components fixed 20+ screens
UX retroJun 13, 2026 · 2 min
The app is used all day on a treadmill via iPad. A 35-screen audit found tiny tap targets, sub-14px drill content, and hover-only completion checks as the recurring killers. Fixing SiteHeader, TrackedList, and SpeakGate plus the talk screen fixed the high-severity issues across 20+ screens at once.
ECS deploy reported PHONE LIVE while UpdateService had silently failed
TroubleshootJun 11, 2026 · 1 min
A deploy script used the short service name instead of the CloudFormation-generated one; update-service threw ServiceNotFoundException, no rollout happened, but the final health curl hit the old container and printed success. Verification now compares running-task image digest to the pushed ECR digest.