MyBooks
Sua vida de leitor, em uma estante só. Monte sua estante, organize coleções e descubra o que outros leitores andam lendo.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A gift for my beloved girlfriend
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
An interactive 3D garden where each flower opens an "open when…" letter.
Built with Next.js 15, React 19, TypeScript, Tailwind CSS, React Three Fiber + drei, GSAP and Framer Motion.
Then open http://localhost:3000. To try it on a phone, run npm run dev -- -H 0.0.0.0 and open http:// :3000 on a phone on the same Wi-Fi.
Everything she reads lives in data/memories.ts: one entry per flower.檢視完整 README ↗An interactive 3D garden where each flower opens an "open when…" letter.
Built with Next.js 15, React 19, TypeScript, Tailwind CSS, React Three Fiber + drei, GSAP and Framer Motion.
npm install
npm run dev
Then open http://localhost:3000. To try it on a phone, run npm run dev -- -H 0.0.0.0 and open http://<your-computer's-LAN-IP>:3000 on a phone on the same Wi-Fi.
Everything she reads lives in data/memories.ts: one entry per flower.
{
id: "sad", // keep ids stable: they're how opened letters are remembered
flower: "lily",
label: "Open when you're sad", // shown on the envelope and the flower's tag
message: `First paragraph.
Second paragraph, after a blank line.`,
photo: { src: "/images/personal/us.jpg", alt: "Us at the beach" }, // optional
audio: { src: "/audio/personal/sad.m4a", title: "Listen to this" }, // optional
},
message between backticks. A blank line starts a new paragraph; a single line break stays as a line break.public/images/personal/ and audio in public/audio/personal/. Both folders are gitignored, so those files never reach GitHub, which also means a deploy from GitHub won't include them. See "Deploying" below.flower: "final") stays locked as a bud until the other six have been opened.Besides the seven letters above, either of you can plant new ones from the garden itself: Plant something (top right) asks for the passcode once per device, then lets you pick a flower, write an "open when…" letter, and attach a photo or voice note. The new flower grows in where you're looking, and if the other person has the garden open it grows in on their screen too, with a note saying who planted it.
It runs on the Supabase project our-little-garden (Singapore):
plants: one row per planted letter, including its position in the garden. The browser can read and add rows, but never edit or delete them, so a leaked link can't wipe anything. To remove a plant, delete its row in the Supabase dashboard (Table Editor → plants).garden-media: uploaded photos (resized to at most 2000px) and voice notes, 25 MB max each.lib/supabase.ts. They're safe in client code: the key only allows what the table's access policies permit. Set NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY to point at a different project.The passcode is checked in the browser against a SHA-256 hash in lib/plants.ts, which also shows how to change it. It keeps casual visitors out, not a determined one. It needs a secure connection, so planting works on localhost and the deployed site but not over http://<LAN-IP>.
Unfamiliar flower_type values (added by hand in the dashboard, say) still render as one of the six flowers.
The first time each device opens the garden, it asks Who are you? Zorrow / Skelly. The answer is saved in the browser, and there's a "Not Zorrow?" link under "Enter the garden" to change it.
Inside the cottage. Follow the stepping stones out of the gate to the cottage, then walk into its door or click it to go inside. Inside is a little room with a bed, a table, a bookshelf and a plant. To go back out, walk into the door or click it.
The cottage keeps three things you can click. Each glows softly when you hover over it.
house_photos, with the files under house-photos/ in the garden-media bucket.notes. To take one down, delete its row in the dashboard (Table Editor → notes).Around the garden. There are four more places to spend time. Each glows faintly and shows a tag when you hover over it.
mailbox. To remove one, delete its row in the dashboard (Table Editor → mailbox).Inside, the music softens as if heard through the walls. To use a separate cottage track instead, put it in public/audio/ and set HOUSE_SRC in lib/music.ts.
The far garden. At the back of the garden, a gateway in the fence leads to a little wooden bridge over a brook.
The five places off the far garden:
NEXT_VISIT_DATE in lib/countdown.ts to a date and time with its time zone, e.g. "2026-12-20T15:00:00+08:00", and redeploy.MAZE_SECRET in lib/places/maze.ts.You only see the other person's gardener when you're in the same place. The top-left corner says where they are: "here with you", "in the garden", "in the cottage", "in the far garden", "in the greenhouse", "up in the treehouse", "in the gazebo", "in the lighthouse", "in the maze", or "away". While someone is away, their gardener is at home in the cottage, pottering about.
This runs on a Supabase Realtime channel (garden-live):
Nothing is stored. There's no login: the name is just a choice on each device.
While a festival is on, the garden is dressed for it. Thadingyut, the Festival of Lights, runs from 25 to 28 October 2026 in Myanmar time, a day longer than the festival itself.
festival_lamps; to remove one, delete its row in the dashboard.FESTIVALS in lib/festivals.ts (Tazaungdaing, say) with its dates and colours. Everything above follows on its own.?festival=thadingyut to the URL, e.g. to try it out or show it after it's over. Use ?festival=off to turn it off.Add these to the URL:
| Flag | What it does |
|---|---|
?skipintro | Skip the opening line and go straight to the garden |
?reset | Forget which letters have been opened on this device (progress is saved in the browser) |
?debug | Show an FPS meter, for checking performance on a phone |
?festival=thadingyut | Dress the garden for Thadingyut whatever the date (?festival=off for none) |
Flags combine, e.g. /?reset&skipintro.
The scene adapts to the device: it starts at a moderate resolution, and if the frame rate drops it lowers the resolution and halves the grass, wildflowers, fireflies and petals. Open the site with ?debug on her kind of phone to check the frame rate.
The project deploys on Vercel from the main branch of the private GitHub repo; every push to main redeploys.
Because photos and audio are gitignored, they won't be in a GitHub-based deploy. Options:
public/*/personal blocks from .gitignore and commit the media.data/memories.ts.The site is public to anyone with its URL (it's hidden from search engines), so share the link only with her.
| Path | What |
|---|---|
data/memories.ts | Letter text, labels and optional photo/audio for each flower |
lib/layout.ts | Where each flower grows, and the stepping-stone path |
lib/flowerSpecs.ts | Petal shapes and colours for each flower |
components/garden/ | The 3D scene: terrain, pond, flowers, camera, effects |
components/ui/ | Intro, envelope and letter, progress row, flower tags |
lib/gardenStore.ts | Garden state: intro stage, open letter, which letters have been read |
lib/plants.ts, lib/plantStore.ts | The shared garden: Supabase reads, uploads, realtime, passcode, where new plants grow |
components/garden/Fence.tsx | The fence and gate around the garden |
components/garden/Gardeners.tsx | Zorrow and Skelly: their looks, pace, wandering, tending and the wave when tapped, their walk in from the cottage, and walking them yourself or live |
lib/presence.ts, lib/playerInput.ts | The live garden: who you are, who's online, sending and replaying movement; keyboard and joystick input |
components/ui/PlayerControls.tsx, components/ui/WhoAreYou.tsx | WASD/arrow keys and the touch joystick; the "Who are you?" question |
components/zones/registry.ts, lib/zones.ts | The zones (garden, cottage, far garden and its five places): each one's scene, spawn points and exits, and which one is showing |
components/zones/FarGardenZone.tsx, components/zones/far/, lib/farGarden.ts | The far garden: its meadow, signpost and five entrances |
components/zones/places/, lib/places/, lib/rooms.ts | The greenhouse, treehouse, gazebo, lighthouse and maze: their scenes, layouts, and walking about in them |
lib/countdown.ts | The lighthouse's countdown: the date of your next visit |
lib/bridge.ts, components/garden/props/Bridge.tsx, |
components/garden/props/Brook.tsx| The bridges and the brook between the garden and the far garden |
components/zones/HouseZone.tsx, lib/house.ts | The cottage's interior and its layout |
components/zones/HouseKeepsakes.tsx, components/ui/Keepsakes.tsx | The photo wall, notes board and letter shelf in the room, and the panels they open |
lib/keepsakes.ts, lib/notes.ts, lib/housePhotos.ts | Which keepsake panel is open, opened letters and the photo wall's photos; the shared notes board; photos hung in the cottage |
components/ui/PartnerStatus.tsx, components/ui/ZoneFade.tsx | Where the other person is; the fade when you go through a door |
components/garden/Cottage.tsx, lib/procession.ts | The cottage outside the gate, its path, and the intro's walk and camera shots (runs after "Enter the garden"; there's a Skip intro link) |
lib/props.ts, components/garden/props/ | The swing, dock, mailbox and stargazing hill: where they stand, sitting on them, and the starry night |
lib/mailbox.ts, components/ui/MailboxPanel.tsx, lib/stargazing.ts | Delayed letters in the mailbox; when the stars are out |
lib/festivals.ts, components/garden/festival/ | The festivals, their dates and colours; the lights, lamps and fireworks in the garden |
lib/festivalLamps.ts, lib/fireworks.ts, lib/fireworkSound.ts, components/ui/FestivalMenu.tsx, components/ui/FestivalGreeting.tsx, components/ui/LampPanel.tsx | Lighting lamps, fireworks and lighting together, their sound, and the festival's menu, greeting and lamp panel |
components/garden/GardenerBody.tsx, lib/wander.ts | How the gardeners are built from simple shapes, and where they're allowed to walk |