Inspiration

If you carried a virtual pet in your backpack in the 90s, you know the feeling: rushing home because it was hungry, the beep in the middle of class, the exaggerated grief when the screen showed a little ghost.

We are Marcello and Alice, and we are parents. Tame did not start as a business plan — it started with the two of us looking for something our own children could play, and not finding it. Almost everything we opened wanted their attention by the minute, or their data, or put them in a room with strangers. The toy we remembered asked for none of that. It asked you to come back at six because something small depended on you.

So we asked what that toy would be if it could actually answer you. Not a chatbot with a pet skin: a pet that lives on its own clock, has a personality it did not choose, grows up, picks a career — and happens to talk.

Four things from 1996 survived into Tame as design constraints rather than decoration, and each one cost us something to keep.

It works offline. The pet is a function of the device clock, not of a server. No signal, no problem. Close the app and it keeps living; open it after two days and it has lived those two days. A toy you had to be online to enjoy would not have been that toy — and a child on a shared phone or a prepaid plan should not get a worse version of the game.

It is fun without a toll booth. There are no ads, and there is no ad SDK in the binary — which is a different promise from a policy we could quietly reverse in a later release. No energy timer that only money skips, no loot box, no randomized purchase. The shop sells named things at fixed prices.

The care has a time of day. The beep in the middle of class was the whole point. A pet you attend to whenever you feel like it is a screensaver.

Nobody can talk to your child. There is no player-to-player chat, no feed, no visible usernames, no way for an adult to reach a kid inside Tame. The only thing your child talks to is their own pet, and that conversation runs through our own server with a persona instructed never to record an address, a phone number, a school or a surname. We considered a social square early and deliberately did not build it: moderating children talking to strangers is not something you bolt on afterwards.

A week before this submission, Meta announced a Tamagotchi-shaped AI keychain with cameras and microphones. We think the industry is rediscovering something real. We just went the other way on what it should cost the person holding it.

What it does

You adopt a dog, a cat, a dragon or a bee, name it, and care for it in real time. Hunger, hygiene, energy and mood decay with the actual clock, even with the app closed. It goes from egg to hatchling to adult over days, not minutes.

It develops a personality — two traits at birth, one more that emerges from how you raised it. It studies, graduates into one of six careers chosen by what it actually did, and starts bringing coins home. It wanders scenes you decorate and interacts with what you place: climbs into the bed, sits on the couch, smells the flowers.

And it chats. It remembers your name, remembers what you told it, and answers in character.

Then it got a village. You build a farm on a real map: fields, a chicken coop, a barn, a sawmill, a greenhouse, a windmill, fences and gates, and twenty-six farm animals that graze and answer when you tap them. A tractor drives out of its shed with one of four implements attached, does the round and comes back. Crops ripen, wait a day, and dry out if you never come.

The farm is also where the game quietly becomes educational, and that is on purpose. A child playing it is running a small economy without being told they are: corn feeds the chickens, the mill turns corn into flour, flour feeds the expensive animals, and buying a tractor means saving for it first. Prices are fixed and visible, income has a rate per hour, and the warehouse has a ceiling — so "should I upgrade the barn or buy another field?" is a real question with a real answer. Teaching this explicitly is our roadmap rather than our pitch: household finance and farm management are what the next chapters are for.

Nobody dies. Neglect a pet long enough and it leaves — but it leaves an egg that inherits its name and part of its memories. The consequence stays; the trauma does not. That was deliberate: kids play this. In the last release we added an optional mode for players who want mortality, off by default, because it was asked for and should be a choice rather than a default.

How we built it

React Native + Expo SDK 57. Zustand + MMKV for state, Reanimated for the stage, Skia for the village map, expo-router with native tabs.

The game logic is a pure module with zero React Native imports. Every rule — decay, illness, tantrums, graduation, the heir egg, the farm economy — lives in testable files. Time is never simulated with background timers: the pet's state is a function of elapsed real time, computed on wake. That one decision removed a whole category of bugs and made the game behave identically whether you were gone five minutes or two days. It is also what makes the game work on a plane.

The pet is written, not drawn. 292 sprites are JavaScript functions on a 64x64 grid, exported at 8x — four species, three life stages, eight emotions, sixteen action poses, every interface icon, the app icon and the wordmark. The 29 sound effects are synthesized the same way: PCM written sample by sample, because a recording of a real cow next to 16-pixel art would sound like it came from another game.

The village is a licensed pixel-art pack, and everything that happens to it is code. We did not draw those 479 sprites. We wrote the cutting, the recolouring, the compositing, and the derivation of frames the pack never shipped — the withered stage of six crops, derived from the ripe frame; an autumn pine, because the pack shipped the same green one for three seasons out of four.

The chat runs through our own Hono server. The Anthropic key never touches the app — that was non-negotiable. The persona prompt is split into a stable block and a volatile block, in that order, so prompt caching actually hits. Every three messages a Haiku call distills the conversation into a short memory that lives with the pet.

We never store conversations. Not a design detail — a constraint we set before writing the server. What persists is the distilled memory, and the persona is instructed never to record sensitive data. Moderation runs in two layers, deterministic filters on the way in and on the way out, plus a second opinion from the model on the finished reply, and it fails closed.

Supabase for auth and a per-user snapshot backup, with the device as the source of truth and the cloud as backup. RevenueCat for the subscription, with the RevenueCat user id bound to the Supabase uid, so the subscription follows the account rather than the device.

Challenges we ran into

The math almost killed the product. We wanted to advertise unlimited chat. Then we did the arithmetic: with Haiku and prompt caching, a message costs about US$0.0018, and at R$9.99/month break-even lands around 30 messages a day. "Unlimited" was not a generous promise — it was one we could not keep.

We capped it and rewrote the copy. The interesting part is what happened next: that false claim had already spread into four App Store locales, the Play listing and the website, and it survived because the real number only existed in a server environment variable. So we made drift impossible instead of fixing the instance — the marketing bullets became a function of the limits, plus a test that renders every dictionary with fake numbers and fails if a locale hard-codes one, and sweeps the dictionaries for promises we have made before and could not keep.

A player with 19,958 corn showed us the farm was built wrong. His warehouse capped at 19,982. He was not playing badly; he was playing well for a long time. Every building in our village produced and none consumed, and an economy like that runs in one direction: you harvest, the number rises to the cap, and from then on the main verb of the game has no consequence. The game does not break on a mistake. It breaks on success.

The windmill was the answer. It takes corn and returns flour, which is what the expensive animals eat. Planting stopped being "make the number go up" and became the first step of a chain — plant, mill, raise. Forty lines of code, visible in no screenshot, and the reason the farm has a future.

A blind player told us our app was silent. He wrote a careful report: the stat meters announced nothing, eight buttons had no labels at all — he found one by pressing it to see what it did, and it turned out to be the time-skip — and the menus read as "one big long thing" with no way to move item by item.

We fixed all of it. Then we made the class of mistake impossible: an automated check now sweeps the interface, and a new unlabelled button fails our build before it can reach anyone. We also told him, publicly and in writing, what we had not fixed — the village is drawn as a single graphics canvas, so a screen reader still sees one blank area.

Two subscribers paid and received nothing. Our RevenueCat entitlement had the App Store product attached and the Google Play one sitting unattached in the catalogue, added six days apart in August. Every Android subscriber bought a subscription that granted them nothing, for 41 days — and our only paid campaign in that window was Android-only. "Nobody converts" had never been a paywall problem, a price problem or an audience problem.

Attaching it fixed everyone retroactively. The code change was making the failure impossible to miss next time: a purchase that completes without an active entitlement is now its own state, with its own message — which tells you to restore rather than buy again — and an error log that fires outside debug builds. It used to be reported as a generic error, with copy inviting the user to try again, after the money had left.

Accomplishments we're proud of

A game our own children can use unsupervised. No ads, no strangers, no identity exposed, no chat with anyone but their own pet, and account deletion in two taps that removes everything server-side immediately. That was the original requirement, and every other decision had to fit around it.

The pet feels alive without draining your battery. No background timers, no push tricks — honest arithmetic on elapsed time.

Art that is code, and purchased art that is still code. Regenerating the visual identity is one command; deriving a season the artist never drew is a function.

Three languages from day one (English, Portuguese, Spanish), with typed dictionaries where a missing key fails compilation instead of shipping an empty string.

1,141 tests guarding the rules that matter: the free economy stays winnable, the marketing copy cannot outrun the code, the referral flow cannot be farmed, and every species that walks the village has a voice.

From 2 accounts to 1,544 during the window, 96% of whom went on to create a pet.

What we learned

Prompt caching is a product decision, not an optimization. Splitting the persona into a stable and a volatile block is what makes a conversational pet economically possible at R$9.99. Get the order wrong and the business model goes with it.

Pricing is a feature. We found the chat limit while writing the store listing, not in a spreadsheet at the end, and it changed the product.

An economy needs a drain before it needs a bigger cap. A game that only produces is a game whose main verb eventually stops meaning anything.

Write the guard, not the fix. Every bug we fixed by editing one string came back somewhere else. The ones we fixed by making the wrong state unrepresentable did not. The unlabelled button, the false marketing claim and the silently failed purchase are all now test failures or loud errors rather than things somebody has to remember.

Ship the honest version of the bad news. We told a blind player which part of our app still fails him, in our release notes and on our public blog. He was going to open it and find out.

What's next for Tame a Pet

An accessible village. An invisible layer of labelled targets over the map, so the farm can be played with a screen reader. It is next on the list, with a tester waiting.

The farm as a classroom. The economy is already there; what is missing is making it legible. A ledger a child can read, goals framed as savings, and a gentle lesson in the difference between income and a windfall.

A day/night cycle where the pet sleeps and you turn the light off, and a mess to clean up — both from the 1996 original, both asked for by the same player who told us our buttons were silent.

Roads that connect villages, so the sign at the edge of the map stops saying "coming soon".

Bees and honey as a production chain, designed by someone who keeps real ones.

Built With

Share this project:

Updates

Submission history