Apexs Solutions
TooSmartGames labelIn developmentDraft case study

Container Life

A storage-unit auction simulator

The player bids on locked storage units without looking inside, hauls what they win back to their own warehouse and takes it apart by hand. The whole game rests on one question: what is the thing in your hands actually worth.

Open the canvas showcase

The three things the game is built around

Not warehouse management and not a clicker. Closer to the work of an appraiser who bets their own money on their own eye every time.

The lot is bought blind

The facility opens the gate for a minute. You cannot step inside, you cannot touch anything, you can shine a torch. The bid is made from the silhouettes of the boxes and from the way the owner stacked them: a neat pile of identical crates and a heap of junk are worth different money.

A thing is recognised by hand

The container you win is unpacked by hand: boxes are opened, things are taken out and turned in front of your eyes. Each has its own condition — rust, dirt in the crevices, chips. Cleaning and small repairs raise the price, but they cost time and can finish off something fragile.

The price is worked out by the player, not the interface

The game does not print a price above an item. At first finds are driven to an expert, who takes money and a day of waiting. Gradually the player starts recognising hallmarks, materials and schools themselves — and stops paying for what they can already see.

The painting generator

A painting is the only find whose price is set not by the type of object but by what is depicted on it. The same canvas in the same frame can turn out to be a two-hundred-rouble supermarket poster or a signed original worth a million. That makes it the perfect object for the mechanic: the only way to learn what is in front of you is to look closely.

We needed a set where value can be read by eye. We measured the model geometry to see what proportions of canvas the four in-game frames expect, wrote a table of 351 prompts — from velvet clowns and paint-by-numbers to the Dutch Golden Age — and ran it through a text model.

Every row in the table has its own price, its own school and, most importantly, its own tells: what a trained eye should spot on the canvas itself. The tells are spelled out in the prompt in words — otherwise they simply will not be in the picture, and the whole school of appraisal turns into guesswork.

A saccharine print of a kitten in a basket
Kitten in a basket, a print
A comic painting: dogs in waistcoats playing cards
Dogs playing poker
A parody of a famous portrait with a cat instead of the sitter
A parody of a museum portrait
An impressionist poppy field with two figures under parasols
A poppy field, impressionism
A girl with a letter by a window in a Dutch interior
A Dutch interior
A self-portrait of an artist at an easel in a studio
A self-portrait at the easel
A portrait from life of an eighteenth-century statesman
A portrait from life
A romantic panorama of wilderness with a waterfall
A panorama with a waterfall
351
canvases in the set
220 s
for the whole run
$1.97
cost of the set
5
value classes

How the player learns to read a price

There are five value classes, and they are told apart not by a label but by what is visible on the canvas. At first a paid expert names those differences; later the player starts noticing them alone.

  • A halftone dot and moiré mean a print, not a painting.
  • Relief in the brushwork and bristle marks mean a hand, not a run.
  • Craquelure and darkened varnish mean age.
  • An edition number in pencil under the image means a lithograph.
  • A signature on top of the varnish rather than under it means a fake.

What the live run revealed

The prompts were written in advance and looked right on paper. The very first batch showed three things that do not follow from the model's documentation.

The model has no negative prompt

Asking for "no frame, no mat" inside an ordinary prompt does the opposite: the model reads the nouns and draws them. A nine-frame probe confirmed it outright — the variant with negations came back with exactly the white border we were trying to avoid.

The words "photograph of a painting" add a mat

The first version of the wrapper began with "square-on photograph of a painting" and produced a white border in six frames out of eight: a photo of a painting can have margins, and the model added them. Removing the word itself and describing the frame by what is in it fixed it.

A person's name in the prompt is not enough

A famous face often has a famous portrayal, and the generator goes for it: the name of a pirate produced a recognisable actor in a film role. And the metaphor "a lion's mane of hair" was read literally, so instead of a portrait we got a lion. Appearance is now described in words, and there are no metaphors in the prompts.

All 351 canvases on one page

A showcase with filters by value class and by frame. Each canvas opens a large version, its appraisal, its tells and the prompt that made it. The originals weigh 583 MB; the page is compressed down to 25 MB, five of which are the thumbnail grid.

Open the canvas showcase

Music: a nine-track record

All the game's sound is synthesised in code, but music has a texture a sine wave cannot give. The tracks were generated and picked by ear: first three probes in different languages — lo-fi, ambient and southern blues — then variations on the winner. The second batch was drawn from twenty-eight drafts. Nine tracks stayed in the game: four songs with lyrics and five instrumentals, and on this page they are split into the same two groups.

The music has no assigned places, and that is a decision too. At first the scene chose the track — four themes and a "scene to theme" table — but the player drives between scenes dozens of times a session, and a song cut off by a crossfade at every arrival never once reached its second verse. Now there is one record and it plays everywhere: the playlist loops from a random point, and for seven seconds a credit appears in the corner — Cargo Waves and the track title.

Original soundtrack9 tracks · 19:30
  • Songs
  • Instrumentals

A track change is a crossfade

The outgoing track fades over two and a half seconds while the next one comes in. That is why the game keeps two sources: with one the transition ends up as a cut on a half-note.

Pauses between repeats

A track finishes and goes quiet for a minute and a half. The game is meditative, the session is long, and continuous music is the first thing to wear out in it.

Streaming from disk

A two-minute track decompressed into memory costs about twenty megabytes and sits there for the whole game. So the music is streamed, and the mode is set by an import post-processor rather than a checkbox ticked by hand.

Under the hood

Engine

Unity 6, URP, C#

Platforms

PC and PC VR from a single build

Painting generation

fal.ai z-image/turbo

Music

ElevenLabs Music

Models and textures

Poly Haven, Meshy, Blender

Draft case study: this page is reachable only by direct link and is not shown in the project list.

Container Life | Apex Solutions