← Back to all projects

Case Study — Yokai Soba Shop (요괴 소바집)

Four days, one game. The hardest part wasn't the code.

A bilingual cozy management sim built solo for the Cursor Vibe Jam 2026. Code written 95%+ by Claude under direction; art, music, and design decisions mine. Ships a complete 7-day arc with grandmother's memory, drag-and-drop cooking, a pour-timing mini-game, and a layered ending — playable in Korean and English.


Problem

Cursor announced a two-week jam. I'd never shipped a complete game before, but I had a clear theme — 1960s Japanese mountain village, a grandchild inheriting a small soba shop from a grandmother who quietly fed yokai for decades. The risk was obvious: cozy games like Mistia's Izakaya live or die on atmosphere, which usually takes weeks of polish. Most jam games punt on either the mechanic or the story. I wanted both — emotionally complete in four days, bilingual, and reachable by anyone with a URL.


My Role

Solo. Wrote zero code by hand — every line is AI-generated through guided iteration with Claude. My job was direction: deciding what's fun, what's emotionally true, what to cut, and pushing back when the AI suggested something that felt mechanically right but emotionally hollow.


Process

Game design

  1. 1

    Built the core loop on day 1: drag ingredients into a bowl, click serve, watch the customer react. Mechanically thin — exactly what I expected. The first playthrough confirmed it was a checklist, not an experience.

  2. 2

    Added a morning discovery scene: the player wakes up in a daylit version of the shop, finds one glowing object per day (a handkerchief, an IOU note, a feather), and grandmother's memory reveals what that customer likes. Two-beat pacing — quiet morning, busy night — turned out to be the structural fix that made the game feel like a game, not a script.

  3. 3

    Layered the ending. The first version closed on three terse beats and a stats screen. The second version added per-character outros graded by final affinity tier (stranger / regular / friend), with a closing line that callbacks day 1's '...노렌을 걸었다.' Bookending the seven nights gave the campaign a shape.

  4. 4

    Added a dashi pour mini-game after a feedback round where 'this isn't fun enough.' First built it as a punishment, then as a binary bonus. The user feedback that drove the final shape was 'just less affinity, not failure' — so I made it a gradient (perfect / good / off, with no negative outcome). That's the kind of call no AI made on its own.

Engineering

  1. 1

    Vanilla JS + Canvas 2D + Vite. No frameworks. The whole runtime is one 55 kB JS bundle. Pixel-perfect logical canvas at 640×360, integer-multiple scaling for any screen size.

  2. 2

    Single-state-tree game state with reducer-style dispatch — one place to mutate, easy to audit. Scenes (title, morning, night, tally, ending) are modules that subscribe to input and render to canvas.

  3. 3

    Bilingual content via Proxy-based locale switching. CHARACTERS, MORNING_MEMORIES, and RECIPES all maintain ko/en variants internally; consumer code keeps using CHARACTERS[key] unchanged. Switching language updates the UI mid-sentence without a reload.

  4. 4

    Audio: one streaming BGM file (~6 MB) loaded with metadata-only preload so it doesn't block startup. All four SFX (door bell, bowl place, text blip, satisfaction chime) are synthesized live in Web Audio with brief envelopes — zero audio assets to ship.

  5. 5

    Day-7 grandmother edge case: the game's only infinite-retry character. Wrong dish triggers her actual line ('괜찮아, 다시 한번 해보렴') and resets the kitchen with no penalty, honoring the dialogue's promise.

AI-paired workflow

  1. 1

    Treated Claude like a junior engineer who needs direction, not autocomplete. Spent more time describing intent than reviewing code. The best results came from giving examples of tone and feel rather than implementation hints.

  2. 2

    Caught two design dead-ends through Claude's instinct to over-engineer: a generic 'tasting line' that lied to the player about what was in the bowl, and an early ending that ended on grief instead of continuation. Both required a stop-and-redirect, not a polish pass.

  3. 3

    Wrote design feedback in plain Korean throughout the build (e.g., '뭔가 노잼인데, 미스티아의 이자카야는 왜 재밌다 그러는거지?'). Found that abstract qualitative feedback works better than prescriptive instructions — the AI fills in mechanics; humans should fill in feel.


Outcomes

4 days

Solo build to a shippable 7-day campaign

2 langs

Korean + English, 200+ strings localized via Proxy-based i18n

55 kB

JS bundle. SFX synthesized via Web Audio — no asset bloat


Stack

Vanilla JSCanvas 2DViteWeb Audio APIi18nPixel Art

What I Learned

Three things stuck. First — AI-paired solo development isn't typing, it's directing. Most of the value came from saying no, not from generating more. Second — cozy games need contrast. The morning discovery beat exists only because the night service alone felt monotonous; adding a quieter rhythm made the busy one land. Third — design feedback is the human's job. The dashi pour mini-game went through three shapes before it settled into 'graded reward, no failure' — that final shape came from a single line of user feedback and would not have emerged from the AI on its own.