Hanabi Developer Hub
/ Reference / What's new
Reference

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), and files.manage + the fs.* 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-sdk types, 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.native for the ffmpeg/imagemagick/libvips image, or network.fetch.broad for 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 with HANABI_DEV_SANDBOX_HEAVY=false. A new HANABI-Q009 error 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-xxxx code with a documented cause and fix. The codes are generated from one registry into docs/modules/error-codes.md, mirrored into the SDK's HANABI_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-Q009 dev-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/.xlsm files carry the OOXML MIME application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, whose substring "document" matched isDocumentFile's /document/i test. Because openWorkspaceFile (the double-click handler) checked isDocumentFile before isSpreadsheetFile, the workbook routed to the Word Editor. isDocumentFile now returns false for anything isSpreadsheetFile recognizes (and the loose /document/i catch-all was narrowed to /msword|wordprocessingml/i), and openWorkspaceFile now checks spreadsheets first — consistent with intrinsicOpenAppForFile. 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 default admin account 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 / startFolderDrag in FileExplorer.svelte were setting event.dataTransfer.effectAllowed = 'move'. Certificate Builder's handleDragOver (and every other module's drop zone) sets dropEffect = '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 to effectAllowed = 'copyMove', which is in the compatible set for both copy and move targets.

[5.5.2] — 2026-06-03 #

Fixed

  • Wrong-password attempts briefly flashed the loading screen. submitLogin was setting workspaceLoading = true and the "Signing in" message before awaiting login(). When credentials were rejected, the loader appeared for a frame and then jumped back to the login form. The workspaceLoading flip is now deferred until login() 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. windowPreviewAction clones the source article.window with cloneNode(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 sets muted = true, volume = 0, strips the autoplay attribute, and calls pause() defensively.

Changed

  • Volume Mixer moved out of Accessibility into a dedicated "Sound" page. Settings now has a new Sound entry between System and Apps, fronted by the Speaker icon. Accessibility is back to a single "Reduced motion" toggle. The Home overview surfaces Sound automatically because the card grid iterates navItems.

[5.5.0] — 2026-06-03 #

Added

  • Volume Mixer in Settings → System. New audio-mixer.ts shared 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/admin account is permanent and cannot be deleted; the currently signed-in account cannot delete itself. All flows go through toast notifications via the existing onNotify channel.
  • `portal-auth.ts` extensions. Exports createAccount, deleteAccount, updateAccountPassword, plus PortalAccount, PortalAuthState, PortalRole types. 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: 24px so the sign-in form sits dead-center.
  • Taskbar latency chip polished. Value + unit live in a flex container with align-items: center so 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-trailing and the third column is auto.

[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 setTimeout bailed 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 whenever loading or workspaceLoading flips, with a 1.5 s fallback timer for the edge case where the work finishes before the progress animation crosses 99.5 %.
  • HanabiLoadingScreen rearms its completionFired flag when targetProgress drops back below 100, so a second load cycle (logout/login, refresh) can fire onComplete again.

[5.4.0] — 2026-06-03 #

Added

  • Live taskbar window previews. Hovering a taskbar entry now clones the actual article.window DOM into the hover card and applies transform: 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-latency chip pings /api/auth/me every 6 s, measures the round-trip with performance.now(), and renders the result as XXX ms next to a pulsing dot. Tiers: < 120 ms green, < 320 ms yellow, ≥ 320 ms red, unreachable shows in grey. Both dark and light themes have tuned colors.
  • Multiple media-player windows. openMediaFile(file) keys each window as media-player:${file.id} instead of a singleton. A new mediaFilesByWindow map 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-stack with 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_VERSION chip 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. openTaskbarContext now anchors to the actual .task-button (via closest), left-aligns the menu with the icon's left edge (Windows 11 style), and sits it directly above the taskbar. Clamped to 8 … 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-zone is 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 permanent admin / admin account. Exports signIn, 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.ts lib: a localStorage-backed writable<DeveloperStoreState> typed with SystemModule, 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 with publisher: "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 via bumpVersion) 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 as rolled-back.
  • Real review + rating system in the Module Store. All hardcoded review arrays and synthetic distributions are gone. Reviews persist per (user, module) via submitReview; 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 postTicketMessage with from: '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.dev and 花 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.dev to Hanabi Matsuri System; support email defaults to support@hanabimatsuri.app.

[5.2.1] — 2026-06-03 #

Fixed

  • Settings → Background → Upload image scroll glitch. The hidden <input type="file"> was position: absolute with 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 as position: relative; overflow: hidden and stretches the input to fill the button at opacity: 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/drop handlers on every article.window that preventDefault on hanabi MIME types and route the drop through dispatchVfsItemsDropAtPoint, which uses document.elementsFromPoint to dispatch a hanabi-vfs-files-drop CustomEvent 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 from rows="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 onNotify prop on DeveloperPortalPanel, wired to pushNotification from +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 .spinning class + keyframe whenever loading || !assetsReady.
  • Desktop right-click "Refresh" rewired from refreshDesktopFolder() (folder-only) to refreshDesktop({ 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-tb row (花 · 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-back header pill is removed; the circular .gp-back button 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: column with the body taking flex: 1. Also restored the panel's container-type: inline-size / position: relative that 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; the transition:fade was 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 (h3 for 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-grid with 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, big h1 title, 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-grid of 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-redesign styles from apps/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-workspace selectors 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