Five Windows
A little house shared by five friends who live far apart: Rithika in Canberra, Neha in New Jersey, Amirdhavarshini in Tamil Nadu, and Rithanya and Aswathy in Bangalore. Everyone has a room, and everyone shares the living room, the kitchen, the garden and Shinzo the dog.
You come in whenever you're free, leave something for someone, and go. Whoever comes by next finds it, an hour or a week later. Nobody has to be online at the same time, nothing pings you, and there's nothing to like or count. When you come back, the house tells you what happened while you were away. And if friends are in at the same time, the house is live: you see each other walk, hug, and leave things as it happens.
What "good" means here
A good version of this house:
- Works asynchronously. One person can come by, leave something and go, without waiting for anyone.
- Remembers people. What you leave is still there tomorrow, after a refresh, a restart or a redeploy.
- Makes coming back worth it. When you return, the house tells you who has been by and what's new since your last visit.
- Feels like a place, not a feed. It has rooms, a wall and a kitchen table, not a timeline. There are no likes, follower counts, notifications or infinite scroll.
- Is built for exactly five. The five of us are the whole cast, and the house assumes you already know each other.
- Keeps interactions few and meaningful. If something doesn't make five people feel closer, it doesn't go in.
- Gets more alive when friends overlap. Being there at the same time should feel special, but it's never required.
The house
The house is a cutaway seen from above, like a game, illustrated in Google Stitch. Amirdhavarshini's room is the big one in the corner, with the biggest bed and a round mat and cushions on the floor, because that's where everyone hangs out. The kitchen and the living room are in the middle, the garden is out the back, and Rithika's, Rithanya's, Aswathy's and Neha's rooms run along the front.
On a phone, the house fills the screen either way up. Upright you see part of it and pan for the rest (a line under the bar says so); sideways the whole house fits. Each of us is a little sticker in the house, and nobody moves unless they're the one moving. You walk yourself around: with the arrow keys or WASD on a laptop, or on a phone by holding either bottom corner of the screen and sliding your thumb, like a game, in a room as much as in the whole house (on an iPad, the bottom corners of the house). The stick comes up wherever your thumb lands, so there's nothing to aim for, and the buttons stay out of those corners. A quick tap in a corner still taps whatever's under it. Walk into a room and a button offers to take you in (Enter does it on a keyboard), and the house zooms in on it. You can also just tap a room, and you walk there and go in. When you're done in a room, walk out of it and the house zooms back out, with you where you stepped out.
Whatever you walk up to that you can use lights up gold: a bed, a desk, the cushions on Amirdhavarshini's mat, Rithanya's mirror, Aswathy's yoga mat, the sofas, the wall of notes, the stove, the garden patches, a birthday girl's balloons, Shinzo. Walk up to a friend who's here and you can hug her. Buttons for what you can do there appear above the Go in button. Sitting on Amirdhavarshini's mat with a friend, the button deals UNO. On a keyboard, Enter or E does the first one (ahead of going in), and the number keys do the rest.
Everything you can do has a little emoji on its button: ๐ด sleep, ๐ง water, ๐ฑ plant, ๐พ pet Shinzo, ๐ฆด give him a treat, ๐งน tidy, ๐ kettle Maggi, ๐ฅ face mask, ๐ eat, ๐ค hug, ๐ wish a happy birthday, ๐ UNO, and so on. The emoji pops up over the thing as you do it. Once it's done, something pops up where you did it: drops fall on the garden, a sprout comes up, hearts float over Shinzo, sparkles show where the clutter was, z's drift over you in bed.
The house keeps where you stopped. Reload, or come back next week, and you're standing there, with Shinzo beside you if he's with you.
Friends stand still where they last were, so you can find a friend in the kitchen, or on the sofa where she sat down. Anyone who's been here in the last ten minutes breathes a little and glows underfoot because she's here. During her sleep hours, a friend who isn't here is tucked up in her own bed.
The house is live. Nothing needs a refresh: whatever a friend leaves, wherever she sits down, whoever she hugs shows up on your screen as it happens, and a friend who's in at the same time walks around in front of you. Typing something yourself is never interrupted.
Each bedroom is someone's own:
- Neha's has a pink tablecloth, a blue checked blanket and the board games. Neha's the first one in bed, at 10.
- Rithanya's has UPSC books and a box of KitKats on the study table, a basket of more KitKats, a mirror, and face mask powder for everyone. She loves movies, and she sleeps in too.
- Aswathy's has a yoga mat for meditating, a desk with two chairs (one to work on, one for her clothes), and bananas that should have been thrown out a while ago. Tidying doesn't touch the bananas.
- Rithika's has shelves of little bottles and jars, a pink bed and a desk.
- Amirdhavarshini's has the hangout mat, with a cushion for each of us around it, and the kettle we made Maggi in back in the hostel.
Everyone has a laptop.
On a laptop, the house sits beside "while you were away" and everyone's clocks. On a phone, the house fills the screen and you pan around it, with tabs at the bottom for Home, Updates, Movies and Everyone.
Your sticker sits in the corner of the top bar ("Not Rithanya?", or whoever you are), and tapping it takes you back to the door. On the Everyone page you can also come in as someone else directly.
Every room keeps its owner's time
A bedroom runs on its owner's clock. If it's late afternoon in Canberra and 3 am in New Jersey, Rithika's room is in evening light and Neha's is dark, with Neha asleep in bed and a lamp on in Rithika's, whoever is looking. Each room's name tag shows its owner's time. Only bedrooms ever dim: the living room, kitchen, garden and the halls between are always in daylight, whatever the time, and after dark the fire's lit too.
Characters sleep at night where they live: Neha from 10 pm to 8 am, Rithanya from 11:30 pm to 9:30 am, and everyone else from 11 pm to 7 am. Anyone who's been in the house in the last ten minutes is shown awake and "home now", so being there at the same time shows.
What you can do
- Leave something on a friend's desk. Write a note, add something with it (masala chai, filter coffee, dosa, biryani, Maggi, cake, a mango, a flower, chocolate or a KitKat from Rithanya's box), and it waits on their desk. Only they can read the note; anyone who walks in sees that something's been left. A friend can write back to a note on her own desk: her answer goes on your desk, says which note it's answering, and only you can read it.
- Write on the living room wall. Something funny from today, a good-luck wish, anything. Tick "big news" and it stays pinned at the top. The wall starts fresh on the 1st of every month (by Canberra's clock, so everyone sees the same wall), and each month before goes into the memory box in its own envelope, so nothing ever disappears. Friends can stick a sticker on any note (โค๏ธ ๐ ๐ฅน ๐ ๐ค ๐ฎ ๐ ๐), one each, with their name on it, so whoever wrote it knows they read it and how they felt. Pick another to swap yours, or the same one to peel it off. Stickers are never counted, and only the writer hears about them.
- Pin a photo on the memory wall. Something remind you of everyone? Take a photo of it and pin it on the living room wall, with a line about it (it starts as "this reminds me of you guys"). It goes up like a polaroid, and friends can stick a sticker on it like any note. Only friends in the house can see it.
- Draw something, or leave a voice note. In a friend's room, draw her something on a sheet of paper with a finger or the mouse (seven pens, a rubber, Undo), or record her a voice note of up to a minute, and it waits on her desk. Only she and you can see or hear it; anyone else who walks in sees a folded drawing or that a voice note's been left. A drawing can go up on the living room wall too, like a photo. Without a microphone, pick a recording your phone made.
- Cook for everyone, and eat what's out. Leave a dish out on the kitchen counter. It stays out for three days, or until someone eats it: then the plate's gone from the counter for everyone, and the cook hears who ate it.
- Save a plate for a friend who's away. Cook something and save it for one friend. It sits on the counter covered, with her name on a tag, for however long she's away. Only she can eat it, she finds it first when she comes into the kitchen, and whoever saved it hears she found it.
- Tidy someone's room. Rooms get a little lived-in after a couple of days, and messier after five. Anyone can tidy any room, and the owner finds out who did.
- Look after the garden. Everyone has a patch to plant in. Plants sprout, grow and bloom over three days. They look thirsty after two days without water, but they never die, and anyone can water the lot.
- Sleep or sit down anywhere. Anyone can sleep in anyone's bed, sit on her cushion on Amirdhavarshini's mat, sit on the sofa, or meditate on Aswathy's yoga mat. Friends who come by find you there, and the bed's owner hears who slept in it. You get up when you walk, or after two hours.
- Shinzo has his own day. He gets up and wanders the house on his own: the garden, the kitchen, the sofas, everyone's rooms, stopping for a sniff on the way. Every so often he naps, on his blanket under the tree or curled up in someone's room, and only then is he lying down. Everyone sees him in the same place at the same moment.
- Pet Shinzo, or give him a treat. Walk up to him wherever he's got to. He wakes if he was napping, comes over, and follows a step behind you for half an hour, facing the way he's going. Then he goes back to his own day.
- Hug. Walk up to friends who are here right now and hug one of them, or pull everyone close into a group hug, up to all five of you. You stay huddled together, hearts floating over you, until someone walks off, and whoever you hugged hears about it.
- Birthdays. Rithanya's is in January, Amirdhavarshini's in May, Neha's in June, Rithika's in October and Aswathy's in November. All through a friend's birthday month (by her own clock) her room has bunting and balloons, and she wears a crown wherever she is. Walk up to the balloons to wish her a happy birthday: you get a party hat for a couple of hours, and she finds out who wished her. On the day itself there's cake on her desk. You can leave the light on in a friend's window: it glows until she next comes home, and she hears who left it on for her, a hug that waits. Under a friend's photo on the wall you can write one line, like on the back of a print. Home and Updates bring back a note or photo from this day in an earlier month, and after you've done something, they offer a message you can send your group chat yourself (the house never sends anything). Any time of year you can write a friend a birthday card in her room: it's sealed until her birthday by her own clock, she sees who's written but not what, and on the day it opens for her and nobody else.
- UNO on the mat. Sit on Amirdhavarshini's mat with friends and deal UNO: seven cards each, up to five of you. Everyone gets twenty seconds a turn, counted down on the table. Whoever lets her time run out, or leaves the house, is out of the game, and the rest play on without waiting; the last one left wins. Updates says who dealt and who won.
- Do a face mask in Rithanya's room. She always has the powder. Your sticker wears a green mask with cucumber slices for two hours, so a friend who comes by catches you in it, and Rithanya hears whose face used her powder.
- Make kettle Maggi in Amirdhavarshini's room. Like in the hostel. The kettle and two bowls sit out on her mat, steaming, for the night (twelve hours), with a note if you leave one.
- Movie time. Rithanya loves movies, so the Movies tab is hers. The time for all of us comes first, to plan a movie night on the living room sofas; then suggest a movie and say why, or tick off the ones you've watched. A new plan replaces the old one. Rithanya's suggestions are marked as her picks.
- A time for all of us. On the Everyone tab (and on Movies), every friend's clock is there at once, one row each, starting from now. Above them is a strip of everyone's day and night: drag it with a finger or the mouse (or swipe, or use the arrow keys) and every clock's hands, its AM or PM and its time follow as you go, with each friend's time beside the needle so a phone shows all five at once. Or change any one row and the rest follow, so if Neha's staying up late or you're up early, start from that row. Each row says if it falls while that friend is usually asleep. Use it just to see what time it'll be for everyone, or plan a video call (with what it's about, if you like) or a movie night from it. Everyone sees the plan in their own time, and Back to now puts the clocks back.
- Look out at the whole house. In any room, even lying in bed, press Esc (or See the whole house) and the view zooms out to the whole house, so you can watch who's moving about without getting up. Esc again goes back into the room.
When you come home, While you were away lists what's new since your last visit, starting with what was left for you: who tidied your room, what's on your desk, who wrote on the wall, what's in the kitchen. Rooms with something new for you twinkle in the house too. A visit is a stretch of page loads with no 30-minute gap, so the new marks survive a refresh and reset the next time you come back. The Updates tab also keeps what happened lately, so there's always something to read. After the wall starts fresh, the first time you come back you get a recap of last month's wall, every note and photo with your name, and what's new to you marked. It waits on Updates (and on a laptop's Home) however long you're away, until you put it in the memory box.
A house for your own friends
This house is for the five of us, but anyone can make one for their own friends at /make (there's a link at the door), for two to seven of you. Tell it each friend's name, where she lives and a few things about her, pick what's in her room from a set of pictures (a guitar, fairy lights, too many plants, a cat bed and more), and add the memories you'd pin on the living room wall. At the end it asks for something you all did together and the inside joke or quote from it, and frames that, word for word, at the house's door and on the memory wall in the living room, with a little frame on the living room wall in the picture. The name you give the house is on its door and at the top of every page. It builds a house of your own at its own private address: our picture for five, or a house drawn for your number, with a room each named for your friends, their things pictured in their rooms, your memories on the wall, and everyone's own clock. When Claude can be reached it writes each room's description from what you said; otherwise the house is built straight from your words. Everything else works the same in your house: walking, hugs, UNO (at the coffee table, if you aren't five), the wall, Shinzo. Our five's own things (the KitKats, the face masks, the kettle) stay in our house.
It's a prototype: two to seven friends, because each size needs its own picture, and more friends means more rooms and new art.
What isn't here yet, on purpose
Chat, notifications, and editing or deleting things you left. Each one has to show it makes five people feel closer first. Being in at the same time is a bonus, never a need: you see friends walk and what they do as it happens, but everything waits for whoever comes by later. UNO, with its twenty-second turns, is the one thing that needs you there.
Only one person can be each of us at a time. A friend's window at the door stays shut while someone's in the house as her, and opens again two minutes after they leave, even for her own second device. Anyone with the link can still pick a window that's free. Coming in as anyone (a window at the door, or "Come in as" on Everyone), Home says "Hi Rithika ๐" with her picture for a few seconds, and "Not you? Change" takes you back to the door, so a wrong tap is caught straight away. There's no password on purpose for now, so the course's markers can walk in as any of us: a desk note is private from the other friends in the house, but not from someone who comes in as you. A shared front-door key is the likely next step before the real five move in.
On your phone
The house is an app too. Open "Get the app" (at the door, or the foot of any page) for an Install button where your browser has one, a code to scan from a laptop with your phone, a way to share it, and the steps for each kind of phone. Nothing to download from a store, and it's always the newest. Offline, it says so kindly instead of failing. The house can go on a phone's home screen like an app, with the living room's fire as its icon. On an iPhone, open it in Safari, tap Share, then Add to Home Screen. On Android, open it in Chrome and choose Add to Home screen (or Install app) from the menu. It opens full-screen, without the browser around it. A made house goes on the home screen under its own name and opens straight to its own door.
There's a widget too, like Locket. Home asks once on each phone, iPad or laptop: "Put Five Windows on your home screen?" Say yes and it shows the steps for whatever you're on, and tells you "It's working" as soon as your widget first looks in; say not now and it stops asking on that one. The widget shows something different each time your phone refreshes it: a friend's birthday (that day and the day before, with her picture), a note or a gift someone left on your desk with their words, a plate saved for you, this month's photos on the memory wall, your room with you in it, everyone's faces and clocks, and Shinzo. Tap it to go straight there. It's easy on the battery: one small question to the house each refresh, and every picture kept on the phone once it has it. On an iPhone or iPad it's a widget in the free Scriptable app (copy, paste, add); a Mac with macOS Sonoma or newer shows the iPhone's widget on its desktop. On Android it takes KWGT (its Pro key is a few dollars), since Android doesn't let a website be a widget on its own. The widget updates itself, so nobody pastes twice, and it never sends a notification. Each friend's widget is her own and says whose it is, so come in as yourself before saying yes. Something new for you (a note on your desk, a plate saved for you) shows first. A note on a friend's desk never shows on yours, and the wall only shows what its writer chose: pinning asks "Show it on friends' home-screen widgets too", and she can change her mind on the note later. A made house gets all of this for its own friends, faces and rooms included.
How it's built
It's kept as small as the problem: one Node process, no framework and no runtime dependencies. Every page is drawn on the server, and every action is a plain HTML form. One small script lets you walk your avatar around, and another keeps an open page up to date, but everything works without them: rooms are links.
src/server.tsholds the routes, and lets only one person be each of us at a time.src/live.tskeeps a line open to every open page (server-sent events) and tells it when something changes or a friend walks;public/live.jsthen fetches the page again and swaps in what's new. It also plays your UNO cards without leaving the page.src/store.tskeeps everything people leave in one SQLite table (Node's built-innode:sqlite), plus when each friend was last here and where she stopped, in a file on the Fly volume at/data, the only storage that survives a redeploy.src/house.tsworks out what the house looks like from that log: how messy a room is, how thirsty the plants are, where Shinzo's own day has taken him, who's asleep, sitting or hugging where, what's on the counter, who's in a face mask or a party hat, whether there's Maggi out, and the movie list.src/uno.tsreplays each UNO game from its moves in the log.src/time.tsturns each friend's time zone into a clock, a time of day and her birthday month.src/scene.tslays an SVG layer over the illustration: the rooms as links, each room's light, what's been left, the things you can use, Shinzo and the five of us.src/art.tsdraws the small things in SVG: food, notes, clutter, plants, Shinzo on his feet and his blanket, and the bunting, balloons and crowns.src/pages.tsputs the pages together,public/style.cssstyles them, andpublic/house.jsdoes the walking: the keys, the thumb stick, the Go in button, lighting up what you're next to, the hug button, telling the house where you are, walking Shinzo along his day, and moving friends as they walk.src/people.tslists the five, with their cities, time zones, sleep hours and birthdays.scripts/cut-art.pycuts the Stitch exports into the house picture (with one desk in each room), Shinzo and the five stickers inpublic/art/. It runs by hand, not on the server.
The big decisions (the stack, the storage, who counts as a person, the illustrated house, the log of things, the clocks, walking yourself around, the house keeping where you stopped, the live house, one of us at a time, Shinzo's own day, UNO and its twenty-second turns, and always-lit common areas) are written up as decision records in doc/adr/ in the repository.
Run it locally with pnpm start (it keeps its data in ./data), then run pnpm check in another terminal to check it against the spec.
What's been checked
spec/house.test.ts checks the house's promises against the running app:
- the door offers the five of us
- each friend's clock shows the time where they live
- each friend goes to bed at her own bedtime (Neha at 10)
- choosing who you are is remembered
- only one person can be each of us at a time
- a friend's open page hears what you do and sees you walk, without a refresh
- a note on the wall is there, marked new and named in "while you were away", when another friend comes by
- your own notes are marked as yours
- a note shows exactly as written, even when it looks like HTML
- friends can stick a sticker on a note, one each and named, and its writer hears how they felt
- only the five can leave things
- a note left on a friend's desk reaches that friend, and others only see that it's there
- food from the kitchen is on the counter for everyone
- food leaves the counter once someone eats it, and the cook hears who ate it
- a plate saved for a friend waits for her alone, and the cook hears she found it
- a friend can write back to a note on her desk, and only its writer can read the answer
- a friend finds out who tidied their room
- the garden remembers who planted what and who watered it
- Shinzo goes along with whoever pets him, wherever they go
- Shinzo gets up and wanders the house on his own, the same for everyone, and only lies down to nap
- you're still where you walked to when you come back, with Shinzo beside you if you fed him
- anyone can sleep in anyone's bed or sit down, and friends find her there
- each thing in the house offers what you can do with it, where it is, each with an emoji
- a little emoji pops up where you did something once it's done, and Shinzo's awake once he's petted
- a friend who's home right now shows up where she is in the house
- nobody walks around on their own
- a face mask shows on the friend wearing it, and Rithanya hears whose it was
- kettle Maggi stays out in Amirdhavarshini's room
- a suggested movie and who watched it are there for everyone
- a movie night shows at the right time in each friend's own clock
- the planner shows every friend's clock from now, yours first, on the Everyone tab and Movies
- a video call planned from it shows in everyone's own time
- a room's page draws the whole house and everyone in it, even with you asleep in bed, so Esc can zoom out to it
- a made house has saved plates, writing back, the planner and Esc too, for its own friends
- an open Movies page's planner keeps up with friends' suggestions
- the time for all of us comes first on Movies, before the suggestions
- a photo pinned on the memory wall, with its words, is there for friends in the house and nobody else
- a drawing or a voice note left on a friend's desk is seen or heard by her and whoever left it, and nobody else
- a drawing pinned on the wall goes up like a photo, and friends can sticker it
- the wall starts fresh each month, keeps every month before in the memory box, and a friend back after the 1st gets a recap of what she missed until she puts it away
- Home asks about the widget, and yes gives each friend one that shows what friends left her and everyone's clocks, only with her own key, without coming in; its iPhone script runs as Scriptable runs it, shows the next card each time, and doesn't fetch what it already has
- saying not now to the widget stops Home asking on that browser
- a browser never runs yesterday's scripts under today's page
- the house can go on an Android or iPhone home screen, and a made house goes on as itself
- a made house's Home asks about the widget too, and each of its friends gets her own, with her friends' faces and her own room
- the widget shows what's left for her first, never a note on a friend's desk, and only the wall its writers chose to share
- a birthday card stays sealed until her day, by her own clock, and only she and its writer ever read it, in made houses too
- the top of Home names who came by, even if they left nothing, in made houses too
- a light left on in a friend's window glows until she comes home to it, and she hears who left it
- a note or photo from this day in an earlier month or year comes back from the memory box
- each friend can write one line under a friend's photo, never a thread, and the photo's writer hears it
- a message to send the group yourself says what you did and never what you wrote
- a made house names its own dog, and its about page is about its own friends
- a phone gets the house either way up: sideways it fills the screen, with its walking corners on the screen's own corners; upright, nothing covers it
- every browser is asked about the widget until it answers, even if the widget already works on another phone
- the house hands itself out as an app: a page anyone with the address can install it from, a code that reads back as its address, and a kind page offline, in made houses too
- every common area stays lit whatever the time, and only bedrooms dim, by their owner's clock
- a live page catches up by itself after its connection drops and comes back
- every page holds to an accessibility floor: a language, a title, one main landmark, alt text on every picture, a name on every button, link and field, and no id used twice
- the Everyone tab never offers to come in as a friend who's already in the house
- a garden planted just now is never thirsty, and a friend's kettle Maggi note stays after someone makes more
- the Updates dot only shows when Updates has something new to read
- friends who are close can hug, one or a group, up to all five
- a friend's birthday month brings bunting and a crown, and her friends' wishes reach her
- friends sitting together on Amirdhavarshini's mat can deal UNO, seven cards each, up to all five
- only whoever's turn it is can play UNO
- an open UNO table keeps up with friends' moves, and a card goes down without leaving the page
- each UNO player gets twenty seconds a turn, then the others play on without her
- leaving the house takes you out of your UNO game
- anyone can make a house for two to seven friends, and it's built from what they said
- a made house has a bedroom for each friend, and up to seven can play UNO at its coffee table
- each made house keeps to itself: its own friends, its own wall, its own sign-in
- a made house gives its friends their own rooms and memories, and none of ours
- a made house frames its friends' inside joke at its door and on its memory wall, exactly as they wrote it, under the name they gave it
- making houses is capped, and a house with a missing friend is turned down
- the house only takes things it has
The checks that write only run against a throwaway house, never the deployed one. doc/process-log.md in the repo records what was verified on the deployed app and how.