What's shipped, version by version. Numbers bump by 0.01 with every change — see the footer for the current build.
v1.06
Sub-tabs are toggleable too
- Same hide/show mechanism as the per-game toggle, one level down: each game's sub-tabs (Normal/Nightmare/Hell, Story/Maps, Leveling/Endgame) can now be hidden individually. A small row of toggle buttons appears under each game's visibility toggle on the Class Art page, one per sub-tab that game has — Grim Dawn has none, so it gets no row.
- Same behavior as the game-level toggle: non-admins never see a hidden sub-tab's button at all; admin sees every sub-tab marked with 🚫 when hidden, so hidden work-in-progress content stays reachable while you're still building it.
- Handles the case where every sub-tab under a game gets hidden at once — falls back to the same clean "nothing here yet" message rather than the checklist showing content with no tab to reach it.
- Stored in the same
storyChecklistSettings doc as the game-level toggle, as a new hiddenSubtabs list — no new collection needed.
v1.05
Per-game visibility toggle for Story Checklist, controlled from Class Art
- Each game's section on the Class Art page now has a "Visible in Story Checklist" / "Hidden from Story Checklist" toggle button — flip it to hide that game's tab from everyone while you're still building it out, then flip it back when it's ready to go live.
- Non-admins never see a hidden game's tab at all — it's not just unclickable, it doesn't render. Admin still sees every game's tab (marked with 🚫 when hidden) so you can preview and keep working on hidden content without losing access to it.
- New
storyChecklistSettings collection — a single doc listing which games are currently hidden, public read (needed so the tab bar filters correctly for every visitor) but admin-only write.
- Edge case handled: if every game somehow ends up hidden at once, non-admins see a plain "nothing here yet" message instead of the checklist trying to render content for a game with no visible tab.
v1.04
Recovered items that could've gone invisible during the Hero Siege gap
- Between v1.02 and v1.03, Hero Siege briefly had no difficulty selector at all. Any item assigned to Hero Siege during that window would have saved with no difficulty value — and since the filter required an exact match to Normal/Nightmare/Hell, those items would show up under none of the three tabs once Hero Siege's difficulty tabs came back, without actually being deleted.
- Fixed at the source: any item whose stored difficulty is missing or isn't valid for its game now surfaces under that game's first sub-tab (Normal, for Hero Siege) instead of matching nothing. Nothing was deleted or silently reassigned — this only changes which tab an already-existing item shows up under.
- Worth double-checking: if any recovered item's difficulty isn't actually "Normal," it'll need a one-time edit-and-resave with the correct value picked — the fallback is a display recovery, not a guess at the real intended value.
v1.03
Game-specific sub-tabs (fixed Hero Siege regression)
- Fixed a regression from v1.02: Hero Siege lost its Normal/Nightmare/Hell tabs entirely, since that update only kept the difficulty layer for D2R. Restored — Hero Siege has Normal/Nightmare/Hell again.
- The sub-tab layer under each game is now genuinely per-game instead of one fixed list: D2R and Hero Siege keep Normal/Nightmare/Hell; POE 1, POE 2, and Last Epoch now get Story/Maps; Diablo 4 gets Leveling/Endgame. Grim Dawn still has no sub-layer at all (flat Act → Questline → Group), unchanged.
- Switching games now resets the sub-tab selection to a valid option for that game automatically, rather than potentially carrying over a value that doesn't exist there (e.g. "Normal" isn't a valid option under POE 1).
- Firestore rules updated to accept the new sub-tab values (Story, Maps, Leveling, Endgame) alongside the original three.
v1.02
Story Checklist: added a Game layer above Difficulty
- New top-level Game tabs (POE 1, POE 2, D2R, Diablo 4, Last Epoch, Grim Dawn, Hero Siege) sitting above the existing Normal/Nightmare/Hell difficulty tabs — same visual style as Compendium's game tabs. Difficulty tabs now only show up for D2R, since that's the only game that actually has that concept; other games skip straight to Act → Questline → Group.
- Nothing was auto-reassigned. Every existing checklist item (all built under Normal/Nightmare/Hell before this update) keeps its difficulty exactly as it was, and now lives under an admin-only "Unassigned" tab — visible only to the admin, and only for as long as any items actually lack a game. Opening an item there for editing forces a real game to be picked from the dropdown before it can be saved; nothing moves until someone deliberately does that, one item at a time.
- Firestore rules updated: both
game and difficulty are now optional on checklist items (previously difficulty was required) — needed so items belonging to non-D2R games can validate without a difficulty value.
v1.01
Story Checklist visual overhaul
- Restyled to read more like a dense app tool — inspired by how ExileCompass's campaign checklist looks — using Kaoz Emporium's own theme (colors, fonts, shadows) rather than copying its look.
- Acts are now bordered, shadowed card blocks instead of plain headings, with a new aggregate progress badge (e.g. "12/68") in the act header — previously only questlines showed a progress count, not the act as a whole.
- Questline blocks got a distinct nested card treatment (background + border) instead of a plain centered header borrowed from the unrelated External Tools page's styling — item rows are now bordered pill-style rows with a clear hover state and a subtle "checked" tint, instead of flat unstyled rows.
- The difficulty tabs and profile selector now sit inside one bordered toolbar strip instead of floating as two separate rows.
- All changes scoped specifically to Story Checklist's own CSS classes — the shared base styles it had been borrowing from the External Tools page are untouched, so that page's look isn't affected.
v1.00
Story Checklist: acts default to collapsed
- Acts now start minimized until expanded; questlines still default open underneath them. Same per-browser preference as before, just scoped to the act level specifically rather than everything.
v0.99
Story Checklist: group reordering + collapsible sections
- Groups now have an explicit order (same as acts and questlines already did) with their own ▲/▼ arrows, since there was no way to reorder them before — they were just sorting alphabetically.
- Both Act headings and Questline titles are now collapsible — click either to fold it shut. A collapsed questline still shows its progress badge; a collapsed act still shows its own reorder arrows. Collapse state is saved per-browser (it's a viewing preference, not progress, so it doesn't need to follow your account).
v0.98
Story Checklist: added a Questline/Group tier
- Restructured from a flat Act → Item list into Act → Questline → optional Group → Item. "Act" is now a real dropdown (with "+ Add new act") instead of free text, and each level cascades into the next — picking an act scopes the questline options to it, picking a questline scopes the group options to it.
- Groups are optional: items with no group render as a flat list at the top of their questline; items sharing a group name cluster together underneath a small sub-label. This is how "Coffee Beans" + "Turn in Quest" can sit together while "Bricks" gets its own cluster, all still under one "Sarcaster Questline" section.
- The admin form's Act/Questline/Group selections stay sticky after each save, so adding several items to the same spot in a row doesn't require reselecting every field each time.
- Reordering now works at three levels: whole acts, questlines within an act, and items within their group — each via the same ▲/▼ pattern as External Tools.
- Firestore rules:
storyChecklistItems now requires questline and allows an optional group field.
v0.97
Story Checklist (Hero Siege)
- New "Story Checklist" page — Grimtools-style: Normal/Nightmare/Hell difficulty tabs, items grouped by act with a per-act "x/y" progress badge, checkboxes to mark completion.
- Admin builds the actual list through a form at the bottom of the page (difficulty, act, item name, optional notes) — same "admin types it in" pattern as External Tools, including ▲/▼ reordering for both acts and individual items.
- Progress is per signed-in account and per "character profile" — create as many named profiles as you want (e.g. one per character or season), switch between them from a dropdown, rename or delete any of them.
- "Reset" clears a profile's checked items, but asks first whether to save its current progress as a new backup profile (named "<profile> (backup <date>)") so resetting to start fresh doesn't erase the record of how far that character got — it just gets tucked away as its own profile you can switch back to.
- Firestore rules: new
storyChecklistItems (public read, admin write) and storyChecklistProfiles (each user can only read/write their own) collections.
v0.96
External Tools: manual reordering
- Both categories and tools within a category now sort by an explicit order once touched — ▲/▼ arrows on each category header (admin only) reorder categories, and matching arrows in each card's admin action row reorder tools within their category. Untouched items keep sorting by creation date, same as before, until moved.
- Firestore rules: both
externalToolCategories and externalTools now allow the new optional order field.
v0.95
Admin Mode toggle moved to Account page
- Moved the "Admin Mode" pill out of the header and into the Account page, on the right side of the name/email/role row — a quieter spot than sitting in the main nav on every page.
v0.94
Site-wide Admin Mode toggle
- New "Admin Mode: On/Off" pill next to the profile widget (visible only to the admin account). Turning it off hides every admin-only panel, form, and button across the site — Subscribed Calendars, Pending Approval queue, Class Art (nav entry and the page itself), External Tools' admin form and per-card Edit/Remove, League Countdown's add form and delete buttons, News/Guides "+ New" toolbar buttons and their admin action bars, Archive/Feature links on Compendium and BEYOND THE VAULT cards, and the admin-granted Edit button on build/entry detail views for things you didn't create yourself.
- This only hides UI chrome — actual write permissions (Firestore rules, and the JS guard clauses that check real admin status before saving/deleting) are untouched, so nothing about what's actually allowed changes; it's purely about not seeing admin controls while browsing normally.
- Persisted per-browser via localStorage, defaulting to on (today's behavior) until toggled off.
v0.93
External Tools: removed page title/intro
- Dropped the "External Tools" heading and intro paragraph — the game tabs sit at the top with just the categories and cards below.
v0.92
External Tools: layout polish
- Game tabs were using the wrong container class (
.section-tabs, styled as pill buttons) instead of the Compendium's actual .game-tabs — plain uppercase text with a single underline beneath the whole row. Switched to the real class so it matches exactly.
- Reordered the page: game tabs (with their underline) now come first, with the "External Tools" title and its intro paragraph below that line, rather than above it.
- Centered the page title, intro paragraph, and every category title/subtitle.
v0.91
External Tools: game toggle
- Added the same game tabs used on the Compendium (POE 1/2, D2R, Diablo 4, Last Epoch, Grim Dawn, Hero Siege) to the top of External Tools. Each tool now has a Game field in the admin form; picking "General (all games)" makes a tool show up regardless of which game tab is active — for things like Discord or a cross-game wiki hub that aren't tied to one game.
- Selecting a specific game filters both the category grouping and the cards to just that game's (plus General) tools. Cards show a small gold game-name chip alongside their other tags when a game is set.
- Firestore rules:
externalTools now allows the new optional game field.
v0.90
External Tools: real categories, redesigned admin form
- Categories are now their own thing (a new
externalToolCategories collection) instead of free text retyped per tool — pick one from a dropdown, or choose "+ Add new category" to create one. Each category can carry its own description, shown under its title on the page.
- Category titles on the page are now sized and weighted to actually read as section titles, with a divider underneath, rather than a small label.
- Admin form reordered top to bottom: icon (image or emoji), category dropdown, category description, tool name — all centered — then link, tags, and description as normal full-width fields below.
- Firestore rules: new
externalToolCategories collection — public read, admin-only write.
v0.89
External Tools: icon uploads, layout fix, admin form moved
- Fixed a real layout bug, not a styling one: the
.wrap container that gives every page its max-width and padding was closing right after the Changelog view, so Class Art and External Tools were both rendering completely outside it — full-bleed, edge to edge. Moved the closing tag to after both, same category of bug as the earlier Account page fix.
- Admin can now upload a small image per tool as its icon (resized client-side, same pattern as Class Art) instead of only typing an emoji — the emoji field still works as a fallback if no image is uploaded.
- The admin add/edit form now sits below the tool cards instead of above them, so the page reads content-first.
- Firestore rules:
externalTools now allows the new iconImageDataUrl field.
v0.88
HS Interactive Map → External Tools directory
- The single-tool landing page is now a general, admin-managed link directory — "External Tools" in the menu. Admin gets a form (category, icon, name, URL, description, tags) to add/edit/remove entries directly from the page itself; any category name typed in creates or joins that group, so it grows without needing another code change.
- Tools are grouped into cards by category (sorted by whichever category was populated first), each showing an icon, name with an external-link arrow, description, and optional tag chips — styled to match Kaoz Emporium rather than any source site's own look.
- Parazeya's HS Interactive Map isn't pre-seeded anymore — it's just the first entry to add back in through the new form, same as any other tool.
- Firestore rules: new
externalTools collection — public read, admin-only write (same pattern as Subscribed Calendars and Class Art).
v0.87
Hamburger menu: grouped into three sections
- Reordered and grouped the menu into three sections with dividers: Dashboard/News/Calendar at the top (day-to-day/at-a-glance items), then a "Browse" group for Compendium/BEYOND THE VAULT/Emporium Guides (the actual content sections), then "Tools & Info" for HS Interactive Map/Changelog/Class Art — continuing the grouping started when HS Interactive Map got its own divider.
v0.86
HS Interactive Map: menu grouping
- It was sitting flat in the hamburger menu alongside core site sections (Dashboard, Compendium, etc.), which made a single-game link-out tool look like a peer to major parts of the site. Added a "Tools & Info" divider above it, grouping it with Changelog instead — both are secondary/meta entries rather than core content sections.
- Also gave external-link menu items (currently just HS Interactive Map) a small ↗ indicator and slightly muted styling, so it visually reads as "leaves the site" before you click it, not just in the landing page's own disclosure text.
v0.85
Subscribed calendars: upload instead of live fetch
- Turned out the underlying problem wasn't a flaky proxy — aRPG Timeline blocks requests coming from proxy/datacenter IPs (consistent failures through several different CORS proxies, while loading fine in a real browser). No proxy-based approach was ever going to be reliable against that, so live fetching is gone.
- Replaced with a direct upload: admin downloads the .ics file from the source and uploads it here. It's parsed entirely client-side (a local file read, not a network request) and the parsed events are stored in Firestore, so every visitor's calendar reads them directly — no fetch, no proxy, nothing that can time out or get blocked.
- "Refresh now" is now "Replace file" — re-upload whenever the source schedule changes. This is no longer a live sync, by design.
v0.84
Subscribed calendar feeds: proxy fallback
- External calendar subscriptions (e.g. aRPG Timeline feeds) were timing out on every fetch — the free CORS proxy they relied on (allorigins.win) had started stalling with no code change on our end. Fetching now tries a short chain of CORS proxies in order and falls through to the next one on timeout/failure, instead of depending on a single point of failure.
- A proxy returning HTTP 200 with an empty or non-ICS response (e.g. an interstitial page) is now treated as a failed attempt too, so it doesn't get cached as a false "0 events" — the next proxy in the chain gets a shot instead.
- Per-attempt timeout raised slightly (15s → 20s) to give a slow-but-alive proxy a bit more room before giving up on it.
v0.83
HS Interactive Map
- New hamburger menu entry — "HS Interactive Map" — linking out to Parazeya's community-built Hero Siege map (zone-by-zone drops on hover, plus a full item codex), hosted on its own site. It's an independent tool, not part of Kaoz Emporium's codebase, so this is a styled landing page with an "Open" button rather than an embedded page.
- Landing page lives at its own view (?view=hsmap) — a hero section, a stylized zone-route graphic, four feature callouts, and links to both the live tool and its GitHub source, with a small disclosure that it opens an independent site in a new tab.
v0.82
Shareable links now reflect Compendium section
- Shareable Compendium links always used /build/ regardless of section. They now match the entry's actual section: /build/ for Builds, /tool/ for Tools, /compendium-guide/ for Compendium's internal Guides section (kept distinct from /guide/, which belongs to the separate top-level Guides page).
- Old /build/ links for Tools/Guides entries that were already shared will still work — routing accepts all three prefixes for the underlying builds collection.
v0.81
Edit button on build detail + wider creation form
- Opening a build now shows an "✎ Edit" button to the left of Share, visible only to that build's owner (or the admin) — click it to jump straight into editing without hunting for the pencil icon on the card.
- The New/Edit Entry form (Compendium builds) now opens at the same width as the detail view (1400px) instead of the narrow default modal width, so there's more room to work with — the form has grown a fair bit (Build Link, filters, notes editor, etc.) since the compact width was originally set.
v0.80
Fixed cover art getting cropped at the top
- Cover images (cards, dashboard tiles, and the detail view banner) were center-cropping, which cut off the top of tall portrait-style images like standing character art — the head/upper body was getting sliced off. Cropping now anchors to the top of the image instead of the center, so any cropping happens at the bottom rather than the top. Also bumped card and dashboard tile heights up slightly for more breathing room.
v0.79
Class Art admin page
- New admin-only "Class Art" page (hamburger menu, visible to the admin account only) for uploading Menu Portrait and Card Art images per class, organized in sections by game. Images are stored directly in Firestore — no external hosting needed.
- Menu Portrait shows in the build form when picking a class (same spot the earlier hardcoded CLASS_IMAGES preview used). Card Art is used as fallback cover art on a build's grid card and detail view, same as CLASS_CARD_IMAGES before it, but only when no manual cover was uploaded and no link-preview image was found.
- Both now work for every game, not just Hero Siege — since it's admin-uploaded rather than code-edited, there's no reason to gate it by game anymore.
- The old hardcoded CLASS_IMAGES/CLASS_CARD_IMAGES objects stay in place as a fallback for anyone who was filling them in directly in code, but the admin page is the source of truth going forward.
- New classArt Firestore collection — public read, admin-only write, validated in firestore.rules.
v0.78
Class fallback art for build cover images (Hero Siege)
- New CLASS_CARD_IMAGES mapping (separate from the form-preview CLASS_IMAGES) supplies fallback cover art for a build's grid card and detail view banner, used only when no manual cover was uploaded and no link-preview image was found. Hero Siege only for now — extend to other games later by filling in more entries in the same shape.
v0.77
Class portrait auto-select on the build form
- Selecting a class now shows a matching portrait automatically, if one's been mapped for it. Portraits aren't included — this ships as an empty CLASS_IMAGES config (per game, per class) that gets filled in with self-hosted image URLs. Classes without a mapped image just show no preview, nothing breaks.
v0.76
Build Link copy button moved to the left
- The Copy button next to a build's Build Link now sits to the left of the link text instead of the right.
v0.75
Renamed "Build Guide Link" to "Build Link"
- The optional link field on Compendium builds — shown at the top of the detail view with a one-click Copy button — is now labeled "Build Link".
v0.74
Reordered Dashboard sections
- New Dashboard order: Featured Guide, League Countdown, Recently Viewed, Upcoming Events, Latest News, New Guides, Trending Guides, Favorites, Continue Reading.
v0.73
Share button grouped next to Close on every detail view
- Share and Close were being spread evenly across the header (a 3-way space-between), which pushed Share toward the middle instead of next to Close. Both buttons are now grouped together on the far right with a bit of breathing room between them, across Compendium, BEYOND THE VAULT, Guides, and News.
v0.72
Guides & News close button moved to the far right
- The flexible header layout that pushes Compendium/BTV's Share and Close buttons to the far right of the detail view now applies to Guides and News too — they were missing this layout rule after the width fix in v0.71.
v0.71
Guides & News detail views now match Compendium's width
- Opening a guide or news post was capped at a much narrower 780px modal than Compendium/BTV's 1400px. Both now open at the same width.
v0.70
Fixed background flicker behind an open shared-link detail view
- Opening a build, BTV entry, guide, or news post bumps its view count, which was re-triggering the shareable-link router on every resulting Firestore update — causing it to keep re-opening the same detail view and re-render the grid behind it. The router now skips re-opening a detail view that's already open.
v0.69
Shareable links for Compendium, BEYOND THE VAULT, Guides & News
- Every build, BTV entry, guide, and news post now gets a clean, permanent URL (e.g. /build/my-cool-build) generated from its title, with automatic de-duplication if two entries share a title.
- A new 🔗 share button on each detail view copies that link to your clipboard.
- Opening a shared link now deep-links straight into the right detail view, and the browser's Back button correctly closes it. Older entries saved before this update fall back to their raw Firestore ID until they're next edited.
v0.68
Moved Game/Series filters above the search bar
- BEYOND THE VAULT page order is now: game tabs → Game/Series filter chips → search bar → Generation/Era filter chips → grid. Generation/Era stays below the search bar; only Game/Series moved.
v0.67
BEYOND THE VAULT's filter chip rows split onto two lines
- Game/Series and Generation/Era filter chips (the clickable ones above the grid, for browsing/filtering — not the entry form) now render on two separate lines instead of one shared row, so the two dimensions read as clearly distinct groups.
- Either row collapses cleanly instead of leaving a blank gap if that dimension has no values yet (e.g. before anyone's set a Generation/Era on any entry).
v0.66
Multi-filters (Compendium) + structured 2-filter system (BEYOND THE VAULT)
- Compendium: the Filter field is now multi-select — up to 10 custom filters per entry, shown as removable chips with a dropdown (including "+ New Filter") to add more. Existing single-filter data still works unchanged; filtering/chip-row display needed no changes since they already read from an array.
- BEYOND THE VAULT: different design here — two dedicated, structured filter fields instead of a generic multi-select: Game/Series and Generation/Era, separated by a divider line on the entry form. Both support picking an existing value or typing a custom one, same dropdown-with-custom pattern used elsewhere. Capped at exactly one value per field (2 filters total per entry), not a growable list — this is a different shape on purpose, matched to how collectors actually categorize entries across a franchise's generations/eras.
- Both new BEYOND THE VAULT filters show as chips on cards and in the detail view, and both have their own clickable filter-chip row for browsing (single-select per dimension — click a chip to filter to it, click again to clear, same toggle pattern as the game tabs).
- Firestore rules updated on both sides: Compendium's tags list validated up to 10 entries; BEYOND THE VAULT's entries validate the two new optional string fields instead of a tags array.
v0.65
Compendium's game tabs: All is the default now too
- Unlike the other toggle conversions so far, Compendium's game tabs (POE 1, POE 2, D2R, etc.) never had an "All" state at all — exactly one game was always active, with no way to browse everything at once. Now it works the same as everywhere else: no game selected shows every entry across all games, click a game to filter to it, click it again to turn it off and go back to "All."
- Selecting a game still resets the section filter (Builds/Tools/Guides) back to "All," same as before — avoids landing on a confusing "no results" state when switching games while a specific section was filtered.
v0.64
Removed "All" from BEYOND THE VAULT's game tabs
- Same treatment as Compendium's section tabs back in v0.56, applied to BEYOND THE VAULT's game tabs: no more "All" button — the individual game tabs are toggles now. Click one to filter, click it again to turn it off and go back to seeing everything (the implicit default). This one had been missed when the rest of the app got that treatment.
v0.63
Fixed hamburger menu hover color
- Hovering a hamburger menu item was turning it plain off-white regardless of accent color — hardcoded to
var(--ink) instead of the theme accent. Now hovers to the actual selected accent color, matching every other themed control.
- Same hardcoded-to-white pattern exists on a few sibling nav controls (game tabs, section tabs, Main/Favorites/Archived sub-tabs) — not touched here since only the hamburger menu was reported, but worth a follow-up pass if you want that consistent everywhere too.
v0.62
Removed the Features panel
- The "Changelog & Features" page is now just "Changelog" — removed the Features tab, its content, and the tab-switching UI (no reason to keep a two-tab toggle around for a single remaining tab).
- Renamed the hamburger menu entry from "Changelog & Features" to "Changelog" to match.
- Cleaned up the now-unused CSS that only existed for the Features panel (tab buttons, feature cards, status pills, the comparison table) rather than leaving dead styles behind.
v0.61
Consistent Spacing, Shadows, Hover Effects & Animations
- The last two Premium Polish items, done together since they overlap heavily (shadows are part of the hover treatment).
- New shared shadow scale (three levels: resting, hover, modal) applied consistently across every card type — Compendium/BEYOND THE VAULT cards, Guide/News cards, Dashboard mini-cards, the Featured Guide card, Account stat cards, and modals. Before this, four different card types each had their own ad hoc hover treatment — one had lift+shadow, one had lift-only, one had border-color-only, one just faded opacity. All four now match.
- Modals had no shadow at all before — flat panels floating with nothing to visually lift them off the page. Now have a proper shadow plus a subtle pop-in animation when they open.
- Every card type gets a soft fade-in when it first renders, instead of appearing instantly.
- Fixed a real bug found along the way: the primary button's hover state was hardcoded to brighten toward a specific green, regardless of which of the 10 accent colors is actually selected — so hovering it on a Purple/Blue/Red/etc. theme would flash green. Now brightens whatever color is actually active.
- Account page sections were using a hardcoded spacing value instead of the same spacing variable the Dashboard's sections use — now shares the same value, so the vertical rhythm matches between the two.
v0.60
Beautiful Empty States
- Every "nothing here" screen across the app now follows one consistent design: an icon, a clear heading, and a helpful line of context — instead of a single flat sentence with no visual hierarchy, inconsistent between views.
- Covers every grid empty state (Compendium, BEYOND THE VAULT, News, Guides, Account) — sign-in prompts, empty favorites/archived, no-results-from-filter, and completely-empty-collection states, each with copy specific to what's actually going on rather than a generic message.
- Dashboard's smaller inline empty states (rails, Calendar, League Countdown, Latest News, Subscribed Calendars) got a lighter matching touch — a small icon prefix, keeping them compact for their inline/rail context rather than the full treatment the main grids get.
v0.59
Skeleton loading placeholders
- Fixed a real, previously-shipping bug: on every page load, the Compendium/BEYOND THE VAULT/News/Guides grids briefly showed "nothing here yet" style messages — not because they were actually empty, but because Firestore hadn't responded yet. Data starting as an empty array looked identical to genuinely-empty data, so the app couldn't tell the difference.
- Added a loading-state flag per collection, set true on that collection's first Firestore response. Until then, grids show pulsing skeleton placeholder cards instead of a misleading empty-state message. Once data arrives, real content (or a real, accurate empty state) replaces it.
- Covers all four main grids (Compendium, BEYOND THE VAULT, News, Guides) plus the Dashboard's entry-derived rails (Recently Viewed, Continue Reading, Favorites, Featured Guide, Trending Guides, New Guides) and the Account page's Recently Added Favorites.
- If Firebase isn't configured at all, the loading flag is set immediately rather than waiting forever — otherwise a page with no database connection would show pulsing skeletons permanently instead of ever settling into an empty/error state.
v0.58
Reordered hamburger menu
- Moved Calendar below News in the hamburger menu. New order: Dashboard, Compendium, BEYOND THE VAULT, Emporium Guides, News, Calendar, Changelog & Features.
v0.57
Centered Favorites/Archived and tag filter chips
- Favorites/Archived sub-tabs are now centered, on both Compendium and BEYOND THE VAULT — same shared CSS class, so both picked it up at once.
- Tag filter chip rows (#Endgame, #Leveling, and any custom ones, plus BEYOND THE VAULT's own filters) are now centered too — covers Compendium's main filter row, the separate one shown on the Favorites tab, and BEYOND THE VAULT's, since all three share the same class.
v0.56
All/Main are now default states, not buttons
- Compendium: removed the "All" button from the section tabs. Builds/Tools/Guides are now toggles — click one to filter to it, click the same one again to turn it off and return to showing everything (the new implicit default).
- Compendium and BEYOND THE VAULT: removed the "Main" sub-tab button. Favorites and Archived are the toggles now — click to switch to that view, click the active one again to return to Main. Same behavior on both sections.
- Direct links (?view=favorites, ?view=archived, etc.) and the hamburger menu's Compendium/BEYOND THE VAULT entries are unaffected — this only changes the tab-click interaction, not how the views themselves work.
v0.55
Centered game/section tabs
- Compendium: the game tabs (POE 1, POE 2, D2R, D4, LE, GD, HS) and the section tabs (All/Builds/Tools/Guides) are now centered. The Main/Favorites/Archived sub-tabs above them stay left-aligned, unchanged.
- BEYOND THE VAULT's game tabs are centered too, same change — it shares the exact same CSS class as Compendium's, so this applied automatically.
- News's category tabs share the same underlying class as Compendium's section tabs but were deliberately left alone — scoped the centering specifically to Compendium's row rather than the shared class, so News stays left-aligned as before.
v0.54
Paste/upload images into News posts too
- Same feature as v0.53, extended to the News post body: paste an image straight from the clipboard, or click "+ Insert images" for multiple files at once. Same compression, same 50-image / ~700KB budget, same live counter.
- Had to fix a real conflict to make this safe: News posts already had their own 150,000-character body limit (from v0.32/v0.33) — but embedded images are base64 text living inside that same body field, and the ~700KB image budget alone is well past that old limit. Left as-is, saving would've started failing after just 2-3 images with a confusing "too long" error. Raised the body limit (both the client-side counter/guard and the Firestore rule itself — the rule needed updating too, or Firestore would've silently rejected saves the client thought were fine) to 850,000 characters, comfortably covering the full image budget plus a generous amount of text on top.
v0.53
Paste/upload images into Notes (Compendium + BTV)
- Both the Compendium and BEYOND THE VAULT entry forms can now have images added directly to Notes: paste an image straight from the clipboard into the field, or click "+ Insert images" to pick multiple files at once. Each one gets compressed and inserted as Markdown, rendering inline wherever the notes show up (the editor's Preview tab, and the entry's detail view).
- Important, worth understanding: "up to 50 images" isn't achievable for real photos, and this is a hard platform limit, not a choice — Firestore caps an entire document at 1MiB, covering every field, not just Notes. Even with fairly aggressive compression, that's realistically single-digit-to-low-teens full photos before hitting the ceiling. To keep saves from failing with a cryptic error partway through, there's a live counter under Notes tracking both image count (up to 50) and total embedded size (~700KB budget) — whichever limit is hit first stops further additions with a clear message, rather than letting the save itself fail.
- No Firestore rules changes needed — the
notes field was already unrestricted by size in the rules for both collections; the only real ceiling is Firestore's own document-size cap, which rules can't override.
v0.52
Fixed the actual cause of overflowing tile text
- v0.51's line-clamp fix contained normal text, but missed the real culprit for the specific case reported:
guideExcerpt() stripped most Markdown syntax but not = characters — so a post using a setext-style header (Title on one line, a row of ===== underneath) leaked that whole unbroken ===== run straight into the excerpt.
- Now strips setext header underlines and horizontal-rule lines (
---, ***, ___) as whole lines before the general character cleanup, so this kind of raw Markdown artifact can't end up in a card excerpt again.
- Also added a pixel-based
max-height as a fallback on the excerpt style, in case line-clamp itself ever doesn't apply for some reason — belt and suspenders.
v0.51
Fixed text overflowing News/Guide tiles
- The excerpt text on News and Guide cards (they share the same tile styling) had no truncation at all — a long post, or a long unbroken string like a URL with no spaces to wrap at, could spill past the tile's edges instead of being contained.
- Excerpt now clamps to 3 lines with an ellipsis, and long unbroken words now wrap instead of forcing the tile wider or overflowing it. Same fix applied defensively to the card title for the same reason.
v0.50
Dark Grey and Light Grey modes
- Two new Mode options alongside the existing Dark and Light: Dark Grey (a neutral mid-dark grey, less near-black/green-tinted than default Dark) and Light Grey (a genuinely all-grey light theme — no pure-white surfaces like default Light has).
- Same picker, same spot (Account page → Appearance → Mode), now 4 buttons instead of 2. Persists and applies instantly like the others.
v0.49
Accent color: 5 swatches → 10
- Added 5 more accent color presets — Orange, Pink, Teal, Cyan, Indigo — alongside the original Green, Purple, Blue, Red, Yellow. Same picker, same behavior (Account page → Appearance → Accent Color), just more options.
v0.48
Appearance settings on the Account page
- New "Appearance" section on the Account page: Mode (Dark/Light), Accent Color (the pre-existing green/purple/blue/red/yellow swatches, relocated here), Density (Expanded/Compact), and Text Size (Small/Default/Large/Extra Large).
- Light mode uses a lighter grey palette, not stark white, to match the existing earthy dark-theme feel.
- Density tightens page margins and the gap between Dashboard sections — deliberately scoped to those two spots rather than every element, to avoid destabilizing more delicate layouts like the card cover-image bleed math or the calendar grid.
- Text Size uses whole-page zoom rather than resizing individual elements, since the stylesheet uses fixed px everywhere rather than rem/em — zoom gets the real effect without needing to touch hundreds of rules.
- All four preferences persist per-browser via localStorage and apply immediately, plus early on page load so there's no flash of default appearance.
- Deliberately built inside the Account page rather than as a separate top-level Settings destination, per direction.
v0.47
Account Statistics cleanup
- Renamed the "Favorites" stat on the Account page to "Favorited Guides" for clarity.
- Removed the "Reading Time isn't tracked yet" note — decided not to build reading-time tracking at all, so it's off the page and off the roadmap rather than sitting there as a placeholder.
v0.46
League Countdown moved to the top
- Moved League Countdown from the bottom of the Dashboard (where it landed in v0.34) to the very top, above Recently Viewed.
v0.45
Custom filters everywhere, custom games on BEYOND THE VAULT
- New reusable pattern: a dropdown listing every value currently in use, plus a "+ New ___" option that reveals a text box for typing a custom one.
- Compendium's Tag field (renamed "Filter") now uses this — no more fixed 3-option vocabulary (Leveling/Endgame/Speed Leveling still there since they're in use, but anyone can add more). The filter-chip row above the grid needed zero changes — it already read whatever tag values exist in the actual data.
- BEYOND THE VAULT's Game field switched from a free-text input to this same dropdown pattern. Its Filter field is brand new — didn't exist before — with its own filter-chip row, same as Compendium's.
- Deliberately NOT applied to Compendium's Game field — that one stays a fixed dropdown, no custom games, by design.
- Firestore rules updated to match: Compendium's tag validation loosened from a hard-coded enum to any reasonable string; BEYOND THE VAULT's entries now validate an optional
tags field the same way.
v0.44
BEYOND THE VAULT section
- New "BEYOND THE VAULT" page (Menu → BEYOND THE VAULT) — a Compendium-style catalog for entries outside the aRPG lineup, backed by its own database collection so it's fully independent of the Compendium's builds.
- Same Main / Favorites / Archived sub-tabs as the Compendium, but the game tabs aren't a fixed list — the editor's Game field is free text, and typing in a new game and saving an entry adds its tab automatically. Existing game names autocomplete as you type.
- Skips the Compendium's class/mastery fields, Builds/Tools/Guides sections, and tags, since those are aRPG-build-specific — entries here are just title, link, game, notes, cover image, and public/private visibility.
- Full CRUD (add/edit/delete for the owner or admin), admin archive/feature, per-user favoriting, and a view counter, same as the Compendium — favorites are stored separately from Compendium favorites so the two don't mix.
v0.43
Account access consolidated to the profile button
- Clicking the profile trigger (top-right, next to Menu) now goes straight to the Account page instead of opening the small profile popup — that popup is gone entirely.
- Change photo, change username, and the accent-color theme picker — previously only in that popup — now live directly on the Account page's Profile section, along with a Resend-verification button when the account isn't verified yet, and a Log out button at the bottom of the page.
- Removed "Account" from the hamburger menu since the profile button now covers that — one clear entry point instead of two paths to the same place.
v0.42
Fixed Account page edge-to-edge bug
- The Account page's container div had landed outside the
.wrap element that gives every other view its page padding and max-width — so it was rendering completely full-bleed, content touching both screen edges with no inset. Moved it back inside .wrap, alongside the other views, where it belongs.
v0.41
Account page
- New "Account" entry in the hamburger menu — a real page (Profile / Statistics / Activity) instead of the small profile popup being the only place to see your own info.
- Profile: username, email, join date (Firebase Auth's own account-creation timestamp), role (Admin/Member).
- Statistics: Favorites count, Recently Viewed count, Favorite Game (most common game among your favorited entries). Reading Time is intentionally left off — it isn't tracked anywhere, so no fake number.
- Activity: Last Login (also native to Firebase Auth) plus a "Recently Added Favorites" rail.
- Avatar/username editing still happens through the existing profile popup — "Edit profile" opens that same popup rather than duplicating the form.
v0.40
Calendar feed is live
- The "Subscribe to this calendar" box is now live on the Calendar page, pointing at the deployed feed.
v0.39
Shareable calendar link (webcal/ICS export)
- Added a "Subscribe to this calendar" box on the Calendar page with a real, always-fresh link anyone can add to Google/Apple/Outlook, or drop in Discord as a plain link (Discord doesn't embed live calendars — it'll just show as a clickable link, but stays in sync for whoever opens it).
- This required an actual server endpoint — calendar apps poll a URL expecting live data back, which nothing purely client-side can serve. Rather than a paid Cloud Function, this runs as a free scheduled GitHub Action (every 30 min) that reads Firestore, fetches the admin's Subscribed Calendars server-side, generates the .ics file (recurring events as proper repeating entries), and publishes it via GitHub Pages — no Firebase billing plan required.
- The share box stays hidden until
CALENDAR_FEED_URL near the top of the script is set to the deployed feed's URL.
- No Firestore rules changes needed — Firestore is read via a service account, which bypasses security rules entirely (same principle as a Cloud Function would've used, just running on GitHub's infrastructure instead of Google's).
v0.38
Moved Subscribed Calendars panel
- The "Subscribed Calendars" admin panel now sits below the calendar grid instead of above it, so the top of the page stays clean and focused on the calendar itself — for admins too. The Pending Approval queue stays at the top since it needs active attention.
- Gave it a calmer, muted-border card style distinct from the gold-bordered Pending Approval panel, since this one's just routine config, not something needing action.
v0.37
Subscribe to external calendars (aRPG Timeline)
- Admin can now paste in a calendar-subscribe URL (e.g. an aRPG Timeline league/season feed) from a new "Subscribed Calendars" panel on the Calendar page. The app fetches and parses the .ics feed and merges its events straight into the Calendar grid, day pop-up, and Dashboard, marked with a 🌐 icon.
- Subscribed events are read-only (no RSVP, edit, or approval — they're not managed here), but reminders still work on them since those only need a date/time.
- Feeds are cached for 12 hours per subscription to be considerate of whoever's hosting them (small sites, real bandwidth cost) — a "Refresh now" button forces an update.
- Known limitation: the parser handles the common case of one dated entry per event (what season-announcement feeds like this actually look like) but doesn't expand RRULE-based recurrence rules — if a feed used those instead, only the rule's literal first date would show.
v0.36
Favorites & Archived folded into Compendium
- Favorites and Archived are no longer separate top-level menu items. They're now sub-tabs (Main / Favorites / Archived) inside the Compendium page itself, right above the game tabs.
- Purely a navigation change — same underlying data, filters, and grid as before. Direct links (?view=favorites, ?view=archived) still work exactly as before.
v0.35
Recurring events + reminders
- Events can now repeat: Daily, Weekly, Every 2 weeks, or Monthly, with an optional end date. Recurring occurrences are generated client-side (capped at ~6 months out if no end date is set) and show up throughout the Calendar grid, the day pop-up, and the Dashboard's Upcoming Events tiles, marked with a ↻ icon.
- Editing or deleting a recurring event acts on the whole series, not a single date — deletion warns you about this before it happens.
- RSVPs ("I'm going") are shared across every occurrence of a series rather than tracked per-date — a simplification worth knowing about, not a bug.
- Added event reminders: a "🔔 Remind me" control on any event with a time set (15 min / 1 hour / 1 day / at start), backed by this browser's local storage. Fires both a browser notification (if permission is granted) and an in-app banner.
- Important limitation: reminders only fire while this app is open in a tab on your device — there's no server component sending real push notifications, so nothing happens if the tab or app is closed. The UI says this directly next to the reminder control.
v0.34
Uniform calendar grid
- Calendar day cells were using min-height, so a day with several events could grow taller and stretch its entire row uneven with the rest of the month. Cells are now a fixed height with overflow clipped, so the grid stays uniform regardless of how many events land on a given day.
- No change to functionality — a day still shows up to 3 events plus a "+N more" link, and clicking anywhere on the cell still opens the full list for that day.
- Dashboard's "Upcoming Events" now renders as the same tile style as every other rail (Trending, New Guides, Latest News), instead of the plain text-row list it used before.
- Moved "League Countdown" to the bottom of the Dashboard, after Latest News.
- Dashboard is now the default landing view — opening the app (without a specific ?view= link) goes straight to the Dashboard instead of the Compendium.
v0.33
News post length limit raised further
- Raised the News post body limit from ~50,000 to ~150,000 characters — still comfortably under Firestore's 1MiB document cap even with a cover image attached. Character counter and save-time guard updated to match.
v0.32
News post length limit
- Found a second cause of the News save error: post bodies were hard-capped at 5,000 characters in the Firestore rules, with nothing in the app to warn you — going over just came back as "Missing or insufficient permissions" again, same symptom as the featured-post bug, different cause.
- Raised the limit to ~50,000 characters (Firestore documents can hold up to 1MiB, so there's plenty of room even with a cover image attached).
- Added a live character counter under the post body field that turns red if you go over, plus a clear in-app message at save time instead of the generic permissions error.
v0.31
News: dropped "featured", fixed save error
- Root-caused the "Missing or insufficient permissions" error blocking new News posts: it was the "unfeature the old post" step (triggered whenever a post was marked featured) failing its Firestore rules check, which happened before the new post was ever created.
- Rather than patch that mechanism, removed "featured" from News entirely. The banner at the top of the News page now always shows the newest post automatically — no more manual featuring, no more single-featured-post limit, and no more save failures caused by it.
- Removed the "Feature this post" checkbox from the post editor and the Feature/Unfeature button from post cards.
v0.30
Real save errors
- The News, Compendium, Event, and Guide forms were still showing a generic "check your connection" message on any save failure, even when the real cause was something else (like a Firestore rules mismatch). All 4 now show the actual error message instead.
v0.29
Dedicated News page
- News is now its own page (Menu → News), built the same way the Emporium Guides page works: a grid of post cards, an optional featured-post banner, category filter tabs, and a click-through detail view.
- 5 post categories: Patch Notes, Game News, Developer Posts, Featured Guides, Community Highlights.
- Post creation/editing moved off the Dashboard entirely — admin now writes, edits, features, and deletes posts from the News page itself, same workflow as guides.
- The Dashboard's "Latest News" section is now read-only tiles matching every other Dashboard rail (cover image, title, excerpt) — click one to open the same detail view as the News page.
v0.28
Dashboard cover images + News markdown
- Recently Viewed, Continue Reading, Trending Guides, New Guides, and Featured Guide on the Dashboard now show the same cover image (or favicon fallback) as their Compendium tile, instead of text-only cards.
- Uses the entry's existing cover fallback chain — nothing new to set up, it just reads whatever the entry already has.
- Latest News post body now has the same Write/Preview Markdown editor as Compendium notes and guide content — headings, bold, lists, links, and images all render in the feed.
v0.27
News post images
- Latest News posts can now include an optional image — the admin form on the Dashboard has an image picker with preview, right below the title/body fields.
- Uses the same resize/compress approach as Compendium and guide cover images, so post images stay well within Firestore's per-document size limit.
v0.26
Features tab catch-up
- Added the 3 feature cards that were missing from the Features tab despite already being shipped: Markdown Notes & Guide Content, Linked Guides, and Cover Images.
- Standalone ROADMAP.md/FEATURES.md files are retired as of this version — the in-app Changelog and Features tabs (Menu → Roadmap & Features) are now the single source of truth.
v0.25
Feature cards get cover art
- Feature cards in the Docs > Features tab now match the Compendium card layout, with a full-bleed banner on top (a large icon representing the feature) instead of just a text block.
v0.24
Favicon fallback
- Added a third tier to the cover image fallback chain: if an entry has a Link but no uploaded cover and no auto-fetched preview image was found, it now shows that site's favicon as a small badge instead of a blank tile.
- Uses Google's public favicon service (no proxy or extra network call needed) — always returns something, even a generic globe icon for sites with no favicon of their own.
- Fallback order is now: uploaded cover image → linked page's og:image → linked page's favicon → nothing.
v0.23
Auto cover image from links
- If an entry has no manually-uploaded cover image, it now automatically falls back to the linked page's own preview image (its og:image/twitter:image), where one exists.
- Best-effort: relies on a public CORS proxy to read the linked page and on that site having a preview image tag at all — some sites won't have one, block the proxy, or the linked image can later disappear, in which case the tile/detail view just shows no cover image, same as before this change.
- An uploaded cover image always takes priority over the auto-fetched one.
v0.22
Compendium cover images
- Entries in the Compendium (and by extension Favorites and Archived, which share the same grid) can now have an optional cover image, added the same way as Guide cover images.
- Cover image shows across the top of the tile in the grid and above the title in the full detail view.
v0.21
Markdown notes + linked guides
- Compendium "Notes" field now has a Write/Preview Markdown editor (same as guide content) — headings, bold, lists, links, and images all render in the build detail view.
- Grid tiles and the Dashboard "Featured" card show a plain-text excerpt of notes instead of raw Markdown syntax, so tile previews stay clean.
- Guides can now be linked to a Compendium entry via a new dropdown in the guide editor. A linked guide shows a "View linked build" button, and the Compendium entry it points to shows a matching "Related guides" list back — both respect existing private-entry visibility rules.
v0.20
Card layout fix
- Moved the "Feature" admin link out of the crowded left cluster (star + Archive) into a right-aligned column stacked under the game/section badges, fixing badge overflow on narrower tiles.
v0.19
Personalized Dashboard
- New Dashboard view — the landing page after login — with 9 sections: Recently Viewed, Favorites, Continue Reading, Featured Guide, Trending Guides, New Guides, Upcoming Events, League Countdown, Latest News.
- New admin-only "Feature" toggle on cards, new global view counter powering Trending Guides, two new admin-managed collections (news, leagueCountdowns), and localStorage-based view history.
- Firestore rules updated to match (featured, views, and the two new collections).
v0.18
Rich link previews
- Open Graph + Twitter Card meta tags so pasting the site URL anywhere shows a proper preview card (logo + tagline). Page title updated to match the "Kaoz Emporium" branding.
v0.17
Header wordmark
- Logo + "Kaoz Emporium" wordmark added to the header, absolutely centered on the page regardless of sibling element widths; hidden on narrow screens.
v0.16
Favicon & tab branding
- Full favicon set (16/32/48/192/512px, .ico, apple-touch-icon) generated from the Zaren "Z" logo.
v0.15
All section default + header polish
- Added "All" as the default subsection per game (Builds + Tools + Guides combined), with a section badge on cards when viewing it.
- Hamburger menu labeled "☰ Menu"; gold "Sign In" button shown next to the profile avatar when signed out (avatar itself hidden until signed in).
v0.14
Baseline sync point
- First version re-synced with active development after the documentation gap above.
v0.13
Public/Private entries
- Added a Public/Private visibility toggle for Compendium entries.
- Private entries are hidden from everyone except their owner or the admin — client-side only, same open-read caveat as the rest of the app's data (see Features tab, Private Entries).
Reconstructed from session history — version numbers here reflect the order changes were made in that session, and may not perfectly match any separately-numbered work done elsewhere during the same stretch.
v0.12
Notes visibility fix
- Repositioned entry notes in the detail popup to sit between the Favorites button and the link/preview section.
- Fixed a bug where notes text was being silently hidden in the detail view due to a CSS flexbox/line-clamp conflict.
v0.11
POE mastery updates
- Added the Reliquarian mastery option to POE 1's Scion.
- Renamed the "Mastery" field label to "Ascendancy" specifically for POE 1 and POE 2 (Last Epoch keeps "Mastery," matching its own in-game term).
v0.10
Profile menu + D2R
- Profile dropdown now opens to the right instead of the left.
- Username now displays as text next to the avatar.
- Added
?view= URL parameter support so a link can open directly to a specific tab (e.g. Calendar) — useful for embedding.
- Added D2R as a new game (positioned between Diablo 4 and Last Epoch) with all 8 classes, including Warlock.
v0.09
Header layout redesign
- Removed the "Kaoz Emporium" title text from the header.
- Moved the login/profile widget to the left side where the title had been, leaving empty space above the New Entry button on the right.
v0.08
Game tab reorder
- Reordered the game tabs to POE 1, POE 2, Diablo 4, Last Epoch, Grim Dawn, Hero Siege — applied consistently across Compendium, Favorites, and Archived.
v0.07
Entry form wording cleanup
- Placeholder text "Name this build" changed to "Name this entry."
- Save button "Save Build" changed to "Save Entry."
- Form field label "Build Name" changed to "Entry Name."
v0.06
Rebrand pass
- Header title changed from "Emporium Builds" to "Kaoz Emporium."
- "+ New Build" button renamed to "+ New Entry"; New Entry modal title updated to match.
v0.05
Error messaging
- Surfaced the real Firebase error on failed saves instead of a generic "check your connection" message, to make future debugging easier.
v0.04
Archive control redesign
- Replaced the hover-only archive icon with an always-visible underlined "Archive" text link next to the favorite star, so it doesn't depend on hover/desktop-only interaction.
v0.03
Archived Builds
- New Archived bubble (mirrors Favorites) showing only archived entries.
- Admin-only archive/unarchive control on every card.
v0.02
More games + Sections + Favorites as a view
- Added Grim Dawn, POE 1, POE 2 as games.
- Introduced Builds/Tools/Guides subsections per game (folding in the old standalone "Helpful Guides" tab).
- Moved Favorites from a game-tab into its own top-level bubble, mirroring the builder's game/section navigation but filtered to favorited entries.
v0.01
Game Nights calendar
- Month-grid calendar added alongside the builder, toggled via a top-level Builder/Calendar switch.
- Anyone signed in can add an event; click a day to add one there.
Backlog (unscheduled)
Data model / accounts
- Real server-side push notifications for event reminders (would need a Cloud Function on a schedule + Web Push subscriptions — today's reminders only work while the app is open in a tab).
- Account-synced Recently Viewed & Continue Reading (currently per-browser via localStorage — doesn't follow the user across devices).
- Multi-admin role system (currently a single hardcoded admin email).
- Bulk-edit/bulk-move tooling for entries (e.g. reassigning many entries to a new section at once).
Security hardening
- Server-side enforcement of private-entry visibility (currently client-side only; builds reads are open at the database level).
- Same open-read caveat applies to the events collection (pending events are hidden in the UI but technically queryable directly).
Dashboard
- Time-windowed "Trending" (currently all-time view counts).
- Multiple featured picks with rotation/scheduling (currently just the one most-recently-featured entry).
- Edit-in-place for League Countdown and News posts (currently delete + re-add only).
- Recurring/templated league countdowns for games with predictable season cadences.
- Rich text or image support in News posts (currently plain text).
Content
- Keep POE 2's class/mastery list current — it's still under active development and adds classes over time.
- Expand the tag vocabulary (currently hardcoded in both the client and firestore.rules, so it's a two-file change each time).
Branding
- Revisit the Open Graph tags' hardcoded canonical URL if a custom domain ever replaces emporium-builds.firebaseapp.com.