Big stuff lands under Updates. Small fixes and polish go under Patch notes. The newest entries are always on top.
Update
Beta 3.2 — outage closed out
Top-bar banner is now Beta 3.2. The May 7th free-tier hosting outage is fully behind us — three rounds of caching across the site mean we're back comfortably under the monthly CPU cap with headroom for the rest of the cycle.
If you dismissed the previous banner, this one will show up once and you can dismiss it again. Thanks for hanging in there.
Update
BETA 3.0 update — audit log, auto-notify mods on submissions, Top creator crown
Preparing the site for a stretch where the Creator can only check in occasionally. Everything in this release is about making moderators self-sufficient — they should have full visibility into each other's work, get pinged the moment something needs attention, and earn automatic recognition for what the community's actually producing.
**Every community submission now pings every moderator.** The V8.19 priority sort already floated user-flagged submissions to the top of `/admin/triage`, but a mod had to be actively watching the page to notice. Now `submitCreation` in `lib/community/actions.ts` broadcasts a `mod_community_submission` notification to every moderator+ the moment a row is inserted — submitter persona name + item title + a link straight to `/admin/triage`. Delivery is fire-and-forget (wrapped in try/catch), so a DB hiccup on the broadcast can't unwind the user-visible insert. The submitter themselves is excluded from the fan-out in case they're also a mod.
**Full moderator audit log at `/admin/audit`.** New `mod_actions` table records every non-trivial mod server action: approve / quick-approve / reject / archive / restore / hard-delete / set-kind / re-scrape / save-tags / confirm-tag / remove-tag / create-tag / update-tag / create-category / delete-category / grant-badge / revoke-badge / ban / unban / hard-ban / clear-hard-ban / mute / unmute / warn / clear-warnings / set-role / grant-appeal / dismiss-appeal / grant-age-gate-bypass / revoke-age-gate-bypass / manual-ingest / admin-add / clear-report / action-report / delete-comment-from-report. Each row stores actor (with persona snapshot), action, targetType:targetId, a human-readable summary, a jsonb metadata blob for contextual details (reasons, previous values, etc.), and a timestamp. A new `/admin/audit` page (mod-tier visible) lists the feed with filters for actor steamid, action type, and target, plus a dropdown that shows the top 15 most-used action types with counts. Paged 50 per screen. `logModAction()` in `lib/audit/log.ts` never throws — if an audit insert fails, the action the mod just took still goes through; worst case one entry is missing from the feed.
**Top creator crown (👑) auto-badge.** New `top_creator` badge in `lib/badges/definitions.ts`. Auto-managed: grants to the single site-account holder with the most approved creations (authors + co-authors, DISTINCT on creation id — same counting logic `/creators` uses). Revokes from everyone else. If the current #1 never signed in to the site, the badge sits unowned until someone with an account is on top. Tie-break is `site_joined_at ASC` — earliest to the site wins when counts are equal. Hard-banned users are filtered out of eligibility. `refreshTopCreatorBadge()` runs after every action that shifts the counts: approve, quick-approve, archive from report, manual archive, restore from archive, admin-add auto-approve, hard-delete, re-scrape creators. Listed in `SYSTEM_AUTO_BADGES` so the `/admin/users` page hides the manual grant button for it — manual grants would just be reverted on the next count-changing action. The server action `grantBadgeAction` also refuses `top_creator` with a `badge_system_auto_managed` error for defense in depth. Migration `0031` seeds the initial winner at deploy time (no waiting for the next approval).
**Tag and category attribution columns.** `tags.created_by_user_id` + `tags.created_at` and the same pair on `categories`. Pre-V9.1 rows carry nulls (there's no reliable historical source to backfill from). `createTag` and `createCategory` populate the new columns on insert; on upsert (same slug) they leave attribution untouched so the column always answers "who originally added this tag" rather than "who last edited it". Updates flow through the audit log regardless.
**`creations.reviewed_by_user_id`** was added in V2.0 but rarely populated — approve / quick-approve / set-kind / archive / restore all now write it, so "who last reviewed this creation" is now always recoverable from the row itself without cross-referencing the audit log.
**Top-bar banner bumped to BETA 3.0** copy. New `smse_beta_dismissed_v3_0` dismiss key so everyone who cleared the BETA 2.1 banner sees the new one once.
**UX for the single-moderator workflow.** With only one mod active while the Creator's away, the triage/queue combo from BETA 3.0 plus the audit feed means the mod can walk away, come back, and see exactly what they've handled vs. what's still pending. No more "did I already reject this one?" guesswork. If they approve someone's submission and need to back it out, the audit log tells them the exact timestamp so they can restore the archive later cleanly.
Update
BETA 3.0 — Ukrainian + Chinese translations, creator-only ingest, better moderator flow
Big milestone release — the site now speaks six languages, ingest powers consolidate into the Creator's hands, and moderators get concrete quality-of-life wins across triage and queue.
**New languages — Ukrainian (Українська) and Chinese (中文).** The language picker in /settings (and the language toggle in the top bar at lg+) now offers six locales: English, Русский, Українська, Deutsch, Polski, 中文. Every UI key that's already translated for RU/DE/PL gets a full UK/ZH translation too — navigation, home, /new, /creators, /search, /me/*, creation card labels, creation detail page, Ideas board, submit form, settings, footer presence counters, and the two minigames (Scrapcha and Blockdle — all 60+ Blockdle keys across every column header, leaderboard row, error, win/lose copy). Translations are AI-assisted first-pass seeds, same quality bar as the existing RU/DE/PL — native-speaker polishing is always welcome through the Ideas board. The English-only tag catalogue rule (V8.1) still holds: tags are cross-language navigation and stay ASCII; creations keep their author's original language.
**Ingest is now Creator-only.** `/admin/ingest` and `/admin/add` have been reclassified as Creator-tier tools — same tier as Users, Badges, Suggestions, and Changelog management. Manual ingest runs burn Steam API quota and can reshape the public catalogue wholesale; direct `/admin/add` of any Workshop URL bypasses the follower-count floor entirely. Neither is something a moderator should be able to do unilaterally without the site owner's judgement, so the gating matches the stakes. Server actions `triggerIngest` and `addCreation` now call `requireCreator()` instead of `requireMod()`; the nav pills move from the baseNav row to the purple creatorNav row; both pages render a friendly "Creator only" card for moderators who land on them directly. The moderator handbook at /admin/guide was updated to reflect the new boundaries. The daily cron at `/api/cron/ingest` is unaffected — it runs automatically on schedule and never needed a human to kick it.
**Moderator QoL — one-click rejection reason presets.** Rejecting a community-submitted item used to mean typing the same five sentences into the reason box over and over. Now both `/admin/triage` (the swipe modal for community-submit rejections) and `/admin/queue` (the inline reason input on community-submit rows) surface a row of five preset pills — *Below threshold*, *Duplicate*, *Low quality*, *Missing attribution*, *Not Scrap Mechanic*. One click fills the reason box with a short, submitter-friendly sentence that you can still edit before confirming. Same five presets across both surfaces so rejection notifications stay consistent regardless of which route the mod took. The rejection-reason-required behaviour for community submissions (V8.19) is unchanged — presets are a typing shortcut, not a bypass of the "reason required" rule.
**Moderator QoL — community-submission counter in triage header.** `/admin/triage` now shows a purple "N community-submitted waiting — these are up first" pill below the batch counter when there's at least one community-flagged item in the queue. Makes it obvious at a glance that the V8.19 priority sort is doing its job, and tells the mod exactly how many high-intent submissions they need to clear before the auto-ingest backlog resumes.
**README tidy-up.** The public repo readme no longer advertises "Issues and PRs welcome" or the contributor checklist. The site is a fan project with a single-person backend vision — the on-site Ideas board at /suggestions is the one canonical channel for feature requests and bug reports, and keeping that loud and clear avoids setting expectations that PRs are open for merging.
**Under the hood.** `LOCALES` in `lib/prefs.ts` went from `["en", "ru", "de", "pl"]` to `["en", "ru", "uk", "de", "pl", "zh"]`; `LOCALE_NATIVE_NAMES` picked up "Українська" and "中文"; `lib/i18n/dictionaries.ts` gained two full dictionaries (`uk` and `zh`) mirroring the existing RU/DE/PL key set. The language-picker pill group in the top bar renders all six now — slightly busier at lg, but still fits comfortably.
Thank you as always for the feedback that drove this release. Keep flagging things on the Ideas board.
Update
BETA 2.1 — feedback everywhere, new guide, changelog
This release is about making the site talk back — every click and every action should tell you it heard you.
What shipped:
• Loading spinners on every action button — favourite, vote, comment, report, submit, suggest, and every moderator tool.
• Toast notifications pop in the bottom-right whenever an action succeeds or fails, with human-readable error copy instead of silence.
• Every route now has a proper loading skeleton when you navigate between pages — no more flashing blank screens.
• The "Ratings: Site / Steam / Both" toggle self-hides on pages that don't actually display ratings.
• The Browse dropdown no longer snaps shut when you move from the trigger to an item (reported as idea #8 on the Ideas board).
• Captcha on sign-in now has a "Skip the puzzle" escape hatch that fades in after the first wrong answer.
• Ingest pipeline no longer gets stuck with zero-new-items runs when the top of Workshop is all already-decided stuff. Daily cron now digs up to 5 pages per kind and stops early once it finds enough novel items.
• New live progress bar on /admin/ingest so moderators can see which kind and which page the ingest is currently on.
• Native window.alert() and window.confirm() dialogs are gone — replaced with styled in-page armed-click confirmations.
Documentation:
• /guide rewritten as a layered tutorial — a one-line summary per section with collapsible "More details", plus new "Roles on the site" and "Glossary" sections so nobody has to guess what a word means.
• /admin/guide rewritten as per-role playbooks with "on a normal day you…" cards, "Common mistake" callouts, and a formal escalation ladder (warn → mute → temp ban → perma → hard ban).
And this page:
• You're reading it. The changelog now lives inside the site, with Updates (big stuff) and Patch notes (small stuff) tabs, and a "What's new" badge in the top bar that shows unread count for signed-in users.
Rough edges still exist. Keep the reports and Ideas-board suggestions coming.