← All workReleased iOS app

VirtualTakeout 你又饿了

Make room for another choice.

A familiar takeout ritual, with a different ending. Browse a meal, make your choices, and pause before a real order.

01 · Browse
02 · Choose
03 · Reflect

Simulated meals. No food purchase or delivery.

Chinese simulator build captured on September 4, 2026. Monetary figures shown are simulated estimates.

01 / A personal starting point

She was browsing.
She wasn’t ordering.

I remember seeing a Korean news item about simulated takeout. What I saw looked like an early Figma concept, rather than a usable product. Around the same time, I noticed my girlfriend browsing takeout apps while dieting, often without placing an order. That everyday observation made the idea feel worth building.

I was not the first to explore this concept. My opportunity was to make the experience feel complete: continuous choices, a clear ending, and a consistent visual world. This began as a personal observation, not a formal research study.

MY ROLE · INDEPENDENT

I independently took the product from 0 to 1: product definition, interaction and visual design, AI-assisted development, QA, and App Store release.

02 / The experience between the screens

Finished means
the details connect.

A simulation still needs to respect the person’s choices. I focused on the small transitions that make browsing feel coherent, rather than treating a working screen as a finished experience.

INTERACTION 1 / 3

Choose a dish without losing the restaurant.

Portion selection is a small decision inside a larger browse. Making it feel like a new destination would break that continuity.

MY DESIGN DECISION

I used a sheet above the menu, with the dish, portion choices, estimate, and basket action in one place. The restaurant stays visible behind it.

IN USE

Open a dish → choose a portion → add to the simulated basket. Dismiss the sheet to return to the same menu.

A CLOSER LOOK

The portion choice and basket action share one surface.

Real Chinese UI · the detail is a crop of the same screenshot. Select any image to view the original.

03 / Designing a content production system

One dish.
An entire workflow.

A believable browse needs more than a handful of attractive dishes. I built a repeatable content workflow from recordings, rather than directly scraping a delivery app: extract, clean, generate, then review the result in context.

CONTENT WORKBENCHBeef & egg pepper rice · a real project sample
01 / Extract
EXTRACTED RECORD00:08
frame_0005

牛肉拼炒蛋胡椒饭(标准)

Category
热销
Visible price
¥38.9起
Dish name · category · starting price

Retained extraction fields from 00:08. Platform and location fields omitted.

02 / Organize
SIMULATED CATALOG

牛肉拼炒蛋胡椒饭

Food group
招牌胡椒饭
Estimate
¥39.8
Stable dish identityitem_beef_egg_pepper↳ Image identitymenu_beef_egg_pepper_rice

Merge repeated listings. Turn add-ons into options. Keep one image identity per dish.

03 / Generate

The actual generated asset. The dish name defines the food; the style brief defines the photograph.

04 / In the app

The same dish in the captured UI. Select to inspect the full screen.

THE DISH BRIEF

Sizzling black pepper beef and scrambled eggs on a bed of rice in a cast iron pan, steam rising.

Separate source from simulation.

To turn recordings into a usable menu, I sampled video frames with FFmpeg and used vision extraction for dish names, categories, descriptions, prices, and visible options. Frame references kept uncertain entries traceable to their source.

I separated source transcription from the simulated catalog. For this restaurant, promotional categories were removed, repeated listings were merged into five food-based groups, and add-ons became option groups. Stable dish and image identifiers kept the cleaned menu connected to its generated asset.

Give AI a clear job—and a review standard.

OpenRouter connected the workflow to Gemini image generation. I ran batches from structured dish briefs, then used later generation rounds to fill missing assets. The menu record, generation brief, and output filename shared an identity, so each image had a defined destination.

My review criteria separated food identity from visual style. The dish name and verified ingredients came first; style references guided framing, light, and background. I also checked whether the complete serving remained readable at thumbnail size. Early batches used exception review; later batches added explicit visual checks.

Retained final restaurant-cover asset · original generated imagery

A concrete AI correction

Directing the image, not just accepting it.

“This should be a merchant hero banner, not a menu dish photo.”Retained generation review note

For the restaurant cover, I redirected the brief toward a wide teppan-counter scene: atmosphere, warm lighting, and steam, with the dish playing a supporting role. The resulting asset gives the restaurant its setting, while the square dish image helps someone choose a meal.

Identity before plausibility

A later image review caught a more fundamental mismatch: “丝瓜” (luffa) looked like cucumber. The second attempt was still withheld. A third version with visible longitudinal ridges passed review. A plausible food photo was not enough; it had to represent the intended ingredient.

04 / A second way to pause

If simulation is the whole product, why come back?

That question led me to App Guard. A simulated browse gives someone an alternative activity; an intentional pause gives them a way to act on the decision. I added a tool for voluntarily pausing selected takeout apps, with control remaining with the person using it.

IMPLEMENTED CONTROL FLOW
  1. 01

    Allow, then select

    Explicit authorization. Apple’s system app picker.

  2. 02

    Choose a pause

    Pause now, or set a recurring schedule.

  3. 03

    Choose the boundary

    Gentle mode offers a temporary opening. Firm mode keeps the pause.

  4. 04

    Stay in control

    End the pause in VirtualTakeout or revoke system permission.

A device boundary, explained.

Requires a physical iPhone.
A visible recheck action.

Implementation flow, not a device recording. The available screenshot shows Simulator unavailability; it does not demonstrate successful blocking on a physical iPhone.

I kept App Guard separate from the simulated basket. Someone can finish a browsing session without enabling app pausing. Selection and authorization live in their own Guard area, making the additional commitment an explicit choice.

Design the way back, too.

The return path matters as much as the pause. In gentle mode, a Shield action cannot guarantee direct navigation back into this app. The interface therefore explains that the selected app closes and the person must open VirtualTakeout to complete a temporary unlock. Restoring membership does not silently restore device permissions.

05 / Delivery & the next question

Designed. Built.
Shipped independently.

Chinese edition released

I shipped the Chinese edition on the App Store as 你又饿了-先缓一口. The work connected product design with a native SwiftUI app, content preparation, subscription states, permission explanations, QA, and review materials. The screens in this case come from a development build; they do not establish the exact feature set of a particular store version.

My next question is whether the browsing ritual helps people pause, and how the voluntary pause tool fits into repeat use. I do not yet claim a measured behavioral or health effect. English and Korean localization is in progress, as a next step beyond the Chinese product.

Back to all work