尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
A seek-and-find game I made for my daughter, starring her family as cartoons. One HTML file plus pictures; every hiding place comes from one data file.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗For a child who already does serious seek-and-find books, and her family, who are the ones hiding. It does 42 busy pages, in English and Korean, each hiding the same nine: a girl, Dad, Mum, Grandma, an uncle, the grandparents, a pair of ballet shoes, a sleepy doll and the unicorn from the Monster Book. About a hundred people on the first page, over 250 on the busiest, the family the same size as everyone else. Find them, get a clue when stuck, then "Hide everyone again" for a new round on the same page, with lookalikes from the third round. Nine of the pages are for Christmas and open on their own days in December, from the 6th to Boxing Day.
Try it: seek.mikeohalloran.au on a phone. Pinch to zoom, tap to find. Or start at the playroom, the front door to all three labs: Monster Lab, Learning Lab and Seek Lab (this one). The public game uses generic labels (Girl, Dad, Mum); the family's own names never leave their devices.
What's measured: the answer key can't be wrong, by construction: AI paints each scene empty, and code places the family from one data file that also builds the printed book and its answers pages. Over 1,400 hiding spots, about 40 a page, were each checked by eye with a stand-in in place. A build fails if either language file is missing a line. "Things that turned out to matter" below is the real record: what went wrong, from the image model to the size of a fingertip, and what fixed each.
Where the AI is: painting crowds, not hiding people. Asked to hide the girl once, the first test drew her five times and invented a second grandma, so the model never sees the family: it paints the place, and code does the hiding. Two people decide what's good enough: the parent who checks every spot, and the child who plays it. Built with Claude; it was planned as a printed book, and the website is what it became.
After the Monster Book, my daughter was getting a second book: a seek-and-find where the people hiding in the crowd are her own family, drawn as the cartoon versions she already knows from her stickers. It was planned as ten busy places, each across a two-page spread, coil-bound so it lies flat: a toy shop, a library, a playground, a supermarket, a swimming pool, an airport, Grandma's garden, a ballet school, a zoo and a party in the park. All ten are on the website, plus thirty-two more made just for the website: a whole street out trick-or-treating for Halloween, everyone in costume (the family too), nine for Christmas that each open on their own day in December, like an Advent calendar: a suburban street lit up for Christmas with a foam-snow machine and an ice-cream van, Carols by Candlelight on a park lawn full of rugs and candles, a Christmas parade with a giant pudding, a koala in a Santa hat and a sleigh pulled by kangaroos, Boxing Day on a harbour headland watching the yacht race set off, all four with the family in their everyday clothes, a village where every building is a gingerbread house, with an icing skating pond and a chocolate stream, and the snow festival in the mountains at Taebaek, with giant snow sculptures and a snow slide, both with the family in puffer jackets and beanies, then Santa's toy factory, where the family hide among mountains of presents, and the North Pole on Christmas Eve, with the sleigh being loaded and the reindeer harnessed, both with the family dressed as elves, and Christmas Day itself on Manly Beach, half the crowd in Santa hats, with the family in rash vests and board shorts and Santa hats of their own, four real places in Korea (the sunrise at Homigot in Pohang, with its giant bronze hands, Pohang's Jukdo Market, and Expo Science Park and the Sungsimdang bakery in Daejeon) four in Sydney (Circular Quay between the Harbour Bridge and the Opera House, Hyde Park, Town Hall and Bondi Beach), five more around Asia: Victoria Harbour in Hong Kong, Gardens by the Bay and the Lau Pa Sat hawker centre in Singapore, and KLCC Park under the Petronas Towers and the old streets of George Town in Malaysia, and five palace pages in Seoul long ago, where the whole family wears hanbok: Seollal, the Lunar New Year, in the courtyards of Gyeongbokgung Palace, the King's procession setting out through the palace gate, the changing of the guard at Gwanghwamun, a summer banquet at Gyeonghoeru on its lotus pond, and an autumn day in the Secret Garden of Changdeokgung, and four in Korea today: a picnic by the Han River under the Banpo Bridge rainbow fountain, the mountain-trout ice-fishing festival at Hwacheon, a primary school sports day, red team against white, and a spring day at Daereungwon in Gyeongju, the grassy tomb hills of the old Silla kings, where half the visitors have rented hanbok for the day and so has the family. The printed copy is shelved: she took to the website and finished all ten pages, so the website became the game. She already does serious Where's Wally-style books, so the pictures are dense and mostly get harder as you go: about a hundred people on the first page, over 250 on the busiest, with the family the same size as everyone else.
The website is the same book on a phone. Same pictures, same family, same hiding places, plus things paper can't do: it knows when you've found someone, it can give a clue, and it remembers how far you got.
A gift link like ?for=Max makes it "Max's Seek and Find" on that device.
Some pages open on a date. The Christmas pages stay hidden until their own day on the device's calendar, then appear on the home screen (even in a tab left open overnight), like doors on an Advent calendar. ?all in the address shows every page early, for checking one before its day.
The book and the website come from the same file. That's the main design decision.
The pictures are painted by Google AI Studio, but AI image models can't be trusted with a seek-and-find. Asked to hide the girl once, the first test drew her five times, gave Dad's tattoo to a stranger and invented a second Grandma. So the scenes are painted with no family in them at all, and the family are added afterwards in code, as cut-outs, at positions written down in one file (scenes.json). From that one file:
So the answer key is right by construction, and the website and the book always agree.
The website goes one step further: it gets the pictures empty, plus the family cut-outs, and places everyone itself. A first play uses the book's places. Hide everyone again picks a new mix from a list of checked spots on each page (about 30 per page, over 700 in all: feet on open ground, nobody in front, each one looked at zoomed in), with room for the grandparents' pair and smaller spots for the toys. A round is just a random seed (and its level) saved on the device, so a half-finished round comes back the same after a reload. Harder rounds use the same spots: the lookalikes take the spots nobody is using, and a hiding find is drawn with a prop in front, picked to suit the page and the spot (suitcases at the airport, presents at the party, a bush only where the ground is grass).
The site itself follows the monster site: one HTML file plus pictures. No framework, no server, no accounts, no analytics, hosted free on Cloudflare Pages. Progress lives in localStorage on the device. The chime is synthesised with Web Audio, so there are no sound files. Nothing anyone does in the game leaves their phone; the only outside request is Google Fonts. The one exception is a gift link, which carries the child's first name in its address (?for=Max): opening it, or following the "More to play" link at the bottom back to the playroom, sends that name to the site's hosting as part of the page request, and nothing else. The site asks search engines not to list it.
English and Korean. A switch on the home page turns the whole game into Korean and back, and the device remembers it. Every word the game shows lives in two files, tools/lang/en.json and tools/lang/ko.json, with the same keys in each, so a new page adds one line to each; the build stops, and a test fails, if either is missing a line. Korean puts a small word after a name that depends on how the name ends (아빠를 but 삼촌을, for "Dad" and "Uncle"), so the Korean lines mark the spot ({name|을/를}) and the page picks. The Korean font (Jua and Gowun Dodum from Google Fonts) loads only when Korean is on, cut down to the few hundred letters the game uses.
The family's own names aren't public. This repo and the public page only know generic labels: Girl, Dad, Mum, Grandma, Uncle, Grandparents. My daughter's devices show her own names for everyone, from a private link (hide.py link makes it from scenes.json, which isn't in the repo) that carries them after the # in the address. Browsers never send that part to the server; the page keeps the names on the device and takes them out of the address bar straight away.
| Path | What it is |
|---|---|
index.html | The whole site: markup, styles and script in one file, as hosted |
tools/site_src.html | The same page as written for the Claude preview, before make_site.py wraps it for hosting |
tools/hide.py | The book builder: cuts figures out of AI Studio character sheets, suggests and checks hiding places, builds the print pages, the who's-hiding page, the answers and the PDF, finds and records the spots for new rounds (slots), exports the website's empty pictures, cut-outs and data, including the lookalikes, props and sitting and peeking poses for harder rounds and the costumes some pages dress the family in, and makes the private names link (link) |
tools/gen.py | Makes the character sheets and scenes with Google AI Studio's image model (needs your own API key) |
tools/prompts.json | The prompts for every character sheet and scene, the lookalike and prop sheets, the hanbok sheets for the palace pages, the Halloween, Christmas elf, winter-coat and beach costume sheets and the Christmas and beach props (the real-place scenes also attach reference photos of the real places, which aren't in the repo) |
tools/make_site.py | Wraps the page for hosting (plain link says "My Seek and Find"), builds the English and Korean text and the Korean font link into it, and zips it for Cloudflare Pages |
tools/lang/en.json, tools/lang/ko.json | Every word the game shows, one file per language: buttons and messages, what each find is called, and each page's title |
tools/check_lang.py | Checks the two language files against each other and against the pages: no missing lines, no lost name slots |
tools/test_site.py | Drives the site in Chromium at phone and laptop size: every find, a miss on an empty part of the picture, reload, the finale, start again, zoom, drag, clues, and a new round on every page (everyone moves, nobody overlaps, every find taps, a reload keeps the round), a finished page reopening as a new round with its star kept, harder rounds on every page (levels in turn, lookalikes and hiding, nothing overlapping, a lookalike tap says "Nearly!" and doesn't count), the private names link (own names shown, ticks carried over from a renamed find, the address bar cleaned, a broken link ignored), costumes (on a palace page everyone is in hanbok in every kind of round, with hanbok lookalikes and faces, and every other page unchanged), dates (a Christmas page is hidden before its day, with no card, link or next-page button, opens on the day, even in a tab left open, and keeps any progress while hidden; shows everything), and languages (the switch turns every screen to Korean and back, is remembered, loads the Korean font only in Korean, and never touches a tick or a star); runs it all again in Korean |
The pictures aren't in the repo; they're the book. Nor are scenes.json (where every hiding place lives, so it would give the answers away, and where the family's own names are kept) and the website/ output folder, so hide.py and make_site.py won't run from a clean clone; index.html is the built result and is complete. The tools, prompts and tests are all here.
The page needs to be served, not opened from a file:
python3 -m http.server 8000
Then open http://localhost:8000. Without data.json and the pictures you'll get the page frame with nothing to play, which is enough to see how it's put together.
Pictures generated with Google AI Studio. Fonts: Fredoka and Nunito, both Open Font Licence. Site and tools written with Claude.
Made for my daughter.
hide.py slots suggests spots with the same open-floor test as the book and draws each one with a stand-in figure; only the ones that look right are kept. One spot was dropped because a fairy behind it made whoever stood there look like they had wings.co in scenes.json): the website swaps in that costume's cut-outs, sitting and peeking poses, its own lookalikes (strangers in hanbok who share all but one thing with a find) and its own faces on the strip. The toys stay as they are. The Halloween page has a second set, made the same way: a witch, a pirate, a black cat, a fairy, a vampire, and a scarecrow and a skeleton for the grandparents, each in their usual colours and with no character from a film or show. A witch's hat makes the girl's cut-outs taller than her everyday ones (and Mum's cat ears and tail, a little), so those costume cut-outs get a size of their own and she stays her usual size under the hat; a page put in costume after it was made keeps its places and its key, so nobody's stars move. The Christmas pages have a third set: everyone as an elf in green and red, with their own colours for the collar, belt and shoes (lavender and pink for the girl, navy for Dad, cream for Mum, light blue for the uncle), Grandma's red flowers on a green dress, and a floppy elf hat each, sized the same way as the witch's hat. A fourth set dresses everyone for snow: a puffer jacket, a beanie with a pom-pom and a scarf, each in their own colours (Grandma's flowery dress shows under a long green coat), for the gingerbread village and the snow festival; the beanies are sized like the hats. A fifth is for Christmas Day at the beach: a long-sleeved rash vest and board shorts in their own colours and a Santa hat each, with beach things to hide behind (a tent, a heap of bags, a sandcastle, an esky).hide.py spots suggests places where the floor just below the feet is open, so there's nobody in front. Flat roofs read as open floor too, so each scene can list no-go boxes.key_pin in scenes.json, dropped as soon as the page really changes), so every star and round carried over.?all--lang kodocs/ | Screenshot |