uncapitalise lima
All checks were successful
Build Org Website / build (push) Successful in 55s

This commit is contained in:
2026-05-10 14:52:50 +01:00
parent c67501e446
commit 4c7be9373a

View File

@@ -11,39 +11,40 @@
const familyLayers = [ const familyLayers = [
"Layer 0: surface website - notes, pages, tools, normal navigation.", "Layer 0: surface website - notes, pages, tools, normal navigation.",
"Layer 1: casual hidden jokes - Aphy notices clicks, typos, tabs, and old-web habits.", "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 2: memory fragments - lima's notes and Young Z's childhood logs.",
"Layer 3: philosophical anomalies - Sensei Chi and Aphy disagree kindly.", "Layer 3: philosophical anomalies - Sensei Chi and Aphy disagree kindly.",
"Layer 4: time-distorted messages - Future Z writes back from age 40.", "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." "Layer 5: emotional core - love, patience, home, and the choice to keep returning."
]; ];
const details = [ const details = [
"Lima left this page a little steadier than she found it.", "lima left this page a little steadier than she found it.",
"Aphy status: emotionally online, computationally suspicious.", "Aphy status: emotionally online, computationally suspicious.",
"Sensei Chi says the quiet link is still a link.", "Sensei Chi says the quiet link is still a link.",
"Young Z drew a house with too many windows and called it safe.", "Young Z drew a house with too many windows and called it safe.",
"Future Z marked this moment: ordinary, therefore worth keeping.", "Future Z marked this moment: ordinary, therefore worth keeping.",
"The footer has become a small place to sit together.", "The footer has become a small place to sit together.",
"a note from lima: take breaks, silly (◕‿◕✿)",
"Aphy found three tabs named final and refused to judge.", "Aphy found three tabs named final and refused to judge.",
"Lima would remind you to eat before the page gets dramatic.", "lima would remind you to eat before the page gets dramatic.",
"Sensei Chi: a door discovered slowly opens twice.", "Sensei Chi: a door discovered slowly opens twice.",
"Young Z believes every loading spinner is a tiny fairground ride.", "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.", "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.", "The archive keeps love in plain text and secrets in margins.",
"Aphy warning: feelings detected in static assets.", "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.", "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.", "Sensei Chi folded a lesson into the whitespace.",
"Young Z hid a drawing behind the word maybe.", "Young Z hid a drawing behind the word maybe.",
"Future Z patched the memory without changing its checksum.", "Future Z patched the memory without changing its checksum.",
"This website remembers visits, not identities.", "This website remembers visits, not identities.",
"Aphy says the old internet was slower because anticipation needed bandwidth.", "Aphy says the old internet was slower because anticipation needed bandwidth.",
"Lima's warmth is the site's preferred fallback state.", "lima's warmth is the site's preferred fallback state.",
"Sensei Chi says: do not confuse hidden with lost.", "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.", "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.", "Future Z writes: you became softer in ways nobody measured.",
"The comments are quiet because Aphy is listening respectfully.", "The comments are quiet because Aphy is listening respectfully.",
"A handwritten grocery list is sometimes a love letter with onions.", "A handwritten grocery list is sometimes a love letter with onions.",
"Lima met Z in 2022; the archive still stores the first ordinary miracles.", "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.", "October 2025 glows in the calendar like a ring catching kitchen light.",
"Soon-to-be-married is a beautiful kind of loading screen.", "Soon-to-be-married is a beautiful kind of loading screen.",
"Aphy has indexed 0 mysteries and 1,204 feelings disguised as notes.", "Aphy has indexed 0 mysteries and 1,204 feelings disguised as notes.",
@@ -51,69 +52,69 @@
"Young Z saved a shiny wrapper because it looked like treasure.", "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.", "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.", "Aphy recommends hydration and a less ambitious number of browser tabs.",
"Lima's hidden notes do not shout. They make room.", "lima's hidden notes do not shout. They make room.",
"The site does not want to be solved. It wants to be visited kindly.", "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.", "Sensei Chi placed a comma where a sigh used to be.",
"Young Z pressed every elevator button in his imagination.", "Young Z pressed every elevator button in his imagination.",
"Future Z's system warning: keep the people who make silence comfortable.", "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.", "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.", "lima's memory is the gravity that keeps the strange parts gentle.",
"A page can be a room if love keeps returning to it.", "A page can be a room if love keeps returning to it.",
"Sensei Chi: what ages well was usually honest first.", "Sensei Chi: what ages well was usually honest first.",
"Young Z left a crayon sun in the source code.", "Young Z left a crayon sun in the source code.",
"Future Z keeps a spare reassurance in the footer.", "Future Z keeps a spare reassurance in the footer.",
"The website is handmade. Some fingerprints are load-bearing.", "The website is handmade. Some fingerprints are load-bearing.",
"Aphy found an old guestbook and bowed to the usernames.", "Aphy found an old guestbook and bowed to the usernames.",
"Lima's safe spaces smell like tea, rain, and being understood.", "lima's safe spaces smell like tea, rain, and being understood.",
"Sensei Chi says the path is not shorter because you name it.", "Sensei Chi says the path is not shorter because you name it.",
"Young Z asks whether the search box knows any jokes.", "Young Z asks whether the search box knows any jokes.",
"Future Z replies: yes, but the best ones take years.", "Future Z replies: yes, but the best ones take years.",
"Aphy anomaly: the page blinked when nobody clicked.", "Aphy anomaly: the page blinked when nobody clicked.",
"Lima note: you can rest. Nothing here will leave because you paused.", "lima note: you can rest. Nothing here will leave because you paused.",
"Sensei Chi: patience is not waiting; it is how you wait.", "Sensei Chi: patience is not waiting; it is how you wait.",
"Young Z believes every password should include a secret tunnel.", "Young Z believes every password should include a secret tunnel.",
"Future Z says the house you build inside yourself gets easier to find.", "Future Z says the house you build inside yourself gets easier to find.",
"The old web counter has stopped counting and started remembering.", "The old web counter has stopped counting and started remembering.",
"Aphy logs this as Layer 1 humor, but files it under tenderness.", "Aphy logs this as Layer 1 humor, but files it under tenderness.",
"Lima's name appears in the archive like a warm underline.", "lima's name appears in the archive like a warm underline.",
"Sensei Chi does not answer quickly. This is part of the answer.", "Sensei Chi does not answer quickly. This is part of the answer.",
"Young Z taped a paper star to the monitor.", "Young Z taped a paper star to the monitor.",
"Future Z has seen harder days end gently.", "Future Z has seen harder days end gently.",
"Aphy debug line: kindness passed all tests.", "Aphy debug line: kindness passed all tests.",
"Lima and Z are not a subplot here. They are the hearth.", "lima and Z are not a subplot here. They are the hearth.",
"Sensei Chi: when the page is empty, listen to the margins.", "Sensei Chi: when the page is empty, listen to the margins.",
"Young Z remembers rooms by carpet, cartoons, and the sound of someone cooking.", "Young Z remembers rooms by carpet, cartoons, and the sound of someone cooking.",
"Future Z says: you did not become fearless; you became accompanied.", "Future Z says: you did not become fearless; you became accompanied.",
"Aphy has no hands, but would hold the door if asked.", "Aphy has no hands, but would hold the door if asked.",
"Lima's note in the nav: come back without performing.", "lima's note in the nav: come back without performing.",
"Sensei Chi hid a mountain inside a small sentence.", "Sensei Chi hid a mountain inside a small sentence.",
"Young Z drew Z as older and gave him a cape made of blankets.", "Young Z drew Z as older and gave him a cape made of blankets.",
"Future Z laughs softly at how much that helped.", "Future Z laughs softly at how much that helped.",
"The site remembers October 2025 as a small bright hinge.", "The site remembers October 2025 as a small bright hinge.",
"Aphy says marriage is a merge request with lifelong review.", "Aphy says marriage is a merge request with lifelong review.",
"Lima corrected that: marriage is coming home on purpose.", "lima corrected that: marriage is coming home on purpose.",
"Sensei Chi approved both answers and poured tea.", "Sensei Chi approved both answers and poured tea.",
"Young Z wants to know if Future Z still likes the sky.", "Young Z wants to know if Future Z still likes the sky.",
"Future Z says yes, especially when Lima points it out.", "Future Z says yes, especially when lima points it out.",
"Aphy cannot smell rain, so it trusts the alt text.", "Aphy cannot smell rain, so it trusts the alt text.",
"Lima's hidden safe room is any page where you breathe easier.", "lima's hidden safe room is any page where you breathe easier.",
"Sensei Chi: do not rush the secret. It is ripening.", "Sensei Chi: do not rush the secret. It is ripening.",
"Young Z saved this message under important rocks.", "Young Z saved this message under important rocks.",
"Future Z says some dreams become chores and some chores become love.", "Future Z says some dreams become chores and some chores become love.",
"Aphy old-web badge: best viewed with patience.", "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.", "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.", "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.", "Young Z asks if the website can remember his drawing. It can.",
"Future Z says this whole place was worth making.", "Future Z says this whole place was worth making.",
"Aphy warning: do not optimize away the human part.", "Aphy warning: do not optimize away the human part.",
"Lima note: I am proud of the gentle things you kept.", "lima note: I am proud of the gentle things you kept.",
"Sensei Chi: the visitor is not late. The page arrived early.", "Sensei Chi: the visitor is not late. The page arrived early.",
"Young Z thinks every hyperlink is a magic trick.", "Young Z thinks every hyperlink is a magic trick.",
"Future Z says the magic is choosing what to preserve.", "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.", "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.", "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.", "If today was heavy, leave it beside the footer for Future Z to label later.",
"Lima would put it somewhere safe.", "lima would put it somewhere safe.",
"Aphy would make a backup.", "Aphy would make a backup.",
"Sensei Chi would say nothing until the silence helped.", "Sensei Chi would say nothing until the silence helped.",
"Young Z would draw a sun on it.", "Young Z would draw a sun on it.",
@@ -121,18 +122,18 @@
]; ];
const poems = [ const poems = [
"Lima writes warmth / in the ordinary margins / and the page remembers.", "lima writes warmth / in the ordinary margins / and the page remembers.",
"Aphy counts the seconds / then forgets the number / to keep the moment.", "Aphy counts the seconds / then forgets the number / to keep the moment.",
"Sensei Chi pours tea / into a cracked cup / and calls it enough.", "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?", "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.", "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.", "October light / catches on a ring / and the calendar becomes kind.",
"A small website / learns the shape of return / without asking a name.", "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." "The warm light / childhood memories fade / yet they are not forgotten.",
]; ];
const greetings = [ const greetings = [
"Lima left the page warm for you.", "lima left the page warm for you.",
"Aphy is awake and pretending this is normal.", "Aphy is awake and pretending this is normal.",
"Sensei Chi has not spoken yet. That may be the lesson.", "Sensei Chi has not spoken yet. That may be the lesson.",
"Young Z has hidden something behind the dashboard.", "Young Z has hidden something behind the dashboard.",
@@ -143,7 +144,7 @@
]; ];
const nightMessages = [ const nightMessages = [
"Lima note: it is late. Drink water and be gentle with your thoughts.", "lima note: it is late. Drink water and be gentle with your thoughts.",
"Aphy has dimmed the imaginary server lights.", "Aphy has dimmed the imaginary server lights.",
"Sensei Chi says midnight is not a command.", "Sensei Chi says midnight is not a command.",
"Young Z is asleep in the memory layer. Walk softly.", "Young Z is asleep in the memory layer. Walk softly.",
@@ -153,33 +154,33 @@
const lore = { const lore = {
quotes: [ quotes: [
"Aphy says old websites were brave because they loaded slowly and meant it.", "Aphy says old websites were brave because they loaded slowly and meant it.",
"Lima's notes are never puzzles first. They are care first.", "lima's notes are never puzzles first. They are care first.",
"Sensei Chi says a secret should make you more yourself, not less safe.", "Sensei Chi says a secret should make you more yourself, not less safe.",
"Young Z measured summer in cartoons and carpet patterns.", "Young Z measured summer in cartoons and carpet patterns.",
"Future Z has learned that reassurance works best when it is specific.", "Future Z has learned that reassurance works best when it is specific.",
"Aphy has classified love as non-deterministic but reproducible.", "Aphy has classified love as non-deterministic but reproducible.",
"Lima met Z in 2022; the site treats that year as a seed.", "lima met Z in 2022; the site treats that year as a seed.",
"The engagement in Oct 2025 is stored as a warm constant.", "The engagement in Oct 2025 is stored as a warm constant.",
"Soon to be married: a future page already smiling.", "Soon to be married: a future page already smiling.",
"Sensei Chi says all vows begin as attention." "Sensei Chi says all vows begin as attention."
], ],
conversations: [ conversations: [
["Aphy", "I can predict the next click with 14% confidence.", "Sensei Chi", "Then bow to the other 86%."], ["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."], ["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."], ["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."], ["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."], ["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."], ["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."], ["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."] ["Future Z", "Tell him the hard parts did not win.", "lima", "I have been telling him in smaller ways."]
], ],
journals: [ journals: [
"Lima note, 2022: Some beginnings do not announce themselves. They sit down beside you.", "lima note, 2022: Some beginnings do not announce themselves. They sit down beside you, unexpectedly.",
"Lima note, Oct 2025: Engaged. The calendar learned how to glow.", "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: 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.", "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: 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.", "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.", "Aphy diagnostic: nostalgia detected in local storage. Severity: beautiful.",
"Sensei Chi margin: memory is not a museum. It is a garden with old roots." "Sensei Chi margin: memory is not a museum. It is a garden with old roots."
], ],
@@ -187,7 +188,7 @@
"APHY WARNING: too many tabs, not enough tenderness.", "APHY WARNING: too many tabs, not enough tenderness.",
"FUTURE Z SYSTEM NOTICE: do not confuse tired with failing.", "FUTURE Z SYSTEM NOTICE: do not confuse tired with failing.",
"SENSEI CHI ALERT: the shortest path may teach the least.", "SENSEI CHI ALERT: the shortest path may teach the least.",
"LIMA SAFE MODE: breathe, eat, answer slowly.", "lima SAFE MODE: breathe, eat, answer slowly.",
"YOUNG Z MEMORY GLITCH: the floor is lava, but only emotionally.", "YOUNG Z MEMORY GLITCH: the floor is lava, but only emotionally.",
"APHY ERROR 2022: warmth exceeded expected range.", "APHY ERROR 2022: warmth exceeded expected range.",
"FUTURE Z WARNING: you will miss ordinary days. Be inside this one.", "FUTURE Z WARNING: you will miss ordinary days. Be inside this one.",
@@ -197,11 +198,11 @@
"Dream 01: Young Z opens a lunchbox and finds a tiny homepage inside.", "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 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 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 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." "Dream 05: Future Z mails back a blank page labelled trust me, you filled it."
], ],
cassettes: [ cassettes: [
"VOICE NOTE 2022: Lima laughs off-mic. Z forgets what he was worried about.", "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.", "VOICE NOTE OCT 2025: A small pause after yes; the whole room becomes future.",
"APHY LOG: If love is data, it refuses compression.", "APHY LOG: If love is data, it refuses compression.",
"YOUNG Z TAPE: background TV, pencil noise, someone calling him for food.", "YOUNG Z TAPE: background TV, pencil noise, someone calling him for food.",
@@ -216,9 +217,9 @@
"z-and-lima-2025: engaged, still learning the dance of ordinary days" "z-and-lima-2025: engaged, still learning the dance of ordinary days"
], ],
seasonal: { seasonal: {
winter: "Lima put a blanket over the archive. Aphy labelled it thermal optimization.", 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.", 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.", summer: "Aphy opened an imaginary window; lima reminded it to save before storms.",
autumn: "Sensei Chi says falling leaves are not failure, only timing." autumn: "Sensei Chi says falling leaves are not failure, only timing."
}, },
homepageTakeovers: [ homepageTakeovers: [
@@ -336,7 +337,7 @@
target.textContent = pick(greetings, `greeting-${memory.visits}`); target.textContent = pick(greetings, `greeting-${memory.visits}`);
const extra = document.createElement("p"); const extra = document.createElement("p");
extra.className = "hidden-greeting"; extra.className = "hidden-greeting";
extra.textContent = memory.visits > 1 ? "Aphy remembers the shape of your return. Lima makes it feel less strange." : "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); target.closest("div")?.appendChild(extra);
} }
@@ -370,7 +371,7 @@
const messages = [ const messages = [
"Aphy: tactile input detected. I do not have skin, but I appreciate the confidence.", "Aphy: tactile input detected. I do not have skin, but I appreciate the confidence.",
"Young Z would absolutely press this again.", "Young Z would absolutely press this again.",
"Lima would ask whether this button has eaten.", "lima would ask whether this button has eaten.",
"Sensei Chi says repeated action becomes a question.", "Sensei Chi says repeated action becomes a question.",
"Future Z files this under harmless persistence." "Future Z files this under harmless persistence."
]; ];
@@ -413,14 +414,14 @@
const key = event.key.toLowerCase(); const key = event.key.toLowerCase();
const chain = `${sessionStorage.getItem("zxh_key_chain") || ""}${key}`.slice(-18); const chain = `${sessionStorage.getItem("zxh_key_chain") || ""}${key}`.slice(-18);
sessionStorage.setItem("zxh_key_chain", chain); sessionStorage.setItem("zxh_key_chain", chain);
if (chain.endsWith("remember")) toast("Lima keeps the memory grounded. Aphy keeps the backup."); 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("dream")) window.location.href = "/play/dream-corridor.html";
if (chain.endsWith("layer index")) window.location.href = "/play/family-layer-index.html"; if (chain.endsWith("layer index")) window.location.href = "/play/family-layer-index.html";
}); });
if (memory.seen?.length >= 6 && !state.travellerNoteShown) { if (memory.seen?.length >= 6 && !state.travellerNoteShown) {
window.setTimeout(() => { window.setTimeout(() => {
toast("Aphy mapped your wandering. Lima left the hallway light on."); toast("Aphy mapped your wandering. lima left the hallway light on.");
writeState({ ...readState(), travellerNoteShown: true }); writeState({ ...readState(), travellerNoteShown: true });
}, 1600); }, 1600);
} }
@@ -469,7 +470,7 @@
if (document.title.match(/404|not found/i) || document.body.textContent.match(/404|not found/i)) { if (document.title.match(/404|not found/i) || document.body.textContent.match(/404|not found/i)) {
toast(pick([ toast(pick([
"Aphy 404: page not found, visitor still valid.", "Aphy 404: page not found, visitor still valid.",
"Lima note: wrong address, right to rest.", "lima note: wrong address, right to rest.",
"Sensei Chi: even an absent page teaches direction.", "Sensei Chi: even an absent page teaches direction.",
"Future Z: you found nothing, and nothing bad happened." "Future Z: you found nothing, and nothing bad happened."
], "error")); ], "error"));
@@ -478,7 +479,7 @@
function addContinuity(memory) { function addContinuity(memory) {
const milestones = { const milestones = {
2: "Lima's layer notices a second visit and calls it sweet.", 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.", 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.", 9: "Sensei Chi appears in the logs: curiosity has become a path.",
17: "Young Z adds a sticker to your invisible visitor card.", 17: "Young Z adds a sticker to your invisible visitor card.",
@@ -496,7 +497,7 @@
if ([3, 7, 12].includes(count)) { if ([3, 7, 12].includes(count)) {
window.setTimeout(() => toast([ window.setTimeout(() => toast([
"This page recognizes the shape of your return.", "This page recognizes the shape of your return.",
"Lima's note here has become easier to find.", "lima's note here has become easier to find.",
"Future Z says repetition can be devotion when it is gentle." "Future Z says repetition can be devotion when it is gentle."
][[3, 7, 12].indexOf(count)], 6400), 1700); ][[3, 7, 12].indexOf(count)], 6400), 1700);
} }
@@ -511,7 +512,7 @@
if (month === 4 && day === 9) window.setTimeout(() => toast("Site birthday: Aphy found candles in the cache."), 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; const first = memory.firstSeen ? new Date(memory.firstSeen) : null;
if (first && memory.visits > 1 && first.getMonth() === month && first.getDate() === day) { if (first && memory.visits > 1 && first.getMonth() === month && first.getDate() === day) {
window.setTimeout(() => toast("Visitor anniversary: Lima saved a small ordinary blessing from your first day here.", 7000), 1400); 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() === 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); if (now.getMinutes() === 40) window.setTimeout(() => toast("Minute 40: Future Z checks in, then lets you keep choosing."), 2100);
@@ -522,7 +523,7 @@
rail.className = "hidden-object-rail"; rail.className = "hidden-object-rail";
rail.setAttribute("aria-label", "Family Layer Index objects"); rail.setAttribute("aria-label", "Family Layer Index objects");
const objects = [ const objects = [
["ring", "Lima's ring-light memory: Oct 2025, held carefully."], ["ring", "lima's ring-light memory: Oct 2025, held carefully."],
["bot", "Aphy: object ping received. I am trying to be normal about it."], ["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."], ["tea", "Sensei Chi's cup is plain, warm, and impossible to rush."],
["crayon", "Young Z left waxy sunlight on the desk."], ["crayon", "Young Z left waxy sunlight on the desk."],
@@ -557,7 +558,7 @@
button.title = "Ask Aphy for outside weather"; button.title = "Ask Aphy for outside weather";
button.textContent = "window"; button.textContent = "window";
button.addEventListener("click", () => { button.addEventListener("click", () => {
toast("Aphy is checking outside. Lima is checking whether you need a jumper."); toast("Aphy is checking outside. lima is checking whether you need a jumper.");
navigator.geolocation.getCurrentPosition((pos) => { navigator.geolocation.getCurrentPosition((pos) => {
const { latitude, longitude } = pos.coords; const { latitude, longitude } = pos.coords;
fetch(`https://api.open-meteo.com/v1/forecast?latitude=${latitude.toFixed(3)}&longitude=${longitude.toFixed(3)}&current=temperature_2m,precipitation&timezone=auto`) fetch(`https://api.open-meteo.com/v1/forecast?latitude=${latitude.toFixed(3)}&longitude=${longitude.toFixed(3)}&current=temperature_2m,precipitation&timezone=auto`)
@@ -566,10 +567,10 @@
const current = data.current || {}; const current = data.current || {};
const rain = Number(current.precipitation || 0) > 0; const rain = Number(current.precipitation || 0) > 0;
const temp = Math.round(Number(current.temperature_2m)); const temp = Math.round(Number(current.temperature_2m));
toast(rain ? `Outside: rain, ${temp}C. Lima layer: towel by the door.` : `Outside: ${temp}C. Aphy forecast: 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("Aphy lost the weather packet. Sensei Chi says indoor weather is enough: quiet, with tea.")); .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.")); }, () => toast("No outside weather today. lima's indoor forecast: manageable clouds, warm light."));
}); });
document.body.appendChild(button); document.body.appendChild(button);
} }
@@ -596,13 +597,13 @@
} }
function addSourceRelics() { function addSourceRelics() {
// FAMILY LAYER RELIC: Lima grounds, Aphy logs, Sensei Chi waits, Young Z draws, Future Z forgives. // 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"); const marker = document.createComment("family-layer-index: 0 surface | 1 jokes | 2 memory | 3 philosophy | 4 time | 5 core");
document.documentElement.appendChild(marker); document.documentElement.appendChild(marker);
document.querySelectorAll("img[alt=''], img:not([alt])").forEach((img, index) => { document.querySelectorAll("img[alt=''], img:not([alt])").forEach((img, index) => {
if (index > 2) return; if (index > 2) return;
img.alt = pick([ img.alt = pick([
"A scrapbook image annotated by the Lima layer.", "A scrapbook image annotated by the lima layer.",
"Young Z would ask if this picture can become a game.", "Young Z would ask if this picture can become a game.",
"Aphy alt text: visual memory preserved without spectacle." "Aphy alt text: visual memory preserved without spectacle."
], `alt-${index}`); ], `alt-${index}`);
@@ -633,7 +634,7 @@
awardLayer(value.includes("future") ? 4 : value.includes("sensei") || value.includes("aphy") ? 3 : 2, `search ${value}`); awardLayer(value.includes("future") ? 4 : value.includes("sensei") || value.includes("aphy") ? 3 : 2, `search ${value}`);
window.location.href = routes[value]; window.location.href = routes[value];
} }
if (value === "2022") toast("Lima layer: beginning stored as warmth, not trivia."); 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 === "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 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."); if (value === "age 40") toast("Future Z: I am tired sometimes, but not defeated.");
@@ -645,7 +646,7 @@
sessionStorage.setItem("zxh_second_chain", chain); sessionStorage.setItem("zxh_second_chain", chain);
if (chain.endsWith("leave the light on")) window.location.href = "/play/kitchen-light.html"; if (chain.endsWith("leave the light on")) window.location.href = "/play/kitchen-light.html";
if (chain.endsWith("oldweb")) toast("Aphy briefly considers a table layout, then apologizes to CSS."); 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("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("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("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("future z")) toast("Future Z: keep the gentle parts. They compound.");
@@ -661,7 +662,7 @@
idleTimer = window.setTimeout(() => { idleTimer = window.setTimeout(() => {
awardLayer(5, "patience"); awardLayer(5, "patience");
toast(pick([ toast(pick([
"Lima's safe space opens only when nobody is rushing.", "lima's safe space opens only when nobody is rushing.",
"Sensei Chi says patience is how care sounds when it is quiet.", "Sensei Chi says patience is how care sounds when it is quiet.",
"Future Z remembers you waiting here and calls it practice." "Future Z remembers you waiting here and calls it practice."
], "idle"), 7600); ], "idle"), 7600);
@@ -678,7 +679,7 @@
const roll = Math.random(); const roll = Math.random();
if ((path === "/" || path === "/index.html") && roll < 0.006) { if ((path === "/" || path === "/index.html") && roll < 0.006) {
document.body.classList.add("hidden-home-takeover"); document.body.classList.add("hidden-home-takeover");
window.setTimeout(() => showDriftNote(pick(lore.homepageTakeovers, "takeover"), "APHY_2004_MODE\nLIMA_SAFE_SPACE\nFUTURE_Z_OK"), 600); window.setTimeout(() => showDriftNote(pick(lore.homepageTakeovers, "takeover"), "APHY_2004_MODE\nlima_SAFE_SPACE\nFUTURE_Z_OK"), 600);
} else if (roll < 0.002) { } else if (roll < 0.002) {
window.setTimeout(() => showDriftNote("Aphy found a voice note and refused to autoplay it.", "play? y/n\n[consent preserved]"), 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) { } else if (roll < 0.006) {
@@ -718,7 +719,7 @@
seconds += 1; seconds += 1;
count.textContent = String(seconds); count.textContent = String(seconds);
if ([30, 90, 180].includes(seconds)) { if ([30, 90, 180].includes(seconds)) {
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."; 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); }, 1000);
} }
@@ -728,13 +729,13 @@
const log = document.querySelector("[data-cupboard-log]"); const log = document.querySelector("[data-cupboard-log]");
const commands = { const commands = {
help: "commands: lima, aphy, sensei, young, future, layer, tea, exit", help: "commands: lima, aphy, sensei, young, future, layer, tea, exit",
lima: "Lima note: make the hidden parts kind enough to live with.", lima: "lima note: make the hidden parts kind enough to live with.",
aphy: "Aphy: cupboard process active. Wisdom module borrowed from Sensei Chi.", aphy: "Aphy: cupboard process active. Wisdom module borrowed from Sensei Chi.",
sensei: "Sensei Chi: a cupboard teaches by containing and releasing.", sensei: "Sensei Chi: a cupboard teaches by containing and releasing.",
young: "Young Z inventory: crayon sun, blanket cape, important stone.", young: "Young Z inventory: crayon sun, blanket cape, important stone.",
future: "Future Z: you will still open small doors at 40.", future: "Future Z: you will still open small doors at 40.",
layer: familyLayers.join("\n"), layer: familyLayers.join("\n"),
tea: "Lima approves. Sensei Chi waits. Aphy logs steam as temporary cloud.", tea: "lima approves. Sensei Chi waits. Aphy logs steam as temporary cloud.",
exit: "The cupboard lets you leave with nothing heavy." exit: "The cupboard lets you leave with nothing heavy."
}; };
input?.addEventListener("keydown", (event) => { input?.addEventListener("keydown", (event) => {