Persistence¶
What it is¶
Void stores reader preferences and state in localStorage under the void-
prefix. Every key is per-browser, per-site, and never sent to a server.
This page documents every key, what it stores, and its default lifetime.
When to use it¶
Persistence is always on. The theme reads these keys on boot to restore the reader's previous state β color scheme, collapsed sidebar, scroll position, and so on. Understanding the keys helps with debugging and with clearing stale data.
How it works¶
All reads and writes go through storageGet(key) / storageSet(key, value),
which prepend void- to the key name. A few keys (like void-scroll-pos)
are written directly to localStorage for performance.
localStorage keys¶
| Key | Written by | What it stores | Lifetime |
|---|---|---|---|
void-color-scheme |
applyColorScheme() |
Current palette scheme ("default", "slate", β¦) |
Persistent |
void-session |
sessionMutate() |
JSON blob: { lastPage, lastAt, navCollapsed, search, search_history } |
Session |
void-scroll-pos |
saveCurrentScroll() |
pageURL β { y, x, at } scroll map |
Persistent |
void-ui-reading |
readingModeSet() |
Reading mode "1"/"0" |
Persistent (when reading_mode.persisted) |
void-ui-sidebar |
Sidebar toggle | Nav sidebar hidden "1"/"0" |
Persistent (when persisted) |
void-ui-toc |
TOC toggle | TOC hidden "1"/"0" |
Persistent (when persisted) |
void-ui-notes |
notesSetOpen() |
Notes panel open "1"/"0" |
Persistent |
void-notes |
notesAddComposer() |
JSON array of notes { id, url, text, note, color, ts } |
3 days (TTL) |
void-note-did-apply-<id> |
notesReapply() |
"1" flag: highlight applied for that note |
Persistent |
void-task.<path>.<n> |
Task list checkbox | "1"/"0" checkbox state |
Persistent |
void-tabs.<path>.<set> |
Tab switcher | Last active tab index per tabbed-set | Persistent |
void-focus-timer |
focusTimerRestore() |
{ remaining, running, updatedAt } timer session |
Persistent (when timer.persist) |
void-focus-timer-settings |
focusTimerApplySettings() |
Reader timer overrides { default_minutes, ... } |
Persistent |
void-consent |
Cookie consent | "accepted" / "declined" |
Persistent |
void-announcement-dismissed-<text> |
Announcement bar | "1" = dismissed for that exact text |
Persistent |
void-cache-repo-<owner>/<name> |
repoPopover |
{ ts, data } GitHub API cache |
1 hour (TTL) |
void-glass-intensity |
Glass restore | Glass intensity value β data-md-void-glass |
Persistent |
Session-only (inside void-session)¶
| Field | What it stores |
|---|---|
lastPage |
Last visited page URL |
lastAt |
Timestamp of last visit |
navCollapsed |
Array of collapsed sidebar section IDs |
search |
Last search query |
search_history |
Last 5 search queries |
Configuration¶
Most persistence is opt-in or opt-out per feature:
theme:
void:
reading_mode:
persisted: true # Remember reading mode (default true)
timer:
persist: true # Remember timer state (default true)
content:
task_lists:
persist_state: true # Remember checkbox states (default true)
keyboard:
shortcuts:
toggle_sidebar:
persisted: true # Remember sidebar state (default true)
toggle_toc:
persisted: true # Remember TOC state (default true)
notes_ttl: 259200000 # Notes retention in ms (default 3 days)
Under the hood¶
- File:
void.jsβstorageGet()/storageSet()(line ~16),sessionGet()/sessionMutate()(line ~72) - Prefix: all keys use
void-exceptvoid-scroll-pos(written directly) - TTL:
notesuses a 3-day TTL (259200000ms);repo-popoveruses a 1-hour TTL (3600000ms). Expired entries are removed on next read. - Scope: all keys are per-origin β changing
site_urlor deploying to a different domain starts fresh.
Accessibility notes¶
- Persistence is transparent β readers never see the stored data directly.
- Clearing site data (or specific
void-*keys) resets all state without breaking the site. - The notes TTL auto-purges old entries, so the store never grows unbounded.