Half-lifted roller shutter on a Queenstown shopfront
10 · roller-shutter · 1000×700

Cookies and local storage

This page names what the site stores on your device and why. Buttons — not form fields — control consent toggles in the banner.

Essential storage keeps the site readable and remembers that you dismissed the banner. Functional storage holds map-related preferences when policy requires consent elsewhere; here maps display by default while flags still persist for consistency.

Analytics storage remains off unless you enable it. This build does not load separate analytics scripts even if enabled — the toggle prepares for future compatibility without silent tracking today.

Cookie name: sg_reader_consent. Format: URL-encoded JSON with keys essential, functional, analytics, v, ts. Max-Age roughly one hundred eighty days. Path /. SameSite Lax. Secure on HTTPS.

LocalStorage mirror: reader_consent_v1 with the same JSON shape for redundancy if cookies are blocked.

Reject all sets functional and analytics false while keeping essential true. Accept all sets functional true. Customise lets you mix flags then Save.

Manage cookies links appear in the footer and on this page via buttons carrying data-manage-cookies. Keyboard focus moves to Save when the panel opens.

Third-party cookies may originate from Google Maps iframes per Google policies. I do not control those names or durations. Consult Google privacy documentation for detail.

Clear cookies through browser settings to reset choices. The banner reappears on next visit until you decide again.

No social media pixels load here. No advertising networks load here. Font CDN requests are not cookies but are network calls you should know about.

Updates to this policy appear on this URL with a revised date. Material changes will not shrink your choices silently.

Email [email protected] with subject "cookie question" if something here disagrees with what you see in developer tools — I want discrepancies reported.

Session versus persistent: consent cookie persists across sessions until expiry. No session-only flash cookies appear in this build.

Button semantics: toggles use aria-pressed true or false rather than checkbox inputs because the template avoids form elements site-wide. Screen readers should announce state changes on click.

Reject interaction with maps: because body carries data-map-policy always, maps remain visible even if functional flag is false. Other deployments might hide maps; this build chooses visibility with documented policy.

Essential definition includes consent storage itself — without it the banner would loop every page load, which would annoy more than inform.

Functional definition includes preferences that affect embedded content behaviour on stricter builds. Here it still records choice for consistency if policy changes later.

Analytics definition reserved for counters or referrers. None load today even when toggled on — a honesty note so you know enabling does nothing yet.

Cookie banner copy uses first person singular to match site voice elsewhere. Legal pages still aim for clarity over poetry.

Cross-device behaviour: choices do not sync between phone and laptop. Each browser profile maintains its own consent record.

Private browsing: some modes discard cookies at exit. Expect banner return next visit — not a bug.

Developer inspection tip: Application tab lists sg_reader_consent under Cookies and reader_consent_v1 under Local Storage when set.

Updates log: 11 August 2026 initial publication aligned with site build date. Future edits bump the dateline at top.

Relationship to privacy page: privacy explains why; cookies explains names and mechanics. Read both if you audit.

No dark patterns: reject is as prominent as accept. Customise opens panel without nesting deceptive colour contrast.

Keyboard: Escape closes customise panel per main.js. Tab order flows through buttons in banner before panel controls.

Language: English only for cookie strings. Translators welcome to email suggestions; I implement manually.

Retention override: clearing cookies manually always wins over Max-Age if browser implements user action correctly.

Third-party audit: I occasionally re-test banner with devtools open. Document results inform DELIVERY-QA.txt notes.

Contact for enterprise scanners: automated compliance bots may email; human review still applies before changes.

Banner persistence: once accepted, banner hides until cookie expires or you clear storage. Reopen via footer manage link anytime.

Comparison to app trackers: native apps often embed opaque SDKs. This static site limits scripts to main.js plus map iframe plus font CSS.

Historical builds: earlier prototypes existed locally only and never collected public traffic. No legacy database lingers.

Honesty clause: if I discover undocumented storage later, I will patch this page before sleeping that night if possible.

Screen reader note: cookie panel buttons expose aria-pressed; test with NVDA or VoiceOver if unsure states read correctly.

Print stylesheet: printing cookies page may omit banner; choices still governed by live site when you return online.

Mobile Safari quirks: intelligent tracking prevention may partition storage sooner than desktop browsers; expect earlier banner return on some phones.

Cookie panel focus: Save button receives focus when panel opens to speed keyboard confirmation for low-vision users.

Queenstown neighbourhood — Tanglin Halt axis, westward glance.