What's new
Recent platform changes and the capabilities as they became available.
Notable changes to the Hanabi platform (the desktop shell, Settings, taskbar, File Explorer, Developer Portal, Module Store, login, etc.) are recorded here. Versions follow Semantic Versioning. The version shown on the login screen's changelog panel is read from APP_VERSION in apps/web/src/routes/+page.svelte.
Module changelogs live with their modules, not here. Each module (Word Editor, Excel Editor, Certificate Builder, …) tracks its own version history in the Developer Portal / Module Store, seeded from apps/web/src/lib/developer-store.ts. Hanabi is the platform that runs those modules; their release notes stay on the modules themselves.
Unreleased #
_Nothing pending._
[5.7.0] — 2026-06-12 #
Added
- Desktop & filesystem module capabilities. Modules can now (with permission) integrate with the desktop workspace and manage the virtual filesystem beyond their own folder. New capabilities:
desktop.read(read Desktop contents),desktop.workspace(place files/folders on the Desktop),desktop.shortcuts(create desktop shortcuts/launchers),desktop.personalize(change wallpaper / personalization), andfiles.manage+ thefs.*operations (move/copy/rename/ delete/mkdir across the scopes the user grants — own scope and, when granted, workspace-wide). The whole surface is wired end-to-end through the capability registry, the iframe bridge, the@hanabi/module-sdktypes, the module CLI's allowed-permission list, the reference docs, and a sample module — kept in lockstep by the capability-contract parity test. - In-portal module debugger. The Developer Portal now has a debug console that streams a running module's bridge requests and replies (including any error code) so you can watch exactly which platform call failed and why. Two run controls sit beside it: Run worker boots the draft's worker once with no inputs (does it start?), and Run tests runs it against the module's own
tests/sample-inputs/so you can watch it handle real data — all on your unpublished draft, no approval required. - Capped DEV sandbox — test heavy modules before approval. A draft that declares a heavy capability (
worker.nativefor the ffmpeg/imagemagick/libvips image, ornetwork.fetch.broadfor open-web fetch) can now exercise that path in the debugger without waiting for an admin. The dev-run gets a fixed DEV ceiling (1 GB / 90 s, the native image when declared, a 10 MB rate-limited and SSRF-guarded audited egress budget) inside a 30-minute ephemeral session — enough to prove the heavy path works; the full production limits still come with approval. Owner-only, audited, and on a container-worker host only; an operator can disable it withHANABI_DEV_SANDBOX_HEAVY=false. A newHANABI-Q009error reports an ended session ("start a new one to keep testing"). - Stable platform error codes. Every failure across the backend API, the module bridge/SDK, and the worker sandbox now carries a stable
HANABI-xxxxcode with a documented cause and fix. The codes are generated from one registry intodocs/modules/error-codes.md, mirrored into the SDK'sHANABI_ERROR_CODES, surfaced in the debugger, and pinned by parity tests so the registry, SDK, and docs can never drift. - Beginner developer documentation. A new on-ramp under
docs/modules/: a glossary, a "how it works" overview, a build-your-first-module tutorial, a permissions explainer, a beginner FAQ ("wait, why doesn't this work?"), and an API walkthrough that covers every platform call.
Changed
- Module verification & publishing process now expects a debugger smoke-test. The developer guide's upload/review flow and the publishing checklist now call for running your draft in the debugger (and exercising any heavy path in the capped DEV sandbox) before submitting it for review. First publishes still get a manual admin review; version updates still auto-approve on passing the automated checks.
- `@hanabi/module-sdk` tracks the bridge. The SDK gained the new desktop/VFS message types and the
HANABI-Q009dev-session error code, so typed modules stay in sync with the platform.
[5.6.1] — 2026-06-05 #
Fixed
- Double-clicking an Excel workbook opened the Word Editor.
.xlsx/.xlsmfiles carry the OOXML MIMEapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet, whose substring "document" matchedisDocumentFile's/document/itest. BecauseopenWorkspaceFile(the double-click handler) checkedisDocumentFilebeforeisSpreadsheetFile, the workbook routed to the Word Editor.isDocumentFilenow returnsfalsefor anythingisSpreadsheetFilerecognizes (and the loose/document/icatch-all was narrowed to/msword|wordprocessingml/i), andopenWorkspaceFilenow checks spreadsheets first — consistent withintrinsicOpenAppForFile. Excel files open in the Excel Editor again, and the "Open with" menu no longer offers the Word Editor for spreadsheets.
[5.6.0] — 2026-06-05 #
Added
- Developer Portal — module owners can edit their own listings. Ownership is per-publisher: a module's Settings tab is editable only when the signed-in portal account is the module's publisher (
publisher_id) or an administrator. Owners can edit the store metadata (name, summary, category, tags, homepage, support email), publish/roll back versions, and upload custom store screenshots. Non-owners see a read-only "managed by the publisher" note instead of the editor. Seeded built-in modules start out system-owned and are claimed by the admin account on sign-in (claimSystemModules), so the defaultadminaccount can manage the whole first-party catalog. Screenshots are stored locally as data URLs in the developer store (setModuleScreenshots, capped at 8) — no backend involved. - Module Store — uploaded screenshots render in the listing gallery.
screenshotsFor()now prefers an owner's uploaded screenshots over the default artwork, so edits made in the Developer Portal show up immediately in the store detail view.
Changed
- Module Store — refreshed product-shot artwork. Image Converter, Certificate Builder, Simple Excel, and Word Editor now ship dark Windows-11 app-UI product shots (16:9, rendered from authored SVGs) so every listing matches the look of the Calendar and Calculator tiles.
[5.5.3] — 2026-06-03 #
Fixed
- Certificate Builder refused .xlsx / .xlsm drops from File Explorer.
startFileDrag/startFolderDraginFileExplorer.sveltewere settingevent.dataTransfer.effectAllowed = 'move'. Certificate Builder'shandleDragOver(and every other module's drop zone) setsdropEffect = 'copy'. Chrome enforces the effectAllowed/dropEffect compatibility table and silently rejects the drop when the source advertises "move-only" but the target wants "copy" — the drop event never fires, so the file never uploads. Switched both drag sources toeffectAllowed = 'copyMove', which is in the compatible set for bothcopyandmovetargets.
[5.5.2] — 2026-06-03 #
Fixed
- Wrong-password attempts briefly flashed the loading screen.
submitLoginwas settingworkspaceLoading = trueand the "Signing in" message before awaitinglogin(). When credentials were rejected, the loader appeared for a frame and then jumped back to the login form. TheworkspaceLoadingflip is now deferred untillogin()resolves successfully, so the loader only shows after authentication actually succeeds. Failed attempts stay on the login form with the error message in place.
[5.5.1] — 2026-06-03 #
Fixed
- Taskbar live preview was duplicating audio.
windowPreviewActionclones the sourcearticle.windowwithcloneNode(true). The clone preserves<video autoplay>and inherits the same media URL, so opening a Media Player video plus hovering its taskbar tile produced two simultaneous audio streams. The action now walks every<video>/<audio>inside the clone and setsmuted = true,volume = 0, strips theautoplayattribute, and callspause()defensively.
Changed
- Volume Mixer moved out of Accessibility into a dedicated "Sound" page. Settings now has a new
Soundentry between System and Apps, fronted by theSpeakericon. Accessibility is back to a single "Reduced motion" toggle. The Home overview surfaces Sound automatically because the card grid iteratesnavItems.
[5.5.0] — 2026-06-03 #
Added
- Volume Mixer in Settings → System. New
audio-mixer.tsshared store with master volume + per-source state, persisted to localStorage. The Settings panel now surfaces a Windows-style mixer with sliders + mute for every registered source (each Media Player window self-registers on the current file). Master mute zeroes every output without losing the per-source positions. - Developer Portal — Management section. A new admin-only rail group above _My modules_ with a "User accounts" button and a count badge. Routes to a new
view: 'users'page. - Developer Portal — User accounts page (admin-only). Create developer or administrator accounts, reset any account's password inline, remove accounts. The
admin/adminaccount is permanent and cannot be deleted; the currently signed-in account cannot delete itself. All flows go through toast notifications via the existingonNotifychannel. - `portal-auth.ts` extensions. Exports
createAccount,deleteAccount,updateAccountPassword, plusPortalAccount,PortalAuthState,PortalRoletypes. Persists to localStorage like the existing session state.
Changed
- Developer Portal rail header restructured. The avatar / name / role row is now a 3-column grid (avatar | meta | actions). Two compact icon buttons sit next to the user profile: a settings cog (density toggle, previously in the rail footer) and a sign-out arrow. The bottom "admin · Administrator" footer placeholder is gone.
- Taskbar window preview enlarged to 220 × 148 (was 136 × 84). The cloned window content is centered with
translate(-50%, -50%) scale()instead of pinned to the top-left so live previews are legible. - Login screen recentered. The two-column wrapper was pulling the form off-axis; the changelog panel is now
position: fixed; bottom: 24px; right: 24pxso the sign-in form sits dead-center. - Taskbar latency chip polished. Value + unit live in a flex container with
align-items: centerso the digits no longer float above the dot.
Fixed
- Notification panel button disappeared. The taskbar grid had four fixed columns; adding the latency badge as a fifth child pushed the notification button onto an implicit second row. Trailing items are now wrapped in
.taskbar-trailingand the third column isauto.
[5.4.1] — 2026-06-03 #
Fixed
- Loading screen could get stuck at 100 %. The bar finished but the overlay never faded because the one-shot
setTimeoutbailed when the workspace work was still running, and nothing rechecked once it finished. The fade-out is now driven by reactive guards that re-evaluate wheneverloadingorworkspaceLoadingflips, with a 1.5 s fallback timer for the edge case where the work finishes before the progress animation crosses 99.5 %. HanabiLoadingScreenrearms itscompletionFiredflag whentargetProgressdrops back below 100, so a second load cycle (logout/login, refresh) can fireonCompleteagain.
[5.4.0] — 2026-06-03 #
Added
- Live taskbar window previews. Hovering a taskbar entry now clones the actual
article.windowDOM into the hover card and appliestransform: scale()to fit. Non-minimized windows show their real content; minimized ones fall back to the icon tile. Cloned DOM is non-interactive. - Latency badge in the taskbar. A new
.taskbar-latencychip pings/api/auth/meevery 6 s, measures the round-trip withperformance.now(), and renders the result asXXX msnext to a pulsing dot. Tiers:< 120 msgreen,< 320 msyellow,≥ 320 msred, unreachable shows—in grey. Both dark and light themes have tuned colors. - Multiple media-player windows.
openMediaFile(file)keys each window asmedia-player:${file.id}instead of a singleton. A newmediaFilesByWindowmap remembers the file per window, so opening multiple images or videos side by side works as expected. - Upload progress toast stack. New bottom-right
.upload-toast-stackwith one card per active/recently-finished upload task. Each card shows the filename, status message, an animated<progress>bar (blue→green gradient mid-flight, solid green on success, red on failure), and the percentage. Auto-dismisses 3.2 s after success or 7 s after failure; users can also dismiss manually. The full notification panel still keeps the history. - Login screen changelog panel. The sign-in screen is now a two-column stage with the form on the left and a scrolling changelog aside on the right. The aside shows the current
APP_VERSIONchip plus a timeline of recent releases. Below 880 px viewport the layout collapses to one column. Both themes are styled.
Changed
- Taskbar context-menu placement.
openTaskbarContextnow anchors to the actual.task-button(viaclosest), left-aligns the menu with the icon's left edge (Windows 11 style), and sits it directly above the taskbar. Clamped to8 … innerWidth − menuWidth − 8. - Certificate Builder drop zone is now the entire
<main class="certificate-body">instead of just the dashed visual area, so the whole window content accepts files. The dashed.certificate-drop-zoneis purely cosmetic now.
[5.3.0] — 2026-06-03 #
Added
- Developer Portal local login. New
apps/web/src/lib/portal-auth.ts: a localStorage-backed credential store with a permanentadmin/adminaccount. ExportssignIn,signOut,createAccount,updateAccountPassword,deleteAccount. Sessions persist across reloads. The portal mounts behind a sign-in card; the rail account block shows the portal user's display name and role; the footer carries a sign-out button. - Seeded system modules in the Developer Portal. New
apps/web/src/lib/developer-store.tslib: a localStorage-backedwritable<DeveloperStoreState>typed withSystemModule,SystemModuleVersion,ModuleReview,SupportTicket,TicketMessage. Seeded on first load with every built-in module (Certificate Builder, Image Converter, Simple Excel Sheet, Calendar, Calculator, Word Editor, Excel Editor) — each withpublisher: "Hanabi Matsuri System", real metadata, and 2–3 version entries with changelogs. Projected into the Developer Portal as published entries that the admin owns. - Listing metadata editor. The Settings tab now exposes an editor for name, summary, category, tags, homepage, and support email. Saves instantly via
updateModuleMetadata. Below it, a "Publish update" form publishes a new version (auto-incremented viabumpVersion) with changelog notes. - Version rollback. Every prior version in the Versions tab now has a "Make current" pill that calls
rollbackToVersion, marking the older entry as published-current and the previous current asrolled-back. - Real review + rating system in the Module Store. All hardcoded review arrays and synthetic distributions are gone. Reviews persist per
(user, module)viasubmitReview; ratings recompute on the fly. Each rendered review uses the real author, rating, body, and timestamp. The user's own review is tagged "You" with Edit / Delete actions. An empty state covers the no-reviews case. A new "Write / Edit a review" form with an interactive 5-star picker accepts submissions. - Support ticket + messaging system.
- Module Store detail: new "Support tickets" card lists the current user's tickets for the module as collapsible threads with status pills and a reply box. A "Open a support ticket" form (Subject / Category / body) creates new tickets via
openTicket. - Developer Portal: new "Support tickets" rail entry with an open-count badge. Selecting a ticket opens the conversation panel with status quick-toggles (Open / Awaiting user / Needs reply / Resolved / Closed), a styled message thread, and a reply textarea that routes through
postTicketMessagewithfrom: 'developer'. - Changelog card in the Module Store detail page. Shows the system module's full release history as an outlined timeline: each entry marked Current / Rolled back / Past, with notes and changelog bullets.
- Module Store now shows the real desktop session user. Replaced the hardcoded
hanabi.devand 花 avatar with the active Hanabi user's display name and profile image (or initial fallback). - Start menu promotion. Developer Portal and Module Store now appear as top-level pinned entries (after File Explorer and Settings) rather than buried inside "All programs". Curated, ordered list keeps placement stable.
Changed
- All built-in module developer references in the Module Store changed from
hanabi.devtoHanabi Matsuri System; support email defaults tosupport@hanabimatsuri.app.
[5.2.1] — 2026-06-03 #
Fixed
- Settings → Background → Upload image scroll glitch. The hidden
<input type="file">wasposition: absolutewith no positioned ancestor, so when the browser scrolled it into view to open the OS picker, the whole Settings panel scrolled, leaving a black slab below the content and collapsing the side nav. The button now wraps the input asposition: relative; overflow: hiddenand stretches the input to fill the button atopacity: 0. Same fix applies to the Profile photo upload. - Cross-window VFS drag-drop. Files dragged from File Explorer into other module windows weren't reliably picked up. Added window-level
dragenter/dragover/drophandlers on everyarticle.windowthatpreventDefaulton hanabi MIME types and route the drop throughdispatchVfsItemsDropAtPoint, which usesdocument.elementsFromPointto dispatch ahanabi-vfs-files-dropCustomEvent to the matching inner[data-vfs-file-drop-target="true"].
Changed
- Inline rename input tightened to Windows 11 style: smaller min/max height, white background with dark text, single-pixel accent border with a focus ring,
font-size: 12px× UI scale, narrower width that hugs the icon label, and all desktop rename textareas switched fromrows="2"→rows="1".
[5.2.0] — 2026-06-03 #
Added
- Window titlebar icons. Every window now renders its per-app icon in a tinted rounded square chip immediately left of the title. Uses the existing
iconForWindow(win)helper, so media-player, pdf-viewer, properties, text-editor, zip-viewer, word-editor, excel-editor, office-editor all light up correctly alongside the generic icon map. - Notification-routed Developer Portal status. New
onNotifyprop onDeveloperPortalPanel, wired topushNotificationfrom+page.svelte. All portal toasts ("Module draft created", "Approved", "Settings saved", etc.) now land in the desktop Notification Panel and pop a bottom-right toast.
Changed
- Developer Portal opens at 1340 × 820 instead of 1040 × 640 so the redesigned dashboard table and right rail are not cut off.
- Module Store window now locks aspect ratio (1480 / 860 via
windowAspectRatio) so resizing keeps the layout coherent. - Dashboard heading renamed from "Welcome back, hanabi.dev" to "Developer Dashboard".
- Module Store refresh button is always clickable; it now spins via a
.spinningclass + keyframe wheneverloading || !assetsReady. - Desktop right-click "Refresh" rewired from
refreshDesktopFolder()(folder-only) torefreshDesktop({ showLoading: false })so it actually re-pulls desktop, modules, jobs, readiness, and folder listings.
Removed
- Duplicate inner Developer Portal titlebar. The Portal B prototype's fake-chrome
.pb-tbrow (花 · Developer Portal — HanabiMatsuri SDK · minus/square/x) is gone. Only the real Hanabi window chrome shows now. A visually-hidden<h2>Developer Portal</h2>keeps the landmark heading accessible. - "All changes saved" floating pill that overlapped "+ New module" is removed; routed status events through the notification system instead.
- Module Store pill back button. The
.module-store-backheader pill is removed; the circular.gp-backbutton in the hero now carries the same selector so existing tests still resolve. Killed the now-dead pill CSS. - Module Store right "From your library" rail is dropped to give the main content the full width. Both the home and detail variants of the panel + ~70 lines of dead CSS removed.
Fixed
- Top gap above Developer Portal content caused by an earlier edit that left grid-template-rows expecting two rows when only one existed; the panel root is now
display: flex; flex-direction: columnwith the body takingflex: 1. Also restored the panel'scontainer-type: inline-size/position: relativethat had accidentally moved onto the sr-only heading. - Loading screen no longer flashes the workspace before the overlay appears. Desktop branch is now gated on
!loaderVisible; thetransition:fadewas replaced with deterministic mount/unmount so the swap is atomic. - Right-click context menu now dismisses itself the moment the user picks "New folder", "New text file", "Open in File Explorer", "Paste", "Settings", or "Refresh".
[5.1.0] — 2026-06-03 #
Added — Developer Portal "B" redesign
DeveloperPortalPanel.svelte is rebuilt as Portal B from the Claude Design bundle:
- Titlebar + sidebar shell with the 花 mark, account block, "New module" sakura pill, primary nav (Dashboard / Create module / Review queue with badge), "My modules" list with status dots and pulsing in-review dots.
- Dashboard with welcome heading, animated metric strip (Published / In review / Total installs + sparkline / Avg. rating), attention row for in-review / changes-requested / draft modules, segmented Table / Cards / List switcher with all three list variants.
- Module detail with back button, icon tile + title + status pill, four stat tiles, five tabs that slide an accent underline:
- Overview — what's-new changelog, permissions, sandbox info.
- Reviews — rating summary + distribution bars + reviewable feed with inline reply box.
- Versions — timeline with reviewer notes / changes / checks.
- Analytics — Option B board: smooth area chart with gridlines + endpoint bubble, ratings donut, install-source bars, conversion funnel.
- Settings — folder list, permission toggles, window size, unpublish / delete danger.
- Review queue with your-submissions section + incoming queue cards with validation checks, "Approve & publish" / "Request changes" that animate the card out with a toast.
- Create wizard: full-page direction-B step rail with direction-A field styling. Steps: Basics → Capabilities → Folders → Package (zip + icon / banner / screenshots) → Review. Submit hits create + upload in one shot.
- Toasts, count-up numbers, staggered entrance animations, area-chart line-draw, sparkline scale-Y growth, density toggle, container-query responsive collapse.
Added — Module Store redesign
ModuleStorePanel.svelte is rebuilt as the Google Play Games desktop storefront:
- Pure-black canvas, labeled left nav rail with avatar block + Home / Library / Search buttons + footer (Announcements / Activity / Submit feedback).
- Home: full-bleed cinematic hero with art-right / info-left layout, kicker, large 46 px module name (
h3for test compat), tagline, meta, green install pill, "View details" CTA, and a bottom-center dot indicator that cycles between the top 4 catalog modules. - Card rows: "Recommended for you" (
.module-gridwith all 7 modules) + "Top rated" (4 cards). 16:9 banner art, hover zoom, "Installed" / "Update" chip overlay, category tag. - Right "From your library" rail with aspect-ratio thumbnails and gradient name overlays + "More to explore" for uninstalled modules. _(Removed in 5.2.0 to give content the full width.)_
- Module detail (
.module-detail-page): full-bleed 588 px hero with circular back button, bigh1title, green dev link, icon-tile + stars + installs row, install pill + "Optimized" badge + Uninstall / Report buttons, and the ESRB-style "Sandboxed module" safety card pinned bottom-right with permission list. Screenshot strip with side arrows and lightbox. Two-column body: About / App support / Data & safety / Permissions on the left; Ratings & reviews (60 px score, distribution bars, sortable helpful/newest/critical, review list with verified avatars and per-review yes/no helpful) + Report form on the right. Similar modules grid at the bottom. - Library page: update banner + GP-style list rows with 56 px icon tile, name + dev + category, size pill, Launch + Uninstall buttons (overlay button pattern to avoid nested-button accessibility issues).
- Search page: large "Explore" title + rounded pill search input with clear button. Empty state shows category chips and a hint string; query state shows
.module-gridof matches under a "Search results" heading. - Loading page with centered card and progress bar reading
${assetProgress} of ${assetTotal} assets ready.
Removed
- ~3 000 lines of dead
.developer-panel/.developer-redesignstyles fromapps/web/src/styles.css(the predecessor of Portal B). - ~2 500 lines of dead
.module-store-panel/.module-*styles (the predecessor of the storefront redesign).
Test updates
desktop.spec.ts: the staged-publishing Playwright test walks Portal B's actual wizard (4 × Continue, then Submit for review), matches the new tab names (/Versions/), the new nav label ("Review queue"), the new queue button ("Approve & publish"), and the new toast body. Kept.developer-panel,.developer-page-heading,.developer-workspaceselectors stable.
[5.0.0] #
Pre-existing baseline before this changelog file was introduced.
[5.4.1]: ./CHANGELOG.md#541--2026-06-03 [5.4.0]: ./CHANGELOG.md#540--2026-06-03 [5.3.0]: ./CHANGELOG.md#530--2026-06-03 [5.2.1]: ./CHANGELOG.md#521--2026-06-03 [5.2.0]: ./CHANGELOG.md#520--2026-06-03 [5.1.0]: ./CHANGELOG.md#510--2026-06-03 [5.0.0]: ./CHANGELOG.md#500