A tiny cat who remembers your life.
Translation pending
HealthJavaScript · CSSGitHub @vantrangaofOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
This is a project to remind me of Xiao Mi and love
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A tiny cat who remembers your life.
Every day, tell Mimi one small thing worth remembering. Mimi listens. Mimi remembers. Over time Mimi starts noticing the people you love, the things you like, the wishes you made and forgot, and little patterns in your life. The good things you tell Mimi are how Mimi gets to know you.
Notice → Tell Mimi → Mimi reacts → Mimi remembers → Mimi connects things → Mimi knows youRead the full README ↗A tiny cat who remembers your life.
Every day, tell Mimi one small thing worth remembering. Mimi listens. Mimi remembers. Over time Mimi starts noticing the people you love, the things you like, the wishes you made and forgot, and little patterns in your life. The good things you tell Mimi are how Mimi gets to know you.
Notice → Tell Mimi → Mimi reacts → Mimi remembers → Mimi connects things → Mimi knows you
Mimi is a gentle pet: no hunger bars, no punishments, no streaks that break. Mimi looks a little sad on a day without a fish or water, and one treat cheers them right up. Missing a day takes nothing away. "Arigato" means thank you in Japanese; you can rename the cat (for example, Xiao Mi).
It's an installable web app (PWA). It works offline and without an account; sign in with your email to sync your good things to the cloud and across devices. Once you've told Mimi something, a Keep Mimi safe on this phone card suggests adding Mimi to the Home Screen (an install button on Android and Chrome, Share → Add to Home Screen steps on iPhone; "Not now" hides it for two weeks). Safari on iPhone can clear a website's data after about a week away, which signs you out; Home Screen apps are spared. Mimi also asks the browser to keep its data.
| Pillar | What it does |
|---|---|
| Good things | Tell Mimi up to five good things a day. One is a good day; five is Mimi's favorite. |
| Mimi | A pixel cat with moods, reactions to what you write, idle habits, and a purr. |
| Memories | Mimi connects your good things into theories about you, remembers what happened a year ago, and keeps your wishes. |
| Little world | Mimi's room fills up with things as your good things add up, things from your own life, and treasures Mimi finds. |
| Scrapbook | Every so often Mimi keeps one of your good things as a scrapbook page. |
Everything unlocks by total good things and never goes away:
| Good things | Unlocks |
|---|---|
| 5 | Little flower (to wear) |
| 15 | Ribbon bow (to wear) |
| 30 | Tiny plant |
| 40 | Cozy scarf (to wear) |
| 50 | Cushion |
| 75 | Wall picture |
| 100 | Window (the sky outside follows the time of day) |
| 120 | Beret (to wear) |
| 150 | Bookshelf |
| 200 | Tiny crown (to wear) |
| 250 | Aquarium |
| 500 | Starry window |
The journal shows what's next: "Next for Mimi's world: a cushion at 50 good things."
Things from your life: when something comes up in three good things, a small object for it appears in the room and Mimi says "has been noticing a theme. A coffee mug appeared in the room." There are 18: coffee mug, teapot, stack of books, radio, toy mouse (cats), dog bone, umbrella (rain), vase of flowers, little pot (cooking), noodle bowl, cupcake (sweets), suitcase (travel), beach ball (the sea), sneakers (walks and runs), camera (photos), game controller, paint palette (art), popcorn (movies). Four sit on the floor and two on a little wall shelf; with more than six, the most-mentioned ones show. Tap one for a line ("sniffs your coffee mug. Still warm."). They never go away.
Jar of good things: a jar on a shelf under the window fills with paper stars (one per 5 good things, up to 16). Tap it, or shake your phone, and Mimi pulls out a random past good thing and reads it to you. On iPhone, shaking asks for motion permission the first time you tap the jar. On days your diary weather is rainy or stormy, the stars glimmer and Mimi likes to sit by the jar. That's the only thing Mimi takes from the diary: the weather, never the words.
Your photo on the wall: once the wall picture is unlocked (75), it shows one of your photos, pixelated to match the room. It's your newest photo unless you choose one with Hang in Mimi's room in the photo viewer.
Weekly postcard: on Sundays Mimi leaves a postcard on the floor about the week (Monday to Sunday): how many good things, how often you laughed, who came up, what kept showing up, and Mimi's favorite of the week. It stays until the next one (Monday to Saturday you see last week's), sparkles until read, and Mimi says "mail!" once when it arrives.
Seasons: for a few days a year the room gets a decoration and the wardrobe gets costumes, then they go away until next year:
| When | Room | Wardrobe |
|---|---|---|
| Halloween (Oct 18 to Nov 1) | pumpkin and a bat | witch hat, ghost costume |
| Christmas (Dec 18 to 26) | wreath | Santa hat |
| Lunar New Year (3 days before to 7 days after) | red lantern | lucky knot |
| The day you met Mimi, every year after the first | cake with a candle |
Mimi mentions it once per event each year. Costumes come off automatically when the event ends.
Your cat's diary (the tab is named after your cat, like "Xiao Mi's diary"): a photo a day of your real cat, or of the two of you (pick Xiao Mi or Xiao Mi & me before adding it). The cat writes a line about it in their own voice: "Sat in the sunbeam. Refused to move. 10/10." When you're signed in, Mimi's AI looks at the photo and writes it; otherwise it's one of a few built-in lines. Change the words or Change the photo any time. Flip back with ‹ ›, or tap a page in the strip underneath. Pages sync, and the photos are in Photos too. (Your own private diary is now called My diary.)
Cat translator (the button at the top of your cat's diary): add a photo of your real cat, and Mimi's AI reads their body language ("slow blink, ears relaxed, tail curled around paws") and says what they mean, in a speech bubble over the photo: "I love you. Also, dinner was 4 minutes ago." plus a mood (loving, playful, sleepy, grumpy…). Each translation goes into your cat's phrasebook (synced) and the photo into Photos. A photo with no cat gets a remark but isn't kept. Needs you to be signed in.
Memories: Mimi's theories first: every few days (at most one every 3 days, after 10 good things) Mimi connects some of your good things into a numbered theory, mentions it when you open the app, and keeps it forever. Mimi looks for:
Theories never use percentages or scores, and never use the diary. Each one has You're onto something (it gets a ✓) and Nope (Mimi "has made an error. They quietly take it off the evidence board."; it's gone for good and never suggested again). Then What Mimi has learned ("Mimi thinks you really like coffee." "You talked about Lin 3 times. Mimi knows Lin must be important." "Your mom came up 4 times. That sounds special.") plus a of drawers Mimi sorts on their own: People, Food, Things you were proud of, Things that made you laugh, Beautiful moments, Kindness, Rest, Moving your body, Hard days you got through, Little things, Wishes in the jar, Wishes that came true, and Treasures Mimi found.
api/nudge.mjs, which a GitHub Actions schedule (.github/workflows/nudge.yml) calls every hour.ABC-234 and a link to share; a friend opens the link or types the code under "Have a code?" and says yes. Tap a friend to visit their room: their cat, unlocks, treasures, seasonal decor and things from their life. Never their good things, diary or photos. "Show my things to friends" hides your things from your life from visitors. Either of you can remove the friendship.cafe:<host id>), allowed by mimi_can_enter_cafe in supabase/schema.sql.No build step and no dependencies. Serve the folder with any static server:
python3 -m http.server 5173
# open http://localhost:5173
index.html Page markup (the room, journal, tabs, dialogs)
manifest.webmanifest Install-to-home-screen metadata
sw.js Offline support (network first, cached copy when offline)
supabase/schema.sql Cloud database tables and security rules (run once in Supabase)
api/mimi.mjs Vercel function: Mimi's AI (good-thing check + chat, Gemini), 120 calls/person/day
assets/
icon.svg App icon (vector)
icons/ PNG app icons (home screen, maskable, Apple touch, favicon)
sounds/meow.m4a 0.9 s meow clip
sounds/purr.m4a 1.5 s purr clip
styles/
tokens.css Colors, fonts, light/dark themes, the pixel unit
base.css Graph-paper page, buttons, inputs, utilities
layout.css Page layout; desktop two-column layout
cat.css The room, sprite states, idle animations, effects
panels.css Journal, tabs, memories, scrapbook, month, calendar, dialogs
games.css Games
src/
main.js Startup: opens the database and wires the modules together
config.js Supabase project URL + public anon key (empty = no cloud sync)
cloud/
sync.js Sign-in with email + password, push/pull sync with Supabase (entries, photos, state, room)
ai.js Asks api/mimi.mjs to check a good thing or chat
friends.js Invite codes, the friends list, a friend's room
core/ Infrastructure, no UI
db.js IndexedDB database (localStorage fallback)
store.js In-memory data + persistence, change events, backup/restore
dates.js Local day keys and date formatting
dom.js Small DOM helpers
pixel.js Draws pixel art as SVG
images.js Shrinks photos before saving
ics.js Calendar files (daily reminder, sticky notes)
cat/ The cat itself
sprite.js Sprite data, fur palettes, accessories, SVG and canvas drawing
mimi.js Moods, reactions, idle habits, sleep schedule
sound.js Meow and purr playback
music.js Notes, jingles and sound effects for the games (Web Audio)
fur-photo.js Fur palette from a photo of your cat
world/
world.js Unlock list, the pixel room, treasures
surprises.js Rare finds and dreams
seasons.js Halloween, Christmas, Lunar New Year, your anniversary
room-snapshot.js What friends see when they visit (only the room)
memory/ How Mimi understands you (pure logic)
insights.js Keyword reactions, categories, learned facts, monthly recap
quotes.js Mimi's notes and how a new one is picked each visit
relationship.js Days together and milestones
scrapbook.js When pages are added and which entry is kept
mimi-good.js Mimi's own good thing of the day
postcard.js The weekly postcard's lines
themes.js Things you keep mentioning, and the objects they put in the room
theories.js Mimi's theories: connecting good things into conclusions
wishes.js Finding wishes in good things and noticing when they come true
year-ago.js Good things from this date in earlier years, and Mimi's remark
about.js Memory pages: everything about one person, place or thing
remember.js "Mimi remembers before you do": something that went quiet
reminders.js Sticky notes: reading "text Mom tomorrow at 6", due and repeating notes
needs.js Fish and water as gentle needs: when Mimi looks a little sad
streak.js Paw prints: this week, runs with naps, run milestones
games/ The games in the Play sheet
catch.js Catch the fish (canvas)
pairs.js Pairs (memory cards)
song.js Mimi's song (repeat the tune)
shuffle.js Box shuffle (find Mimi's box)
belly.js Belly trap (pet where asked, not the belly)
tower.js Cushion tower (canvas stacker)
toss.js Treat toss (canvas slingshot)
ui/ One module per part of the page
habitat.js Room on screen, pixel sizing, petting
topbar.js Days together, sound toggle, settings icon
intro.js "What's your name?"
note.js Mimi's note under their name
wardrobe.js Dress up: wear items per slot
photos.js Photo album, viewer, and thumbnails used elsewhere
diary.js Private diary pages, mood weather, little Mimi on the page
jar.js Jar of good things: tap or shake to pull one out
bedtime.js Tuck Mimi in at night
postcard.js The postcard on the floor and its dialog
about.js Memory page sheet (room things, people, places)
thanks.js Thank-you cards
journal.js Writing good things, prompts, unlock, scrapbook, wish and room-thing events
year-ago.js The "one year ago today" card
reminders.js Sticky notes card, Mimi's "psst" at a note's time
tabs.js Accessible tabs
memories.js Memory cabinet
scrapbook.js Scrapbook pages
month.js Monthly recap
calendar.js Calendar and search
play.js Fish, water, cuddles, and laser play
games.js The Play sheet: picking a game, results, bests
streak.js This week's paw prints under the journal
install.js "Keep Mimi safe": Add to Home Screen, and asking to keep the app's data
settings.js Settings dialog, reminder file, backup
account.js Account & sync section in Settings
friends.js Friends section in Settings: invites, friends list
visit.js Visiting a friend's room
theme.js Day & night, match my phone, light, dark
chat.js Chat with Mimi
share.js Share picture
Conventions:
core and memory never touch the page; ui modules each own one part of the page and re-render when the store changes (store.on(render)).addEntry / removeEntry for good things; for everything else change store.<name> then call store.save("<name>").SHELL in sw.js so they work offline.Mimi is local-first: the on-device database is what the app reads and writes, so it's instant and works offline. When you're signed in, it's mirrored to a Supabase (Postgres) database.
mimi-arigato)| Store | Contents |
|---|---|
entries | One record per good thing: { id, day, text, createdAt, updatedAt, deleted, synced, photoId, tags }; tags is { people, places, things } from the AI, or null |
kv | settings (+ when each setting changed; includes customFur and framePhoto), scrapbook, treasures, firstMet, milestones, surprises, daily pets/treats (fish)/water/cuddles counters, quietDay ("Nothing special today"), installLater, runSaid, chat (Chat with Mimi, device only), lastVisit, sync bookmarks, and per-device bits: mimiGood (today's line), tucked (tonight), postcardSeen/postcardAnnounced, seasonsGreeted, motionAsked, yearAgoGreeted, remembered/rememberedAt; synced: theories, wishes, roomThings, reminders, fed (last day fed/watered), quietDays; per device: stickyGreeted, stickySaid, gameBests |
photos | Photo details: { id, day, caption, entryId, createdAt, updatedAt, deleted, synced, uploaded, hasFull, hasThumb } |
photoFiles | The image files, keyed <photo id>:full and <photo id>:thumb |
Data from earlier versions (plain localStorage) moves into the database automatically. If IndexedDB isn't available (some private-browsing modes), the app falls back to localStorage.
| Table | Contents |
|---|---|
entries | id, user_id, day, text, created_at, updated_at, deleted, synced_at, photo_id, tags (jsonb) |
user_state | user_id, data (jsonb: settings, scrapbook, treasures, milestones, firstMet, theories, wishes, roomThings, reminders), updated_at |
photos | id, user_id, day, caption, entry_id, created_at, updated_at, deleted, synced_at |
friend_invites | code, user_id, created_at, expires_at, used_by: one-use codes, 7 days |
friends | user_id, friend_id, created_at: one row each way, made only by accept_invite() |
rooms | user_id, snapshot (jsonb: cat name, fur, wear, total, treasures, things, season), updated_at: readable by friends |
ai_usage | user_id, day, checks, chats: AI calls per day, counted by mimi_ai_call() |
Storage bucket photos | Private image files at <user id>/<photo id>.jpg and …-thumb.jpg |
Entries also have a photo_id column linking a good thing to its photo.
Row-level security means each person can only read and write their own rows. The one exception is rooms: your friends can read your room snapshot. peek_invite() and accept_invite() are the only way to use someone else's invite code.
synced_at (stamped by the server, so wrong device clocks don't matter). If the same entry changed in two places, the newer edit wins.deleted = true) so every device learns about them.supabase/schema.sql, and click Run.https://mimi-arigato.vercel.app) so the confirmation link comes back to Mimi.src/config.js:
export const SUPABASE_URL = "https://YOUR-PROJECT.supabase.co";
export const SUPABASE_ANON_KEY = "eyJ...";
The anon key is meant to be public; row-level security protects the data. Never put the service_role key in the app.Updating: when a new version adds tables (like photos), run supabase/schema.sql again. It's safe to re-run.
Checking that sync works:
Notes:
Or type this code in Mimi: {{ .Token }}. Also add your site to Authentication → URL Configuration → Redirect URLs so the link comes back to Mimi.Re-run supabase/schema.sql (adds the café's Realtime policies). Realtime must be on for the project (it is by default). Cafés are private channels, so they work whether or not Realtime's "Allow public access" is on. If a café says "The café's door is stuck", the policies are probably missing: re-run the schema.
supabase/schema.sql (adds push_subscriptions).VAPID_PUBLIC_KEY (the same value as in src/config.js), VAPID_PRIVATE_KEY, CRON_SECRET (any long random string), and SUPABASE_SERVICE_ROLE_KEY (Supabase → Project Settings → API → service_role; it stays on the server). Redeploy.CRON_SECRET with the same value as in Vercel.{"devices":…,"sent":…}.
To make a new key pair: node -e 'const c=require("crypto");const k=c.generateKeyPairSync("ec",{namedCurve:"prime256v1"});const p=k.publicKey.export({format:"jwk"});console.log(Buffer.concat([Buffer.from([4]),Buffer.from(p.x,"base64url"),Buffer.from(p.y,"base64url")]).toString("base64url"),k.privateKey.export({format:"jwk"}).d)' (public, then private).Hunger or health bars (Mimi only looks a little sad on a day with empty bowls, and cheers up at once), punishment, "Mimi is sad you didn't visit", streaks that reset, losing accessories, coins, energy, ads, quests. Mimi says one thing: "Tell me one nice thing."
Direction (2026-10-07): make Mimi's memory the heart of the app: your life slowly becomes a little world. Built on 2026-10-07: AI tags (people, places, things), memory pages from room things and Memories, theories you can correct, and "Mimi remembers before you do". Ideas to grow them:
Tag older good things (a one-time "Mimi rereads your good things" for entries from before tags, within the daily AI limit).
Room objects from AI things, not only the 18 keyword themes (pottery, Taipei cafés…); a suitcase that lists your places.
A scrapbook-style page for a person after many mentions; thank-you cards from a person's page. Then: letters to future you, the Let-It-Go jar (never saved), diary weather showing in the room. Not now: a memory graph screen, personality modes, friendship tree; save stats and chapters for Mimi Wrapped.
Pick up here (2026-10-07): the AI check, earned fish/water/cuddles and Chat with Mimi are built (ec41a7d) but only tested with a fake Gemini. Before testing for real: push the 4 local commits, add GEMINI_API_KEY in Vercel, re-run supabase/schema.sql. Then check real Gemini replies and that Vercel runs api/mimi.mjs.
Built 2026-10-17: today's challenge (earns a treat bag; one treat per good thing now), the cat's photo diary, Pumpkin patch (Halloween), and notifications (daily nudge + sticky notes). Next seasonal games: one for Christmas (from Dec 18) and one for the Lunar New Year.
Hide a treasure (step 2 of the first multiplayer game; friends and visiting are done): hide one of your treasures in a spot in your room for a friend to find ("sniff sniff warmer!"); the finder keeps a copy tagged with where it came from. Then step 3, your cat visiting a friend's room for a day. Design: docs/superpowers/specs/2026-10-04-visiting-cats-hide-a-treasure-design.md. Later games on the same friends: paint together (a shared pixel canvas that hangs in both rooms), fishing together (live, co-op).
"Mimi Wrapped" in December: a year-in-review story you tap through (total good things, top people, favorite things, mood weather across the year, scrapbook highlights), built from Month, Memories and Scrapbook, with a share card at the end.
Big ideas (logged 2026-10-17)
cat/music.js).Diary extras
Other ideas
To decide (from the 2026-10-04 build)
To decide (from the theories / wishes build)
Sounds: "Loud cat purring" (Freesound community) trimmed to 1.5 s, and a meow (yomecerlm3), trimmed to 0.9 s, both via Pixabay.
Surprises (rare, at most about three a week): Mimi finds a treasure (a tiny button, a seashell, a blue feather…) that appears on the floor of the room, or tells you a dream ("dreamed about noodles last night").
Tap things in the room and Mimi comments on them. Tapping a thing from your life (the coffee mug, the suitcase…) opens its memory page: every good thing about it, who and where it tends to come with, and Mimi's theories about it.
People, places and things (in Memories): a chip for each person who came up at least twice, each place, and each thing from your life, with how many good things mention it. Tap one for its memory page: "3 good things since Sep 12", a line from Mimi ("Mimi thinks Anna is important."), who and where it comes with (tap those to hop to their page), what it goes with, Mimi's theories about it, and the good things themselves.
Mimi remembers before you do: now and then (at most every two weeks, on a quiet day) Mimi brings up someone or something you haven't mentioned in two months while you kept telling other good things: "was just thinking about Bao. They haven't come up since June. Mimi hopes they're well." Never a question, never a nudge.
Diary: a private page per day for whatever happened or whatever's on your mind, not only good things. It saves as you type. Pick the day's mood weather (sunny, cloudy, rainy, stormy) if you like. A little sleeping Mimi keeps you company on the page and flicks her tail while you type, but she never reads or reacts to what you write: diary pages never show up in Memories, Scrapbook, Month, the picture of today, or search. Past pages are listed underneath; tap one to read or edit it.
Scrapbook: at 10, 25, 50, 75, 100 good things, then every 50, Mimi keeps one entry (preferring warm moments) as a taped-in page. Flip through them.
Month: "Your October": how many good things across how many days, what kinds, "You mentioned coffee 11 times," and Mimi's favorite memory of the month.
Calendar: days get pinker the more you wrote, and days with a diary page show their mood weather in the corner. Tap a day to read it or open its diary page; search your good things.