Change Notes
Synthograsizer Suite — Build History & Release Log
NEXT
Unreleased
In Progress — 2026-07-20
Accessibility
-
fix
The knobs and the workflow cards can be used without a mouseThe thirteen knobs and the seventeen workflow cards were plain blocks of layout as far as the keyboard was concerned — you could look at them, but you could not reach them. The knob rack is now one stop on the Tab route rather than thirteen, because it is the main thing on the screen and nobody should have to press Tab thirteen times to get past it. Once you are on it, Left and Right change the value, Up and Down move between knobs, and Home and End jump to the first or last value. Screen readers now say the variable's name and read out the full value rather than the shortened one on the dial. Whichever knob you last used is the one Tab brings you back to. The workflow cards answer Enter and space, announce their name and then their description as two separate things rather than one long run-on, and the video ones you cannot run say so out loud and refuse the keyboard exactly as they already refused the mouse. Nothing about how any of it looks or behaves with a mouse has changed.
-
fix
The small grey text is dark enough to readAll the quiet grey captions — the "(optional)" notes beside form fields, hints under inputs, workflow step labels, the trace viewer's column headings — were set in a grey that does not carry enough contrast against the background behind it. On the tan chassis of the hardware theme some of them measured under 2 to 1, which is close to invisible in daylight or on a projector. Eighty-seven of them are now dark enough to clear the accessibility standard for body text, with the worst case measuring 4.6 to 1 and most far better. This was not a search-and-replace: the same grey is doing the opposite job on the dark surfaces — the Glitcher's chrome and the P5 filter drawer — where it already had plenty of contrast and darkening it would have made it worse, so those were measured individually and deliberately left alone. One subtitle in the Glitcher was failing not because of its colour but because it was being faded to 70 per cent on top of it; the fade is gone and the colour now says what it means.
-
fix
The template name tells you when you have unsaved workIf you rewrote a prompt in the template editor and then picked a different template, the work was gone, and nothing anywhere on screen had suggested it might be. The chip at the top left now grows a dot the moment you start typing — before you have applied anything, because that is exactly when the work is most easily lost — and hovering it says what the dot means. Loading another template over unsaved changes now asks first, and answering no leaves everything where it was. It only asks when there is genuinely something to lose: switching between templates you have not edited is as quiet as it ever was.
-
fix
"Composer" is now called "Agents", and new arrivals are pointed at the toolsThe third mode builds a crew of AI personas and runs them together, which is not something the word "Composer" suggests to anybody — we know, because the person writing the manual had the app open and still described it as a prompt composer. It is now called Agents, and the tooltip says what it does. Separately: a brand new install opens in Perform, which shows knobs and a Generate button and hides the tool menus entirely, so there was nothing on the first screen hinting that four menus of tools existed one click away. On a genuinely first run only, a small note now points at the Studio button and says what is behind it. Dismiss it with the button, with Escape, or just by clicking Studio, and it never comes back. It does not take your keyboard or move you anywhere.
-
fix
The app now tells you when a run has finished, and offers to take you to itStarting something in the Studio used to end in silence. You'd open Smart Transform, press Run, and the dialog would close — putting you back on the menu you came from while the picture appeared somewhere else entirely, with nothing said about it. If you couldn't see the screen, or you'd looked away during a run that takes the better part of a minute, there was no signal that it had finished at all, let alone where the output went. Now the output panel carries a line saying what happened — "Smart Transform complete — 4 results", or what went wrong if it failed — screen readers announce it, and a Jump to results button appears one Tab press from wherever you are. Pressing it takes you to the output; ignoring it costs you nothing. Your place is never taken from you: we deliberately don't move you to the results by force, because there's nothing worse than being yanked somewhere else just as you'd started doing something else. The same goes for batches, workflows and failures.
-
fix
The P5 canvas panel no longer catches your keyboard while it's closedThe sketch panel was only ever hidden by being made transparent, which means that as far as the keyboard was concerned it was still there. Tabbing to the end of the page walked you through ten controls of a panel that wasn't on screen — Play, Stop, the effect sliders — with no way to tell where you were. That's fixed: while it's closed it's properly gone. And while it's open it now behaves like the dialogs do — opening it takes you into it, Escape closes it, and closing hands you back to whatever you opened it from. Unlike a dialog it doesn't hold onto you, so you can Tab back out to the rest of the app while your sketch keeps running, which is the whole point of it being a panel rather than a window.
-
fix
The focus outline is thick enough to find — and the code editors have one at allThe outline marking which control your keyboard is on was a single hairline, which on many screens rendered thinner than the width of one pixel. It's now twice that, matching what the Glitcher already used, so the Suite draws one outline rather than two. Walking the whole screen with the keyboard to check turned up three places with no outline whatsoever — the template editor, the variables box and the P5 code editor, which had been showing a tinted border and a glow so faint it was effectively invisible against the near-white background. They now get the same ring as everything else when you reach them by keyboard, while still looking quiet when you click into them with a mouse.
-
fix
Every dialog can now be used with the keyboardOpening a panel like Smart Transform, Image Studio or Workflows used to leave your keyboard behind: focus stayed on the page underneath, and pressing Tab walked through the app behind the dialog instead of into it. We measured it — with Smart Transform open, forty-eight presses of Tab never once reached one of its controls, because the first of them sat 63rd in line. Escape did nothing either. Now opening a dialog moves you straight into it, Tab cycles within it and wraps around, Escape closes it, and closing returns you to whatever you opened it from. Screen readers announce each dialog by name — previously all twelve of them announced nothing at all, and every close button read out as "times". The one deliberate exception is the terms screen on first sign-in: it holds focus and ignores Escape, because it's a consent step you shouldn't be able to skip by accident.
Models
-
feat
Text generation now runs on Gemini 3.6 FlashEverywhere the app used the fast text model — narrative, quick analysis, fast template generation, the agent panel and demo mode — it's now Gemini 3.6 Flash. It handles multi-step and multimodal work better than the model it replaces while using fewer tokens, and Google charges less for its output. Image generation is unaffected: the picture models are a separate family and stay exactly as they were. The higher-quality Pro option is also unchanged, since there's no new Pro model yet.
-
fix
The Temperature, Top-K and Top-P sliders are goneGoogle has retired these three settings across its current and future models — they're already ignored, and will start returning an error outright. Rather than leave you three sliders that quietly did nothing, we've removed them. If you were using them to make results more predictable, the replacement is to say so in the prompt itself: an instruction like "answer in one sentence, no preamble" now does the work that lowering the temperature used to. The Music Studio's temperature control is not affected — that's a different system and still works as before.
Fixes
-
fix
Your credit balance is correct again after a workflowA workflow runs several steps at once, and the badge was showing whichever step happened to answer last rather than the true remaining balance — so it could read five credits higher than what you actually had. It now re-checks with the server when a run finishes. Batches did the same thing, and are fixed too.
-
fix
Card Style Kit asks for a deck style instead of showing the wrong menuThis workflow wanted a description of the look you're after, but it was borrowing a field name reserved for the 53-item style-preset picker — so it offered you that menu instead of a text box, and then passed the preset's internal id straight into the prompt. Runs came out asking for
art_nouveau, underscore and all. It's now its own field: type the look you want in plain words.
Interface
-
fix
All your knobs are visible in Studio again — ten of thirteen were hiddenIn Studio the knob rack was laid out as one long row that didn't wrap, inside a column far too narrow to hold it. With a typical template that meant three knobs on screen and ten off the side, reachable only by scrolling sideways in a thin strip most people would never think to drag. They now wrap to fill the space, so every variable in your template is visible at once. Studio's knobs are a little smaller than Perform's — Studio is a workbench where the rack shares the column with everything else, while Perform is meant to be read from across a room. Simply wrapping them at Perform's size would have pushed the Connections panel off the bottom of the screen, so this trades a slightly smaller dial for being able to see the whole instrument.
-
fix
Perform / Studio / Composer stays where you left itThe mode switcher used to slide a long way across the top bar the moment you used it — several hundred pixels between Studio and Perform, and again into Composer — because it was being pushed around by whatever else happened to be in the bar for that mode. It now sits in a fixed spot next to the app name and doesn't move at all, so the button you just clicked is still under your cursor.
-
fix
Small things in the top bar that didn't matchTemplate Gen had a thinner outline and a paler shadow than every other control beside it, so it read as though it belonged to a different toolbar. The mode switcher's frame was a slightly lighter shade than its neighbours'. The settings and ⋯ buttons were quietly rendering in a different typeface from the rest of the app. And Template Gen never showed its keyboard shortcut — pressing T has always opened it, and every other button in that row advertises its key, so the one that stayed silent looked like it didn't have one. All four now match.
-
fix
The Studio tools moved up into the top barTemplate Gen and the Generate / Transform / Automate / Inspect menus used to sit in their own strip below the top bar. On a wide screen that strip was about three-quarters empty, in the same colour as the bar above it — a whole row of window furniture that wasn't carrying anything. They now sit in the top bar itself, next to the template name, and they finally match the rest of the bar's lettering instead of being a shade off it. Nothing moved menus or changed what's in them. On narrower screens the tools still take their own row, because there they genuinely need it.
Hosted Service — synthograsizer.com is live
-
feat
Sign in with Google and use the suite in the browser — 300 credits a month, freeThe suite now runs as a hosted service at synthograsizer.com, backed by Cloud Run in Montréal. Signing in with Google grants 300 credits per month (text costs ⚡1–5, images ⚡4–15), topped back up on your first visit each month — no rollover, no card, no waiting list. Anonymous visitors can still open the app and play with templates, variables, and knobs; only the AI calls require an account. Local installs are completely unaffected — run it yourself with your own API key and none of this applies.
-
feat
Your data stays yours — one-click export and account deletionThe account menu has Download my data (a JSON file of your account, credit history, and generation log) and Delete account, which removes everything immediately — no email round-trip, no waiting period. Prompt text is never stored: the generation log keeps only metadata like which model ran and how long it took, and it ages out automatically on a retention timer. Anything you explicitly save to My creations (see below) is the one exception — it's kept until you delete it, not on a timer, since that's the point of saving it.
-
feat
Video and music studios are local-only for nowVeo, Lyria, and Videorama stay off on the hosted tier — a single Veo clip can cost more than a month of everyone's text generation combined. Those tools are hidden rather than teasingly disabled, and the underlying endpoints refuse the call too. Run the suite locally with your own key and they all work as before. A paid tier that unlocks them is designed but not built.
-
fix
Launch buttons open the real app, not the gated demoEvery "Launch" call-to-action on the landing and about pages now goes straight to the full suite. The demo build had been the default for public visitors back when there was no way to sign in; the free tier replaces it. The gated demo is still reachable from the suite navigation if you want it.
-
fix
Backend & Safety panel now talks about credits, not a mythical "instance operator"Settings → Backend & Safety carried notices written before the service existed — a generic operator managing config "via environment variables," which means nothing if you're signed in and paying in credits. The panel now branches on whether accounts are on: with accounts, it explains metering and points at the account menu; a plain hosted deployment without accounts keeps the operator wording. The backend note also stopped hardcoding "Google" — it names whichever tier is actually pinned, so a hosted local-model deployment no longer claims Google's usage policy applies to it.
-
fix
Smart Video Options and Send to Scope no longer show up as dead ends on the hosted serviceBoth buttons sat on every image result and led nowhere for free-tier users. Smart Video Options now shows only for admins, matching the admin-only video endpoint it opens; Send to Scope hides for everyone in service mode, admins included — it bridges to a renderer on your own machine, and the underlying endpoint 403s before a hosted request could ever reach one.
-
fix
Fixed a database migration bug that would have broken every fresh installLaying groundwork for a future account-storage feature surfaced a latent bug in the service database's upgrade path: a brand-new database computed itself as version zero and replayed every migration step up to current, even though it had just been built at the current schema in one shot. Harmless while every step was an additive table creation, but the first column-add or backfill would have errored or double-applied on new installs. Fresh databases now stamp straight to the current version with nothing replayed; migrations only run against a database that already has its own older recorded version. Covered by a new test written to fail against the old logic first.
Saved Creations — the "My creations" gallery
-
feat
Save any generated image, video, or track to your account — find it later under My creationsA 💾 Save button now sits beside generated images and videos. Saved items live in Cloud Storage (same Montréal region as everything else), private to your account, and stay there until you delete them — no retention timer, since that's the point of saving something. The account menu's new My creations entry lists everything you've saved with size and date, opens any item on demand, and deletes individually. A quota meter (200 MB by default) keeps things bounded; deleting your account removes every saved item along with it, immediately.
-
feat
Download button beside Save on generated images — no account neededA ⬇ Download button now sits next to Save on every generated image and puts the PNG straight in your downloads folder, named by date and time. Unlike Save it needs no account and works on local installs, because nothing is uploaded — the picture is already in your browser, which is how you're looking at it. One thing worth knowing, and it's why the button says so on hover: generated PNGs carry the prompt that made them in the file's metadata, so sharing the image shares the prompt. Strip the metadata first if that matters for a particular image.
-
feat
My creations now shows thumbnailsSaved images get a little preview in the gallery instead of a generic icon. The thumbnail is made in your browser when you save (a small ~256px copy), so opening the list stays a single quick request and previews only load as you scroll to them. Older images saved before this update keep showing an icon; anything you save from now on gets a thumbnail. Videos and tracks still show their icon.
-
feat
Save a generated template to your library — and load it back in one clickWhen you generate a template, there's now a 💾 Save to My creations button, and it comes pre-named: a quick one- or two-word theme name so you can spot it later (e.g. "Neon Cats"). Saved templates live in My creations alongside your images; each one gets a Load template button that drops it straight back into the app. Saving is always a deliberate click — nothing is auto-saved. One honest note: a template is prompt text, so unlike an image (where only the file is stored), saving a template does keep its prompt on our server — that's spelled out in the updated Terms §7, and it only happens when you click Save.
-
fix
Agent Composer no longer dead-ends with "Launch failed" on the hosted serviceLive multi-agent sessions (the Agent Composer / Agent Studio chat rooms) run on a separate backend that only exists on local installs, so launching one on the hosted service failed with a cryptic
chatroom_unavailableerror after you'd built the whole session. It now says up front that live sessions are local-only, before you do the work — and the rest of the Composer, including generating agent profiles and templates, keeps working on the hosted service. Running locally? Nothing changes; sessions launch as before. -
chore
Terms bumped to v0.3 — saved creations are the first hosted feature that stores generated media server-sideEverything else about the service is unchanged: prompts are still never stored, and nothing is saved unless you click Save. Since this is a real change in what the service does with your content, signing in again shows the terms interstitial once more so you can review and re-accept — not a bug, just consent catching up to the feature.
Main App — One-Row Header
-
fix
Stop a workflow on purpose, keep what you typed, and save anything you go back toThree more places the app was unforgiving. A running workflow now has a ■ Stop run button — before, the only way out was closing the window, which quietly cancelled the run; it still stops the run (so nothing keeps spending while you're away) but now says so, and points at the steps that did finish. Parameters you've typed survive stepping back to the template list and returning, per template. And a generation you reopen from the RECENT strip now comes back with Download and Save, instead of being something you could look at but not keep.
-
fix
Workflow results are no longer lost when you navigate awayPressing back from a workflow's results took you to the template list with no way to return — the images were still there, just unreachable. The template list now shows a View results bar for your last run, and it survives closing and reopening the Workflows window; only starting a new run clears it. Each result also gained ⬇ Download and (when signed in) 💾 Save, so a run's output can leave the browser instead of living until the tab closes.
-
feat
New workflow: Card Style KitDescribe a style and get the five reusable pieces of a playing-card deck — a blank card frame and the four suit symbols. They're the input to a deck builder that composites all 40 number cards in code, so every card is pixel-consistent instead of being 40 separate generations that drift apart. Restyling a whole card sheet in one go doesn't work — one image can't keep track of 78 different cards at once, and comes back with the ranks and suits scrambled — so this generates the handful of pieces that actually need an artist's eye and builds the repetitive part exactly.
-
fix
Smart Transform: keeps your image's shape, shows what a run costs, and defaults to the cheap modelAspect ratio now defaults to Match input, so a wide image comes back wide instead of being squeezed into a square. The model picker and the Run button show the credit cost up front (Run Smart Transform — ⚡6), read from the live price list rather than hardcoded, and the default is now Gemini 2.5 Flash at ⚡6 instead of Pro at ⚡17 — Pro is still one click away when you want it. Every result also gets ⬇ Download beside Save, so you can keep a transform without being signed in. And picking a file no longer means picking it twice: the first-upload notice now remembers your file and carries on with it once you accept.
-
fix
The p5 canvas viewer now actually fills its windowOn a high-DPI screen the sketch rendered at about half the size of its own viewer, with a wide black border, and FIT and FILL looked identical. The viewer was measuring the canvas in hardware pixels while sizing it in layout pixels — on a 2× display that halves everything. Both buttons now do what they say. Batch tiles gained a Download button too.
-
feat
Save buttons on batch results and Smart Transform resultsSaving to My creations used to work only on a single generated image or video. Now every tile in a batch run gets its own 💾 Save button, and so does every image Smart Transform produces — so you can run a whole batch, look at the grid, and keep just the two you liked. Each save is tied to the specific image it sits under. Batch saves are named after the loaded template, the same as a single generate; Smart Transform saves are named "Smart Transform" (or "Style 1", "Style 2"… when you're comparing styles), since the file you fed in isn't stored anywhere. As before, Save only appears when you're signed in on the hosted service — on a local install nothing is uploaded, so the Download button is the one you want.
-
feat
AI Studio Tools moved into a menu bar — and Template Gen is front and centerIn Studio mode the block of tool buttons is now a proper menu bar across the top of the app, the way desktop software works: Generate, Transform, Automate, and Inspect menus that drop down when clicked (and switch as you hover across them). It's tidier and gives the canvas more room. Template Gen — the tool that builds a whole new template from a description — is pulled out as a featured button both in the menu bar and next to Generate, since it's where a lot of sessions start. Perform mode stays clean: the menu bar only appears in Studio, exactly like the old tool panel did.
-
feat
Workflows now run on the website — multi-step image and text pipelines, no install neededThe ⚡ Workflows tool used to need the local ChatRoom server, so on synthograsizer.com it only showed an "offline" message. It now runs the same workflow engine right in your browser, calling the same generation you already use — so each step counts against your credits exactly like generating an image yourself. Thirteen of the sixteen built-in workflows (style transfer, refinement loops, narrative and comparison pipelines, and more) work on the free tier. The three that generate video (Image → Video, Cinematic Short, Cinematic Animator) are shown but locked, since video generation isn't on the free tier — run Synthograsizer locally, or sign in as an admin, for those. A nice side effect: because the run is checkpointed in your browser, closing the tab mid-workflow no longer necessarily loses it.
-
fix
Tools that only work on a local install no longer appear on the websiteSynthograsizer began as a desktop tool, and a few of those features were still showing on synthograsizer.com where they could never work: Video Studio and Music Studio (both need a paid tier — the buttons were visible but did nothing when clicked), and the whole Scope panel, which bridges to a renderer running on your own computer. They're now hidden unless your account can actually use them, so admins still see Video and Music. Signed-out visitors were missing these checks entirely and saw everything. Nothing changes if you run Synthograsizer locally — every one of these tools works there exactly as before, which is still the way to get the full toolkit.
-
fix
The header now always names the template you're actually using — and saved work is named tooThe template name in the header could show the wrong thing: re-picking a template you'd already loaded left the previous name up there, and templates that arrived any other way (the one loaded on your first visit, a generated one, or one loaded from My creations) never updated it at all — so it could sit on "ART PROMPT" over something completely different. It now follows whatever is really loaded. Because templates now carry their name with them, anything you save to My creations is labelled with it instead of just reading "Image". Also removed a dead entry from the template picker — "Blob Simulator" had no template behind it, so choosing it quietly did nothing and left your previous template loaded.
-
fix
Knobs fit the screen on phones, and hosted users stop being told to run a batch fileOn a narrow screen the knobs used to sit in one long row you had to scroll sideways to reach — with 13 variables, only about two were visible and there was nothing indicating the rest existed. They now wrap into a grid that fits the width, the same way they already did on desktop. Separately, the Workflows panel told everyone to start a local server with
launch-all.batwhen it couldn't connect, which is impossible advice on synthograsizer.com — it now says plainly that Workflows are a local-install feature. Behind the scenes, the app also stopped firing a save request on every template load that the hosted service always refused. -
feat
First visit now opens in Perform mode with the Knobs surfaceA fresh visit now starts in Perform (the minimal live layout) on the Knobs control surface, instead of Studio + D-Pad — a friendlier starting point for live use and MIDI. Both are now the first button in their row. This only changes the starting default: if you've ever picked a layout or control mode yourself, your choice is remembered and still wins — nothing is forced on a return visit.
-
feat
App bar redesigned — two stacked headers become one 53px rowThree zones by frequency of use: brand + template chip on the left, a Studio / Perform / Composer segmented control in the center (hardware theme renders it as a latching button bank with a teal-lit active cell; cel-pastel keeps each mode's signature pastel), and a utility cluster on the right — active-profile pill, ⚙ Settings, and a new ⋯ menu holding the theme picker, Taste Profile, What's New, and suite navigation. The old floating suite-navbar pill no longer loads on this page; the MODE/THEME captions, divider chips, and the "CHANGE ▾" label are gone. Content starts ~100px higher.
-
fix
The header never wraps — labels collapse insteadOne shared control height (34px, 40px on phones) replaces the old 26–38px jumble, and a collapse ladder sheds labels progressively (template name → ellipsis → icon; wordmark hides ≤760px; profile pill becomes its status dot ≤900px) so the bar stays a single row down to 375px. Geometry now lives only in
layout-options.css— the themes reskin colors and typefaces but can no longer fight the layout, which is what kept breaking the old bar. Mode buttons exposearia-pressed; edge tooltips no longer clip offscreen. -
fix
Connections reads as part of the instrument, not a bolted-on drawerThe section header now uses the same teal function-label language as Output and AI Studio Tools (hardware theme), the "Hide inactive" pill follows the teal accent instead of the legacy purple, connection chips share the 34px control height, and every status LED is pinned to the chip's right edge so connection state scans as one column.
Videorama — Batch Video Synthesis
-
feat
Videorama — prompt to a finished set of stylized Veo video clips, entirely inside the suiteNew tool at /videorama/ (hub tile added). A Brief Writer (Gemini) expands a plain-language idea into a full production brief — concept, cast, locations, per-shot camera/lighting direction, QC grading criteria — then a checkpointed pipeline (shot list → 4-clip pilot → full render → assembly) drives Veo 3.1 with automated QC grading and retakes. Local-only; ships with 6 starter templates (home-video bloopers, corporate training, mall CCTV, news remotes, public-access cable, art-competition mockumentary) plus era-correct post-processing presets (VHS, Betacam, security time-lapse, ENG news).
-
feat
Shot Inspector — per-clip editing, keyframe reimagining, and shot extensionClick any shot to open its Inspector: edit and re-render the prompt, pin/unpin an NB2 keyframe (fixes Veo not holding unusual camera angles), reimagine the keyframe by typed intent, request Gemini-suggested motion variations, extend a shot ~8s further, or spin off a sequel shot from its last frame. A Cast & Locations panel manages the character/location reference sheets directly — regenerate with a tweak, drag-drop upload a replacement, or reset stale keyframes after a cast change.
-
feat
9:16 vertical formatEvery project now picks a Format (16:9 landscape or 9:16 vertical) at creation — threaded through the brief writer, Veo render calls, NB2 keyframes, and final assembly, so a Snapchat/TikTok-style set renders as genuine portrait video end to end.
-
feat
Grow and re-cut a project after it's "done"Add shots… appends new shots (a new act, in a described direction) to an already-rendered project; Reassemble rebuilds the exported reel from the current shot selection/order/exclusions without re-rendering, versioning each cut (v2, v3, …) rather than overwriting.
-
fix
Shot review grid no longer restarts playing clips every few secondsThe dashboard's polling loop was rebuilding every video element on each refresh; it now diffs and patches shot cards in place, and slows to a 30-second idle poll once a project is done — clips keep playing, and the grid doesn't flash while idle.
Gemini Interactions API Migration
-
feat
All Gemini calls migrated to Google's Interactions API — stateless by defaultText, chat, vision, multimodal template modes, Gemini image generation, and the entire ChatRoom server now use
interactions.create(Google's GA interface, June 2026) instead ofgenerateContent. Every request is sent withstore=false— nothing is retained server-side at Google (the API's default would keep requests for 55 days). The deprecatedgoogle-generativeai/@google/generative-aiSDKs are gone; Veo, Imagen, and Lyria keep their dedicated APIs. -
feat
Google API mode switch — legacy generateContent as a safety escape hatchThe Interactions API has no per-category safety thresholds — filtering is Google-managed. Settings → Backend & Safety → Google API now offers Interactions (current) and generateContent (legacy): legacy mode re-arms the threshold knobs for edgy artistic work and doubles as a wholesale behavioral rollback. The panel greys the knobs out (with an explanation) while Interactions is active;
/api/healthreports the mode; hosted instances pin it viaSYNTH_GOOGLE_API. -
fix
Thinking-model output can no longer leak into streamed textInteractions streams thinking summaries as separate events; the new stream handlers (backend and ChatRoom) only surface text from real model output, and ChatRoom's truncation auto-continue now keys on
status: incomplete. Verified live across text, streaming, JSON mode, chat history, vision, image gen, and web-search grounding in both API modes; new unit suite (tests/test_google_api.py) locks thestore=falsecontract.
Suite Wayfinding & First-Run
-
feat
The hub finally goes places — and knows when you're localEvery "Launch" button on the landing page detects a local instance and opens the full app (public/hosted visitors keep the gated demo); Taste Profile, standalone Glitcher, and Agent Chat Room got real linked cards. The shared navbar now appears on every surface (main app and Taste Profile included, as a slim dark pill), lists the full app first, and labels the demo honestly instead of calling it "main".
-
feat
⚙ Settings button in the header + honest API-key statusGlobal Settings was only reachable through the small API chip (its dedicated button had been lost — the binding was still warning in the console). A visible ⚙ Settings button is back in the header, and the modal now says "✓ API key active on this server" instead of showing an empty field when a key is already configured.
-
perf
Composer precompiled — no more in-browser Babel or CDN ReactComposer shipped as raw JSX transpiled in the browser via unpkg Babel, with development-build React from a CDN — slow startup, console warnings, and a hard break if the CDN was unreachable. It's now compiled ahead of time (
composer.jsx→composer.js) with production React vendored locally; Composer works fully offline. -
fix
Workflows explain themselves when the ChatRoom server is downInstead of a dead panel and console spam, the Workflows modal now shows what's wrong, names
launch-all.batas the fix, and offers a working ↻ Retry connection button.
Glitcher: Suite Identity & Studio-Mode Effect Fixes
-
feat
Glitcher joins the family — teal-forward on the suite's dark identityNew shared design tokens (
static/shared/css/tokens.css) define the suite palette; Glitcher was remapped onto it (569 substitutions across both modes) keeping teal as its signature accent on the suite's near-black backgrounds. Also: the duplicate sidebar drop-zone is now a compact "Browse files…" tile, and the unexplained red ✕ is gone. -
fix
Direction & Spiral now behave like classic mode inside Studio ModeStudio Mode applied both effects to the whole canvas at once — spiral rendered one global swirl instead of per-region vortices, direction was a uniform shift with its smear trails clipped off, and Direction → Random did nothing at all. Both effects now consume the same animated clump regions as classic mode, trails render fully, and random direction works. Verified side-by-side against classic on identical images.
Backend Tiers, Safety Controls & Feedback
-
feat
Local-model backend tier — run text generation on your own hardware, unrestrictedSettings → Backend & Safety now offers two text backends: Google AI (cloud — Google's safety filters and Prohibited Use Policy apply) and Local model (any OpenAI-compatible endpoint: Ollama, LM Studio). On the local tier Synthograsizer applies no content filters of its own — your hardware, your discretion, within the Terms §6 floor. Mixed-mode v1: images, video, and music always generate via Google. Includes endpoint test-connection + model picker (
GET /api/backend/local/models), JSON-mode mapping with graceful fallback for servers that rejectresponse_format, and SSE streaming. Hosted instances are pinned to Google and reject config changes. -
feat
User-controlled Google safety thresholdsPer-category selectors (Harassment / Hate speech / Sexually explicit / Dangerous content / Civic integrity) adjust Google's
safety_settingswithin what its API permits — values pass through verbatim and Google's rejections surface honestly at generation time. Saved server-side; precedence: per-request > saved defaults > permissive baseline. Hosted instances clamp per-request settings to the operator's defaults — closing a pre-existing hole where any client could sendBLOCK_NONE. -
feat
"Report wrongly blocked" + one-click feedbackSafety blocks are now a typed error end-to-end (
SafetyBlockedError→ structured 422), so the error panel shows what was blocked and why, with a Report wrongly blocked button: prefilled GitHub issue form (wrongly_blocked.yml) and/or a local report toPOST /api/feedback(JSONL on the operator's disk). Prompts are never auto-included — sharing one is an explicit checkbox. General "Send feedback" lives in the settings modal. -
security
Phase-1 hardening: SSRF guard, upload consent, retention, rate limiting
synth_fetchnow validates URLs and every redirect hop against private/loopback/metadata addresses with a 10s timeout and 2 MB cap (workflow-engine/urlGuard.js); ANALYZE_URL gets a scheme/private-literal pre-check. First image upload shows a one-time consent notice (images go to Google's APIs — see Terms §7). Hosted mode (SYNTH_HOSTED=1): env-only API key, per-IP rate limiting (429 + Retry-After), and an hourly retention purge (default 30 days). None of this affects a normal local install.
Responsive Layout & UI Consistency
-
feat
Layout now holds together across phone, tablet, and desktop widthsThe AI Studio Tools grid switched from a hard
repeat(3, 1fr)torepeat(auto-fit, minmax(170px, 1fr)), so tiles reflow 3-up → 2-up → 1-up instead of squeezing. The app bar's controls are now grouped into wrap units (Mode / Links / Theme) that drop to a second row as whole groups rather than splitting mid-group, with a stacked-bar breakpoint at ≤1080px and tightened chrome below 600px. Verified clean at 1577 / 1024 / 768 / 375. -
fix
Theme picker no longer clips off the right edge at mid widthsThe app-bar mode container had
flex-shrink: 0, pushing the Cel-Pastel button past the viewport (partially unclickable) on screens narrower than ~1620px. It now shrinks and wraps to a tidy right-aligned row; dividers that would dangle at a row edge are dropped once wrapping begins. -
fix
Connections panel reads as an aligned 2-up chip gridMIDI / Scope / Display / API were four full-width rows each hugging the right edge under a left-aligned header — lopsided and disorganized. They now pair into a wrapping grid (Display spans its row for the BG swatch), matching the treatment the Cel-Pastel theme already had.
-
fix
D-Pad value text shrinks to fit instead of truncatingThe Hardware theme pins the center value to a fixed 38px with
nowrap + ellipsis, so longer values like "razor-edge stillness" rendered as "razor-edge st…". The dormantresizeControlValueText()hook is reimplemented as a shrink-to-fit (down to a 14px floor, transition suspended during measurement) and now runs on every value change, not just window resize. -
fix
Glitcher Studio & Workflows tiles now carry their theme color
.btn-glitcher-largeand.btn-workflow-largewere missing from the Hardware theme's accent block (and Glitcher from Cel-Pastel's icon group), so they fell back to an un-themed grey. Glitcher gets a teal tint matching its brand accent; Workflows joins its Flow-category green. Output action buttons (Copy / Like / Code / Send to Chat) were re-colored from the label tint (~1.9:1) to full text contrast (~9.7:1) so they no longer read as disabled.
Gemini Prompt Engineering
-
refact
Template / narrative / transform prompts rewritten for schema reliability + intent inferenceEvery Gemini-facing prompt in
backend/services/gained an explicit "interpret the request" layer: terse user input is expanded into a specific, opinionated reading rather than a generic one, and explicit user constraints (named variables, counts, fixed phrases) are honored over defaults. Narrative generation now requires exactly one self-contained prompt per image in input order; image-variation requires exactly five; smart-transform handles the EMPTY-input and no-reference edge cases. The external-LLM authoring guides (SYSTEM_PROMPT.txtand friends) were de-duplicated against the canonical prompt and corrected — one shipped a stale flat-array schema.
Glitcher CSS Consolidation & Repo Cleanup
-
refact
Standalone Glitcher's 8-file CSS
@importchain flattened into one fileThe accretedstyles/fixes/*.csspatch cascade (where.effect-modulewas redefined 11× across files) was inlined intoeffect-studio.cssin exact load order — byte-identical cascade, verified in-browser. The orphanedquick-fixes.css(referenced nowhere) was deleted. -
chore
Trimmed stale scratch dirs, dead bundles, and a leftover design exportRemoved
tmp/,scratch/, an emptypresentation/shell, a stray rootnode_modules/, two superseded ChatRoom build bundles, an orphantweaks-panel.jsx, a deadgenerateAgentResponseSyncexport, and the untracked.design-handoff/raw export (the curateddesign-handoff/remains).REPO_MAP.mdupdated with each pass.
Local-Disk Persistence — Agent Logs & Workflow Runs
-
feat
Agent Studio conversations auto-save on closeWhen you close the Agent Studio modal with at least one message in the transcript, the session is persisted to
JSON/Agent Studio Logs/<agent-name>-<hash>.jsonwith the same payload shape as the manual ⤓ Export button: goal, mode, agents, messages, workflow chips, artifacts, and composer context if launched from the Composer. Empty sessions (modal opened but no chat) are skipped to keep the folder clean. Content-addressed dedup means closing/reopening the same conversation lands on the same file. -
feat
Workflow runs auto-save on completionWhen the Workflow Runner fires
workflow_complete(success OR failure), the run is logged toJSON/Workflow Outputs/<workflow-name>-<hash>.jsonwith the template name, run id, params used (image params stripped — they're huge base64 blobs), step results, status, and duration. Failed runs are saved too — useful for diagnostics. The run metadata is captured at_runWorkflowstart time so the complete handler has everything it needs.
Local-Disk Persistence — Auto-Backup & Restore
-
feat
New
/api/save-outputgeneric endpoint — content-addressed JSON backup for any storePOST{kind, content, filename_hint?}. Files land atSynthograsizer_Output/JSON/<Kind>/<slug>-<6-char sha256>.json. Server-side dedup is content-addressed (id + timestamps stripped before hashing) so repeated saves of the same logical content land on the same file. Supported kinds:agent_profile,taste_profile,agent_log,story_output,workflow_output(last three reserved for follow-ups). Sibling endpoints:GET /api/list-outputs/{kind}for picker UIs (returns lightweight per-kind summary),GET /api/get-output/{kind}/{filename}for full content,DELETE /api/delete-output/{kind}/{filename}. -
feat
Auto-backup wired into AgentProfileStore and TasteProfileStoreEvery
.save()now fires a best-effort POST to/api/save-outputalongside the local localStorage / IndexedDB write. Failures are silent (backend may be offline). Net effect: on first load of the Composer, every built-in agent gets re-saved through the store and back-filled to disk — instant historical backup. The user no longer loses agents to a wiped browser cache. -
feat
"Restore from Disk" modals on two surfacesComposer Library overflow menu (
⋯) gets a "📁 Restore from disk…" item that lists everyAgent Profiles/*.jsonwith a one-click Restore button per row. The active-profile pill on the Synthograsizer app bar gets the same affordance forTaste Profiles/*.json. The pill now stays visible even when no profile is active (shows "No active profile") so Restore is always reachable.
Taste Profile → Composer · End-to-End Handoff
-
feat
"Send to Composer" now lands you in the Session room with a pre-built Welcome Session — not an empty LibraryAll 4 tuned agents auto-placed in channels 1–4, session named "<profile> · First Session", goal pre-filled, three shared anchors (session_context, tone, output_rules) derived from the profile's tagline + axes + narrative inclinations. One click "Launch Session" and the crew is collaborating.
-
feat
New
TasteProfileStore— persists synthesised profiles, supports multiple personas with an active pointerMirrors AgentProfileStore's shape; full CRUD + subscribe. Lives in localStorage (lightweight at this scale). An artist can keep "Neon Sirens" and "Quiet Erosion" side-by-side and switch which one their agents read from. -
feat
Agent bios pull dynamically from the active Taste Profile
resolveProfileBio()now injects synthetic placeholders —{{taste_tendency}},{{taste_narrative}},{{taste_subject}},{{taste_profile_name}},{{taste_tagline}},{{taste_palette_primary/secondary/accent}},{{taste_axes_summary}}— resolved at render time against whichever profile is active. Switch profiles, every agent re-skins instantly. Profile-defined variables with the same name still win (no surprise overrides). -
feat
New Composer command bus action:
openSessionFromTasteProfileLikeopenSessionFromRecipebut addresses agents byprofileId(deterministic) and acceptssharedAnchors+sessionNamein addition togoal. Fired from a one-shot sessionStorage handoff so the redirect from /taste-profile/ is seamless. -
feat
Sketch-only Remix path — surgical p5.js edits without regenerating the whole templateNew
mode: "p5_edit"endpoint takes the loaded sketch + an instruction and returns RAW JavaScript (no JSON envelope, no schema overhead). The frontend merges the result back, leavingpromptTemplateandvariablesuntouched. Surfaced as an inline "Edit scope" toggle in the Remix panel — appears only when the loaded template has a p5.js sketch, defaults to "Sketch only" (the common AV case). Should dramatically reduce timeouts on Pro for visual edits since the model no longer has to re-emit the entire template every time. Includes aREQUIRES_FULL_REMIXescape hatch: if the model decides the edit needs variable / prompt changes it prepends a comment and the frontend prompts the user to switch scope. -
feat
Active-profile pill in the Synthograsizer app bar — visible status + one-click profile switcherPersistent indicator showing which Taste Profile is currently active (with a green / cherry status dot). Clicking it opens a small menu listing all saved profiles, with switch / clear / "Manage on Taste Profile" actions. Subscribes to
TasteProfileStorechanges so it stays in sync if the active profile is updated in another tab. Hidden in Composer mode (where the Taste-Profile shortcut already gets hidden). Styled for both Hardware and Cel-Pastel themes.
Cel-Pastel Theme — Optional Visual Mode
-
feat
Second theme: 1990s DIC-animation pastels (Madeline / Care Bears) with 2.5px navy-ink outlines and offset sticker shadowsLayered on top of the Hardware theme via
body.theme-cel-pastel— Hardware remains the default and is unaffected when the picker is set to Hardware -
feat
Theme picker in the Synthograsizer app bar (Hardware ↔ Cel-Pastel) and on the Taste-Profile topbar (Dark ↔ Cel-Pastel)Persists to
localStorage['synthograsizerTheme']; each page gracefully normalizes the other's vocabulary ('dark' ↔ 'hardware') so navigation stays consistent -
feat
Cel-Pastel overrides for Studio, Perform, and Composer modes — including the Composer "needs more room" mobile fallbackCovers the full Taste-Profile surface (steps 1–4): dropzone, pair cards, synth spinner, stat cards, aesthetic axes, palette swatches, tag chips, agent cards, JSON preview
AV / Resolume Control-Surface Mode
-
feat
New
/synthograsizer/av.htmlperformance surface — knob grid wired for OSC dispatch to Resolume (or any OSC-aware receiver)Standard Synthograsizer page is unaffected at runtime; the AV hooks inapp.jsstay no-op unlesswindow.SYNTH_AV_MODEis set (only by av.html) -
feat
Per-variable source-tag mapping — CODE / AI / BOTHA variable set to
source: 'code'drives OSC only and is masked from the LLM prompt; set to'ai'fills the prompt without firing OSC;'both'does both -
feat
Throttled OSC dispatch (~30 fps) with per-variable diff suppression and per-knob curve / range / send-type configSend types:
float,int,trigger. Curves: linear, exponential, logarithmic, custom. Sends only fire when the normalized value actually changes -
feat
AV Inspector drawer — live-edit OSC mappings, set host/port, save/load profilesProfiles persist via the new
AVProfileStore; override edits apply to the running surface immediately without reload -
feat
Per-template AV variants under
templates-av/with automatic fallback totemplates/Same template can have a performance-tuned variant (smaller knob set, OSC-wired) without forking the LLM template. Ships with AV variants forsvg-flow-particles,lissajous-lab,synthograsizer-prompt -
feat
Resolume preset helpers — clip launch, layer opacity, blend-mode address buildersPre-built OSC address templates targeting Resolume's standard composition routing
Taste Profile — Onboarding Polish
-
feat
"Both / Neither" skip button on every taste-pair axisLets the artist leave an axis unconstrained instead of forcing a false choice; the marker biases to 0.5 (range 0.4–0.6) in
buildProfile()and the backend prompt was hardened to honor neutral answers -
feat
PNG metadata extraction on upload — auto-fills the prompt-history fieldReads
tEXt,iTXt, andzTXtchunks. Knows the formats used by AUTOMATIC1111 (parameters), ComfyUI (workflow/prompt), NovelAI (Description), and genericComment -
feat
GIF first-frame extraction for animated uploadsFrame is rendered onto a canvas and resized like any still image; lets you train on a GIF without uploading the full animation
-
feat
Thumbnail remove button — hover-reveal × on each upload previewClean up mistakes without restarting the upload step
-
feat
Hardened agent-synthesis prompt with explicit schema block + pre-emit validation checklistEvery agent now reliably ships
bioTemplate+variables+anchors; the Send-to-Composer flow has a client-side fallback that synthesizes a minimum-viable template if any field is still missing -
feat
Send-to-Composer flow waits for IDB writes to settle before navigatingSaves all 4 agents, verifies each landed in the cache, then waits ~600 ms before redirecting so the Composer page's
loadAllAsync()doesn't race the writes
Template Auto-Save — Deduplication
-
feat
Deterministic content-fingerprint filenames for auto-saved templatesAuto-save now derives a 1–3-word slug from the template name (or first source tag) + 6-character SHA-256 of the canonical content. No more timestamp spam in the output directory
-
feat
Directory scan on save — catches duplicates from older timestamp-named filesIf any existing file in the output directory has the same content fingerprint (even under a different name), the save returns
status: existspointing at the original instead of creating a copy
Agent Profile Engine — Storage & Intelligence
-
feat
IndexedDB storage backend for AgentProfileStoreReplaces synchronous 5 MB-limited localStorage; profile saves/loads are now fully async, eliminating UI jank on large agent rosters with embedded assets
-
feat
Zero-friction auto-migration from localStorage → IndexedDB on first loadExisting profiles are transparently moved on first run; no manual export/import step required
-
refact
Synchronous in-memory cache maintained for backward compatibilityLegacy call-sites using
AgentProfileStore.loadAll()continue to work until they are updated toloadAllAsync() -
feat
Anti-repetition intelligence in agent bio resolutionresolveProfileBio() now re-rolls weighted-random attribute picks up to 3 times to avoid choosing the same value as the previous interaction, producing more varied and dynamic agent behaviour
Composer — Robust JSON Parser
-
feat
extractJSONArray() — multi-layer LLM output parser for variable generationReplaces fragile regex; gracefully handles markdown code fences, preamble/postamble prose, trailing commas, and single-quoted strings hallucinated by the model
Workflow Engine — Session Stability
-
fix
Removed hard-coded 5-minute SSE timeout in WorkflowRunnerThe kill-switch would silently cancel complex long-running tasks (e.g. video generation) at exactly 5 minutes regardless of activity
-
feat
Dynamic 10-minute inactivity keepalive replaces static timeoutTimer resets automatically on every workflow_step_start / workflow_step_chunk event; connections only close if the backend goes genuinely silent for 10 minutes
-
fix
p5.js Template Gen timeout raised to 5 minutes for Pro modelPro model generating a full self-contained p5 sketch (lookup maps, 4–7 variables, draw loop) was being cut off by the shared 150s frontend abort; now 300s frontend, 300s backend, 300s workflow-engine path — all three layers aligned
Agent Composer — Generation Instructions
-
feat
User-editable style instruction field for agent profile generationStructural rules (JSON format, variables, anchors) always enforced; tone and style are now customizable per-user
-
feat
Agent profile edit-in-place — refine existing profiles instead of regenerating from scratchCurrent profile JSON sent alongside the generation prompt so the model can make targeted changes
-
feat
Collapsible generation instructions panel in Composer Editor roomState persisted to localStorage; factory-default reset button included
-
style
Visual context cues when generation instructions are activeIdentity row and Bio template highlighted with gen-context-active state; taste vector bias automatically included when a vector is set
Template Generator
-
feat
Multi-image reference support for Remix modeAttach up to 8 reference images to visually guide template evolution via multimodal prompt assembly
V0.7
Latest
2026-05-08
Major UI Overhaul
-
feat
V6→V7 UI audit — unified app bar, full layout overhaul, Agent Studio re-skinSingle persistent top bar across all modes; layout-switcher promoted to app-bar-modes; hardware theme fully applied to Agent Studio
-
feat
Agent Composer complete — 4-room mode (Library → Editor → Session → Run) with live knob controlEach room is a discrete workflow step; knobs in Run room control live generation parameters in real time
-
feat
React chatroom: attach-chip CSS and gallery lightbox polish
Bug Fixes & Stability
-
fix
Consensus quorum now counts only unmuted agentsPreviously, muted agents still counted toward quorum threshold, producing incorrect vote outcomes
-
fix
Demo mode backend guard — non-demo routes blocked in demo context
-
fix
Veo 3.1 duration default corrected; multimodal beat continuity restored; workflow outcome now surfaces in UI
Code Quality
-
refact
Agent Studio CSS modernized — all !important overrides replaced with CSS custom properties and proper cascade ordering
-
feat
Storyboard: beatNarrative store, hidden/classList overlay, aria-labels, CSS contract doc
-
refact
Glitcher: removed dead selection fallback; FrameTimer guarded on frame count
V0.6
2026-05-01
Deployment & Demo
-
feat
Demo mode — Gemini Flash Lite locked in for demo sessions; CTAs route to demo.htmlFull interactive demo with no API key required; rate-limited to lightweight models
-
fix
Vercel routing corrected — /synthograsizer/ now resolves to full app
-
feat
Glitcher v2 embedded in Synthograsizer; comprehensive UI overhaulBidirectional bridge between Synthograsizer prompt output and Glitcher effect parameters
Storyboard Panel
-
style
Storyboard panel fully redesigned to match hardware synth themeCream chassis, warm brown borders, NeoBrutalism shadows, monospace labels throughout
-
fix
Hardware theme CSS class names corrected across all storyboard components
V0.5
2026-04-25 – 2026-04-30
AI Model & Generation
-
feat
Suite-wide upgrade to Gemini 3.1 Pro PreviewImproved output coherence, longer context window, faster multimodal responses across all generation endpoints
-
feat
Live Gemini token streaming in Agent Studio transcriptsTokens appear as they arrive — no more waiting for full response before text renders
-
fix
Imagen-only fields no longer sent on Gemini generation path
Agent Studio
-
feat
Codenames game template — Layer 1 secret knowledge prototypeMulti-agent Codenames with roles (spymaster / operative); agents maintain secret layer inaccessible to opponents
-
fix
Turn-order routing corrected; verbosity defaults tuned; Codenames protocol formalized
-
feat
Template library, artifact panel with debug console, MIDI lazy-init, Display mode renamed
Templates & Story Mode
-
feat
Beat navigator for story templates — previous/next beat controls with dot-position indicator
-
feat
Twin Spheres p5.js generative template added
Platform
-
feat
Glitcher Studio modal — P5 FX drawer within Synthograsizer with bidirectional bridge
-
refact
Landing page consolidated — Synthograsizer as primary product surface
-
chore
Repo polish — trust signals, cleaned surfaces, docs structure