My Selected Works

Potato.exe

An incremental game on a 1998 office PC. You spin a wheel to download potatoes, and slowly find out what the company does with them.

Potato.exe key art. A startled office worker sits at a computer as windows full of potatoes and cats burst out of the screen.
Role
Game Designer, Writer & Programmer
Team
2 people, with Uluç Kaymak
Studio
InEv Games
Format
Incremental / narrative
Status
In development · Demo on Steam
Tools
Godot 4, GDScript, Python

Highlights

  • Built the economy on a reference formula and took it five tiers further.
  • Wrote a simulator and put every balance change through it.
  • Paced the story to how fast the player earns.
  • Wrote all 2,127 lines of text, and most of the code.
On this page
  1. I designed the economy and wrote the story.
  2. The player spins the wheel and buys upgrades.
  3. Testing changed the payouts and upgrade progression.
  4. I used a simulator to balance payouts and prices.
  5. The player’s income determines when story events appear.
  6. I wrote corporate humour for the game’s characters and websites.
  7. The narrative progresses through five acts.
  8. These tools support the implementation and balance work.

I designed the economy and wrote the story.

Potato.exe has one verb: spin a wheel to download a potato. I designed the game, its economy and its pacing, and wrote the text and most of the code. Uluç Kaymak made the look and the sound. I wrote code with Claude.

The payout formula and the first price tiers come from Unfair Flips by Heather Flowers (2025). What I built on top of them is below.

The player spins the wheel and buys upgrades.

Gameplay: the wheel spins, lands on PROGRESS several times while the download bar climbs, then lands on CORRUPTED and the bar falls back to 10%.
A chain builds, then breaks. Real spins, 15 seconds, no sound.
  1. SpinTwo seconds at first, one at full speed.
  2. PROGRESSOne step forward, and a payout.
  3. CORRUPTEDBack to 10%. Potatoes are kept.
  4. SpendUpgrades and cards in the Marketplace.
  5. 100%A promotion, and the download restarts.

Each step pays value × ceil(combo ^ (step − 1)). step counts the PROGRESS results in a row, which the game calls a chain. One long chain pays far more than many short ones.

Testing changed the payouts and upgrade progression.

I wrote a Monte Carlo simulator that plays the game from its own data files. Before trusting it, I had it reproduce a published 150,000-run simulation of the reference game. It came within 1%.

Before What showed the problem After
The safety net, a hidden floor under the odds after a losing run, started at the first loss Milestones came a third faster and the wheel lost its risk It starts at the third loss. Milestones come 6 to 9% faster, inside the 5 to 10% target
HR ATTENTION, the meter that ends the run at 100, rose 6 per story hit The story needs 19 hits. 19 × 6 is 114, so a player who did everything right was always caught 3 per hit, +2.5 a minute with a story module installed, −2 a minute always
Four upgrades, 22 levels By minute 30 a typical player owned 20 of the 22 Five more tiers, 27 levels. Minute-30 earnings went from 4,649 to 65,867 in that test. After a later reprice the current build earns 52,802
Three more changes
Before What showed the problem After
A linear payout, value × combo × step The reference is exponential. Linear starved the midgame value × ceil(combo^(step − 1))
The story’s first message at minute 8 Too early, and the campaign ads read as part of the story A gate on earning rate and upgrade level, median 14.8 minutes
A flat 6× bet at Potato Downs, the horse-racing side game, with no limit At 60% PROGRESS the player’s potato wins 62.3% of races, so the bet returned 3.75 times the stake Flat 6× up to 1,000. Above that, a VIP box with a 10% house cut

I used a simulator to balance payouts and prices.

What I added to the reference:

  • A hidden safety net. After three CORRUPTED spins in a row the next spin gets a 15% floor on its PROGRESS chance, rising to 100% after nine. It only overturns a spin that had already lost.
  • A story that costs income. Each story job installs a module that takes its slice out of the green. Working for the story lowers earnings until the module comes off.
  • Five more tiers. PROGRESS to 65%, COMBO to 4.5×, two more tiers of potato value.
  • Sinks. By the hour mark a median player held 15 million potatoes and the dearest item cost 1 million. A VIP box at Potato Downs costs 250,000 and keeps a 10% house edge. Desktop themes go to auction for up to 1,000,000.
The AntiPotato Inc. Upgrades window with the module EXFIL.SYS installed and an Uninstall button that reads: returns the green. On the wheel a blue slice sits inside the green PROGRESS area, and PROGRESS reads 55% where it was 60%.
A story module on the wheel. EXFIL.SYS takes 5% of PROGRESS while it is installed.
Median potatoes earned, by minute of play
0.01110010,0001,000,00015102030MinutePotatoes, log scaleMedian earned: 0.08Median earned: 0.17Median earned: 0.54Median earned: 7.78Median earned: 170Median earned: 52,802Before: 4,649Before: 4,649Median earned

The current build, 2,000 simulated runs. The ring is minute 30 before the five added tiers. The jump after minute 20 is one long chain paying tens of thousands.

The numbers
MinuteMedian earned
10.08
50.54
107.78
20170
3052,802
The price ladder, the simulator’s output and the late game

Tiers marked (added) are mine. The others follow the reference.

Level PROGRESS chance Price (potatoes) COMBO Price (potatoes)
0 20% 1.0×
1 25% 0.01 1.5× 0.01
2 30% 0.10 2.0× 0.10
3 35% 1 2.5× 1
4 40% 10 3.0× 10
5 45% 100 3.5× 100
6 50% 1,000 4.0× (added) 250
7 55% 10,000 4.5× (added) 1,000
8 60% 100,000
9 65% (added) 200,000
POTATO.exe — what the player earns
  policy greedy, 2000 runs, 30 simulated minutes each
  odds start at 20%, first packet pays 0.01, combo 1.0x

  minute   median earned   spins   upgrade levels owned
      1            0.08      24   3
      2            0.17      48   4
      5            0.54     122   6
     10            7.78     254   11
     20          169.85     553   16
     30        52801.84     877   25

The first full download comes at a median of about 30 minutes. Half of all runs finish between 21 and 40.

After it, everything stays: potatoes, upgrades, cards and story. Only the download restarts. The Potautospinner automates in batches, so there is no offline income. There is no prestige layer yet.

The player’s income determines when story events appear.

The story follows the player’s speed. A system I call Tempo compares what this player earns per spin with a player who never buys anything. Near 1 they are still fighting the wheel. Near 40 they have a chain economy. Near 300 they are printing potatoes.

Gate Tempo at least Upgrade levels Earliest Latest Median in simulation
The story opens: peeled writes 40 12 minute 8 minute 30 14.8 min
The background channels go quiet 300 16 minute 18 minute 40 23.1 min

The floor keeps a lucky opening from skipping the calm. The cap means bad luck never locks anyone out of the story.

The office messenger, ISQ 98, with a chat from a contact called peeled: Wake up! i used to sit where you are sitting. same chair, spinning same wheel. probably the same coffee ring on the desk. the wheel is not what they told you it is. and i can show you. it costs you nothing but attention.
The first gate opens. This message waits until the player has earned it.
How the noise adapts, and the tool that finds the gaps

Ads and campaign spots read the last 50 spins. A stalled player gets them 1.4 times further apart, and a player on a run gets them at 0.8 times the gap.

The rule is that nobody does the same thing for more than three to five minutes without something addressing them. A tool prints the projected timeline from the game’s data and flags the gaps:

THE FIRST 40 MINUTES  (steady player, installs PotatoGuard)
    0:09  spin 1 -> Sprouty introduces itself
    3:35  Tuberson campaign spot #1
    5:00  the worm lands (>=55 spins, tempo, >=300s)
   10:30  CURED after 6 ANTIVIRUS landings
   12:00  Sprouty + HR: COMPLY_98.FRM lands in My Documents
   15:00  peeled writes: START->MID phase gate (median ~15 min)
   19:06  Sprouty marketplace reminder #4 (spin 380)   <-- 4:06 of nothing
   25:35  Tuberson campaign spot #5   <-- 5:30 of nothing

Sprouty is the desktop assistant, Tuberson a campaign ad, the worm an ad virus.

I wrote corporate humour for the game’s characters and websites.

The game is a comedy. The company never admits anything is wrong, and its fake internet runs to 64 pages of potato websites.

  • “Wrongly boiled, he spends nineteen years digging out of the pantry with a potato spoon.”

    TuberFlix, The Mashank Redemption (1994)

  • “Two potatoes fall in love on a sack bound for the chip shop. The sack is unsinkable. The chip shop is not.”

    TuberFlix, Taternic (1997)

  • “Reduce CORRUPTED to 79% (ambitious). The year stays 1968 (non-negotiable).”

    Russet M. Tuberson, the platform

  • “I am about 60% gravy. Looking for the other 40%.”

    Gravy Dave, 2 weeks old, Hot Mashed Singles

  • “Thank you for answering questions. Help is not available at your clearance level.”

    Sprouty, the desktop assistant, after a six-question help intake

  • “Employees who resolve irregularities quickly enjoy longer careers. And bodies.”

    HR, first written warning

  • “Do not paraphrase. Paraphrasing is how 1994 happened.”

    HR, handing over a compliance form

A window titled PERSONNEL, Exit Interview, over a canteen tray of fries with a sign: FRI: SURPRISE (POTATOES). The text reads: Your file has been closed. Your position has been filled. Catering will handle the rest. Thank you for your service. Below, a RE-APPLY button.
Getting caught: the exit interview.

The narrative progresses through five acts.

The player is employee E-1998 at Potato Inc. A stranger called peeled says the wheel is not what they were told. Every job from peeled is the same shape: install a module, hit its slice enough times, uninstall it.

The five acts, with spoilers
  • Act 1, contact (around minute 15). peeled writes: “i used to sit where you are sitting. same chair, spinning same wheel.” If the player says no, peeled comes back.
  • Act 2, the tunnel. A backdoor slice opens a hidden folder with the previous employee’s unsent letter. Then peeled goes dark, and the Steam demo ends here.
  • Act 3, operations. Five hits on an exfiltration slice pull five files out of the company. An HR ATTENTION meter appears and rises on every hit and while a module is installed. At 50 HR fines the player, and at 75 it warns that the Basement has been notified.
  • Act 4, the basement. A hidden photo is drawn one strip per hit. Each potato is an applicant, and the wheel sets the speed of the processing line. “Yes. They are people. They were always people.”
  • Act 5, the end. Three endings. Send the files, and the machine formats itself and boots to the same wheel, now downloading from \\SOIL\NOBODY (Nobody’s Potatoes). Tell HR everything, and you are Employee of the Month while Catering closes peeled’s file. The third can come earlier: if HR ATTENTION reaches 100 at any point after Act 3, you are FRIED. RE-APPLY keeps the potatoes and upgrades, so both Act 5 endings stay open.

These tools support the implementation and balance work.

Team, engine, code, tests and AI use

Uluç Kaymak made the Windows 98 look and feel: the window chrome, icons, cursors and Sprouty’s art, the CRT and ripple shaders, and the feel of dragging windows and icons. He also made all of the sound, the boot sequence and the desktop drag and drop, and fixed builds and performance.

  • Godot 4.7, GDScript. About 18,900 lines in 121 scripts, grown from a single-file HTML prototype.
  • Data-driven. No numbers or text live in code. The story engine reads its beats from JSON and checks every reference at start-up, so a typo fails a test.
  • Python tools. The simulator reads the game’s own data files. A text pipeline moves all 2,127 lines through one sheet, one column per language.
  • Tests. 17 suites, one of which plays the story from start to finish.
  • AI use. The upgrade icons, the Windows 98 icon pack and the photos on the fake internet were made with image generators, and I wrote code with Claude. The translations were done with LLMs and edited by a translator at InEv.
  • Accessibility. Reduced motion, UI scale, message speed, colour cues, remappable keys, and full keyboard and gamepad play with Steam Deck defaults.

Click the picture to zoom · click outside to close