Cookies
Storage, maps, and your controls.
This page explains cookies and similar storage on Pen Lines — penforge.life — in plain Singapore English. I am Yasmin; this is my personal blog, not a shop or an app. There is no checkout, no account login, and no comment form that stores your name.
Why a banner appears: when you first visit, a bottom strip asks for your choice about optional storage. It must work — not decoration. Accept all, Reject all, and Customise buttons write a real record so the banner stays hidden after you decide, until the record expires in about six months.
What gets stored: a cookie named sg_notes_consent containing URL-encoded JSON like {"essential":true,"functional":true|false,"analytics":false,"ts":"<ISO time>","v":1}. The same JSON is mirrored in localStorage under cookie_consent_v1 so the site can read your choice quickly on the next page. Both use Path=/ and SameSite=Lax; Secure is added on HTTPS.
Categories — Essential: always on. Remembers that you answered the banner so it does not nag every page load. Cannot be disabled while using the site because without it the banner would return continuously. No tracking purpose.
Categories — Functional / embedded content: controls Google Maps iframes on every page. This site uses approach (a): if you Reject all, maps are hidden and replaced by a quiet placeholder with a Load map button. Clicking Load map grants functional consent for that session view and stores your choice like Accept would for maps. If you Accept all or enable Functional in Customise, maps load normally without an extra click.
Categories — Analytics: included for honesty and future-proofing. No Google Analytics, no Meta pixel, no Hotjar, no session replay scripts run today. The toggle defaults off. Turning it on does not currently load extra scripts — there is nothing to load — but the category exists so the panel tells the truth if I add privacy-respecting stats later.
Google Maps disclosure: each page includes one embed centred on Queenstown at neighbourhood zoom, not my exact flat. Google's iframe may set its own cookies or read device data when functional consent allows loading. I do not control Google's processing. Read Google's privacy policy if you need vendor detail. If you prefer not to load maps, choose Reject all or leave Functional off.
How to change your mind: use Manage cookies below or the Customise path on the banner. The panel reopens with toggles reflecting saved state. Save overwrites the previous record immediately. Hard refresh after saving should keep your choice — if the banner returns, that is a bug and I want to know.
How to clear storage in your browser: open settings → privacy → cookies → search for penforge.life → remove sg_notes_consent. Also clear localStorage key cookie_consent_v1 for this site. Next visit will show the banner again as first visit.
Retention: about 180 days (six months). After expiry the banner may return. I will never claim forever storage.
Keyboard and motion: banner controls are reachable by keyboard with visible focus rings. Animations respect prefers-reduced-motion. The strip sits above the footer without blocking links permanently.
No hidden inputs: consent toggles are buttons with aria-pressed, not form fields. There is no POST, no send.php, no server handler.
Relationship to privacy: the long-form PDPA notice lives on /privacy.php. This page is the operational companion focused on cookies, maps, and controls.
Thread rule above the banner: on this site the cookie strip carries a red thread line in the design — a visual reminder that choices here connect to maps on every page. Functionally, the banner still behaves the same: your decision persists in sg_notes_consent and cookie_consent_v1.
Contact: [email protected] if something behaves wrongly — banner reappears every load, Load map fails, console errors. Include your browser name if you can.
Testing tip: after saving choices, open DevTools → Application → Cookies and confirm sg_notes_consent matches localStorage cookie_consent_v1. Mismatch indicates a bug worth reporting.
Banner text is written in my voice on purpose — short, plain, not legal theatre. The legal detail lives here where patient readers expect it.
First-visit behaviour: until you choose, maps stay hidden behind placeholders and analytics stays off. Essential banner memory still writes only after you interact — not before.
Safari private mode: if localStorage is blocked, the cookie alone still carries your choice until it expires. Both storage paths are attempted for reliability.
Last updated: 11 August 2026.
This is a personal blog. Everything here reflects my own experiences, opinions, memories and impressions. 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 end of the street — never as reporting. If I have got something wrong, please tell me and I will fix it.
Map hidden until you allow embedded content.