What's shipped, version by version. Numbers bump by 0.01 with every change — see the footer for the current build.
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.
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.03
Archived Builds
- New Archived bubble (mirrors Favorites) showing only archived entries.
- Admin-only archive/unarchive control on every card.
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.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.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.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.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.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.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.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.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.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.14
Baseline sync point
- First version re-synced with active development after the documentation gap above.
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.16
Favicon & tab branding
- Full favicon set (16/32/48/192/512px, .ico, apple-touch-icon) generated from the Zaren "Z" logo.
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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.
Backlog (unscheduled)
Data model / accounts
- 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).
Calendar
- Recurring events.
- Reminders/notifications for upcoming events.
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.
Living documentation of every feature in the app — what it's for, how solid it is, and what could be built on top of it later.
📚
Compendium (Builder)
Done
Purpose: The core library — builds, tools, and guides for each supported game, browsable and searchable by anyone, editable by whoever added an entry (or the admin).
How it works:
- Games (top-level tabs): POE 1, POE 2, D2R, Diablo 4, Last Epoch, Grim Dawn, Hero Siege.
- Each game has 4 subsections: All (default, combined view), Builds, Tools, Guides. Switching games resets back to "All."
- Entries carry: title, URL, category (game), section, class/mastery (Builds only), tags (Leveling / Endgame / Speed Leveling), notes, and a public/private visibility flag.
- Search box + tag filter chips narrow the current game/section view.
- Cards show a section badge (only in the "All" view), a game badge, a "Private" badge when relevant, and an "added by" line with avatar.
Future enhancements: Class/mastery data for POE 2 will need occasional updates since it's still in active development. No bulk-edit or bulk-move tooling yet.
🗂️
Sections (Builds / Tools / Guides / All)
Done
Purpose: Split each game's content into purpose-built categories instead of one long undifferentiated list.
How it works: Every entry has a section field (Builds, Tools, or Guides). Class/mastery fields only appear on the add/edit form when section is Builds. Entries saved before this feature existed default to "Builds" for backward compatibility.
🔎
Tags & Search
Done
Purpose: Fast filtering within a game/section.
How it works: A fixed tag vocabulary (Leveling, Endgame, Speed Leveling) plus free-text search across title and notes.
Future enhancements: Tag vocabulary is hardcoded and validated by Firestore rules — adding a new tag means updating both the client dropdown and firestore.rules.
📝
Markdown Notes & Guide Content
Done
Purpose: Let Notes and guide content support real formatting instead of a flat text box.
How it works:
- The Compendium "Notes" field has a Write/Preview Markdown editor — 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.
🔗
Linked Guides
Done
Purpose: Connect a guide directly to the build/tool entry it's about, so people can jump between them.
How it works: A dropdown in the guide editor links it to a Compendium entry. A linked guide shows a "View linked build" button, and the entry it points to shows a matching "Related guides" list back. Both directions respect existing private-entry visibility rules.
🖼️
Cover Images
Done
Purpose: Give Compendium tiles a visual anchor instead of text-only cards.
How it works: Fallback chain, in order: an uploaded cover image → the linked page's own og:image/twitter:image preview (auto-fetched) → the linked site's favicon (via Google's public favicon service) → nothing, if none of those exist. Shows across the top of the grid tile and above the title in the full detail view. Favorites and Archived share the same grid, so they get covers automatically too.
Known limitation: The auto-fetched preview image relies on a public CORS proxy to read the linked page. It's best-effort — some sites won't have a preview image tag, some block the proxy, and a fetched image can disappear later if the source page changes. In any of those cases it just falls through to the next tier (favicon, then nothing) rather than erroring.
⭐
Favorites
Done
Purpose: Let each signed-in user bookmark entries and privately tag them for their own organization.
How it works: A favorites collection keyed by {uid}_{buildId}, readable only by its owner. The Favorites bubble mirrors the Compendium's game/section tabs but filters to only the current user's favorited entries. Users can add their own custom tags to a favorite.
Future enhancements: No way to share a favorites list with someone else or export it.
🗄️
Archived Builds
Done
Purpose: Let the admin retire an entry without deleting its data.
How it works: Admin-only "Archive"/"Unarchive" link on every card. Archived entries disappear from the Compendium and Favorites views and only show up in the dedicated Archived bubble.
Future enhancements: No archive reason/note field, no archive history log.
🔒
Private Entries
Partial
Purpose: Let a user add an entry that only they (and the admin) can see.
How it works: A private boolean on the entry, filtered client-side out of every view except for the owner and admin.
Known limitation: Firestore reads are open (allow read: if true) for the whole builds collection. A signed-in user querying the database directly could technically still read private entries that aren't theirs. Locking this down would require restructuring reads to filter by owner/admin at the query level.
🌟
Featured Guide
Done
Purpose: Let the admin spotlight one entry on the Dashboard.
How it works: Admin-only "Feature"/"Unfeature" link on every card (right column, under the game badge). The Dashboard shows the most recently featured entry as a large highlighted card.
Future enhancements: Only one featured entry shown at a time; no scheduling or rotation of multiple picks.
📈
View Counter / Trending Guides
Done
Purpose: Surface popular guides on the Dashboard without any manual curation.
How it works: Every entry has a views counter, incremented by exactly one (server-validated) whenever anyone opens its detail view — including signed-out visitors. "Trending Guides" ranks Guides-section entries by all-time view count.
Future enhancements: This is all-time views, not "trending this week." A time-windowed version would need view events with timestamps.
🔐
Authentication & Profiles
Done
Purpose: Let people sign up, log in, and have builds/favorites/events attributed to them.
How it works: Firebase email/password auth. Users pick a username and optional avatar photo on signup. A hardcoded admin email grants admin powers app-wide.
Future enhancements: Single hardcoded admin email — no multi-admin role system if more moderators are ever needed.
📅
Calendar (Game Nights / Events)
Done
Purpose: A shared calendar for game nights and events, separate from the Compendium.
How it works:
- Month-grid calendar; click a day to see every event on it in a popup, or add a new one.
- Anyone signed in can submit an event; admin must approve it before it's visible to anyone else.
- RSVP: anyone signed in can mark themselves "going," shown as avatars + a count on the event.
- Admin can approve/reject from a dedicated pending-events panel or from the event detail view directly.
Known limitation: Reads are open on the events collection, so a signed-in user querying directly could still see raw pending event docs even though the UI hides them.
Future enhancements: No recurring events, no reminders/notifications.
🏠
Dashboard
Done (2 manual sections)
Purpose: A personalized home screen — the landing page after login — pulling together the most relevant content instead of making people dig through tabs. Entry-based sections (Recently Viewed, Favorites, Continue Reading, Featured Guide, Trending Guides, New Guides) show the same cover image or favicon as the entry's Compendium tile.
The 9 sections:
| Section | Source | Status |
| Recently Viewed | Per-browser localStorage | Partial |
| Favorites | Existing favorites data | Done |
| Continue Reading | Recently viewed, filtered to Guides | Partial |
| Featured Guide | Admin "Feature" toggle | Done |
| Trending Guides | Global view counter | Done |
| New Guides | Most recent Guides-section entries | Done |
| Upcoming Events | Existing calendar events | Done |
| League Countdown | New admin-managed collection | Manual |
| Latest News | New admin-managed collection | Manual |
Known limitation: "Recently Viewed" (and "Continue Reading") is tracked in the browser's localStorage, not tied to the account — won't follow someone between devices, and clearing browser data resets it.
Future enhancements: Account-synced view history, time-windowed Trending, multiple featured picks with rotation.
⏳
League Countdown
Manual
Purpose: Days-remaining countdown cards for upcoming game seasons/leagues.
How it works: Admin-only inline form (label, optional game, date) on the Dashboard. Everyone sees countdown cards for anything with a future date; past dates drop off automatically. Admin can delete any countdown.
Why it's manual: League/season start dates are announced by each game's developers on their own schedule and change often — there was no reliable way to pre-populate this with real dates.
Future enhancements: No edit-in-place; no recurring/templated countdowns.
📰
News
Done
Purpose: A proper news/announcements page — patch notes, game news, developer posts, featured-guide callouts, and community highlights — plus a quick-glance feed on the Dashboard.
How it works: Its own page (Menu → News), built the same way as Emporium Guides: admin-only "+ New Post" button, a grid of cards (cover image, category badge, title, excerpt), a banner at the top showing the newest post, category filter tabs, and a click-through detail view with the full Markdown body. Post body supports the same Write/Preview Markdown editor as guides and Compendium notes. The Dashboard's "Latest News" section shows the newest few posts as read-only tiles (same style as every other Dashboard rail) that open the same detail view — all creating/editing happens on the News page itself, not the Dashboard.
Future enhancements: No scheduled/draft posts (everything posted is live immediately, unlike guides which support Draft/Scheduled/Published), no per-category RSS-style notifications.
🎨
Branding
Done
How it works:
- Favicon set (16/32/48/192/512px + .ico + apple-touch-icon) generated from the Zaren "Z" logo.
- Logo + "Kaoz Emporium" wordmark centered in the header; hidden on narrow/mobile screens to avoid crowding.
- Open Graph + Twitter Card meta tags so pasting the site's URL anywhere shows a proper preview card.
Known limitation: The Open Graph tags hardcode the firebaseapp.com URL as canonical — if a custom domain is ever used, those tags need updating.
🔖
Version Footer
Done
Purpose: Quick visual confirmation of which build is currently deployed.
How it works: A small vX.XX tag fixed to the bottom-right corner, bumped by one increment with every shipped change.