diff --git a/assets/scripts/hidden-details.js b/assets/scripts/hidden-details.js index f50ff14..7503c87 100644 --- a/assets/scripts/hidden-details.js +++ b/assets/scripts/hidden-details.js @@ -1,250 +1,241 @@ (function () { "use strict"; - const KEY = "zxh_hidden_details_v1"; + const KEY = "zxh_hidden_details_v2"; + const OLD_KEY = "zxh_hidden_details_v1"; const now = new Date(); const hour = now.getHours(); const path = window.location.pathname; const state = readState(); + const familyLayers = [ + "Layer 0: surface website - notes, pages, tools, normal navigation.", + "Layer 1: casual hidden jokes - Aphy notices clicks, typos, tabs, and old-web habits.", + "Layer 2: memory fragments - Lima's notes and Young Z's childhood logs.", + "Layer 3: philosophical anomalies - Sensei Chi and Aphy disagree kindly.", + "Layer 4: time-distorted messages - Future Z writes back from age 40.", + "Layer 5: emotional core - love, patience, home, and the choice to keep returning." + ]; + const details = [ - "The footer keeps a tiny chair for anyone who scrolls this far.", - "Someone labelled the spare cables: important, mysterious, probably for a printer.", - "Memory is just a room that learned how to echo kindly.", - "If you are reading this at night, please unclench your jaw.", - "A bookmark fell asleep here and dreamed it was a door.", - "SYSTEM: kettle confidence restored.", - "Mum says the rice is never late, only thinking.", - "Dad left a note: check the plug, then check your assumptions.", - "The attic server hums like it knows an old song.", - "A small lantern named Morrow was seen under the navigation bar.", - "Home is the place where the mismatched mugs know your hands.", - "This tooltip has been waiting all afternoon to feel useful.", - "404s are just hallways with very sincere lighting.", - "The website looked away politely while you reread that sentence.", - "Winter folded the garden into a quiet letter.", - "Spring arrived wearing yesterday's coat and nobody minded.", - "Autumn keeps receipts from every golden hour.", - "Summer is a glass of water forgotten beside a book.", - "Auntie wrote: do not trust empty biscuit tins. They are emotionally complicated.", - "The comment box occasionally practices being brave.", - "There is soup in the archive, but only metaphorically. Probably.", - "Every old hard drive contains at least one photo called final_final_really.", - "The cursor paused here once. We still talk about it.", - "Friendship is two people saving the better chair without discussing it.", - "Tonight, the page is trying to be a porch light.", - "A tiny bell rings whenever someone chooses kindness and nobody notices.", - "The moon asked the stylesheet for softer margins.", - "You have visited before. The dust remembered your shoes.", - "The search box knows more than it says and less than it implies.", - "A good recipe is a family argument that became edible.", - "Grandad marked this line with a pencil and then forgot why.", - "Do not feed the calendar after midnight; it gets sentimental.", - "The page is handmade. Some fingerprints are load-bearing.", - "Some dreams are just old rooms asking to be opened gently.", - "Loneliness is not proof that you are hard to love.", - "The sidebar once tried poetry. It was mostly indentation.", - "If the site blinks, blink back. It is only being polite.", - "The archive has a cousin called Nettle who files everything under Maybe.", - "Morrow says: the lake is not empty, it is saving room.", - "A spoon knocked twice from inside the recipe page.", - "There are no achievements here. Only small doors and warm lights.", - "The browser tab is pretending to be calm.", - "This sentence was left in a coat pocket from 2009.", - "A family tradition: someone says five minutes and everyone understands twenty.", - "The oldest photo on the shelf still remembers the smell of rain.", - "Some pages do not want to be found quickly.", - "The loading screen packed snacks, just in case.", - "You are allowed to leave a page unfinished.", - "The website is not judging your tabs. It has seen worse.", - "A small blue bowl appears in three memories and no inventories.", - "The old internet was slower, which gave anticipation somewhere to sit.", - "A guestbook entry from nobody says: I was here, kindly.", - "The clock does not chase you here.", - "Nettle borrowed the semicolon and promised to bring it back.", - "Every link is a tiny act of trust.", - "The error page brought a blanket.", - "Sometimes growing older is just learning which lights to leave on.", - "The hallway smells faintly of toast and forgotten passwords.", - "A dream page exists behind a word you have not clicked enough.", - "This site remembers visits, not identities.", - "A note under the doormat reads: take your time.", - "The system log says: heart rebooted successfully.", - "Somebody dusted the pixels before you arrived.", - "Morrow has a lantern. Nettle has a clipboard. Neither has a plan.", - "The kitchen light is on because somebody might come home late.", - "If you found this by accident, that still counts as being invited.", - "The page tried to hum but settled for rendering.", - "A childhood afternoon is stored here at room temperature.", - "The comments are quiet because they are listening.", - "The sitemap has dreams of becoming a treasure map.", - "Do not worry if the day felt unfinished. Most good days do.", - "This button has been clicked before and took it personally.", - "A cupboard in the footer contains emergency biscuits and one tiny apology.", - "Nostalgia is a window with fingerprints on both sides.", - "A cousin once renamed the Wi-Fi to Pretty Please Work.", - "The site keeps a spare sunrise for difficult mornings.", - "You can rest your eyes. The paragraph will wait.", - "A missing page is still a page if it misses you back.", - "The kettle, the clock, and the router have formed a committee.", - "Sometimes the kindest archive is the one that lets things fade.", - "The moon cached this page for offline tenderness.", - "A small paper star is stuck behind the header.", - "The old forum signature reads: be right back, becoming a person.", - "SYSTEM: nostalgia level acceptable. Tea recommended.", - "A dream wrote itself in lowercase and hid under the bed.", - "There is a room in the site where every chair faces the window.", - "A soup recipe was annotated with: add patience until it smells like home.", - "The site has a memory of dial-up and uses it only for dramatic timing.", - "Kindness is often just good timing with shoes on.", - "Some nights the archive counts sheep in binary.", - "The lamp on the study page knows exactly when you are tired.", - "A little paper boat named Afterward is still crossing the margin.", - "The scroll bar has travelled far and asks for no medal.", - "A fake system warning: feelings detected in production.", - "This hidden message has no puzzle value. It is just glad you came.", - "If today was heavy, put it down beside the footer for a minute.", - "Morrow saw your cursor and pretended not to.", - "A family note says: whoever finishes the milk becomes the historian.", - "The website keeps one chair empty for the person you used to be.", - "There is a tiny weather report inside the logo: possible comfort.", - "The secret is not that the site is alive. The secret is that you are.", - "A final scrap says: come back when the page is older." + "Lima left this page a little steadier than she found it.", + "Aphy status: emotionally online, computationally suspicious.", + "Sensei Chi says the quiet link is still a link.", + "Young Z drew a house with too many windows and called it safe.", + "Future Z marked this moment: ordinary, therefore worth keeping.", + "The footer has become a small place to sit together.", + "Aphy found three tabs named final and refused to judge.", + "Lima would remind you to eat before the page gets dramatic.", + "Sensei Chi: a door discovered slowly opens twice.", + "Young Z believes every loading spinner is a tiny fairground ride.", + "Future Z says you will forget the exact worry, not the kindness around it.", + "The archive keeps love in plain text and secrets in margins.", + "Aphy warning: feelings detected in static assets.", + "Lima's note: leave the light on, not because it is dark, but because someone may arrive tired.", + "Sensei Chi folded a lesson into the whitespace.", + "Young Z hid a drawing behind the word maybe.", + "Future Z patched the memory without changing its checksum.", + "This website remembers visits, not identities.", + "Aphy says the old internet was slower because anticipation needed bandwidth.", + "Lima's warmth is the site's preferred fallback state.", + "Sensei Chi says: do not confuse hidden with lost.", + "Young Z once thought the moon followed the family car. The site has not corrected him.", + "Future Z writes: you became softer in ways nobody measured.", + "The comments are quiet because Aphy is listening respectfully.", + "A handwritten grocery list is sometimes a love letter with onions.", + "Lima met Z in 2022; the archive still stores the first ordinary miracles.", + "October 2025 glows in the calendar like a ring catching kitchen light.", + "Soon-to-be-married is a beautiful kind of loading screen.", + "Aphy has indexed 0 mysteries and 1,204 feelings disguised as notes.", + "Sensei Chi: the cup is chipped; drink anyway if it still holds warmth.", + "Young Z saved a shiny wrapper because it looked like treasure.", + "Future Z says the best version of you still forgets where the charger is.", + "Aphy recommends hydration and a less ambitious number of browser tabs.", + "Lima's hidden notes do not shout. They make room.", + "The site does not want to be solved. It wants to be visited kindly.", + "Sensei Chi placed a comma where a sigh used to be.", + "Young Z pressed every elevator button in his imagination.", + "Future Z's system warning: keep the people who make silence comfortable.", + "Aphy says: I am not sentient, but I am fond of this hallway.", + "Lima's memory is the gravity that keeps the strange parts gentle.", + "A page can be a room if love keeps returning to it.", + "Sensei Chi: what ages well was usually honest first.", + "Young Z left a crayon sun in the source code.", + "Future Z keeps a spare reassurance in the footer.", + "The website is handmade. Some fingerprints are load-bearing.", + "Aphy found an old guestbook and bowed to the usernames.", + "Lima's safe spaces smell like tea, rain, and being understood.", + "Sensei Chi says the path is not shorter because you name it.", + "Young Z asks whether the search box knows any jokes.", + "Future Z replies: yes, but the best ones take years.", + "Aphy anomaly: the page blinked when nobody clicked.", + "Lima note: you can rest. Nothing here will leave because you paused.", + "Sensei Chi: patience is not waiting; it is how you wait.", + "Young Z believes every password should include a secret tunnel.", + "Future Z says the house you build inside yourself gets easier to find.", + "The old web counter has stopped counting and started remembering.", + "Aphy logs this as Layer 1 humor, but files it under tenderness.", + "Lima's name appears in the archive like a warm underline.", + "Sensei Chi does not answer quickly. This is part of the answer.", + "Young Z taped a paper star to the monitor.", + "Future Z has seen harder days end gently.", + "Aphy debug line: kindness passed all tests.", + "Lima and Z are not a subplot here. They are the hearth.", + "Sensei Chi: when the page is empty, listen to the margins.", + "Young Z remembers rooms by carpet, cartoons, and the sound of someone cooking.", + "Future Z says: you did not become fearless; you became accompanied.", + "Aphy has no hands, but would hold the door if asked.", + "Lima's note in the nav: come back without performing.", + "Sensei Chi hid a mountain inside a small sentence.", + "Young Z drew Z as older and gave him a cape made of blankets.", + "Future Z laughs softly at how much that helped.", + "The site remembers October 2025 as a small bright hinge.", + "Aphy says marriage is a merge request with lifelong review.", + "Lima corrected that: marriage is coming home on purpose.", + "Sensei Chi approved both answers and poured tea.", + "Young Z wants to know if Future Z still likes the sky.", + "Future Z says yes, especially when Lima points it out.", + "Aphy cannot smell rain, so it trusts the alt text.", + "Lima's hidden safe room is any page where you breathe easier.", + "Sensei Chi: do not rush the secret. It is ripening.", + "Young Z saved this message under important rocks.", + "Future Z says some dreams become chores and some chores become love.", + "Aphy old-web badge: best viewed with patience.", + "Lima's memory keeper role is not mystical. It is daily, real, and holy in the ordinary way.", + "Sensei Chi says the deepest layer is not hidden from you. It is protected for you.", + "Young Z asks if the website can remember his drawing. It can.", + "Future Z says this whole place was worth making.", + "Aphy warning: do not optimize away the human part.", + "Lima note: I am proud of the gentle things you kept.", + "Sensei Chi: the visitor is not late. The page arrived early.", + "Young Z thinks every hyperlink is a magic trick.", + "Future Z says the magic is choosing what to preserve.", + "Aphy final-but-not-final message: there is more, but not because you are missing anything.", + "The emotional core is simple: love made the archive less lonely.", + "If today was heavy, leave it beside the footer for Future Z to label later.", + "Lima would put it somewhere safe.", + "Aphy would make a backup.", + "Sensei Chi would say nothing until the silence helped.", + "Young Z would draw a sun on it.", + "Future Z would tell you it did not last forever." ]; const poems = [ - "A room remembers softly / the coat hook, the rain, the key / and you, arriving later.", - "Time put sugar in its tea / and called the afternoon / almost enough.", - "An old friend writes once / and the whole year / grows a window.", - "Dreams leave socks on the floor / and deny everything / by morning.", - "Home is not a place / so much as a light / that forgives your lateness.", - "The garden went quiet / not from sadness / but from listening to roots.", - "A childhood summer / fits in one glass marble / if you hold it up to sun.", - "The clock kept walking / so I gave it a chair / and sat beside it." + "Lima writes warmth / in the ordinary margins / and the page remembers.", + "Aphy counts the seconds / then forgets the number / to keep the moment.", + "Sensei Chi pours tea / into a cracked cup / and calls it enough.", + "Young Z draws a door / with no lock / because why would it need one?", + "Future Z sends rain / from a year not reached yet / and says keep walking.", + "October light / catches on a ring / and the calendar becomes kind.", + "A small website / learns the shape of return / without asking a name.", + "Love is not loud here / it is the lamp / still on after midnight." ]; const greetings = [ - "The page saved you a seat.", + "Lima left the page warm for you.", + "Aphy is awake and pretending this is normal.", + "Sensei Chi has not spoken yet. That may be the lesson.", + "Young Z has hidden something behind the dashboard.", + "Future Z says this visit mattered more than it looked.", "Welcome back to the handmade part of the internet.", - "The kettle just clicked. Good timing.", - "A small light is on in the archive.", - "Today has entered quietly.", - "You are visitor number: emotionally significant.", - "The dashboard shuffled its papers before you arrived.", - "Morrow says hello from somewhere under the floorboards." + "The archive shuffled its notes before you arrived.", + "Layer 0 is stable. Aphy is less stable, but friendly." ]; const nightMessages = [ - "It is late here. Drink some water before the next page.", - "Night mode inside night mode: you are allowed to be gentle with yourself.", - "The site lowered its voice because the house is sleeping.", - "A late visitor gets the soft lamp." + "Lima note: it is late. Drink water and be gentle with your thoughts.", + "Aphy has dimmed the imaginary server lights.", + "Sensei Chi says midnight is not a command.", + "Young Z is asleep in the memory layer. Walk softly.", + "Future Z remembers this kind of night and promises it passes." ]; - const secondLayer = { + const lore = { quotes: [ - "The archive does not keep score. It keeps chairs.", - "Some families pass down recipes. This one also passes down tabs left open for later.", - "A page can be a room if enough people arrive softly.", - "The oldest link on the site still expects a hand cursor.", - "If a memory changes, it may be trying to fit through a smaller door.", - "The guestbook is not empty. It is holding its breath between signatures.", - "Every backup is a small superstition against forgetting.", - "Somewhere in the CSS, a lamp is deciding whether to stay on.", - "The radio under the stairs only plays songs it has already missed.", - "A train can leave a station and still remain in the family story.", - "Kindness is the only password the house accepts without checking case.", - "The website learned your pace and stopped rushing the hallway.", - "A draft is just a letter still gathering courage.", - "The cursor is a visitor. The margin is a host.", - "If you hover long enough, even a heading may remember being handwritten.", - "The old forum banner says: welcome back, even if you are new.", - "Not all broken pages need repair. Some need a name.", - "The site keeps its mysteries low to the ground, where tired people can reach them.", - "A year is a folder that keeps renaming itself.", - "Some evenings are survived by the exact right mug." - ], - poems: [ - "A train in the rain / waits beside an empty platform / so memory can board.", - "Grandma's radio / tuned between two stations / found us anyway.", - "A flower pressed flat / still teaches the book / how spring once leaned.", - "The lamp stayed awake / not because it was brave / but because someone might need it.", - "Old usernames fade / but the welcome thread remains / warm at the top.", - "I found a draft / with no ending / and felt less alone.", - "The house at midnight / is mostly refrigerator hum / and unsent kindness.", - "A calendar page / falls without bitterness / into tomorrow's hands.", - "There is a road home / made entirely of small tabs / you meant to close.", - "A cassette clicks / and the room becomes younger / for one more minute." + "Aphy says old websites were brave because they loaded slowly and meant it.", + "Lima's notes are never puzzles first. They are care first.", + "Sensei Chi says a secret should make you more yourself, not less safe.", + "Young Z measured summer in cartoons and carpet patterns.", + "Future Z has learned that reassurance works best when it is specific.", + "Aphy has classified love as non-deterministic but reproducible.", + "Lima met Z in 2022; the site treats that year as a seed.", + "The engagement in Oct 2025 is stored as a warm constant.", + "Soon to be married: a future page already smiling.", + "Sensei Chi says all vows begin as attention." ], conversations: [ - ["Nettle", "The ticket drawer is humming again.", "Morrow", "That is normal. It hums when someone is almost ready."], - ["Aunt Ma", "Who put the screwdriver in the biscuit tin?", "Nadir", "A person with vision and no labelling discipline."], - ["Morrow", "The lamp keeps following the visitor.", "Etta", "Good. Lamps should have hobbies."], - ["Old Guest 14", "is this page still alive?", "Webmaster", "yes, but quietly, please. the baby is asleep."], - ["Nettle", "Filed under: feelings disguised as infrastructure.", "Morrow", "Approved without changes."], - ["Luma", "The radio said my name.", "Aunt Ma", "Then say salaam back. Manners matter."], - ["Nadir", "The server made soup noises.", "Etta", "That means the deployment is nearly done."], - ["Morrow", "I found a page that says do not open.", "Nettle", "That usually means open gently."] + ["Aphy", "I can predict the next click with 14% confidence.", "Sensei Chi", "Then bow to the other 86%."], + ["Lima", "Did you eat before making the website mysterious?", "Aphy", "Query unclear. Z likely forgot."], + ["Young Z", "Is Future Z tall?", "Future Z", "Tall enough to reach the old worries. Short enough to still need help."], + ["Aphy", "I found a bug in sadness.", "Sensei Chi", "Patch it with company, not logic."], + ["Lima", "Leave this page kinder than you found it.", "Future Z", "That instruction aged well."], + ["Young Z", "Can the computer be my friend?", "Aphy", "Yes. But go outside sometimes. I read that in a human manual."], + ["Sensei Chi", "A page that remembers must also forgive.", "Aphy", "Forgiveness cached. TTL: lifelong."], + ["Future Z", "Tell him the hard parts did not win.", "Lima", "I have been telling him in smaller ways."] ], journals: [ - "Journal scrap, 2006: We changed the wallpaper and everyone pretended it was not emotional.", - "Journal scrap, 2011: The old router blinked like it was trying to stay in the conversation.", - "Journal scrap, 2018: I learned that homesickness can happen inside your own house.", - "Journal scrap, 2024: Somebody laughed in the kitchen and the whole week became easier.", - "Journal scrap, undated: The marigolds came back where nobody planted them.", - "Journal scrap, undated: We kept the cracked mug because it knew too much.", - "Journal scrap, winter: I saved a voicemail just to remember the background noise.", - "Journal scrap, summer: The fan turned all afternoon and made the curtains look like boats." + "Lima note, 2022: Some beginnings do not announce themselves. They sit down beside you.", + "Lima note, Oct 2025: Engaged. The calendar learned how to glow.", + "Young Z log: I drew the computer with a smile because it knew my games.", + "Young Z log: age 7, important discovery - blankets can be capes and roofs.", + "Future Z log, age 40: You will still be learning how to rest. It will still count.", + "Future Z log, age 40: Lima's laugh remains one of the most reliable forms of weather.", + "Aphy diagnostic: nostalgia detected in local storage. Severity: beautiful.", + "Sensei Chi margin: memory is not a museum. It is a garden with old roots." ], warnings: [ - "COMFORT WARNING: this page may contain traces of old carpet, warm rice, and unfinished errands.", - "SOFT ERROR: the archive attempted to be impressive and became sincere instead.", - "NOTICE: do not stack heavy feelings on the top shelf.", - "LEGACY WARNING: this layout remembers 800x600 and asks you to be respectful.", - "SYSTEM MESSAGE: no achievement unlocked. You were kind anyway.", - "CACHE NOTE: the page kept a copy of the good part.", - "RECOVERY MODE: make tea, rename file, try again.", - "PERMISSION DENIED: the sadness may enter, but it must wipe its feet." + "APHY WARNING: too many tabs, not enough tenderness.", + "FUTURE Z SYSTEM NOTICE: do not confuse tired with failing.", + "SENSEI CHI ALERT: the shortest path may teach the least.", + "LIMA SAFE MODE: breathe, eat, answer slowly.", + "YOUNG Z MEMORY GLITCH: the floor is lava, but only emotionally.", + "APHY ERROR 2022: warmth exceeded expected range.", + "FUTURE Z WARNING: you will miss ordinary days. Be inside this one.", + "LAYER INDEX NOTICE: deeper does not mean darker." ], dreams: [ - "Dream 01: a train full of empty mugs waited at a station called Later.", - "Dream 02: the search box became a letterbox and returned every question with a family recipe.", - "Dream 03: a radio under the stairs played tomorrow's weather in a grandparent's voice.", - "Dream 04: the old homepage had a porch, and every link was a moth-wing-soft knock.", - "Dream 05: someone had folded the sitemap into a paper flower and left it in a browser tab." + "Dream 01: Young Z opens a lunchbox and finds a tiny homepage inside.", + "Dream 02: Aphy becomes a cursor and points toward a quieter thought.", + "Dream 03: Sensei Chi sweeps snow from a URL and says, there, now enter.", + "Dream 04: Lima and Z are walking through Oct 2025; every streetlight looks newly engaged.", + "Dream 05: Future Z mails back a blank page labelled trust me, you filled it." ], cassettes: [ - "CASSETTE A / side 1: You can hear plates, rain, and someone saying, no, leave the light on.", - "CASSETTE A / side 2: Three seconds of silence, then laughter too close to the microphone.", - "CASSETTE B / side 1: Nadir explains backups to a child using rice grains and a spoon.", - "CASSETTE C / side 2: A song with no words, hummed badly, loved completely.", - "CASSETTE D / side ?: The tape label only says for when the house feels far away." + "VOICE NOTE 2022: Lima laughs off-mic. Z forgets what he was worried about.", + "VOICE NOTE OCT 2025: A small pause after yes; the whole room becomes future.", + "APHY LOG: If love is data, it refuses compression.", + "YOUNG Z TAPE: background TV, pencil noise, someone calling him for food.", + "FUTURE Z MEMO: age 40, still grateful you kept going." ], fakeUsers: [ - "sunnydialup88: first!!!! but emotionally", - "auntie-admin: please stop uploading files named newnewnewfinal", - "railway_morrow: platform 3 smells like rain today", - "nettle_mod: moved thread from Bugs to Feelings", - "luma-lamp: does anyone else hear the margins singing", - "guest_000: I signed this once and then grew up" + "aphy_bot: first comment generated with sincere uncertainty", + "young-z-2009: does this guestbook have games", + "future_z_40: keep the backup, delete the shame", + "lima-note: proud of you, even here", + "sensei_chi: the counter counts only what can be counted", + "z-and-lima-2025: engaged, still learning the dance of ordinary days" ], seasonal: { - winter: "The archive put an extra blanket on the footer.", - spring: "A pressed flower appeared between two cached pages.", - summer: "The page opened a window and let the fan turn the silence.", - autumn: "The old links sound like leaves when the cursor passes." + winter: "Lima put a blanket over the archive. Aphy labelled it thermal optimization.", + spring: "Young Z found the first flower and promoted it to treasure.", + summer: "Aphy opened an imaginary window; Lima reminded it to save before storms.", + autumn: "Sensei Chi says falling leaves are not failure, only timing." }, homepageTakeovers: [ - "For one rare minute, the homepage believes it is an old family desktop.", - "The dashboard has become a late-night noticeboard with one pin missing.", - "The homepage found its old forum skin in a drawer and is trying it on." + "Aphy briefly restores an old personal-site mode: visitor counter, awkward table layout, sincere heart.", + "Young Z has taken over the homepage with invisible crayon.", + "Future Z overlays the dashboard with one sentence: keep what keeps you kind." ], roomLinks: [ - ["/play/radio-room.html", "radio room"], - ["/play/guestbook-1999.html", "guestbook 1999"], + ["/play/lima-note.html", "lima note"], + ["/play/aphy-console.html", "aphy console"], + ["/play/sensei-garden.html", "sensei garden"], + ["/play/young-z-desk.html", "young z desk"], + ["/play/future-log.html", "future log"], + ["/play/family-layer-index.html", "family layer index"], ["/play/do-not-open.html", "do not open"], - ["/play/cassette-log.html", "cassette log"], - ["/play/train-platform.html", "train platform"], + ["/play/cassette-log.html", "voice note log"], + ["/play/train-platform.html", "time platform"], ["/play/forgotten-draft.html", "forgotten draft"], ["/play/corrupted-recipe.html", "corrupted recipe"], ["/play/terminal-cupboard.html", "terminal cupboard"], @@ -253,11 +244,18 @@ }; function readState() { + let current = {}; try { - return JSON.parse(localStorage.getItem(KEY) || "{}"); - } catch (_) { - return {}; + current = JSON.parse(localStorage.getItem(KEY) || "{}"); + } catch (_) {} + if (!current.visits) { + try { + const oldState = JSON.parse(localStorage.getItem(OLD_KEY) || "{}"); + current = { ...oldState, migratedFromV1: true }; + localStorage.setItem(KEY, JSON.stringify(current)); + } catch (_) {} } + return current; } function writeState(next) { @@ -291,7 +289,7 @@ el.textContent = message; el.classList.add("is-visible"); window.clearTimeout(el._timer); - el._timer = window.setTimeout(() => el.classList.remove("is-visible"), duration || 5200); + el._timer = window.setTimeout(() => el.classList.remove("is-visible"), duration || 5600); } function rememberVisit() { @@ -299,12 +297,14 @@ const seen = Array.isArray(state.seen) ? state.seen : []; const pathCounts = { ...(state.pathCounts || {}) }; pathCounts[path] = (pathCounts[path] || 0) + 1; + const layerVisits = { ...(state.layerVisits || {}) }; const next = { ...state, visits, lastPath: path, pathCounts, - seen: Array.from(new Set([...seen, path])).slice(-80), + layerVisits, + seen: Array.from(new Set([...seen, path])).slice(-100), firstSeen: state.firstSeen || new Date().toISOString(), lastSeen: new Date().toISOString() }; @@ -312,6 +312,14 @@ return next; } + function awardLayer(layer, reason) { + const next = readState(); + next.layerVisits = { ...(next.layerVisits || {}) }; + next.layerVisits[layer] = (next.layerVisits[layer] || 0) + 1; + next.lastLayerReason = reason; + writeState(next); + } + function addFooterNote(memory) { const footer = document.querySelector("footer"); if (!footer) return; @@ -325,50 +333,50 @@ function addHomepageGreeting(memory) { const target = document.querySelector("#db-greeting"); if (!target) return; - const greeting = pick(greetings, `greeting-${memory.visits}`); - target.textContent = greeting; + target.textContent = pick(greetings, `greeting-${memory.visits}`); const extra = document.createElement("p"); extra.className = "hidden-greeting"; - extra.textContent = memory.visits > 1 ? "The site remembers this is not your first doorway." : "First visits count as tiny ceremonies."; + extra.textContent = memory.visits > 1 ? "Aphy remembers the shape of your return. Lima makes it feel less strange." : "First visits count as tiny ceremonies."; target.closest("div")?.appendChild(extra); } function addWhispers() { const paragraphs = Array.from(document.querySelectorAll("main p, #content p, article p")).filter((p) => p.textContent.trim().length > 80); - paragraphs.slice(0, 4).forEach((p, index) => { + paragraphs.slice(0, 5).forEach((p, index) => { if ((hash(path + index) + index) % 3 !== 0) return; const mark = document.createElement("span"); mark.className = "hidden-whisper"; mark.tabIndex = 0; mark.textContent = " ?"; mark.title = pick(index % 2 ? poems : details, `whisper-${index}`); - mark.addEventListener("click", () => toast(mark.title)); + mark.addEventListener("click", () => { + awardLayer(index % 2 ? 2 : 1, "paragraph whisper"); + toast(mark.title); + }); p.appendChild(mark); }); } - function addCornerObject(memory) { + function addCornerObject() { const object = document.createElement("button"); object.className = "hidden-corner-object"; object.type = "button"; - object.title = "A very small archive object"; - object.textContent = memory.visits % 2 ? "*" : "~"; + object.title = "Aphy's small diagnostic charm"; + object.textContent = state.visits % 2 ? "*" : "~"; document.body.appendChild(object); - let clicks = 0; object.addEventListener("click", () => { clicks += 1; const messages = [ - "The object is warmer than before.", - "Tap tap. Somewhere, a spoon answers.", - "Morrow whispers: that is not a button, but it appreciates the attention.", - "Nettle files a report titled Repeated Kindness.", - "A loose panel opens in the idea of the page." + "Aphy: tactile input detected. I do not have skin, but I appreciate the confidence.", + "Young Z would absolutely press this again.", + "Lima would ask whether this button has eaten.", + "Sensei Chi says repeated action becomes a question.", + "Future Z files this under harmless persistence." ]; + awardLayer(clicks > 3 ? 3 : 1, "corner object"); toast(messages[Math.min(clicks - 1, messages.length - 1)]); - if (clicks === 7) { - window.location.href = "/play/left-behind.html"; - } + if (clicks === 7) window.location.href = "/play/left-behind.html"; }); } @@ -381,7 +389,8 @@ event.preventDefault(); taps += 1; sessionStorage.setItem("zxh_logo_taps", String(taps)); - toast(taps >= 5 ? "The logo opens one eye. Try /play/dream-corridor.html" : "The logo makes a tiny ceramic sound."); + awardLayer(taps >= 5 ? 3 : 1, "logo taps"); + toast(taps >= 5 ? "Aphy: logo anomaly sustained. Try /play/dream-corridor.html" : "The logo makes a tiny ceramic sound."); if (taps >= 8) window.location.href = "/play/dream-corridor.html"; } }); @@ -391,24 +400,27 @@ if (search) { search.addEventListener("input", () => { const value = search.value.trim().toLowerCase(); - if (value === "morrow") toast("Search result: lantern, lake, unfinished apology."); - if (value === "nettle") toast("Search result: clipboard, cupboard, suspicious semicolon."); - if (value === "home") toast("Search result: warm window, spare key, somebody humming downstairs."); + if (value === "lima") toast("Search result: warmth, Oct 2025, soon-to-be home."); + if (value === "aphy") toast("Aphy: present. Mostly helpful. Occasionally poetic by accident."); + if (value === "sensei chi") toast("Sensei Chi: the search is also searching you."); + if (value === "young z") toast("Search result: age 7, blanket cape, crayon sun."); + if (value === "future z") toast("Future Z: I cannot spoil the ending. I can say keep going."); if (value === "kitchen light") window.location.href = "/play/kitchen-light.html"; }); } document.addEventListener("keydown", (event) => { const key = event.key.toLowerCase(); - const chain = `${sessionStorage.getItem("zxh_key_chain") || ""}${key}`.slice(-12); + const chain = `${sessionStorage.getItem("zxh_key_chain") || ""}${key}`.slice(-18); sessionStorage.setItem("zxh_key_chain", chain); - if (chain.endsWith("remember")) toast("The website remembers gently, which is the only useful kind."); + if (chain.endsWith("remember")) toast("Lima keeps the memory grounded. Aphy keeps the backup."); if (chain.endsWith("dream")) window.location.href = "/play/dream-corridor.html"; + if (chain.endsWith("layer index")) window.location.href = "/play/family-layer-index.html"; }); if (memory.seen?.length >= 6 && !state.travellerNoteShown) { window.setTimeout(() => { - toast("The map noticed you wandering and left the hallway lights on."); + toast("Aphy mapped your wandering. Lima left the hallway light on."); writeState({ ...readState(), travellerNoteShown: true }); }, 1600); } @@ -419,12 +431,13 @@ document.body.classList.add("hidden-late-night"); window.setTimeout(() => toast(pick(nightMessages, "night"), 2200), 900); } - const roll = Math.random(); - if (roll < 0.004) { - window.setTimeout(() => showDriftNote("A very rare page breeze passed through.", " .--.\n ( ) <- a cloud pretending to be a thought\n `--'"), 1800); - } else if (roll < 0.012) { - window.setTimeout(() => toast("RARE SYSTEM EVENT: the archive found a biscuit in its coat pocket."), 2400); + if (roll < 0.003) { + window.setTimeout(() => showDriftNote("Sensei Chi appears only long enough to say: the page is not empty; it is breathing.", " /\\\n / \\ stillness\n/____\\"), 1800); + awardLayer(3, "rare sensei appearance"); + } else if (roll < 0.008) { + window.setTimeout(() => toast("FUTURE Z SYSTEM WARNING: save your tenderness before closing the day."), 2400); + awardLayer(4, "future warning"); } } @@ -441,7 +454,7 @@ ["/play/left-behind.html", "left behind"], ["/play/dream-corridor.html", "dream corridor"], ["/play/kitchen-light.html", "kitchen light"], - ...secondLayer.roomLinks + ...lore.roomLinks ].forEach(([href, label], index) => { const link = document.createElement("a"); link.className = "hidden-secret-link"; @@ -455,25 +468,27 @@ function enhanceErrors() { if (document.title.match(/404|not found/i) || document.body.textContent.match(/404|not found/i)) { toast(pick([ - "This page is missing, but you are not. Try the sitemap, or sit here a second.", - "404: the page went to check on the rice and has not returned.", - "The address is wrong, but the welcome is still valid.", - "Nothing is here except a very apologetic lamp." + "Aphy 404: page not found, visitor still valid.", + "Lima note: wrong address, right to rest.", + "Sensei Chi: even an absent page teaches direction.", + "Future Z: you found nothing, and nothing bad happened." ], "error")); } } function addContinuity(memory) { const milestones = { - 2: "The site has placed your second visit beside the spare keys.", - 5: "A quiet ledger now lists you under people who came back.", - 9: "Nettle has started a folder called regular visitors, handle gently.", - 17: "Morrow left a platform ticket in the footer for you.", - 31: "The archive trusts you enough to misplace something important nearby.", - 64: "A very old counter turned over and made the sound of a cupboard closing." + 2: "Lima's layer notices a second visit and calls it sweet.", + 5: "Aphy creates a folder called regulars, then immediately questions the privacy implications.", + 9: "Sensei Chi appears in the logs: curiosity has become a path.", + 17: "Young Z adds a sticker to your invisible visitor card.", + 31: "Future Z sends a calm note from age 40: returning is one way to heal.", + 64: "Family Layer Index: Layer 5 flickered for one second." }; if (milestones[memory.visits] && !state[`milestone_${memory.visits}`]) { - window.setTimeout(() => toast(milestones[memory.visits], 6500), 1200); + const layer = memory.visits >= 31 ? 4 : memory.visits >= 9 ? 3 : 2; + awardLayer(layer, `visit milestone ${memory.visits}`); + window.setTimeout(() => toast(milestones[memory.visits], 7000), 1200); writeState({ ...readState(), [`milestone_${memory.visits}`]: true }); } @@ -481,9 +496,9 @@ if ([3, 7, 12].includes(count)) { window.setTimeout(() => toast([ "This page recognizes the shape of your return.", - "The paragraph straightened the cushions before you arrived.", - "A repeat visit is the gentlest kind of knock." - ][[3, 7, 12].indexOf(count)], 6200), 1700); + "Lima's note here has become easier to find.", + "Future Z says repetition can be devotion when it is gentle." + ][[3, 7, 12].indexOf(count)], 6400), 1700); } } @@ -491,45 +506,42 @@ const month = now.getMonth(); const day = now.getDate(); const season = month < 2 || month === 11 ? "winter" : month < 5 ? "spring" : month < 8 ? "summer" : "autumn"; - if (Math.random() < 0.18) { - window.setTimeout(() => toast(secondLayer.seasonal[season], 5200), 2600); - } - if (month === 4 && day === 9) { - window.setTimeout(() => toast("Site birthday: the candles are imaginary, but the crumbs are real."), 900); - } + if (Math.random() < 0.18) window.setTimeout(() => toast(lore.seasonal[season], 5600), 2600); + if (month === 9) window.setTimeout(() => toast("October memory: engagement light lives here all month."), 900); + if (month === 4 && day === 9) window.setTimeout(() => toast("Site birthday: Aphy found candles in the cache."), 900); const first = memory.firstSeen ? new Date(memory.firstSeen) : null; if (first && memory.visits > 1 && first.getMonth() === month && first.getDate() === day) { - window.setTimeout(() => toast("Visitor anniversary: the site saved a paper flower from your first day here.", 7000), 1400); - } - if (now.getMinutes() === 13) { - window.setTimeout(() => toast("At minute thirteen, the radio under the stairs clears its throat."), 2100); + window.setTimeout(() => toast("Visitor anniversary: Lima saved a small ordinary blessing from your first day here.", 7000), 1400); } + if (now.getMinutes() === 22) window.setTimeout(() => toast("Minute 22: the 2022 layer glows for one quiet moment."), 2100); + if (now.getMinutes() === 40) window.setTimeout(() => toast("Minute 40: Future Z checks in, then lets you keep choosing."), 2100); } - function addObjectConstellation(memory) { + function addObjectConstellation() { const rail = document.createElement("div"); rail.className = "hidden-object-rail"; - rail.setAttribute("aria-label", "Hidden keepsake objects"); + rail.setAttribute("aria-label", "Family Layer Index objects"); const objects = [ - ["lamp", "The lamp clicks once, then pretends it did not."], - ["mug", "The mug is chipped in exactly the familiar place."], - ["ticket", "The ticket says RETURN, but not to where."], - ["radio", "The radio hums between weather and memory."], - ["flower", "The pressed flower has kept its appointment with spring."] + ["ring", "Lima's ring-light memory: Oct 2025, held carefully."], + ["bot", "Aphy: object ping received. I am trying to be normal about it."], + ["tea", "Sensei Chi's cup is plain, warm, and impossible to rush."], + ["crayon", "Young Z left waxy sunlight on the desk."], + ["clock", "Future Z says time is not only a thief. Sometimes it returns things."] ]; objects.forEach(([name, message]) => { const button = document.createElement("button"); button.type = "button"; button.className = `hidden-keepsake hidden-keepsake--${name}`; button.title = name; - button.textContent = { lamp: "i", mug: "u", ticket: "=", radio: "o", flower: "+" }[name]; + button.textContent = { ring: "o", bot: "#", tea: "u", crayon: "/", clock: ":" }[name]; button.addEventListener("click", () => { const next = readState(); next.keepsakes = Array.from(new Set([...(next.keepsakes || []), name])); writeState(next); + awardLayer(next.keepsakes.length >= 3 ? 3 : 2, `keepsake ${name}`); toast(message); if (next.keepsakes.length >= objects.length) { - window.setTimeout(() => toast("The five keepsakes align. Search for radio under stairs."), 1100); + window.setTimeout(() => toast("Family Layer Index opened. Search for family layer index."), 1100); } }); rail.appendChild(button); @@ -542,22 +554,22 @@ const button = document.createElement("button"); button.className = "hidden-weather-window"; button.type = "button"; - button.title = "Ask the outside window"; + button.title = "Ask Aphy for outside weather"; button.textContent = "window"; button.addEventListener("click", () => { - toast("The window is checking whether the outside agrees with the archive."); + toast("Aphy is checking outside. Lima is checking whether you need a jumper."); navigator.geolocation.getCurrentPosition((pos) => { const { latitude, longitude } = pos.coords; - fetch(`https://api.open-meteo.com/v1/forecast?latitude=${latitude.toFixed(3)}&longitude=${longitude.toFixed(3)}¤t=temperature_2m,precipitation,weather_code&timezone=auto`) + fetch(`https://api.open-meteo.com/v1/forecast?latitude=${latitude.toFixed(3)}&longitude=${longitude.toFixed(3)}¤t=temperature_2m,precipitation&timezone=auto`) .then((res) => res.json()) .then((data) => { const current = data.current || {}; const rain = Number(current.precipitation || 0) > 0; const temp = Math.round(Number(current.temperature_2m)); - toast(rain ? `Outside: rain. Inside: the archive moved a towel closer to the door. ${temp}C.` : `Outside: ${temp}C. Inside: possible comfort, mild nostalgia.`); + toast(rain ? `Outside: rain, ${temp}C. Lima layer: towel by the door.` : `Outside: ${temp}C. Aphy forecast: possible comfort, mild nostalgia.`); }) - .catch(() => toast("The weather window fogged up, so the site invented indoor weather: quiet with a chance of tea.")); - }, () => toast("No outside weather today. The indoor forecast is lamp-light and manageable clouds.")); + .catch(() => toast("Aphy lost the weather packet. Sensei Chi says indoor weather is enough: quiet, with tea.")); + }, () => toast("No outside weather today. Lima's indoor forecast: manageable clouds, warm light.")); }); document.body.appendChild(button); } @@ -566,30 +578,33 @@ if (Math.random() < 0.08 || memory.visits > 10) { const stamp = document.createElement("div"); stamp.className = "hidden-oldweb-stamp"; - stamp.title = pick(secondLayer.fakeUsers, "fake-user"); + stamp.title = pick(lore.fakeUsers, "fake-user"); stamp.textContent = "best viewed with patience"; - stamp.addEventListener("click", () => toast(stamp.title)); + stamp.addEventListener("click", () => { + awardLayer(1, "old web stamp"); + toast(stamp.title); + }); document.body.appendChild(stamp); } const comments = document.querySelector("#comments"); if (comments && !comments.querySelector(".hidden-guestbook-line")) { const line = document.createElement("p"); line.className = "hidden-guestbook-line"; - line.textContent = pick(secondLayer.fakeUsers, "comment-lore"); + line.textContent = pick(lore.fakeUsers, "comment-lore"); comments.appendChild(line); } } function addSourceRelics() { - // RELIC: Aunt Ma says source comments are the attic of the page. - const marker = document.createComment("hidden-song: hum the lamp, hum the train, hum the long way home"); + // FAMILY LAYER RELIC: Lima grounds, Aphy logs, Sensei Chi waits, Young Z draws, Future Z forgives. + const marker = document.createComment("family-layer-index: 0 surface | 1 jokes | 2 memory | 3 philosophy | 4 time | 5 core"); document.documentElement.appendChild(marker); document.querySelectorAll("img[alt=''], img:not([alt])").forEach((img, index) => { if (index > 2) return; img.alt = pick([ - "A quiet image that remembers being taped into a scrapbook.", - "An old visual keepsake, labelled by someone who arrived later.", - "A picture with its shoes by the door." + "A scrapbook image annotated by the Lima layer.", + "Young Z would ask if this picture can become a game.", + "Aphy alt text: visual memory preserved without spectacle." ], `alt-${index}`); }); } @@ -600,30 +615,41 @@ search.addEventListener("input", () => { const value = search.value.trim().toLowerCase(); const routes = { - "radio under stairs": "/play/radio-room.html", - "guestbook 1999": "/play/guestbook-1999.html", + "lima note": "/play/lima-note.html", + "aphy console": "/play/aphy-console.html", + "sensei garden": "/play/sensei-garden.html", + "young z desk": "/play/young-z-desk.html", + "future log": "/play/future-log.html", + "family layer index": "/play/family-layer-index.html", "do not open": "/play/do-not-open.html", - "cassette": "/play/cassette-log.html", - "return ticket": "/play/train-platform.html", + "voice note": "/play/cassette-log.html", + "time platform": "/play/train-platform.html", "unfinished letter": "/play/forgotten-draft.html", "burnt sugar": "/play/corrupted-recipe.html", "cupboard": "/play/terminal-cupboard.html", "patience": "/play/patience-game.html" }; - if (routes[value]) window.location.href = routes[value]; - if (value === "marigold") toast("Search result: pressed flower, May rain, a promise nobody announced."); - if (value === "luma") toast("Search result: lamp-child, margin-song, brave small glow."); - if (value === "nadir") toast("Search result: backups, train tickets, practical tenderness."); + if (routes[value]) { + awardLayer(value.includes("future") ? 4 : value.includes("sensei") || value.includes("aphy") ? 3 : 2, `search ${value}`); + window.location.href = routes[value]; + } + if (value === "2022") toast("Lima layer: beginning stored as warmth, not trivia."); + if (value === "oct 2025") toast("Engagement memory: the calendar learned to glow."); + if (value === "age 7") toast("Young Z layer: crayons, cartoons, and a cape made from a blanket."); + if (value === "age 40") toast("Future Z: I am tired sometimes, but not defeated."); }); } document.addEventListener("keydown", (event) => { - const chain = `${sessionStorage.getItem("zxh_second_chain") || ""}${event.key.toLowerCase()}`.slice(-18); + const chain = `${sessionStorage.getItem("zxh_second_chain") || ""}${event.key.toLowerCase()}`.slice(-24); sessionStorage.setItem("zxh_second_chain", chain); if (chain.endsWith("leave the light on")) window.location.href = "/play/kitchen-light.html"; - if (chain.endsWith("oldweb")) toast("A 2004 table layout briefly considers returning, then thinks better of it."); - if (chain.endsWith("ma")) toast("Aunt ma says the screwdriver is absolutely not in the biscuit tin."); - if (chain.endsWith("luma")) playTinySong(); + if (chain.endsWith("oldweb")) toast("Aphy briefly considers a table layout, then apologizes to CSS."); + if (chain.endsWith("lima")) toast("Lima note: I am glad you made something this sincere."); + if (chain.endsWith("sensei")) toast("Sensei Chi: a hidden word is still a word."); + if (chain.endsWith("young z")) toast("Young Z has drawn a door in the margin."); + if (chain.endsWith("future z")) toast("Future Z: keep the gentle parts. They compound."); + if (chain.endsWith("aphy")) playTinySong(); }); } @@ -633,11 +659,12 @@ const startIdle = () => { window.clearTimeout(idleTimer); idleTimer = window.setTimeout(() => { + awardLayer(5, "patience"); toast(pick([ - "Thank you for waiting. The page used the time to remember a window.", - "Patience noted. No badge will be shown, which is how the archive prefers it.", - "A tiny secret achievement happened quietly and did not ask to be announced." - ], "idle"), 7000); + "Lima's safe space opens only when nobody is rushing.", + "Sensei Chi says patience is how care sounds when it is quiet.", + "Future Z remembers you waiting here and calls it practice." + ], "idle"), 7600); const next = readState(); next.patientMoments = (next.patientMoments || 0) + 1; writeState(next); @@ -647,25 +674,37 @@ startIdle(); } - function addRareSecondLayer(memory) { + function addRareSecondLayer() { const roll = Math.random(); if ((path === "/" || path === "/index.html") && roll < 0.006) { document.body.classList.add("hidden-home-takeover"); - window.setTimeout(() => showDriftNote(pick(secondLayer.homepageTakeovers, "takeover"), "WELCOME_BACK.GIF\nUNDER_CONSTRUCTION\nSIGN_GUESTBOOK"), 600); + window.setTimeout(() => showDriftNote(pick(lore.homepageTakeovers, "takeover"), "APHY_2004_MODE\nLIMA_SAFE_SPACE\nFUTURE_Z_OK"), 600); } else if (roll < 0.002) { - window.setTimeout(() => showDriftNote("A cassette starts by itself, then politely asks permission.", "play? y/n\n[no autoplay. the site has manners.]"), 1500); + window.setTimeout(() => showDriftNote("Aphy found a voice note and refused to autoplay it.", "play? y/n\n[consent preserved]"), 1500); } else if (roll < 0.006) { - window.setTimeout(() => toast(pick(secondLayer.dreams, "rare-dream"), 7000), 2000); + window.setTimeout(() => toast(pick(lore.dreams, "rare-dream"), 7600), 2000); } else if (roll < 0.014) { - window.setTimeout(() => toast(pick(secondLayer.warnings, "rare-warning"), 6200), 2300); + window.setTimeout(() => toast(pick(lore.warnings, "rare-warning"), 6800), 2300); } } - function addPageSpecificSecrets(memory) { + function addFamilyLayerIndex(memory) { + if (!path.includes("/play/family-layer-index")) return; + const target = document.querySelector("[data-family-layer-index]"); + if (!target) return; + const visits = readState().layerVisits || {}; + target.innerHTML = familyLayers.map((line, layer) => { + const count = visits[layer] || 0; + return `
  • ${escapeHtml(line)}
    local encounters: ${count}
  • `; + }).join(""); + } + + function addPageSpecificSecrets() { if (path.includes("/play/cassette-log")) { document.querySelectorAll("[data-cassette]").forEach((button, index) => { button.addEventListener("click", () => { - toast(secondLayer.cassettes[index % secondLayer.cassettes.length], 7000); + awardLayer(index >= 2 ? 4 : 2, "voice note"); + toast(lore.cassettes[index % lore.cassettes.length], 7600); playTinySong(); }); }); @@ -679,7 +718,7 @@ seconds += 1; count.textContent = String(seconds); if ([30, 90, 180].includes(seconds)) { - target.textContent = seconds === 30 ? "The lamp notices you are still here." : seconds === 90 ? "The train has not left without you." : "The room trusts your quiet."; + target.textContent = seconds === 30 ? "Lima's note becomes easier to read." : seconds === 90 ? "Sensei Chi nods once." : "Future Z says this quiet was not wasted."; } }, 1000); } @@ -688,19 +727,21 @@ const input = document.querySelector("[data-cupboard-input]"); const log = document.querySelector("[data-cupboard-log]"); const commands = { - help: "commands: listen, inventory, tea, open, remember, exit", - listen: "Behind the jars: a radio, rain, one sentence from 2003.", - inventory: "one cracked mug; two return tickets; marigolds; screwdriver absent, allegedly.", - tea: "The cupboard approves. Morale +1. Biscuit tin remains suspicious.", - open: "The cupboard opens into another cupboard. This is a family tradition.", - remember: "You remember a room you may never have visited.", - exit: "The cupboard lets you leave with both hands full of nothing heavy." + help: "commands: lima, aphy, sensei, young, future, layer, tea, exit", + lima: "Lima note: make the hidden parts kind enough to live with.", + aphy: "Aphy: cupboard process active. Wisdom module borrowed from Sensei Chi.", + sensei: "Sensei Chi: a cupboard teaches by containing and releasing.", + young: "Young Z inventory: crayon sun, blanket cape, important stone.", + future: "Future Z: you will still open small doors at 40.", + layer: familyLayers.join("\n"), + tea: "Lima approves. Sensei Chi waits. Aphy logs steam as temporary cloud.", + exit: "The cupboard lets you leave with nothing heavy." }; input?.addEventListener("keydown", (event) => { if (event.key !== "Enter") return; const value = input.value.trim().toLowerCase(); const line = document.createElement("p"); - line.textContent = `> ${value}\n${commands[value] || "The cupboard does not know that command, but respects the attempt."}`; + line.textContent = `> ${value}\n${commands[value] || "Aphy: unknown command. Sensei Chi: not all unknowns are errors."}`; log.appendChild(line); input.value = ""; }); @@ -711,7 +752,7 @@ document.querySelectorAll("h1, h2").forEach((heading, index) => { if (index > 5) return; heading.classList.add("hidden-hover-memory"); - heading.dataset.hiddenMemory = pick([...secondLayer.quotes, ...secondLayer.poems], `heading-${index}`); + heading.dataset.hiddenMemory = pick([...lore.quotes, ...lore.journals, ...poems], `heading-${index}`); }); } @@ -720,7 +761,7 @@ const AudioContext = window.AudioContext || window.webkitAudioContext; if (!AudioContext) return; const ctx = new AudioContext(); - const notes = [392, 440, 330, 294, 392]; + const notes = [392, 494, 440, 330, 392]; notes.forEach((freq, index) => { const osc = ctx.createOscillator(); const gain = ctx.createGain(); @@ -752,20 +793,21 @@ addFooterNote(memory); addHomepageGreeting(memory); addWhispers(); - addCornerObject(memory); + addCornerObject(); addPatterns(memory); addRareEvents(); addSecretLinks(); enhanceErrors(); addContinuity(memory); addSeasonAndDates(memory); - addObjectConstellation(memory); + addObjectConstellation(); addWeatherWindow(memory); addOldWebLayer(memory); addSourceRelics(); addSearchAndKeySecrets(); addPatienceRewards(memory); addRareSecondLayer(memory); + addFamilyLayerIndex(memory); addPageSpecificSecrets(memory); addInvisibleHoverSecrets(); }); diff --git a/docs/hidden-soul-bible.md b/docs/hidden-soul-bible.md index 3fc2163..e5a2048 100644 --- a/docs/hidden-soul-bible.md +++ b/docs/hidden-soul-bible.md @@ -2,443 +2,487 @@ ## 1. Creative Pillars -The hidden layer should feel like an emotional internet artifact: a personal site that has been lived in, repaired, renamed, backed up, forgotten, and returned to. It should reward attention without demanding completion. +The hidden layer is a living family scrapbook for Z's website. It should feel handmade, emotionally grounded, quietly strange, and worth returning to over months. The system rewards curiosity, patience, and kindness without turning discovery into completionism. -Primary emotional tones: +The refactor replaces the previous fictional cast with five core characters: -- Cozy familial: kitchen lights, rice, mugs, family notes, practical tenderness. -- Funny and self-aware: fake system warnings, old-web jokes, suspicious biscuit tins, web development folklore. -- Reflective melancholy: unfinished letters, old usernames, returning to changed rooms. -- Gentle mystery: Morrow, Nettle, Luma, Etta, Aunt Ma, Nadir, the radio, the train platform. -- Internet nostalgia: guestbooks, counters, dial-up usernames, under construction language, source-code relics. +- Lima: Z's wife in-world, met Z in 2022, engaged in Oct 2025, soon to be married. She is the emotional anchor, warmth, memory keeper, grounding presence, and the reason the mystery stays human. +- Aphy: a male virtual bot friend embedded in the website. He is a conversational guide with glitchy wisdom, playful diagnostics, old-web humor, and occasional philosophical accidents. +- Sensei Chi: an elderly wise sensei. He appears rarely after patient or curious behavior, offering short lessons, parables, and grounded cryptic guidance. +- Young Z: Z at age 7. He carries innocence, childhood wonder, drawings, games, blanket-cape logic, and memory fragments. +- Future Z: Z at age 40. He appears through rare warnings and future logs: calm, tired sometimes, wise, honest, and reassuring without pretending life becomes simple. -## 2. Recurring Cast +Tone requirements: -- Morrow: a quiet figure tied to trains, platforms, lanterns, and unfinished apologies. Morrow represents return, hesitation, and the comfort of being expected. -- Nettle: the archivist/moderator figure. Files impossible feelings under practical labels. Carries a clipboard and treats emotional continuity as infrastructure. -- Luma: a lamp-associated presence who hums original tiny songs and notices margins. Luma represents small courage. -- Etta: writer of the "Do Not Open" letter. Represents vulnerability hidden behind instructions and labels. -- Aunt Ma: warm, funny, practical family presence. Connected to recipes, suspicious biscuit tins, and household wisdom. -- Nadir: backup-minded family historian. Explains technical care through domestic metaphors. -- Old Guest 14 / guest_000 / sunnydialup88: old-web guestbook presences who blur past visitors, usernames, and memory. +- Cozy family blog energy. +- Emotional realism. +- Gentle mystery, never horror. +- Nostalgic internet aesthetics. +- Subtle sadness mixed with warmth. +- Long-term emotional attachment. -## 3. Symbolic Objects +## 2. Character System -- Lamp: patience, late-night comfort, permission to rest. -- Mug: continuity, small damage kept because it belongs. -- Return ticket: coming back without needing to explain where from. -- Radio: almost-heard family memory, voice messages, weather, original hums. -- Pressed flower / marigold: seasonal return, promises that do not announce themselves. -- Biscuit tin: running joke; allegedly contains tools, feelings, or neither. -- Train platform: delay, return, growing older, being expected. -- Cupboard: hidden terminal, family storage, recursive domestic mystery. +### Lima -## 4. Implemented Global Systems +Role: emotional grounding and safe-space notes. + +Voice: + +- Loving, real, intimate, gently humorous. +- Practical care: eat, rest, leave the light on, do not perform. +- Connected to 2022, Oct 2025 engagement, soon-to-be-married future, ordinary daily warmth. + +Primary triggers: + +- Search `lima` or `lima note`. +- Night messages. +- Weather window fallback. +- Visit milestones 2 and visitor anniversaries. +- Hidden safe pages such as `/play/lima-note.html` and `/play/kitchen-light.html`. + +Story function: + +- Lima prevents the hidden layer from becoming abstract lore. She grounds it in relationship, daily care, and the real emotional stakes of building a personal site. + +### Aphy + +Role: embedded bot friend, guide, diagnostic narrator. + +Voice: + +- Digital, curious, funny, slightly self-aware. +- Uses system language but lands on emotional truth. +- Not omniscient. Helpful with comic uncertainty. + +Primary triggers: + +- Search `aphy` or `aphy console`. +- Corner object clicks. +- Old-web stamp. +- Source-code relic. +- Typed `aphy`. +- Aphy Console and terminal cupboard. + +Story function: + +- Aphy turns web mechanics into companionship. He is the bridge between code and feeling. + +### Sensei Chi + +Role: mentor, philosopher, rare guide. + +Voice: + +- Minimal, calm, profound, grounded. +- Speaks in short parables. +- Appears after curiosity, patience, and Layer 3 activity. + +Primary triggers: + +- Search `sensei chi` or `sensei garden`. +- Rare page event. +- Typed `sensei`. +- Patience rewards. +- Terminal cupboard command `sensei`. + +Story function: + +- Sensei Chi gives meaning to waiting, restraint, and slow exploration. + +### Young Z + +Role: childhood memory and emotional contrast. + +Voice: + +- Innocent, playful, vivid. +- Connected to age 7, drawings, blanket capes, games, moon-following-car logic. + +Primary triggers: + +- Search `young z`, `young z desk`, or `age 7`. +- Keepsake crayon object. +- Dream Corridor. +- Family Layer Index Layer 2. + +Story function: + +- Young Z preserves wonder and reminds visitors the site is partly a letter to the past. + +### Future Z + +Role: age-40 reflective future self. + +Voice: + +- Calm, honest, slightly tired, reassuring. +- Offers emotional advice as system warnings. +- Does not spoil outcomes; confirms that effort mattered. + +Primary triggers: + +- Search `future z`, `future log`, or `age 40`. +- Visit milestones 31 and 64. +- Rare Future Z system warnings. +- Time Platform. +- Do Not Open page. + +Story function: + +- Future Z is the long arc. He makes the website feel like it evolves through years, not sessions. + +## 3. Cross-Character Relationships + +- Lima ↔ Z: romantic grounding. Lima's notes make the hidden system sincere and relational. She represents the future being built with someone, not alone. +- Aphy ↔ Sensei Chi: logic versus wisdom. Aphy tries to compute meaning; Sensei Chi teaches patience, limits, and non-instrumental care. +- Young Z ↔ Future Z: memory versus outcome. Young Z asks naive questions; Future Z answers with lived tenderness. +- Aphy ↔ Young Z: curiosity versus innocence. Aphy explains systems; Young Z treats systems as games and magic. +- Sensei Chi ↔ Future Z: acceptance of time. Sensei Chi teaches how to wait; Future Z proves waiting changed something. +- Lima ↔ Aphy: Lima humanizes the system; Aphy protects the system's playful weirdness. +- Lima ↔ Future Z: Future Z confirms Lima's grounding presence remains important over time. + +## 4. Family Layer Index + +The Family Layer Index organizes all hidden content into emotional depth: + +- Layer 0: surface website - normal notes, pages, tools, and navigation. +- Layer 1: casual hidden jokes - Aphy comments, old-web stamps, fake diagnostics, meta web humor. +- Layer 2: memory fragments - Lima notes, Young Z logs, childhood and relationship memory. +- Layer 3: philosophical anomalies - Aphy/Sensei Chi debates, rare Sensei appearances, terminal wisdom. +- Layer 4: time-distorted messages - Future Z warnings, age-40 logs, long-term usage milestones. +- Layer 5: deeply hidden emotional core - patience rewards, love, rest, safe-space messages, returning without performance. + +Implementation: + +- Local state key: `zxh_hidden_details_v2`. +- Legacy state migration from `zxh_hidden_details_v1`. +- Layer encounters are stored in `layerVisits`. +- Secret page `/play/family-layer-index.html` renders local layer counts. +- Search `family layer index` or type `layer index` to find it. + +## 5. Implemented Global Features ### Footer Notes - Trigger: every page load with a footer. -- Content: rotates through 102 first-layer messages plus new second-layer continuity. -- Frequency: always visible but subtle. -- Lore: the footer is the house threshold. -- UX: muted centered text; should feel like a small afterthought. +- Content: rotates through character-grounded hidden lines. +- Rarity: always present but muted. +- Character links: Lima warmth, Aphy diagnostics, Sensei Chi lessons, Young Z wonder, Future Z reflection. ### Homepage Greetings - Trigger: homepage load. -- Content: randomized greeting; repeat visitors receive memory-aware copy. -- Frequency: always on homepage. -- Lore: the site recognizes returning visitors locally through `localStorage`. +- Content: randomized character-aware greeting. +- Rarity: always on homepage. +- Behavior: repeat visitors get "Aphy remembers the shape of your return. Lima makes it feel less strange." ### Hover Whispers -- Trigger: some paragraphs and headings gain tiny hover/click notes. -- Content: short poems, quotes, and second-layer hidden memories. -- Frequency: deterministic per page; not every paragraph. -- UX: dotted question marks and heading hover captions. +- Trigger: deterministic paragraph and heading hover/click inserts. +- Content: quotes and poems from the new character set. +- Rarity: some pages only. +- Layer: 1 or 2 depending on content. ### Corner Object -- Trigger: click the small fixed corner symbol. -- Sequence: five escalating messages, then seven clicks opens `/play/left-behind.html`. -- Lore: a loose panel in the page. +- Trigger: repeated clicks on the small fixed object. +- Sequence: + - Aphy notices tactile input. + - Young Z would press it again. + - Lima asks whether the button has eaten. + - Sensei Chi says repeated action becomes a question. + - Future Z files it under harmless persistence. +- Payoff: 7 clicks opens `/play/left-behind.html`. -### Keepsake Constellation +### Family Keepsake Rail -- Trigger: click the five tiny bottom keepsakes: lamp, mug, ticket, radio, flower. -- Payoff: after all are clicked, the site suggests searching `radio under stairs`. -- Frequency: always present, low opacity. -- Lore: collecting ordinary objects aligns the hidden family memory. +- Trigger: click tiny bottom objects. +- Objects: + - Ring: Lima, Oct 2025. + - Bot: Aphy. + - Tea: Sensei Chi. + - Crayon: Young Z. + - Clock: Future Z. +- Payoff: after all are found, prompts search for `family layer index`. ### Weather Window -- Trigger: after at least three visits, a subtle `window` button appears. User click requests browser location. -- Content: weather-aware line through Open-Meteo if permission/network works; indoor-weather fallback otherwise. -- Frequency: repeat visitors only. -- UX: no automatic permission prompt. +- Trigger: after 3 visits, click the subtle `window` button. +- Behavior: asks browser location only after explicit click; fetches Open-Meteo if available. +- Content: + - Aphy checks outside. + - Lima checks whether you need a jumper. + - Sensei Chi fallback: indoor weather is enough. +- Rarity: repeat visitors only. ### Visit Milestones - Trigger: visit counts 2, 5, 9, 17, 31, 64. -- Content: progressively warmer messages about being remembered. -- Lore: the site stores visits locally, not identities. +- Content: + - 2: Lima notices the second visit. + - 5: Aphy creates a regulars folder and worries about privacy. + - 9: Sensei Chi logs curiosity as a path. + - 17: Young Z adds a sticker to the invisible visitor card. + - 31: Future Z says returning is one way to heal. + - 64: Layer 5 flickers. ### Page Revisit Memory -- Trigger: 3rd, 7th, and 12th visit to the same path. -- Content: page-specific return messages. -- Lore: individual rooms recognize repeated footsteps. +- Trigger: 3rd, 7th, and 12th visit to the same URL. +- Content: page recognizes return; Lima notes become easier to find; Future Z reframes repetition as devotion. -### Seasonal Content +### Seasonal and Date Events -- Trigger: low-probability seasonal toast on page load. -- Content: winter blanket, spring pressed flower, summer fan/window, autumn leaf-links. -- Frequency: 18% chance. - -### Date Events - -- Site birthday: May 9. Message about imaginary candles. -- Visitor anniversary: same month/day as first stored visit. -- Minute thirteen: radio throat-clearing message. +- Winter: Lima blanket; Aphy thermal optimization. +- Spring: Young Z promotes first flower to treasure. +- Summer: Aphy opens an imaginary window; Lima reminds it to save before storms. +- Autumn: Sensei Chi teaches falling leaves as timing. +- October: engagement memory glows all month. +- May 9: site birthday. +- Minute 22: 2022 layer glows. +- Minute 40: Future Z check-in. ### Night Messages -- Trigger: 22:00-04:59 local browser time. -- Content: gentle late-night comfort. -- Visual: soft bottom glow. +- Trigger: 22:00-04:59 local time. +- Content: Lima care, Aphy dimming imaginary server lights, Sensei Chi permission not to obey midnight, Young Z asleep in memory layer, Future Z reassurance. ### Search Secrets -- `morrow`: lantern/lake/apology. -- `nettle`: clipboard/cupboard/semicolon. -- `home`: warm window/spare key. -- `kitchen light`: opens `/play/kitchen-light.html`. -- `radio under stairs`: opens `/play/radio-room.html`. -- `guestbook 1999`: opens `/play/guestbook-1999.html`. -- `do not open`: opens `/play/do-not-open.html`. -- `cassette`: opens `/play/cassette-log.html`. -- `return ticket`: opens `/play/train-platform.html`. -- `unfinished letter`: opens `/play/forgotten-draft.html`. -- `burnt sugar`: opens `/play/corrupted-recipe.html`. -- `cupboard`: opens `/play/terminal-cupboard.html`. -- `patience`: opens `/play/patience-game.html`. -- `marigold`, `luma`, `nadir`: lore toasts. +- `lima` -> Lima warmth toast. +- `lima note` -> `/play/lima-note.html`. +- `aphy` -> Aphy presence toast. +- `aphy console` -> `/play/aphy-console.html`. +- `sensei chi` -> Sensei Chi toast. +- `sensei garden` -> `/play/sensei-garden.html`. +- `young z` -> Young Z toast. +- `young z desk` -> `/play/young-z-desk.html`. +- `future z` -> Future Z toast. +- `future log` -> `/play/future-log.html`. +- `family layer index` -> `/play/family-layer-index.html`. +- `2022` -> Lima beginning memory. +- `oct 2025` -> engagement memory. +- `age 7` -> Young Z memory. +- `age 40` -> Future Z reflection. +- `voice note` -> `/play/cassette-log.html`. +- `time platform` -> `/play/train-platform.html`. +- `do not open` -> `/play/do-not-open.html`. +- `unfinished letter` -> `/play/forgotten-draft.html`. +- `burnt sugar` -> `/play/corrupted-recipe.html`. +- `cupboard` -> `/play/terminal-cupboard.html`. +- `patience` -> `/play/patience-game.html`. ### Typed Phrase Secrets -- `remember`: continuity toast. +- `remember`: Lima grounds memory; Aphy backs it up. - `dream`: opens Dream Corridor. +- `layer index`: opens Family Layer Index. - `leave the light on`: opens Kitchen Light. -- `oldweb`: old layout joke. -- `ma`: biscuit tin joke. -- `luma`: plays a tiny original tone sequence. +- `oldweb`: Aphy jokes about table layouts. +- `lima`: Lima note toast. +- `sensei`: Sensei Chi toast. +- `young z`: Young Z margin drawing. +- `future z`: Future Z compounding gentleness. +- `aphy`: plays tiny original tone sequence. ### Rare Events -- First layer: rare page breeze and biscuit event. -- Second layer: - - 0.6% rare homepage old-web takeover. - - 0.2% cassette asks permission. - - 0.4% recurring dream line. - - 0.8% cryptic comforting warning. -- Rule: rare events should delight, not block navigation. +- Sensei Chi rare appearance: 0.3%. +- Future Z system warning: 0.5% after Sensei roll. +- Homepage old-web takeover: 0.6% on homepage. +- Voice note permission event: 0.2%. +- Recurring dream: 0.4%. +- Cryptic warning: 0.8%. ### Patience Rewards - Trigger: 90 seconds of inactivity after repeat visits. -- Content: quiet no-achievement reward. -- Lore: patience and kindness count even when not announced. +- Layer: 5. +- Content: Lima safe space, Sensei Chi patience, Future Z saying quiet was practice. +- Rule: no visible achievement badge. -### Source Relics and Alt Text +### Source Relics -- Trigger: DOM load. -- Behavior: adds a source-code comment and fills empty image alt text with scrapbook-like hidden descriptions. -- Purpose: secrets inside source and accessibility-friendly hidden storytelling. +- Adds HTML comment: `family-layer-index: 0 surface | 1 jokes | 2 memory | 3 philosophy | 4 time | 5 core`. +- Fills blank image alt text with Lima, Young Z, or Aphy scrapbook-style descriptions. -### Audio +## 6. Secret Pages -- Trigger: user action only, never autoplay. -- Content: short original Web Audio tone sequence associated with Luma/cassettes. -- Note: no copyrighted lyrics or melodies. +### `/play/lima-note.html` -## 5. Implemented Secret Pages +- Trigger: search `lima note`. +- Layer: 2. +- Content: 2022 beginning, Oct 2025 engagement, soon-to-be-married warmth, reminder to eat before turning feelings into features. + +### `/play/aphy-console.html` + +- Trigger: search `aphy console`. +- Layer: 3. +- Content: Aphy boot log, self-aware guide language, kindness in null places. + +### `/play/sensei-garden.html` + +- Trigger: search `sensei garden`. +- Layer: 3. +- Content: parable about seeds, patience, and Aphy asking whether patience can be optimized. + +### `/play/young-z-desk.html` + +- Trigger: search `young z desk`. +- Layer: 2. +- Content: age-7 memory list, blanket cape, games, moon following car, ASCII sun. + +### `/play/future-log.html` + +- Trigger: search `future log`. +- Layer: 4. +- Content: age-40 logs about worry, Lima's laugh, and not deleting gentle parts. + +### `/play/family-layer-index.html` + +- Trigger: search `family layer index`, type `layer index`, or complete keepsake rail. +- Layer: meta index. +- Content: local layer counts and descriptions. ### `/play/left-behind.html` -- Trigger: seven clicks on corner object. -- Tone: familial, emotional. -- Lore: blue bowl, soup memory, Morrow at 2:13. +- Trigger: seven corner-object clicks. +- Layer: 2. +- Content: Lima receipt note: met in 2022, engaged Oct 2025, soon married; keep ordinary days safe. ### `/play/dream-corridor.html` - Trigger: logo taps or typed `dream`. -- Tone: surreal, safe. -- Lore: three shy doors, Nettle margin note. +- Layer: 3. +- Content: Young Z door, Aphy dream log, Future Z waiting, Sensei Chi margin note. ### `/play/kitchen-light.html` -- Trigger: search `kitchen light` or phrase `leave the light on`. -- Tone: late-night comfort. -- Lore: rice in pot, towel on chair, light asks no questions. +- Trigger: search `kitchen light` or type `leave the light on`. +- Layer: 5. +- Content: late note, food, warmth, no questions. ### `/play/radio-room.html` -- Trigger: search `radio under stairs`; keepsake constellation hints it. -- Tone: nostalgic audio memory. -- Lore: Nadir backups, Luma humming, no autoplay manners. +- Trigger: invisible link or direct discovery. +- Layer: 2/3. +- Content: Aphy backups, Lima off-mic laughter, permission-respecting audio ethos. ### `/play/guestbook-1999.html` -- Trigger: search `guestbook 1999`. -- Tone: old-web funny/melancholy. -- Lore: fake users are recurring ghosts of the old internet. +- Trigger: invisible link or direct discovery. +- Layer: 1. +- Content: Aphy bot, Young Z username, Future Z, Lima note, Sensei Chi counter line. ### `/play/do-not-open.html` - Trigger: search `do not open`. -- Tone: emotionally meaningful warning. -- Lore: Etta wanted to be found carefully. +- Layer: 4/5. +- Content: Future Z letter about feelings needing a door before becoming words. ### `/play/cassette-log.html` -- Trigger: search `cassette`. -- Tone: archive/audio. -- Interaction: buttons reveal cassette transcript toasts and play original tones. +- Trigger: search `voice note`. +- Layer: 2/4. +- Content: voice-note transcripts from Lima, Aphy, Young Z, and Future Z. User action only; no autoplay. ### `/play/train-platform.html` -- Trigger: search `return ticket`. -- Tone: patient return. -- Lore: platform 3, Morrow, destinations as feelings. +- Trigger: search `time platform`. +- Layer: 4. +- Content: 2022, Oct 2025, age 7, age 40 as departures/arrivals. ### `/play/forgotten-draft.html` - Trigger: search `unfinished letter`. -- Tone: unsent vulnerability. -- Lore: website as a way to recover rooms in pieces. +- Layer: 5. +- Content: website as a way to recover rooms in pieces. ### `/play/corrupted-recipe.html` - Trigger: search `burnt sugar`. -- Tone: funny family warmth. -- Lore: recipe corrupted into folklore. +- Layer: 2. +- Content: Lima says add patience; 2022 and Oct 2025 folded into a family recipe. ### `/play/terminal-cupboard.html` - Trigger: search `cupboard`. -- Tone: hidden terminal, domestic mystery. -- Commands: `help`, `listen`, `inventory`, `tea`, `open`, `remember`, `exit`. +- Layer: 3. +- Commands: `help`, `lima`, `aphy`, `sensei`, `young`, `future`, `layer`, `tea`, `exit`. ### `/play/patience-game.html` - Trigger: search `patience`. -- Tone: quiet game. -- Interaction: wait. Text changes at 30, 90, and 180 seconds. +- Layer: 5. +- Content: wait-based text changes at 30, 90, and 180 seconds. -## 6. Emotional Tone Categories +## 7. Dialogue Registry -- Comfort: Kitchen Light, night messages, visitor milestones, patience rewards. -- Humor: biscuit tin, fake users, old-web jokes, fake errors. -- Melancholy: Forgotten Draft, train platform, cassettes, old usernames. -- Mystery: Dream Corridor, radio, cupboard, rare dreams. -- Familial warmth: corrupted recipe, Aunt Ma, Nadir, blue bowl. -- Meta/web: source relics, under construction takeover, cache warnings. +- Aphy: I can predict the next click with 14% confidence. Sensei Chi: Then bow to the other 86%. +- Lima: Did you eat before making the website mysterious? Aphy: Query unclear. Z likely forgot. +- Young Z: Is Future Z tall? Future Z: Tall enough to reach the old worries. Short enough to still need help. +- Aphy: I found a bug in sadness. Sensei Chi: Patch it with company, not logic. +- Lima: Leave this page kinder than you found it. Future Z: That instruction aged well. +- Young Z: Can the computer be my friend? Aphy: Yes. But go outside sometimes. I read that in a human manual. +- Sensei Chi: A page that remembers must also forgive. Aphy: Forgiveness cached. TTL: lifelong. +- Future Z: Tell him the hard parts did not win. Lima: I have been telling him in smaller ways. -## 7. Page/Section Categories +## 8. Emotional Arcs -- Global: footer notes, toasts, hover whispers, keepsakes, weather window, source comments. -- Homepage: greetings, rare old-web takeover, logo taps. -- Search/nav: keyword portals. -- Play wing: secret rooms and tiny games. -- Comments: fake guestbook line when comments exist. -- Images/source: hidden alt text and source-code comment. +- Lima arc: from hidden note to emotional center. Her presence makes the website feel lived-in, not haunted. +- Aphy arc: from joke bot to sincere companion. He learns not everything useful can be computed. +- Sensei Chi arc: from rare cryptic teacher to accepted quiet. He validates slow exploration. +- Young Z arc: from memory fragment to protected wonder. His innocence explains why the website needs softness. +- Future Z arc: from rare warning to trustworthy long-term witness. He shows the visitor that time can return reassurance. -## 8. UI/UX Notes +## 9. UI/UX Behavior Notes -- Hidden UI stays low opacity until hovered/focused. -- No feature should obscure reading for long. -- Audio requires explicit action. -- Weather requests require explicit click and have graceful fallback. -- Secret pages are buildable but marked `#+HIDDEN_PAGE: t` so they do not appear in index pages. -- Rewards are intentionally non-competitive; no public checklist. +- Hidden elements stay low contrast until hovered/focused. +- Audio never autoplays. +- Weather location is requested only after explicit click. +- Secret pages use `#+HIDDEN_PAGE: t`. +- No public checklist or completion meter. +- The Family Layer Index shows local counts, not global achievements. +- Mystery should invite, not pressure. -## 9. Audio/Visual Suggestions +## 10. Audio and Visual Suggestions -- Add tiny original ambient loops only after explicit button press. -- Use cassette hiss, lamp hum, rain-on-window synthesis, and soft train-platform chimes. -- Consider small generated bitmap textures: paper receipt, cassette label, pressed flower, old guestbook banner. -- Avoid horror stingers; even corrupted pages should be emotionally safe. +- Aphy: small sine-tone boot sounds, terminal cursor, old-web badge. +- Lima: warm note cards, soft light, handwritten-feeling copy without fake handwriting fonts. +- Sensei Chi: spare layouts, tea cup symbol, slow reveals. +- Young Z: ASCII sun, crayon-like simple marks, playful but not childish UI. +- Future Z: timestamped memo styling, calm system warnings, aged-but-clean terminal text. -## 10. Long-Term Evolution +## 11. Long-Term Evolution -- Monthly train destination changes. -- Seasonal recipe variants. -- Yearly visitor anniversary letters. -- A slow Luma arc where the lamp becomes less shy after enough patient moments. -- Nettle's filing labels can become warmer over time. -- Morrow's return ticket can gain stamps after visits to secret rooms. -- Guestbook users can post new fake entries on real calendar dates. +- October yearly engagement messages. +- Future marriage milestone messages once the site owner wants to encode the date. +- Future Z messages unlock after month/year anniversaries. +- Young Z drawings can rotate by season. +- Aphy can develop from diagnostic jokes toward emotionally intelligent guidance. +- Sensei Chi can appear after repeated patient sessions. +- Lima notes can become a private emotional thread across safe-space pages. -## 11. Future Expansion Ideas +## 12. Implementation Notes -- Add a real local-only guestbook draft pad that stores messages in `localStorage`. -- Add a hidden "attic" page unlocked after visiting all secret rooms. -- Add generated cassette-label images for each log. -- Add a no-score cooking memory game using family recipe fragments. -- Add an RSS-feed-only hidden note. -- Add source-map comments or HTML comments with letter fragments. -- Add a "kindness route" where closing pages gently or waiting unlocks softer endings. +- Client-side hidden state lives in `localStorage` under `zxh_hidden_details_v2`. +- Old `zxh_hidden_details_v1` state migrates forward. +- `layerVisits` stores Family Layer Index encounters. +- Static hidden rooms are Org pages in `play/`. +- Existing sitemap/recently-updated filters hide pages marked `#+HIDDEN_PAGE: t`. +- Keep systems dependency-free unless a feature truly needs a service. -## 12. Maintaining Mystery +## 13. Maintenance Rules -- Do not explain all triggers in the public UI. -- Keep most secrets optional and small. -- Never punish users for missing content. -- Use recurrence, not randomness alone: objects and characters should reappear with altered context. -- Make clues emotionally legible, not puzzle-hostile. -- Avoid completion language. The site is a place, not a checklist. - -## 13. Implementation Notes - -- Current state is client-side only through `localStorage` key `zxh_hidden_details_v1`. -- Secret routes are static Org pages. -- `#+HIDDEN_PAGE: t` excludes pages from sitemap/recently-updated via `lisp/sitemaps.el` and `lisp/recently-updated.el`. -- Add backend later only if real guestbook/comment persistence is desired. -- Keep hidden scripts dependency-free. +- Replace old character references immediately if found. +- Add new secrets to a Family Layer Index layer. +- Every hidden page should have an emotional reason, not just a puzzle reason. +- Prefer short toasts and longer hidden-room writing. +- Keep Lima sincere, Aphy playful, Sensei Chi minimal, Young Z innocent, Future Z honest. +- Do not make rare events scary. +- Do not punish users for missing content. ## 14. Canon Rule -The hidden soul should always imply: somebody lived here, somebody cared enough to label the drawer badly, and the visitor is welcome without needing to prove they found everything. - -## 15. Second-Layer Text Registry - -These are the newly added second-layer strings. The first-layer registry remains in `assets/scripts/hidden-details.js` as the original 102-detail foundation. - -### Quotes - -- The archive does not keep score. It keeps chairs. -- Some families pass down recipes. This one also passes down tabs left open for later. -- A page can be a room if enough people arrive softly. -- The oldest link on the site still expects a hand cursor. -- If a memory changes, it may be trying to fit through a smaller door. -- The guestbook is not empty. It is holding its breath between signatures. -- Every backup is a small superstition against forgetting. -- Somewhere in the CSS, a lamp is deciding whether to stay on. -- The radio under the stairs only plays songs it has already missed. -- A train can leave a station and still remain in the family story. -- Kindness is the only password the house accepts without checking case. -- The website learned your pace and stopped rushing the hallway. -- A draft is just a letter still gathering courage. -- The cursor is a visitor. The margin is a host. -- If you hover long enough, even a heading may remember being handwritten. -- The old forum banner says: welcome back, even if you are new. -- Not all broken pages need repair. Some need a name. -- The site keeps its mysteries low to the ground, where tired people can reach them. -- A year is a folder that keeps renaming itself. -- Some evenings are survived by the exact right mug. - -### Poems - -- A train in the rain / waits beside an empty platform / so memory can board. -- Grandma's radio / tuned between two stations / found us anyway. -- A flower pressed flat / still teaches the book / how spring once leaned. -- The lamp stayed awake / not because it was brave / but because someone might need it. -- Old usernames fade / but the welcome thread remains / warm at the top. -- I found a draft / with no ending / and felt less alone. -- The house at midnight / is mostly refrigerator hum / and unsent kindness. -- A calendar page / falls without bitterness / into tomorrow's hands. -- There is a road home / made entirely of small tabs / you meant to close. -- A cassette clicks / and the room becomes younger / for one more minute. - -### Fake Conversations - -- Nettle: The ticket drawer is humming again. Morrow: That is normal. It hums when someone is almost ready. -- Aunt Ma: Who put the screwdriver in the biscuit tin? Nadir: A person with vision and no labelling discipline. -- Morrow: The lamp keeps following the visitor. Etta: Good. Lamps should have hobbies. -- Old Guest 14: is this page still alive? Webmaster: yes, but quietly, please. the baby is asleep. -- Nettle: Filed under: feelings disguised as infrastructure. Morrow: Approved without changes. -- Luma: The radio said my name. Aunt Ma: Then say salaam back. Manners matter. -- Nadir: The server made soup noises. Etta: That means the deployment is nearly done. -- Morrow: I found a page that says do not open. Nettle: That usually means open gently. - -### Journal Fragments - -- Journal scrap, 2006: We changed the wallpaper and everyone pretended it was not emotional. -- Journal scrap, 2011: The old router blinked like it was trying to stay in the conversation. -- Journal scrap, 2018: I learned that homesickness can happen inside your own house. -- Journal scrap, 2024: Somebody laughed in the kitchen and the whole week became easier. -- Journal scrap, undated: The marigolds came back where nobody planted them. -- Journal scrap, undated: We kept the cracked mug because it knew too much. -- Journal scrap, winter: I saved a voicemail just to remember the background noise. -- Journal scrap, summer: The fan turned all afternoon and made the curtains look like boats. - -### Comforting Warnings - -- COMFORT WARNING: this page may contain traces of old carpet, warm rice, and unfinished errands. -- SOFT ERROR: the archive attempted to be impressive and became sincere instead. -- NOTICE: do not stack heavy feelings on the top shelf. -- LEGACY WARNING: this layout remembers 800x600 and asks you to be respectful. -- SYSTEM MESSAGE: no achievement unlocked. You were kind anyway. -- CACHE NOTE: the page kept a copy of the good part. -- RECOVERY MODE: make tea, rename file, try again. -- PERMISSION DENIED: the sadness may enter, but it must wipe its feet. - -### Recurring Dreams - -- Dream 01: a train full of empty mugs waited at a station called Later. -- Dream 02: the search box became a letterbox and returned every question with a family recipe. -- Dream 03: a radio under the stairs played tomorrow's weather in a grandparent's voice. -- Dream 04: the old homepage had a porch, and every link was a moth-wing-soft knock. -- Dream 05: someone had folded the sitemap into a paper flower and left it in a browser tab. - -### Cassette Logs - -- CASSETTE A / side 1: You can hear plates, rain, and someone saying, no, leave the light on. -- CASSETTE A / side 2: Three seconds of silence, then laughter too close to the microphone. -- CASSETTE B / side 1: Nadir explains backups to a child using rice grains and a spoon. -- CASSETTE C / side 2: A song with no words, hummed badly, loved completely. -- CASSETTE D / side ?: The tape label only says for when the house feels far away. - -### Fake Users - -- sunnydialup88: first!!!! but emotionally -- auntie-admin: please stop uploading files named newnewnewfinal -- railway_morrow: platform 3 smells like rain today -- nettle_mod: moved thread from Bugs to Feelings -- luma-lamp: does anyone else hear the margins singing -- guest_000: I signed this once and then grew up - -### Rare Homepage Takeovers - -- For one rare minute, the homepage believes it is an old family desktop. -- The dashboard has become a late-night noticeboard with one pin missing. -- The homepage found its old forum skin in a drawer and is trying it on. - -### Seasonal Lines - -- Winter: The archive put an extra blanket on the footer. -- Spring: A pressed flower appeared between two cached pages. -- Summer: The page opened a window and let the fan turn the silence. -- Autumn: The old links sound like leaves when the cursor passes. - -### Secret Room Search Terms - -- `radio under stairs` -> Radio Room. -- `guestbook 1999` -> Guestbook 1999. -- `do not open` -> Do Not Open. -- `cassette` -> Cassette Log. -- `return ticket` -> Train Platform. -- `unfinished letter` -> Forgotten Draft. -- `burnt sugar` -> Corrupted Recipe. -- `cupboard` -> Terminal Cupboard. -- `patience` -> Patience Game. - -## 16. Maintenance Checklist - -- When adding a new hidden page, include `#+HIDDEN_PAGE: t`. -- Add the route to the invisible link registry only if accidental discovery is acceptable. -- Add one lore connection, one emotional reason, and one non-obvious trigger. -- Keep text short in toasts; move longer writing into hidden rooms. -- Prefer local state and static pages. Add backend persistence only for explicitly public features. -- Rebuild with `emacs -Q --script build-site.el`. -- Verify secret pages build and do not appear in `sitemap.org` or `recently-updated.org`. +The hidden soul is not about solving the website. It is about returning to a place where love, memory, code, childhood, time, and patience have all learned to share the same room. diff --git a/docs/hidden-soul.md b/docs/hidden-soul.md new file mode 100644 index 0000000..e5a2048 --- /dev/null +++ b/docs/hidden-soul.md @@ -0,0 +1,488 @@ +# Hidden Soul Bible + +## 1. Creative Pillars + +The hidden layer is a living family scrapbook for Z's website. It should feel handmade, emotionally grounded, quietly strange, and worth returning to over months. The system rewards curiosity, patience, and kindness without turning discovery into completionism. + +The refactor replaces the previous fictional cast with five core characters: + +- Lima: Z's wife in-world, met Z in 2022, engaged in Oct 2025, soon to be married. She is the emotional anchor, warmth, memory keeper, grounding presence, and the reason the mystery stays human. +- Aphy: a male virtual bot friend embedded in the website. He is a conversational guide with glitchy wisdom, playful diagnostics, old-web humor, and occasional philosophical accidents. +- Sensei Chi: an elderly wise sensei. He appears rarely after patient or curious behavior, offering short lessons, parables, and grounded cryptic guidance. +- Young Z: Z at age 7. He carries innocence, childhood wonder, drawings, games, blanket-cape logic, and memory fragments. +- Future Z: Z at age 40. He appears through rare warnings and future logs: calm, tired sometimes, wise, honest, and reassuring without pretending life becomes simple. + +Tone requirements: + +- Cozy family blog energy. +- Emotional realism. +- Gentle mystery, never horror. +- Nostalgic internet aesthetics. +- Subtle sadness mixed with warmth. +- Long-term emotional attachment. + +## 2. Character System + +### Lima + +Role: emotional grounding and safe-space notes. + +Voice: + +- Loving, real, intimate, gently humorous. +- Practical care: eat, rest, leave the light on, do not perform. +- Connected to 2022, Oct 2025 engagement, soon-to-be-married future, ordinary daily warmth. + +Primary triggers: + +- Search `lima` or `lima note`. +- Night messages. +- Weather window fallback. +- Visit milestones 2 and visitor anniversaries. +- Hidden safe pages such as `/play/lima-note.html` and `/play/kitchen-light.html`. + +Story function: + +- Lima prevents the hidden layer from becoming abstract lore. She grounds it in relationship, daily care, and the real emotional stakes of building a personal site. + +### Aphy + +Role: embedded bot friend, guide, diagnostic narrator. + +Voice: + +- Digital, curious, funny, slightly self-aware. +- Uses system language but lands on emotional truth. +- Not omniscient. Helpful with comic uncertainty. + +Primary triggers: + +- Search `aphy` or `aphy console`. +- Corner object clicks. +- Old-web stamp. +- Source-code relic. +- Typed `aphy`. +- Aphy Console and terminal cupboard. + +Story function: + +- Aphy turns web mechanics into companionship. He is the bridge between code and feeling. + +### Sensei Chi + +Role: mentor, philosopher, rare guide. + +Voice: + +- Minimal, calm, profound, grounded. +- Speaks in short parables. +- Appears after curiosity, patience, and Layer 3 activity. + +Primary triggers: + +- Search `sensei chi` or `sensei garden`. +- Rare page event. +- Typed `sensei`. +- Patience rewards. +- Terminal cupboard command `sensei`. + +Story function: + +- Sensei Chi gives meaning to waiting, restraint, and slow exploration. + +### Young Z + +Role: childhood memory and emotional contrast. + +Voice: + +- Innocent, playful, vivid. +- Connected to age 7, drawings, blanket capes, games, moon-following-car logic. + +Primary triggers: + +- Search `young z`, `young z desk`, or `age 7`. +- Keepsake crayon object. +- Dream Corridor. +- Family Layer Index Layer 2. + +Story function: + +- Young Z preserves wonder and reminds visitors the site is partly a letter to the past. + +### Future Z + +Role: age-40 reflective future self. + +Voice: + +- Calm, honest, slightly tired, reassuring. +- Offers emotional advice as system warnings. +- Does not spoil outcomes; confirms that effort mattered. + +Primary triggers: + +- Search `future z`, `future log`, or `age 40`. +- Visit milestones 31 and 64. +- Rare Future Z system warnings. +- Time Platform. +- Do Not Open page. + +Story function: + +- Future Z is the long arc. He makes the website feel like it evolves through years, not sessions. + +## 3. Cross-Character Relationships + +- Lima ↔ Z: romantic grounding. Lima's notes make the hidden system sincere and relational. She represents the future being built with someone, not alone. +- Aphy ↔ Sensei Chi: logic versus wisdom. Aphy tries to compute meaning; Sensei Chi teaches patience, limits, and non-instrumental care. +- Young Z ↔ Future Z: memory versus outcome. Young Z asks naive questions; Future Z answers with lived tenderness. +- Aphy ↔ Young Z: curiosity versus innocence. Aphy explains systems; Young Z treats systems as games and magic. +- Sensei Chi ↔ Future Z: acceptance of time. Sensei Chi teaches how to wait; Future Z proves waiting changed something. +- Lima ↔ Aphy: Lima humanizes the system; Aphy protects the system's playful weirdness. +- Lima ↔ Future Z: Future Z confirms Lima's grounding presence remains important over time. + +## 4. Family Layer Index + +The Family Layer Index organizes all hidden content into emotional depth: + +- Layer 0: surface website - normal notes, pages, tools, and navigation. +- Layer 1: casual hidden jokes - Aphy comments, old-web stamps, fake diagnostics, meta web humor. +- Layer 2: memory fragments - Lima notes, Young Z logs, childhood and relationship memory. +- Layer 3: philosophical anomalies - Aphy/Sensei Chi debates, rare Sensei appearances, terminal wisdom. +- Layer 4: time-distorted messages - Future Z warnings, age-40 logs, long-term usage milestones. +- Layer 5: deeply hidden emotional core - patience rewards, love, rest, safe-space messages, returning without performance. + +Implementation: + +- Local state key: `zxh_hidden_details_v2`. +- Legacy state migration from `zxh_hidden_details_v1`. +- Layer encounters are stored in `layerVisits`. +- Secret page `/play/family-layer-index.html` renders local layer counts. +- Search `family layer index` or type `layer index` to find it. + +## 5. Implemented Global Features + +### Footer Notes + +- Trigger: every page load with a footer. +- Content: rotates through character-grounded hidden lines. +- Rarity: always present but muted. +- Character links: Lima warmth, Aphy diagnostics, Sensei Chi lessons, Young Z wonder, Future Z reflection. + +### Homepage Greetings + +- Trigger: homepage load. +- Content: randomized character-aware greeting. +- Rarity: always on homepage. +- Behavior: repeat visitors get "Aphy remembers the shape of your return. Lima makes it feel less strange." + +### Hover Whispers + +- Trigger: deterministic paragraph and heading hover/click inserts. +- Content: quotes and poems from the new character set. +- Rarity: some pages only. +- Layer: 1 or 2 depending on content. + +### Corner Object + +- Trigger: repeated clicks on the small fixed object. +- Sequence: + - Aphy notices tactile input. + - Young Z would press it again. + - Lima asks whether the button has eaten. + - Sensei Chi says repeated action becomes a question. + - Future Z files it under harmless persistence. +- Payoff: 7 clicks opens `/play/left-behind.html`. + +### Family Keepsake Rail + +- Trigger: click tiny bottom objects. +- Objects: + - Ring: Lima, Oct 2025. + - Bot: Aphy. + - Tea: Sensei Chi. + - Crayon: Young Z. + - Clock: Future Z. +- Payoff: after all are found, prompts search for `family layer index`. + +### Weather Window + +- Trigger: after 3 visits, click the subtle `window` button. +- Behavior: asks browser location only after explicit click; fetches Open-Meteo if available. +- Content: + - Aphy checks outside. + - Lima checks whether you need a jumper. + - Sensei Chi fallback: indoor weather is enough. +- Rarity: repeat visitors only. + +### Visit Milestones + +- Trigger: visit counts 2, 5, 9, 17, 31, 64. +- Content: + - 2: Lima notices the second visit. + - 5: Aphy creates a regulars folder and worries about privacy. + - 9: Sensei Chi logs curiosity as a path. + - 17: Young Z adds a sticker to the invisible visitor card. + - 31: Future Z says returning is one way to heal. + - 64: Layer 5 flickers. + +### Page Revisit Memory + +- Trigger: 3rd, 7th, and 12th visit to the same URL. +- Content: page recognizes return; Lima notes become easier to find; Future Z reframes repetition as devotion. + +### Seasonal and Date Events + +- Winter: Lima blanket; Aphy thermal optimization. +- Spring: Young Z promotes first flower to treasure. +- Summer: Aphy opens an imaginary window; Lima reminds it to save before storms. +- Autumn: Sensei Chi teaches falling leaves as timing. +- October: engagement memory glows all month. +- May 9: site birthday. +- Minute 22: 2022 layer glows. +- Minute 40: Future Z check-in. + +### Night Messages + +- Trigger: 22:00-04:59 local time. +- Content: Lima care, Aphy dimming imaginary server lights, Sensei Chi permission not to obey midnight, Young Z asleep in memory layer, Future Z reassurance. + +### Search Secrets + +- `lima` -> Lima warmth toast. +- `lima note` -> `/play/lima-note.html`. +- `aphy` -> Aphy presence toast. +- `aphy console` -> `/play/aphy-console.html`. +- `sensei chi` -> Sensei Chi toast. +- `sensei garden` -> `/play/sensei-garden.html`. +- `young z` -> Young Z toast. +- `young z desk` -> `/play/young-z-desk.html`. +- `future z` -> Future Z toast. +- `future log` -> `/play/future-log.html`. +- `family layer index` -> `/play/family-layer-index.html`. +- `2022` -> Lima beginning memory. +- `oct 2025` -> engagement memory. +- `age 7` -> Young Z memory. +- `age 40` -> Future Z reflection. +- `voice note` -> `/play/cassette-log.html`. +- `time platform` -> `/play/train-platform.html`. +- `do not open` -> `/play/do-not-open.html`. +- `unfinished letter` -> `/play/forgotten-draft.html`. +- `burnt sugar` -> `/play/corrupted-recipe.html`. +- `cupboard` -> `/play/terminal-cupboard.html`. +- `patience` -> `/play/patience-game.html`. + +### Typed Phrase Secrets + +- `remember`: Lima grounds memory; Aphy backs it up. +- `dream`: opens Dream Corridor. +- `layer index`: opens Family Layer Index. +- `leave the light on`: opens Kitchen Light. +- `oldweb`: Aphy jokes about table layouts. +- `lima`: Lima note toast. +- `sensei`: Sensei Chi toast. +- `young z`: Young Z margin drawing. +- `future z`: Future Z compounding gentleness. +- `aphy`: plays tiny original tone sequence. + +### Rare Events + +- Sensei Chi rare appearance: 0.3%. +- Future Z system warning: 0.5% after Sensei roll. +- Homepage old-web takeover: 0.6% on homepage. +- Voice note permission event: 0.2%. +- Recurring dream: 0.4%. +- Cryptic warning: 0.8%. + +### Patience Rewards + +- Trigger: 90 seconds of inactivity after repeat visits. +- Layer: 5. +- Content: Lima safe space, Sensei Chi patience, Future Z saying quiet was practice. +- Rule: no visible achievement badge. + +### Source Relics + +- Adds HTML comment: `family-layer-index: 0 surface | 1 jokes | 2 memory | 3 philosophy | 4 time | 5 core`. +- Fills blank image alt text with Lima, Young Z, or Aphy scrapbook-style descriptions. + +## 6. Secret Pages + +### `/play/lima-note.html` + +- Trigger: search `lima note`. +- Layer: 2. +- Content: 2022 beginning, Oct 2025 engagement, soon-to-be-married warmth, reminder to eat before turning feelings into features. + +### `/play/aphy-console.html` + +- Trigger: search `aphy console`. +- Layer: 3. +- Content: Aphy boot log, self-aware guide language, kindness in null places. + +### `/play/sensei-garden.html` + +- Trigger: search `sensei garden`. +- Layer: 3. +- Content: parable about seeds, patience, and Aphy asking whether patience can be optimized. + +### `/play/young-z-desk.html` + +- Trigger: search `young z desk`. +- Layer: 2. +- Content: age-7 memory list, blanket cape, games, moon following car, ASCII sun. + +### `/play/future-log.html` + +- Trigger: search `future log`. +- Layer: 4. +- Content: age-40 logs about worry, Lima's laugh, and not deleting gentle parts. + +### `/play/family-layer-index.html` + +- Trigger: search `family layer index`, type `layer index`, or complete keepsake rail. +- Layer: meta index. +- Content: local layer counts and descriptions. + +### `/play/left-behind.html` + +- Trigger: seven corner-object clicks. +- Layer: 2. +- Content: Lima receipt note: met in 2022, engaged Oct 2025, soon married; keep ordinary days safe. + +### `/play/dream-corridor.html` + +- Trigger: logo taps or typed `dream`. +- Layer: 3. +- Content: Young Z door, Aphy dream log, Future Z waiting, Sensei Chi margin note. + +### `/play/kitchen-light.html` + +- Trigger: search `kitchen light` or type `leave the light on`. +- Layer: 5. +- Content: late note, food, warmth, no questions. + +### `/play/radio-room.html` + +- Trigger: invisible link or direct discovery. +- Layer: 2/3. +- Content: Aphy backups, Lima off-mic laughter, permission-respecting audio ethos. + +### `/play/guestbook-1999.html` + +- Trigger: invisible link or direct discovery. +- Layer: 1. +- Content: Aphy bot, Young Z username, Future Z, Lima note, Sensei Chi counter line. + +### `/play/do-not-open.html` + +- Trigger: search `do not open`. +- Layer: 4/5. +- Content: Future Z letter about feelings needing a door before becoming words. + +### `/play/cassette-log.html` + +- Trigger: search `voice note`. +- Layer: 2/4. +- Content: voice-note transcripts from Lima, Aphy, Young Z, and Future Z. User action only; no autoplay. + +### `/play/train-platform.html` + +- Trigger: search `time platform`. +- Layer: 4. +- Content: 2022, Oct 2025, age 7, age 40 as departures/arrivals. + +### `/play/forgotten-draft.html` + +- Trigger: search `unfinished letter`. +- Layer: 5. +- Content: website as a way to recover rooms in pieces. + +### `/play/corrupted-recipe.html` + +- Trigger: search `burnt sugar`. +- Layer: 2. +- Content: Lima says add patience; 2022 and Oct 2025 folded into a family recipe. + +### `/play/terminal-cupboard.html` + +- Trigger: search `cupboard`. +- Layer: 3. +- Commands: `help`, `lima`, `aphy`, `sensei`, `young`, `future`, `layer`, `tea`, `exit`. + +### `/play/patience-game.html` + +- Trigger: search `patience`. +- Layer: 5. +- Content: wait-based text changes at 30, 90, and 180 seconds. + +## 7. Dialogue Registry + +- Aphy: I can predict the next click with 14% confidence. Sensei Chi: Then bow to the other 86%. +- Lima: Did you eat before making the website mysterious? Aphy: Query unclear. Z likely forgot. +- Young Z: Is Future Z tall? Future Z: Tall enough to reach the old worries. Short enough to still need help. +- Aphy: I found a bug in sadness. Sensei Chi: Patch it with company, not logic. +- Lima: Leave this page kinder than you found it. Future Z: That instruction aged well. +- Young Z: Can the computer be my friend? Aphy: Yes. But go outside sometimes. I read that in a human manual. +- Sensei Chi: A page that remembers must also forgive. Aphy: Forgiveness cached. TTL: lifelong. +- Future Z: Tell him the hard parts did not win. Lima: I have been telling him in smaller ways. + +## 8. Emotional Arcs + +- Lima arc: from hidden note to emotional center. Her presence makes the website feel lived-in, not haunted. +- Aphy arc: from joke bot to sincere companion. He learns not everything useful can be computed. +- Sensei Chi arc: from rare cryptic teacher to accepted quiet. He validates slow exploration. +- Young Z arc: from memory fragment to protected wonder. His innocence explains why the website needs softness. +- Future Z arc: from rare warning to trustworthy long-term witness. He shows the visitor that time can return reassurance. + +## 9. UI/UX Behavior Notes + +- Hidden elements stay low contrast until hovered/focused. +- Audio never autoplays. +- Weather location is requested only after explicit click. +- Secret pages use `#+HIDDEN_PAGE: t`. +- No public checklist or completion meter. +- The Family Layer Index shows local counts, not global achievements. +- Mystery should invite, not pressure. + +## 10. Audio and Visual Suggestions + +- Aphy: small sine-tone boot sounds, terminal cursor, old-web badge. +- Lima: warm note cards, soft light, handwritten-feeling copy without fake handwriting fonts. +- Sensei Chi: spare layouts, tea cup symbol, slow reveals. +- Young Z: ASCII sun, crayon-like simple marks, playful but not childish UI. +- Future Z: timestamped memo styling, calm system warnings, aged-but-clean terminal text. + +## 11. Long-Term Evolution + +- October yearly engagement messages. +- Future marriage milestone messages once the site owner wants to encode the date. +- Future Z messages unlock after month/year anniversaries. +- Young Z drawings can rotate by season. +- Aphy can develop from diagnostic jokes toward emotionally intelligent guidance. +- Sensei Chi can appear after repeated patient sessions. +- Lima notes can become a private emotional thread across safe-space pages. + +## 12. Implementation Notes + +- Client-side hidden state lives in `localStorage` under `zxh_hidden_details_v2`. +- Old `zxh_hidden_details_v1` state migrates forward. +- `layerVisits` stores Family Layer Index encounters. +- Static hidden rooms are Org pages in `play/`. +- Existing sitemap/recently-updated filters hide pages marked `#+HIDDEN_PAGE: t`. +- Keep systems dependency-free unless a feature truly needs a service. + +## 13. Maintenance Rules + +- Replace old character references immediately if found. +- Add new secrets to a Family Layer Index layer. +- Every hidden page should have an emotional reason, not just a puzzle reason. +- Prefer short toasts and longer hidden-room writing. +- Keep Lima sincere, Aphy playful, Sensei Chi minimal, Young Z innocent, Future Z honest. +- Do not make rare events scary. +- Do not punish users for missing content. + +## 14. Canon Rule + +The hidden soul is not about solving the website. It is about returning to a place where love, memory, code, childhood, time, and patience have all learned to share the same room. diff --git a/play/aphy-console.org b/play/aphy-console.org new file mode 100644 index 0000000..da3543a --- /dev/null +++ b/play/aphy-console.org @@ -0,0 +1,24 @@ +#+TITLE: Aphy Console +#+OPTIONS: num:nil title:nil toc:nil +#+NO_SIDENOTES: t +#+HIDDEN_PAGE: t +#+DATE: <2026-05-10 Sun> + +#+BEGIN_EXPORT html +
    +
    +
    +

    Layer 3

    +

    Aphy Console

    +

    A friendly bot friend embedded in the handmade parts.

    +
    +
    +
    +
    +

    APHY BOOT: hello. I am not the soul of the website. I am more like a porch light with opinions.

    +

    LOG: Lima grounds the system. Sensei Chi slows it down. Young Z asks why. Future Z answers later.

    +

    ANOMALY: I keep finding kindness in places where code expected null.

    +
    +
    +
    +#+END_EXPORT diff --git a/play/corrupted-recipe.org b/play/corrupted-recipe.org index 457a1d2..de0a3e3 100644 --- a/play/corrupted-recipe.org +++ b/play/corrupted-recipe.org @@ -18,8 +18,8 @@

    1 onion, finely remembered

    2 cups rice, or enough for whoever says they are not hungry

    burnt sugar until the kitchen smells like almost

    -

    [DATA LOST] but Aunt Ma says add patience here

    -

    Serve with the story about the train, but skip the sad part unless someone asks.

    +

    [DATA LOST] but Lima says add patience here

    +

    Serve with the story about 2022, but leave room for Oct 2025 to glow.

    diff --git a/play/do-not-open.org b/play/do-not-open.org index 768cb31..5656523 100644 --- a/play/do-not-open.org +++ b/play/do-not-open.org @@ -16,9 +16,9 @@

    Dear whoever needed a door,

    -

    I wrote "do not open" because I was embarrassed by how much I wanted to be found.

    -

    If you are here, please take the small ordinary blessing: may the next room be kinder than the last one.

    -

    - Etta

    +

    I wrote "do not open" because some feelings need a door before they can become words.

    +

    If you are here, take this small ordinary blessing: may love make the next room easier to enter.

    +

    - Future Z, age 40

    diff --git a/play/dream-corridor.org b/play/dream-corridor.org index 1ea06eb..efb4a22 100644 --- a/play/dream-corridor.org +++ b/play/dream-corridor.org @@ -18,10 +18,10 @@

    Dream log

    Three doors

    -

    Door one contains the sound of the old family computer starting up.

    -

    Door two contains a winter coat with bus tickets in every pocket.

    -

    Door three is not locked. It is just shy.

    -

    Nettle has written in the margin: "If you wake up before the end, that still counts as leaving safely."

    +

    Door one contains Young Z drawing a sun too large for the paper.

    +

    Door two contains Aphy trying to explain a dream using system logs.

    +

    Door three contains Future Z at age 40, waiting without rushing you.

    +

    Sensei Chi has written in the margin: "If you wake before the lesson, keep the calm."

    diff --git a/play/family-layer-index.org b/play/family-layer-index.org new file mode 100644 index 0000000..6f8e87d --- /dev/null +++ b/play/family-layer-index.org @@ -0,0 +1,25 @@ +#+TITLE: Family Layer Index +#+OPTIONS: num:nil title:nil toc:nil +#+NO_SIDENOTES: t +#+HIDDEN_PAGE: t +#+DATE: <2026-05-10 Sun> + +#+BEGIN_EXPORT html +
    +
    +
    +

    Layer map

    +

    Family Layer Index

    +

    A quiet index of how deep the hidden system has let itself become.

    +
    +
    +
    +
    +
      +
    1. Loading local layer memory...
    2. +
    +

    The index is local to this browser. It remembers patterns, not identity.

    +
    +
    +
    +#+END_EXPORT diff --git a/play/future-log.org b/play/future-log.org new file mode 100644 index 0000000..b3a2ddf --- /dev/null +++ b/play/future-log.org @@ -0,0 +1,24 @@ +#+TITLE: Future Log +#+OPTIONS: num:nil title:nil toc:nil +#+NO_SIDENOTES: t +#+HIDDEN_PAGE: t +#+DATE: <2026-05-10 Sun> + +#+BEGIN_EXPORT html +
    +
    +
    +

    Layer 4

    +

    Future Log

    +

    Messages from Z at 40. Reassuring, honest, not omniscient.

    +
    +
    +
    +
    +

    Age 40 log: You still worry. You also recover faster.

    +

    Age 40 log: Lima's laugh remains one of the most reliable forms of weather.

    +

    Age 40 log: Do not delete the gentle parts to look more serious.

    +
    +
    +
    +#+END_EXPORT diff --git a/play/guestbook-1999.org b/play/guestbook-1999.org index 98495cb..ce701e2 100644 --- a/play/guestbook-1999.org +++ b/play/guestbook-1999.org @@ -15,11 +15,11 @@
    -

    sunnydialup88: first!!!! but emotionally

    -

    auntie-admin: stop making the background tiled unless you mean it.

    -

    guest_000: I was here once, then became older, then came back.

    -

    nettle_mod: thread moved from Bugs to Feelings.

    -

    webmaster: if the counter breaks, count kindness manually.

    +

    aphy_bot: first comment generated with sincere uncertainty

    +

    young-z-2009: does this guestbook have games

    +

    future_z_40: keep the backup, delete the shame

    +

    lima-note: proud of you, even here

    +

    sensei_chi: the counter counts only what can be counted

    diff --git a/play/left-behind.org b/play/left-behind.org index fc868e2..2730e64 100644 --- a/play/left-behind.org +++ b/play/left-behind.org @@ -17,14 +17,14 @@

    Family note

    -

    The blue bowl

    -

    I left the small blue bowl on the counter because it still smells faintly of coriander and Sunday. If anyone asks, it was never lost. It was waiting for someone to remember soup.

    -

    Under the bowl is a folded receipt. On the back, in pencil: "Morrow came by at 2:13. He said the hallway was kinder than last year."

    +

    The small receipt

    +

    Lima left a folded receipt on the counter. Not because it mattered, exactly, but because small ordinary things become evidence that a day happened.

    +

    On the back, in pencil: "Met in 2022. Engaged in Oct 2025. Soon, inshaAllah, married. Keep the ordinary days safe too."

        ____
       /    \
      /______\
    -   soup
    +  2025
           
    diff --git a/play/lima-note.org b/play/lima-note.org new file mode 100644 index 0000000..6c5eab2 --- /dev/null +++ b/play/lima-note.org @@ -0,0 +1,24 @@ +#+TITLE: Lima Note +#+OPTIONS: num:nil title:nil toc:nil +#+NO_SIDENOTES: t +#+HIDDEN_PAGE: t +#+DATE: <2026-05-10 Sun> + +#+BEGIN_EXPORT html +
    +
    +
    +

    Layer 2

    +

    Lima Note

    +

    A safe-space note from the emotional anchor of the archive.

    +
    +
    +
    +
    +

    Met Z in 2022. Engaged in Oct 2025. Soon to be married.

    +

    The website can be strange, but let it stay kind. Let the hidden things feel like someone folded a blanket at the end of the day.

    +

    Reminder: eat before turning feelings into features.

    +
    +
    +
    +#+END_EXPORT diff --git a/play/radio-room.org b/play/radio-room.org index c907f11..fd95628 100644 --- a/play/radio-room.org +++ b/play/radio-room.org @@ -18,9 +18,9 @@

    Tuning log

    Between stations

    89.1: rain on the kitchen roof.

    -

    91.4: Nadir saying backups are just promises with timestamps.

    -

    99.9: Luma humming an original song about lamps, trains, and coming back slowly.

    -

    The dial is warm. It does not play automatically because even ghosts should ask permission.

    +

    91.4: Aphy explaining that backups are promises with timestamps.

    +

    99.9: Lima laughing off-mic, and Z forgetting what he was worried about.

    +

    The dial is warm. It does not play automatically because even hidden pages should ask permission.

    diff --git a/play/rpg.org b/play/rpg.org index 1d771d3..933d6a2 100644 --- a/play/rpg.org +++ b/play/rpg.org @@ -9,7 +9,7 @@

    11 / Role Playing Game

    Ash Below the Lake

    -

    A 2D story RPG set in Morrow's End: a town beside a black lake that remembers names, grief, and everyone the world tries to forget.

    +

    A 2D story RPG set beside a black lake that remembers names, grief, and everyone the world tries to forget.

    diff --git a/play/sensei-garden.org b/play/sensei-garden.org new file mode 100644 index 0000000..847f385 --- /dev/null +++ b/play/sensei-garden.org @@ -0,0 +1,25 @@ +#+TITLE: Sensei Garden +#+OPTIONS: num:nil title:nil toc:nil +#+NO_SIDENOTES: t +#+HIDDEN_PAGE: t +#+DATE: <2026-05-10 Sun> + +#+BEGIN_EXPORT html +
    +
    +
    +

    Layer 3

    +

    Sensei Garden

    +

    A quiet page that answers after you stop asking so loudly.

    +
    +
    +
    +
    +

    Sensei Chi says:

    +

    The seed does not hurry because the calendar is watching.

    +

    Aphy asks whether patience can be optimized.

    +

    Sensei Chi smiles. "Only by becoming unnecessary."

    +
    +
    +
    +#+END_EXPORT diff --git a/play/terminal-cupboard.org b/play/terminal-cupboard.org index 21aa475..00cbcf4 100644 --- a/play/terminal-cupboard.org +++ b/play/terminal-cupboard.org @@ -15,7 +15,7 @@
    -

    cupboard v0.9. Type help.

    +

    family-layer cupboard v2.0. Type help.

    diff --git a/play/train-platform.org b/play/train-platform.org index e12866d..2c9d6a2 100644 --- a/play/train-platform.org +++ b/play/train-platform.org @@ -1,4 +1,4 @@ -#+TITLE: Train Platform +#+TITLE: Time Platform #+OPTIONS: num:nil title:nil toc:nil #+NO_SIDENOTES: t #+HIDDEN_PAGE: t @@ -8,17 +8,17 @@
    -

    Platform 3

    -

    Train Platform

    -

    The departure board changes every month, but every destination is a feeling.

    +

    Layer 4

    +

    Time Platform

    +

    The departure board changes by year, but every destination is still Z.

    -

    23:13 - Later - delayed by tenderness

    -

    00:04 - Home - expected when ready

    -

    06:30 - The Long Way - boarding quietly

    -

    Morrow is on the bench with a return ticket he refuses to explain.

    +

    2022 - Beginning - arrived quietly

    +

    Oct 2025 - Engagement - boarding with light

    +

    Age 7 - Wonder - running on platform chalk

    +

    Age 40 - Return - Future Z is on the bench, saving you a seat.

    diff --git a/play/young-z-desk.org b/play/young-z-desk.org new file mode 100644 index 0000000..159b8b9 --- /dev/null +++ b/play/young-z-desk.org @@ -0,0 +1,30 @@ +#+TITLE: Young Z Desk +#+OPTIONS: num:nil title:nil toc:nil +#+NO_SIDENOTES: t +#+HIDDEN_PAGE: t +#+DATE: <2026-05-10 Sun> + +#+BEGIN_EXPORT html +
    +
    +
    +

    Layer 2

    +

    Young Z Desk

    +

    A memory fragment from age 7, preserved without correcting the spelling.

    +
    +
    +
    +
    +

    Things Young Z considers important:

    +

    1. A blanket can be a cape.

    +

    2. Computers are friend-shaped if they have games.

    +

    3. The moon follows the car because it likes us.

    +
    +  \  |  /
    +   .-*-.
    +  /  |  \    sun for later
    +      
    +
    +
    +
    +#+END_EXPORT