Cookies

This cookies page explains what Inkswift Haven stores in your browser, why, and how to change your mind. It pairs with the privacy notice at privacy.php. The short version: one consent cookie, an optional localStorage mirror, and Google Maps if you allow functional content.
Essential storage — The consent system needs to remember whether you accepted, rejected, or customised choices. Without storage, the banner would return every visit and annoy you. Essential in this context means strictly necessary for that memory, not secretly expanded to tracking.
Functional / embedded content — Google Maps iframes appear on every page, centred on Hougang at neighbourhood zoom. They are not essential to read the text. On this site, if you reject functional cookies, maps are replaced by a quiet placeholder and a Load map button. Clicking Load map grants functional consent for that session path via the same consent record. Accept all enables maps immediately on all pages.
Analytics — Off by default. No Google Analytics, no Meta pixel, no heatmap SaaS. The toggle in the Customise panel exists so the categories are honest if I ever add optional statistics later. Today, analytics remains false even if you Accept all, because nothing is wired to it.
Cookie name and format — sg_reader_consent, Path=/, Max-Age about 15552000 seconds (180 days), SameSite=Lax, Secure on HTTPS. Value is URL-encoded JSON: {"essential":true,"functional":true|false,"analytics":false,"ts":"ISO timestamp","v":1}. localStorage key reader_consent_v1 mirrors the same object for faster reads and stays synced on write.
Buttons — Accept all sets functional true and hides the banner. Reject all sets functional false and hides the banner. Customise opens the panel with toggles implemented as buttons with aria-pressed, not checkbox inputs, because this site avoids form fields entirely. Save writes your exact toggle states.
Manage cookies — Use the Manage cookies button on this page to reopen the panel after a choice. Your saved state should appear on the toggles. Saving overwrites the previous record.
Google Maps disclosure — When functional consent is granted, your browser requests map tiles from Google. Google may set its own cookies or use similar technologies under its policies. I do not control Google’s processing. When functional consent is denied, this site does not load the iframe until you press Load map or change preferences.
Clearing storage — Browser settings → Privacy → Cookies → remove sg_reader_consent for inkswifthaven.life, and clear localStorage for the site. Next visit shows the banner again.
Retention — About six months, not forever. After expiry, choose again.
Accessibility — Banner is a bottom strip, not a blocking modal. Focus moves sensibly in the panel. Escape closes the panel. prefers-reduced-motion reduces animation.
No forms — Consent controls are buttons, not submit fields. Nothing POSTs to send.php because that file does not exist here.
This is a personal blog. Everything here reflects my own experiences, opinions, memories and impressions from a flat in Lorong Ah Soo. The notes are personal reflections, not professional, medical, legal, financial or news-reporting advice.
Where a note touches a serious event nearby, I only describe what I heard or saw from my own end of the road — never as reporting. I do not speak for anyone else, and I do not claim to know more than I actually noticed that night.
If I have got something wrong — a date, a detail, a name I should not have used — please tell me at [email protected] and I will fix it. I read mail in the late afternoons, SGT.
Technical readers: main.js reads document.body data-map-policy="placeholder" and applies map visibility based on functional consent. First visit with no cookie shows banner and placeholders where maps would be.
Questions: [email protected]. Tell me if a button fails — that is a bug, not a preference.
Last updated: 11 August 2026.
Why buttons instead of checkboxes — This site avoids form fields entirely on contact and consent pages. Toggles use aria-pressed buttons so keyboard and screen-reader users get clear state without hidden inputs.
Essential always on — You cannot disable the consent memory without breaking the banner behaviour. That is intentional: remembering a choice is the core function.
Functional default on Accept all — Accept all enables maps immediately. Reject all keeps placeholders until you press Load map or revisit Customise.
Simulating expiry — Developers testing C6 can shorten Max-Age in DevTools or delete the cookie manually to confirm the banner returns politely.
Cross-page consistency — main.js runs on every page so map visibility matches stored consent when navigating from letterbox to scraps without reload quirks.
No dark patterns — Reject all is as prominent as Accept all. Customise is not hidden behind extra menus.
Language — Banner copy is written in my voice, not legal boilerplate, but the cookies page carries the detailed explanation you are reading now.