Changelog
Last updated: October 28, 2026
Product updates from merged pull requests, newest first. Each day lists the changes that shipped.
October 28, 2026
- Pinch-to-zoom on a trackpad is smoother. The canvas now eases toward the zoom your fingers ask for instead of jumping by each uneven step the trackpad reports, and it redraws on every frame while it does. Animated zooms (clicking or dragging with the zoom tool, and fitting to a node) also redraw every frame now, where before they drew every other frame.
October 24, 2026
- Billing history and receipts now show both what a discounted top-up added and what it cost. A $25 top-up bought for $12.50 in the Halloween sale reads "Added funds · $25.00 in credits (Halloween Sale, 50% off)" at +$25.00 with "Paid $12.50" beneath, and its receipt lists the $25.00 in credits, a -$12.50 Halloween Sale (50% off) line, and Total paid $12.50. This applies to personal and team wallets; top-ups at full price and gift credits look as before.
- Halloween sale: credit top-ups are 50% off from October 24 through October 31. The discount applies automatically at checkout with no code to enter, every top-up size is half price, and a banner across the app and the Billing page shows how long it runs. Funds added to a team wallet are half price too; a team's monthly minimum and auto top-ups are billed at full price. The Add funds dialog shows what you pay at the sale price.
October 21, 2026
- Marketing tags can now count a person's first generation once, ever, instead of every generation. The new
first_generationevent fires only in the browser tab whose request claims that person's first generation on the server, never after a reload, in another tab, or on another device. It still respects cookie consent, and people who had already generated before this change never trigger it. - The analytics API now reports how much new users generate: for each weekly or monthly signup cohort, the average and median images, average requests and share who generated at all in each user's first 7 and 30 days, plus an overall row. A cohort's window stays empty until it has fully elapsed for every member.
October 20, 2026
- "Ask for changes" in a brand's guideline menu now works: describe what to change and the guideline board is edited using the brand's logo and reference images, replacing the old board only once the edit finishes. Before, the menu item did nothing.
- The canvas node menu's "View info" now reads "Hide info" while that node's info panel is open and closes it, and Ctrl+\ or Cmd+\ toggles the info panel for the selected (or last selected) node without firing while you type.
- A brand assigned to a prompt now reaches every image in the batch. Prompts with a connected input, such as a style image, previously left most of their options without any brand reference, so those options came back generic. Brand references also stay in the request when a prompt has many connected inputs, and a brand whose screenshots are still being analyzed now contributes its most recent ones instead of nothing.
October 16, 2026
- Shared canvases now resolve simultaneous delete and undo operations consistently. Switching files no longer waits for the file you left to finish saving: its last changes save in the background.
- Deleted nodes and connections on shared canvases stay deleted: every saved copy of the canvas now remembers what was deleted, so another collaborator's older copy, a running generation or a page refresh can no longer bring them back, and undo still restores them. Opening a canvas now also brings its saved copy up to date, so changes like resolved comments no longer flash back for a moment on reload.
October 14, 2026
- Promotions now come in three types: Discount, Signup credits (formerly Free credits) and the new Gift credits. A gift code works for anyone: new users get it at signup through the link, and existing users paste it under "Redeem gift credits" next to "Add payment method" on the Billing page. Each account can redeem a gift code once.
- Opening a gift credit link now takes you to Billing and adds the credits straight away with a confirmation, signing you in first if needed. Credits from Signup and Gift credit promotions now appear in Billing history, named after their promotion.
- Billing history and the discount banner now name a promotion by its promo code. A promotion's name and note are only shown to admins.
October 13, 2026
- The server's local copy of stored images is now a real bounded cache: it stays within its configured size no matter which process wrote a file, only removes files already confirmed in cloud storage, and serves anything evicted straight from cloud storage. A new cleanup command reclaims the space the old cache leaked, reporting first and never deleting a file that exists only on the server.
- Daily database backups reach off-site storage again now that the database has outgrown a single upload: dumps go up in parts and are checked after every upload, a backfill command catches up the days that were missed, a local dump is only deleted once its off-site copy is confirmed, and a backup health check (also shown in Admin stats) reports a failed, missing or overdue backup.
October 12, 2026
- Palettes opened from tools.diffui.ai now land as two inputs on the new canvas, both connected to the prompt: a "Brand color ramp" card with just your brand color's steps, the brand color you typed shown beside them, and the "Full color system". Every color is labelled by ramp and step behind the scenes, so a prompt like "make the header red 300" or "make the buttons brand 600" uses that exact color.
- Palettes opened from tools.diffui.ai now go straight to a new canvas with no confirm step, already connected to the canvas's prompt so Generate uses them as an input. Opening the same palette again, in any tab, returns to that canvas instead of making another, and a reload part-way through finishes the same canvas.
- A file whose link access is set to view or edit now opens read-only for signed-out visitors from its plain URL, not only from the copied share link.
- Palettes made on tools.diffui.ai can open straight into a new canvas: after a one-click confirm, the palette image lands as an input node with its exact sampled colors, and the link survives signing in.
- Button states now read the same in both themes: the light theme loses its drop shadow while busy and sinks properly when pressed, subtle buttons show the busy border and pick up the light gold, primary gained hover and keyboard-focus looks, disabled icons grey out in light as well as dark, and no state shows through on a disabled button.
October 11, 2026
- Opening a file now zooms and pans the canvas to fit all of its nodes, or centers on them when there are too many to fit.
- The canvas node menu now has a "View info" entry that opens the properties panel, and "Copy JSON" shows only for admins.
- Image stacks now animate consistently: left places the previous option on top of the stack, and right lifts the top card off to reveal the next one.
October 10, 2026
- Fixed missing image previews and account avatars in the installed ChatGPT/Codex editor, including high-resolution thumbnails and brand images.
- Diffui account connection now uses a branded sign-in and consent page, and the installed ChatGPT/Codex editor reliably receives sign-in results and live canvas updates.
- Diffui now opens in the ChatGPT and Codex sidebar with live canvas context, account connection, and Build in Codex; the installed plugin connects to production and keeps credentials and live updates synchronized across chats.
October 9, 2026
- Build image generation now accepts canvas image URLs as a reference image, not just build asset URLs: a /files/generations/… or /files/canvas-assets/… link works in absolute or relative form, a thumbnail link still uses the full-resolution image, and a project you cannot view is refused with a clear reference_image_access_denied message.
- A build asset request that fails no longer fails forever: retrying the same request queues fresh work instead of instantly replaying the stored error, build endpoints answer with a readable JSON error (never a bare 502 that the CDN replaces with its own page), and every server-side failure is logged with the build id and error name.
- Bulk node image downloads (the API route and the download_node_images MCP tool) now find images that live in object storage, were pasted in from another file, or have no matching database record, instead of reporting them unavailable; nodes that still cannot be downloaded say why.
October 7, 2026
- Buttons now have distinct selected, in-progress and pressed looks (a latched gold "on" state, a dimmed busy state with a progress cursor, and a held-down press), and switching between them updates the button in place instead of redrawing it.
- Backend CI no longer installs libwebp from apt (a frequent timeout): it builds with a nolibwebp tag that stubs WebP encoding, while production builds still use native libwebp.
- Multiplayer cursors and cursor chat stay responsive with coalesced cursor-only painting, reliable chat expiration, throttled movement updates, and cached text layout.
- N and Shift+N on the canvas now step through frames in a smarter order: connected frames stay together with parents before children, slightly uneven rows still read left to right, and a full lap visits every frame exactly once.
- New blog post: Generation Cost Study compares five landing pages built by bare Opus 5.5 and GPT Astra against each model building from a Diffui design, with screenshots, per-page costs, and token counts.
- Build with bb is now plugin-only: it is gone from the Diffui app entirely — no menu item, no hidden action, and nothing in your browser that talks to a bb running on your machine. The bb plugin carries its own copy of the canvas, so bb-only actions ship there, and Diffui keeps hosting the bridge the plugin builds through.
- MCP clients older than diffui.ai 1.0.14 now get a clear "update required" message with steps (use npx -y diffui.ai@latest, restart, rotate your API key), and the launcher keeps its cached binary current and tells you when an update is out.
- High-quality build images now use gpt-image-2.5 (sunburst) by default, which fixes transparent-background generation, and admins can pick the build image model on the Generators page.
- Canvas comment boxes grow as you type instead of clipping a long comment behind a scrollbar: both the new-comment composer and the reply box expand up to about eight lines, shrink back when you delete, and the popover slides up to stay on screen.
October 6, 2026
- Security: the MCP prepare_reference_upload tool no longer echoes your API key; large uploads now use a single-use upload link that expires in 15 minutes.
- API and MCP clients can bulk-download the full-resolution image on top of each canvas node as a ZIP (new download_node_images tool), without a browser.
- The canvas works on touch screens: pinch to zoom, drag with two fingers (or one on empty canvas) to pan, tap to select, drag a node to move it, double-tap like a double-click, and long-press empty canvas to marquee-select.
September 30, 2026
- MCP agents can now create brands and upload product screenshots or a logo to them with the new create_brand and upload_brand_images tools, including large files via a direct binary upload.
- A brand's guideline board now generates automatically once 10 references finish analyzing, instead of waiting for the Generate guidelines button.
September 29, 2026
- Build SVG icons — text-to-SVG and vectorization — now use Quiver's Arrow 2 Telos model instead of Arrow 1.1, ahead of Arrow 1 retiring in October.
- Invites is now Promotions, with signup-only credits and checkout discounts, migrated campaign links, clear billing offers, and shared admin controls; creator matching and payouts are retired.
- Static-page assets now load on demand, landing demos pause when offscreen or in a hidden tab, and the editor no longer downloads hidden landing-page images.
- Copy and paste complete canvas nodes, image stacks, and connections across files and accounts without waiting for image transfers, with one-hour snapshots and current-state fallback.
- The Move dropdown now uses the Add team plus icon for New folder, separates only spaces with dividers, and gives the folder-name input a single gold focus outline.
- API keys now support explicit team access, MCP agents can create files in team folders, and a shared Move dropdown moves files and brands between personal and team spaces.
- Admins can publish HTML sites up to 250 MiB at permanent public URLs, with owner-only updates and deletion, R2-backed content, and a compact design and build-info header.
- Fixed a wallet-lock ordering deadlock when multiple checkout payments complete at the same time.
- Reduced repeated background-tab socket reports while preserving actionable disconnect errors and reconnect behavior.
- Build PBR maps now run as durable jobs with reconnectable live results, avoiding long-request timeouts and duplicate charges on recovery.
- Fixed generation conversion tracking for canvas generations, edits, and repeat requests while respecting cookie consent.
- Agent-generated build images are now downloadable immediately, even when their optimized display file is still being encoded.
- Added creator offers and campaign reporting, invite notes, Azure MAI image generation, and fixes for configured editing models, live connections, and build API errors.
- The canvas brand picker now loads brands from the file’s team when opening a file or switching between team and personal files.
- Deleted canvas nodes and connections now stay deleted through save conflicts and delayed sync updates, while undo and redo still restore or remove them correctly.
- Canvas thumbnails now have clearer shadows, binary arrow visibility, and pan-first Space/middle-button gestures; headers avoid clipped text, output clicks place prompts reliably, and billing returns and non-web image prompts are improved.
- Canvas variations now have responsive thumbnails, previous/next controls, and undoable drag-out moves with distance-based tilt; generation supports Cmd/Ctrl+Enter, and Billing offers a direct return to your design after a top-up.
- The homepage now features a fixed linen backdrop illuminated by demo nodes, clearer controls, improved mobile framing, and smoother connections between nearby nodes.
- A new Zoom tool supports smooth click and rectangle zoom, tap/hold Z, and Space-to-focus image previews; image deletion, empty thumbnails, and header visibility are also improved.
- A private creator-partnership brief now walks partners through the Diffui-to-agent workflow, includes a sample video and onboarding credit, and provides downloadable transparent logo assets.
- Canvas image downloads are now real PNG files instead of WebP images carrying a misleading
.pngfilename. - Billing history now aligns amounts consistently and keeps receipt links visually quiet until you hover or focus them.
- Billing history now includes a downloadable PDF receipt for every wallet payment. Team receipts name the workspace and its billing contact, include the purchase order when one is saved, and carry Diffui, Inc's legal business details for accounts payable.
- An AI assistant running in your browser can now work your canvas directly. In browsers that support WebMCP — the ChatGPT in-app browser, and Chrome 149+ with WebMCP testing turned on — a project page offers the assistant a small set of canvas tools, so it can read your board, add a design node with a prompt, generate options and report back what came out, select a node, and pan or zoom to what it is talking about. It works the board the same way you do, with the same permissions and the same credit checks, so you can both be on the same canvas at once. Nothing changes in browsers without WebMCP.
- Two-finger panning on the canvas no longer sends your browser back a page. A horizontal trackpad swipe over the board now always moves the board, on Chrome and on Safari, instead of occasionally being read as the browser's back or forward gesture and dropping you out of the project. Pinch-to-zoom is unchanged, menus and panels on the canvas still scroll on their own, and back and forward still work everywhere else — buttons, keyboard shortcuts, and swiping outside the canvas.
- Copy image on a canvas design now puts only the picture on your clipboard. Pasting into Slack, Notes, or a document gives you the image on its own, instead of the image followed by a block of the design's JSON. Pasting back into Diffui still rebuilds the design with its prompt attached, because that part of the copy now travels in a format only Diffui can read.
- Asking for a transparent background on the canvas — "no background", "transparent PNG", an isolated cut-out asset — now renders with a real alpha channel through gpt-image-2, and the result sits on a checkerboard in the node, the option grid and the focus preview so you can see the transparency instead of guessing at it. Prompts that do not ask for it generate exactly as before, and reading the request costs no extra model call: the prompt expansion that already runs now reports it.
- Generating on a prompt frame that is missing from the saved file now fails instantly with "the prompt node is not in the saved canvas" instead of rendering (and charging for) a full set of images that then has nowhere to land. Nothing is queued, nothing is billed, and the retry is a save away.
- Generations that can only ever fail the same way — a prompt frame deleted mid-render, a build reference image URL that points outside your build — now stop on the first attempt instead of re-rendering every image up to three times before giving the same answer. Provider rate limits, which a later attempt can get past, are retried again.
- Build-step image generation can now produce PNGs with a real transparent background: pass
transparentBackground(high quality) on build image generation and the asset comes back with a native alpha channel from the image model itself — no separate background-removal step or extra charge. Background removal remains for images you already have. - A sign-in that fails at the provider (an expired code from the back button, a missing email, an invite problem) now returns you to the sign-in dialog with a plain-language explanation and a retry, instead of dead-ending on a page of raw JSON. The dialog also only offers the sign-in providers this server actually has configured.
- Live wallet balance, the brands list, brand detail pages, and canvas presence no longer go quiet in idle tabs: those connections now stay alive the same way the canvas's own live connection does, instead of being dropped by proxies after a stretch of inactivity and showing stale balances until a reconnect.
- When the payment provider rejects a wallet top-up, checkout now fails with a clean "payment provider error" instead of echoing the provider's raw error response into the page.
- A brand reference whose image analysis failed now says "Analysis failed" (with the reason on hover) instead of spinning on "Analyzing..." forever, and the backend stops re-running that failed analysis every two seconds.
- A prompt the image provider's safety system refuses now fails right away with that reason, instead of being retried up to seven times per image (and the whole batch up to three times) before showing the same rejection minutes later.
- Fixed "Generation failed" / "Generation never started" appearing on canvas generations that actually completed. Reconnecting to a file no longer clears in-flight slots that a running job still owns — a slot is only cleaned up with positive evidence that nothing is rendering into it — and if a slot does get deleted mid-generation, the finished image now attaches back onto its prompt node instead of going missing. When an image truly has nowhere to land, its charge is refunded automatically so retrying never bills twice, and a node that recovers no longer keeps a stale failure message next to its finished images.
- The bb plugin moved into its own repository: install it from github.com/jjcm/diffui-bb (
bb plugin install https://github.com/jjcm/diffui-bb) instead of the Diffui repo. Diffui keeps serving the embed contract the plugin runs against — the bb bridge, and bearer-only cross-origin access to the API and your images — so the canvas in bb still works against your own instance. - The How to design in an existing style walkthrough now has a video of prompting with your brand.
- Build with bb only shows inside the bb plugin, not on diffui.com.
- Pasted screenshots show up on the canvas immediately from the clipboard bitmap, while the upload and analysis run in the background. Generating from a just-pasted image waits until that upload has landed.
- Learn is now a plain header link to a Learn index that lists every walkthrough, instead of a dropdown menu.
- The marketing site has a new Learn menu in the header with three animated walkthroughs: How to create a new site from scratch (moved out of the Use cases menu — the old /for/new-site address now redirects), How to design in an existing style (paste a real granola.ai screenshot, prompt for a dog collar recorder product page, then turn a set of pasted granola.ai pages into a Granola brand and prompt with it), and How to build your site (the copy-for-agent handoff on a fresh Copperline Coffee site, with a slot for a walkthrough video and the models we recommend for builds).
- The canvas inside bb is now literally Diffui's canvas: the plugin mounts the same canvas the app does — same tools, same hit-testing, same pan and zoom, same menus, same option stacks — with only its colors swapped onto bb's theme, so it follows bb's light and dark modes. bb's sidebar now lists just the files you made in bb or opened into bb, rather than everything in your Diffui account, and the panel's browse grid reserves each cover's real shape so thumbnails never stretch or reflow while they load. bb draws one title bar per page and gives plugins no way to hide it, so the plugin no longer draws a second one: its Canvases, New canvas, and Open in Diffui controls now sit in bb's own bar.
- Diffui now plugs into bb: install the diffui-bb plugin from the Diffui repo and bb gets a native Diffui page — browse canvases, open one as a real in-bb canvas view (no iframe), select options, and Build with bb spawns a thread with the design images attached; the same canvas can sit beside any thread. Agent tools create canvases and generate options, and an @diffui mention pulls a canvas or brand into any message. On the Diffui side, canvases started from bb are marked for it, right-clicking a design offers Build with bb (direct to your local bb when paired, relayed through Diffui otherwise, clipboard prompt as the last resort), and when the bb thread finishes the canvas gets a toast.
- Shared brand pages now follow light mode, and the admin area has more consistent theme-aware charts, controls, spacing, and corners, plus a new Team signups metric split between Professional and Enterprise plans.
- Opening a brand page is much faster: the server no longer checks storage for every reference image's preview files before answering (on brands with many references this alone took seconds), it just links the previews and builds any missing one on first view. Switching to a different team while looking at a brand now lands on that team's Brands page instead of staying on a brand that belongs to the previous team.
- Team billing history now lists the monthly minimum charges and paid invoices alongside manual and auto top-ups. A charged minimum used to show in Stripe and in the wallet but leave the Billing history section saying "No billing history yet".
- Teams are live, and there is a release post about them: Design together covers the shared team space, multiplayer files with comments, and the unified team wallet, with real screenshots of each.
- New Security page: Diffui, Inc. completed a SOC 2 Type 1 audit with Prescient Assurance, and the page explains what a Type 1 report covers and how to request it. It is linked from the footer next to Privacy Policy and Terms of Service.
- A cancelled team can restart its monthly minimum again: Team settings → Billing shows a Restart monthly minimum button under the plan picker during the wind-down, and a team locked to view-only gets Add funds and Restart controls there too. The move of Cancel plan under the picker had dropped them.
- Fixed generations going missing when an agent and an open canvas worked on the same project at once: a browser tab saving a copy of the canvas it read before the agent added its prompt node used to delete that node, so the images it generated were charged for but never appeared. Canvas saves are now checked against the version they were made from, a tab picks up nodes it has not seen instead of overwriting them, and a generation that truly has nowhere to land reports an error instead of quietly succeeding.
- Canvas tool, context menu, and node toolbar usage is now measured, so the tools people actually reach for can guide what gets built next. It is our own product telemetry — tool ids and menu item ids only, never prompt text, images, or anything you type — and it batches in the background without touching canvas performance.
- Fixed a script error that stopped the signed-in app from loading at all — a duplicated declaration left over from a merge made the whole page fail before it could paint. A test now guards against the same mistake reappearing.
- The Brands page header now uses the same spacing as Projects, and brand cards show only the name and how many reference designs are ready. The empty-state glow stays on the empty view, and the brands column keeps the same bottom padding as the rest of the app.
- Team billing no longer has a Monthly minimum section. Owners cancel from a danger Cancel plan button under the plan picker, which opens the same confirmation as before.
- A brand's guideline board now always shows at full resolution, so the fine print, type specimens, and swatch labels on it stay readable — no thumbnail can be substituted for it, whichever page you arrive from. Brand cards, references, and logos still use the small, fast previews. The brand page also fills the window: the middle and right columns now run to the bottom edge alongside the sidebar instead of stopping short and leaving a strip of page background under them. And the confirmation for deleting a file now says "Delete file" and looks like every other confirmation in the app.
- The Terms of Service, Privacy Policy, Changelog, and account-deleted pages now follow your system light or dark setting like the rest of the site, instead of always showing the dark theme.
- Signed-in pages now arrive with their data already in the page instead of asking for it after the scripts load, so your files, folders, brands, a brand's details, and team settings appear in the first paint. Opening the app a second time reuses the scripts your browser already has rather than re-checking every one of them, and if your workspace is a team you get the team's data instead of falling back to a slower second round of requests. Thumbnails throughout the app are now picked to be at least twice the size they are drawn at, so nothing looks soft on a high-resolution screen: small previews get small files, and the larger cards, file tiles and brand images get sharper ones instead of a blown-up thumbnail.
- Team owners can now cancel a team's monthly minimum from Team settings → Billing. Cancelling stops the monthly minimum being charged right away and turns off auto top-up, and the team keeps working exactly as before for 60 days — the wallet keeps its balance and one missed monthly minimum is forgiven. After that the team becomes view-only: everyone can still open, read, and export every file, but nobody can edit or generate until the team wallet is topped back up to $50, at which point editing switches back on by itself. A team whose wallet still holds $50 or more is never switched to view-only — it keeps full access and simply spends its balance down. Your files are never deleted at any point, and the owner can restart the monthly minimum at any time. Team settings shows exactly which state the team is in, how many days are left, and what it would take to get editing back.
- The pricing, founders, and bootstrappers pages now say "no subscription on Individual" rather than "no subscriptions" flatly, and spell out that a team commits to a monthly minimum which is credit in its wallet rather than a fee. The Terms of Service gained a "Team minimums and non-payment" section covering the same ground: what cancelling does, that a team behind on payment becomes view-only rather than losing anything, that content is never deleted or made inaccessible over billing, and that a remaining wallet balance is never forfeited and counts toward restoring access.
- Images across the app now paint a soft blurred preview of themselves the instant a page appears, which sharpens into the real thumbnail as it loads — no more empty gray boxes while a grid fills in. Pages and API responses are also compressed on the wire, deep links preload just the scripts they need, settings sections load only their own panel, and the fonts no longer hold up the first paint.
- Opening the app no longer flashes raw dialog text and then a lone top bar on an empty page before your files appear. The projects page now paints once, as a complete shell — sidebar, folders, and files together — and gets there faster: the scripts and the session, team, folder, brand, and file requests all start at once instead of one after another.
- Create team now charges the card you enter on the form. The card fields are a real Stripe form (previously they were decorative and the charge silently used whatever card was on file), a saved card is offered as a clearly-labeled choice, the logo you pick is saved onto the new team, and a declined charge stays on the page with a route into team billing instead of redirecting past the warning.
- Working in a team now checks the team wallet, not your personal one. A member of a funded team can create files and generate even with an empty personal balance, and an empty team wallet says so up front instead of failing mid-generation.
- Re-adding a team owner's email in Team members can no longer demote the owner. Re-adding anyone else still changes their role, which is how role changes work today.
- Only a file's owner can move it into a private folder. A teammate with edit access used to be able to file your shared work into their own private folder, hiding it from everyone's lists — including yours.
- Your "{name}'s files" folder inside a team is now private in fact, not just hidden from the sidebar. Being on the team used to be enough to open, edit, or move one of those files if you had its link, even though the folder never appeared in anyone else's lists. Teammates now get told no, including team owners and admins. Files you deliberately share from that folder still open for the people you shared them with, and shared team folders are unchanged.
- A folder made in a team is the team's folder: every member lists it and can open it, whoever created it. Asking for a team folder no longer files it away in your personal space, your "{name}'s files" folder inside a team is still yours alone, and personal folders stay personal.
- Create brand from a canvas selection now puts the brand in the same space as the file, so a team file no longer creates a personal brand. Team brands are shared with every member: anyone on the team can see them, use them when generating, and add or edit references.
- Localhost sign-in now takes an email instead of a fixed admin button, so you can hop between users while debugging. This login is disabled in production.
- Account billing is now a stack of wallet, auto-top up, payment methods, and top-up history cards. Daily spend moved to Usage.
- Files someone invites you to now show up in a Shared with me folder under your "{name}'s files" in personal space, and in personal Recents — the file itself stays in the owner's folder. Shared with me only appears in the sidebar when at least one file has been shared with you.
- The Add funds dialog closes with a proper icon instead of a typed letter X, and its footnote now spells out that saved cards live with Stripe rather than on our servers.
- Saved payment methods can now be managed instead of only listed: each card has a menu to make it primary or remove it, so the primary card is no longer just whichever one you paid with last. Removing the primary card promotes another one, and removing your last card switches auto top-up off rather than leaving it to fail. On a team, only owners and admins see those controls.
- Canvas noodles now end in a 4×4 cap at each port. Selecting a node still draws the input/output handles on top of those caps.
- Billing now shows saved payment methods and wallet billing history instead of generation usage — that list stays on Usage. Team settings Billing matches the personal page: team wallet, add funds, auto top-up, daily spend, cards, and credits, plus the plan picker.
- Generating in a team file now charges the team's wallet and only shows up on that team's usage page — it no longer bills or logs against the member's personal account. Opening a team file shows the team wallet in the nav.
- The canvas nav dropped Brands and Settings, and the file name now has a menu to rename, move, or delete the file. Rename edits the title in place; move lists folders in the current space (and can create one); delete asks first.
- The canvas crumb no longer prefixes the team name — it shows the folder the file is in (or Recents), then the file title.
- Refreshing or returning to the projects page no longer parks the team switcher on the first space when you were actually in another team.
- The personal space in the switcher is now "{name}'s space", so it no longer shares a name with the "{name}'s files" folder inside a team (or in that personal space).
- Team files created from Recents now land in your "{name}'s files" folder instead of floating unfiled, and opening one no longer labels the canvas as your personal Files or sends that link to the personal account. The crumb shows the team (and folder, when there is one) and takes you back there.
- Per-image pricing moved up: a design is now 17¢ on Individual, 22¢ on Team, and 26¢ on Enterprise — Individual is still exactly what the model costs us, and Team and Enterprise still add the same 30% and 50%. High-quality build-asset images follow the Individual rate at 17¢; every other asset fee is unchanged.
- Generating on a shared board now costs one generation. When several people had the same file open, each of their browsers could fire off the same generate, so one click quietly bought a second set of images and charged a guest's wallet for work they never asked for. The person who clicked owns the run; everyone else just watches it come in.
- The double-click loupe now plays for everyone in a shared canvas: when a collaborator double-clicks an image to start a prompt, their thumbnail lift animates on every connected screen — including share-link viewers — at the right spot on the canvas no matter how each person is panned or zoomed.
- Opening someone else's file from a share link no longer starts the canvas tutorial over their board — you came to look at their work, not to be taught the gestures. Your own first canvas still runs the tutorial, including when you open your own share link, and a guest visit no longer counts as tips you have already seen.
- The canvas editor is now designed for light mode instead of staying dark inside a light app: the canvas plane, prompt boxes, tool rail, node headers and stacks, connection wires, right-click and dropdown menus, the properties and file panels, comments and the Share dialog all follow the theme, with contrast tuned for a light surface. Dark mode looks the same as before.
- The marketing pages now use the same three corner sizes as the app — cards and media frames share one radius, buttons and small tiles another — and the canvas's own right-click and dropdown menus joined the app's menu family, dropping their hairline outline for the same shadowed edge.
- The pricing page's detailed fee breakdown now compares Individual, Team, and Enterprise side by side, lined up under the plan columns. Team and Enterprise add their plan margin (30% and 50%) to the same at-cost rate, so an image asset is 1¢, 1.3¢, and 1.5¢ across the three plans. Those sub-cent prices are what the wallet actually charges: billing now counts tenth-cents, and nothing is rounded up at checkout.
- Settings gained a Usage section that shows what your generations cost. Account settings → Usage lists your own spend; Team settings → Usage lists every member's spend inside that team. Each generation is one row with its quantity and unit price, so a prompt that produced nine designs reads as a single "9 × 17¢ = $1.53" line instead of nine separate charges.
- Corners across the app settled on three sizes instead of five: buttons, icon buttons, single-line inputs, and menu rows share one soft corner, cards and dropdown windows a rounder one, and canvas prompt boxes the roundest. Same-sized controls sitting next to each other — the sort picker and the view icons, or the New file button and the team switcher — now match.
- Dropdown, popover, and right-click menus dropped their hairline outline; their shadow alone lifts them off the page. File cards on the projects page lost a doubled outline around their cover art too.
- Settings now slide in over the sidebar instead of taking you off your files: "Team settings" in the space switcher and "Settings" in the user menu slide the sidebar left and reveal a Team Settings or Account Settings pane, with a back control that slides right back. Team settings covers General (name and logo), Billing (plan, per-image rate, and the monthly minimum), and Team members — where each member's images generated and spend in that space are now listed, and where you can add anyone with a Diffui account. Account settings keeps Profile, API, Billing, and Referrals a click away. The Brands list also dropped its "No brands yet" line; an empty space simply shows All brands.
- Team pricing dropped to 17¢ per image on Professional and 20¢ on Enterprise, each with a monthly minimum ($50 and $300) that is credited to the team's unified wallet for members to spend on generations rather than charged as a seat fee. The public pricing page now compares Individual, Team, and Enterprise side by side, and Enterprise buyers can email
[email protected]about volume discounts and invoicing. - Creating a team is now just a name, a logo, and a plan: the invite panel is gone, and the new team opens on Team settings → Team members, where the people you want are added by email.
- The projects sort picker now matches the sidebar's team switcher — same button, same chevron, same menu, with a check mark on the order you are using.
- Every menu on the projects page now looks like one family: the team switcher, the account menu, the sort picker, and the right-click menus share the same surface, rows, spacing, and a lighter drop shadow with a tighter edge.
- The projects page also reads as a set of sizes now — file cards and menus are rounder than the controls in the toolbar — and buttons across the app pick up a matching soft corner.
- The projects page can now be sorted by when a file was created, not just when it was last edited: a sort picker in the toolbar offers newest or oldest first for either date, and list view gained a Created column next to Edited.
- Settings gained a Referrals page: copy your personal referral code or link, and earn $5 in wallet credit the first time someone who joined through it tops up. The payout lands once per person you refer, and you can paste a code you were given there too (before your own first top-up).
- Errors reported from the browser now carry a specific name (for example
project_websocket_closed_1006or the operation that failed) instead of the generic "Error" every JavaScript error is born with, so error analytics point at the actual problem. - Asset generation during a build (icons, images, textures, maps, background removal) now waits up to four minutes instead of two, and reports progress while it renders — a slow SVG no longer gets cut off partway through and retried by the coding agent.
- The canvas Edit tool (E) now works like the rectangle tool: you can start the selection anywhere, including off the image, and it snaps to whatever image the box mostly covers. It still never leaves a stray prompt node behind — a box that misses every image simply does nothing.
- Holding Alt with the pointer selected now clearly lights up the Duplicate tool (and dims the pointer) so it is obvious the next drag will copy instead of move; letting go of Alt hands the highlight straight back.
- The canvas toolbar gained two tools and proper tooltips: Edit (E) draws a selection inside an image and opens the edit dialog, Duplicate (D) makes pointer drags copy a node instead of moving it (and lights up whenever you hold Alt with the pointer), and hovering any tool now shows a dark bubble with its name and shortcut instead of the browser's tooltip — after a brief pause the first time, then instantly as you sweep across the rest.
- Fixed server-side Google Ads conversions failing to record for visitors without a Google click id: the upload no longer sends hashed email/phone on their own (which Google was rejecting as an unenabled "Enhanced Conversions for Leads" event) and instead sends the browser IP so the conversion is accepted and de-duplicated against the website tag. For visitors in the EEA, UK, or Switzerland the IP is left out per Google's data policy (Meta reporting is unchanged).
- "Add team" in the sidebar switcher now opens a full Create team page instead of a browser prompt: name your team, preview a logo, pick a plan, and line up invites with their roles before creating.
- Teams now have a plan that sets what they pay per generated image — Professional at 19¢ and Enterprise at 25¢. The plan is chosen when the team is created, shown next to the team name in the sidebar, and charged on every image generated in that team's space; personal files keep their existing per-generator price.
- The + next to Folders and Brands in the sidebar now creates the folder or brand right away, opens it, and puts the cursor in its name in the sidebar — no more naming dialog. What you type shows up live in the projects header or the brand's name field, and is saved when you press Enter or click away.
- Fixed the All brands page never showing the brand card grid after the sidebar redesign; brands beyond the sidebar's top four are reachable again.
- Team-space brand lists no longer jump back to personal brands after a live update.
- Redesigned the browse-page sidebar: your profile row on top (with a Settings / Log out menu), a Recents view showing every file in the active space, the New file button, a team switcher (Personal + your teams + Add team), your folders, and your top brands with an "All brands" link — and the browse page no longer shows the top bar.
- Brands list now includes how often each brand has been used in generations, so the sidebar can surface the most-used ones.
- New
GET /api/analytics/attribution/dailyread: daily (or weekly/monthly) rows per UTM combination, with signups, activated users, paying users, and top-up count and revenue each credited on the date they happened, so campaign spend can be divided by campaign outcomes.utm_contentandutm_termnow survive signup and can be grouped on for signups from this release onward — earlier signups never stored them and read asunknown.activated_usersandtopup_countjoined the global analytics metrics. - Fixed the projects-page context menu having no visible hover in light mode; menu items now use a theme-aware hover/focus wash.
- Throttled generation-worker stuck/saturation scans and tightened claim-recovery signals so ops events stay quiet under brief claim blips.
- Generation worker now reports stuck jobs, claim outages, and sustained queue saturation as operational error events, so a DB blip can't leave a silent backlog.
- Fixed the canvas pixel-edit waiting effect vanishing a few seconds into an inpaint and the original image briefly appearing as a new stack entry; the effect now stays up until the edited image lands.
- Websocket
/watch,/stream, and/collabreconnects now stop on authentication failure (401 / session expired) instead of retrying indefinitely, and use exponential backoff with jitter (1 s–30 s) for transient disconnects. Public share viewers and embed consumers are exempt from the session probe so anonymous canvas access is unaffected. A "Session expired" toast appears when auth failure is detected. Server-side 401 logging on these endpoints is suppressed as defense-in-depth. - Migrated Google Ads server-side conversion uploads from the deprecated ConversionUploadService (Google Ads API) to the Data Manager API (
events:ingest). - Removed placeholder marketing pages (/for/creatives, /for/enterprise, /for/agencies) and returned 410 Gone for those paths plus /for/creators so search engines deindex them.
- Fixed the stretched Reddit feature image on the Show HN blog page.
- The blank seed prompt on a new canvas now cycles starter prompt ideas in its placeholder the same way, until you start typing.
- Dragging a new prompt off a screen you already generated now types suggestions into the empty prompt box for you: the pages a visitor would go to next from that screen, like "Show me the Visit page" or "Display the collection page. Include a left sidebar with filters." They cycle until you start typing your own.
- New canvases now come with a short set of coaching tips: example prompts to start from, how to pick between the options a generation returns, how to drag a new screen off one you like, how to hand a screen to your coding agent, and how to turn five screens into a brand. Each tip mimes the action with a faint ghost cursor — the fork tip draws the real connection noodle out to a half-size prompt box — until you do it yourself, and tips can be dismissed or skipped.
- Starting your first prompt now pops a note in the bottom-left corner explaining that generation takes around 90 seconds and that you can paste screenshots onto the canvas as inputs. It counts itself down and disappears after ten seconds.
- Canvas nodes now have a "…" button in the header instead of the download icon. It opens the same menu you get from right-clicking the node, and that menu has a new "Download image" item.
- Updated the Privacy Policy to disclose that hashed identifiers (SHA-256 email, name, phone) are shared with Meta and Google for conversion measurement, which may count as "sharing" or a "sale" under the CCPA/CPRA, and to point at the "Do Not Sell or Share My Personal Information" and Global Privacy Control opt-outs.
- Cookie consent is now geofenced: EEA and UK visitors keep the opt-in notice, US visitors get analytics and ads by default with an opt-out (including a "Do Not Sell or Share My Personal Information" footer link), Global Privacy Control is honored automatically and outranks an earlier choice, and any region we cannot determine falls back to opt-in.
- Consent choices now drive Google Consent Mode v2 signals, and decide what the server-side conversion report may include.
- Dismissing the US cookie notice is now recorded as a dismissal rather than as consent, so turning on your browser's Do Not Track / Global Privacy Control signal afterwards still switches ads and analytics off.
- Conversions are now reported to our ad platforms from the server as well as the browser, so the visitors whose ad blocker silently drops the browser report are counted once, and only once.
- Running out of credits on the canvas is no longer silent: generating now queues only what your wallet covers, tells you what it could not start, shows the top-up prompt, and leaves failed images with a clear error and a Retry button instead of a placeholder that spins forever.
- Share links set to "anyone with the link can view" now open the board straight away for people who are not signed in. They join as an "Anonymous" viewer in multiplayer presence and can leave comments, but cannot change the board itself. A Sign in / Sign up button sits in the top-right corner.
- Fixed the compressed display images that occasionally failed to save when many generations finished at once, so previews and thumbnails now load at full quality every time.
- Fixed duplicating a canvas project failing when the source had no thumbnail yet (
thumbnail_statusNOT NULL). - Image generation can now run in its own worker process, so a routine site deploy no longer interrupts generations already in progress. Live progress still streams to the browser exactly as before.
- Sharpened the Diffui MCP prompt-node guidance for agents (diffui.ai 1.0.11): one node holds one prompt, distinct designs each need their own node, and a whole exploration stays in one project.
- Clarified Diffui MCP prompt-node rules and shipped them in diffui.ai 1.0.10: distinct screen directions now require separate one-image prompt nodes in a single project.
- Moved the image generation queue into its own internal package behind a progress-publishing interface, groundwork for running generation in a separate worker process. No change to how generation behaves today.
- Added cohort retention curves: a Retention admin view showing what share of each signup cohort is still generating on day 1, 7, 30, and beyond.
- Raised the image generation concurrency ceiling from 10 to 100 jobs at a time, so bursts of requests start generating right away instead of waiting in line.
- Added UTM campaign attribution plus Funnel, Segments, and Attribution admin views, so signups, generations, and revenue can be traced back to the ad or link that produced them.
- Added top-referrer analytics and automatic database compaction for error history and collaborative canvas data.
- Added scoped analytics keys: admins can mint read-only tokens that expose the analytics time series and nothing else, each labeled and revocable on its own.
- Fixed low-contrast headlines and off shading on the Founders and Bootstrappers pages in light mode.
- Let shared project viewers mint agent build links for images and assets they can view.
- Added N / Shift+N keyboard shortcuts to jump between canvas frames in reading order.
- Deduplicate database backups to one dump per UTC day and add a guarded script to prune verified local R2 files after migration.
- Added a public Changelog page linked from the footer.
- Overhauled the landing page architecture.
- Prevented ad blockers from taking down the app when gtm.js is blocked.
- Fixed stale blog client caches after the Show HN launch.
- Added a Show HN blog post with interactive demos.
- Added a weighted text expansion experiment.
- Raised generation job worker slots to 10.
- Added generate grip marks and fixed plunger snap-back.
- Routed prompt-input facets before expansion.
- Limited prompt inputs to MySQL TEXT capacity.
- Fixed /app load when cookie consent is blocked.
- Recovered canvas generations after socket interruptions.
- Improved canvas paste placement near the viewport and added [ ] z-order nudging.
- Added consent-gated GTM lifecycle conversion events.
- Fixed weekly analytics bucket totals.
- Excluded admin users from analytics.
- Added a cookie consent banner for Meta Pixel.
- Added a light theme for the landing sign-in modal.
- Allowed queuing stack variants during canvas generation.
- Improved MCP canvas inputs and build image tools.
- Preserved agent build asset results.
- Prevented multi-option grids in MCP generations.
- Bumped the diffui.ai npm package to 1.0.7.
- Let MCP builds use permanent API auth instead of temporary tokens.
- Sanitized seed context for new page expansion.
- Added durable image-generation recovery.
- Required fresh compositions for new pages.
- Required fresh illustrations on new-page expansion.
- Updated pricing page details and theme.
- Added first-party campaign analytics.
- Launched the Diffui MCP blog.
- Added a review-only MCP test login.
- Improved MCP OAuth metadata discovery.
- Added OAuth and domain verification for hosted MCP.
- Added MCP tool safety annotations.
- Documented generate_options timeouts as recoverable, not failures.
- Logged MCP requests before the notification branch.
- Logged MCP tools/call transport shape to diagnose client-side timeouts.
- Defaulted MCP design images to local download instead of markdown/inline.
- Added copy-ready MCP option image markdown.
- Defaulted MCP design images to markdown and purged stale installs.
- Defaulted MCP design images to markdown and purged stale installs.
- Fixed MCP image rendering for non-Cursor agents.
- Renamed the MCP npm package to diffui.ai.
- Preserved theme in prompt-expansion fallback.
- Added a canvas Create brand flow from multi-select.
- Improved MCP CLI install, API settings, and Cursor integration.
- Removed the backup lifecycle configurator.
- Added shared testdb helpers, local test-DB setup, and security-helper unit tests.
- Added GitHub Actions CI for backend tests.
- Added SOC2 change management issue templates.
- Shipped the editor preview.
- Added wizard onboarding for new generations.