Nodes/Nova Audio Player/Nova Theme Studio ๐ŸŽจ
ComfyUI Node

Nova Theme Studio ๐ŸŽจ

Live-theming ComfyUI without the save-reload-guess loop

By NovaFemmeยทCreated 2 months agoยทUpdated 22 days agoยท 2
Nova Theme Studio ๐ŸŽจ

      The odd one out in an audio pack

      ComfyUI-NovaAudioPlayer is thirty-one nodes of ACE-Step music work - generate, master, measure, deliver, train a LoRA. Nova Theme Studio ๐ŸŽจ has nothing to do with audio. It's a colour panel that recolours the entire ComfyUI interface and can drop a wallpaper behind the graph.

      It's also the one node here that isn't really a node. Its info_schema is empty - no inputs, no outputs, not an output node - and that's deliberate. The frontend registers it as a virtual node (isVirtualNode), so graphToPrompt walks straight past it, and the Python half declares nothing and returns nothing. Queue a million times; nothing reaches the backend.

      Why it exists, and how it works

      The usual way to theme ComfyUI is: grab a palette JSON, import it under Settings โ†’ Appearance, reload, squint, hand-edit the JSON, reload again - and the reload costs you the graph you had open.

      Theme Studio's bet is that the loop doesn't need to exist, because a palette isn't compiled into anything. Applying one is three assignments, and it makes them on every keystroke:

      • node_slot - link and slot colours.
      • litegraph_base - the LiteGraph constants the canvas reads while painting node bodies, titles, widgets and slots.
      • comfy_base - CSS custom properties on :root.

      That third one is why the theme goes global: anything built from DOM - ComfyUI's own menus and dialogs, other packs' panels - picks those variables up, so your theme lands on nodes this pack has never heard of. The one button that writes to ComfyUI's settings, Save as, adds the palette to Comfy.CustomColorPalettes so it joins the Appearance dropdown.

      One wrinkle: Nodes 2.0 stops painting nodes on the canvas, so the litegraph_base half goes quiet while the CSS half keeps working. The studio detects the renderer by watching whether drawNode still fires, not by reading a setting name - hence the renderer row, which you leave on Auto.

      The wallpaper is what a theme file can't express. A palette has one URL slot, BACKGROUND_IMAGE, but that's the grid tile - drawn in graph space, so an image there pans and zooms with your nodes. A wallpaper that stays put behind the graph has to be a DOM layer, which is what the backdrop section makes.

      What you actually touch

      No schema inputs; every control is built in the browser. The rows that matter: theme studio (Enabled/Disabled - off applies nothing at all, and your theme is kept), a theme (Midnight, Ember, Nova, Forest, Slate, Ultraviolet) crossed with a finish (Solid, Tinted, Frosted, Glass), top panel (Always shown / Collapsible, the fold button, Nodes 2.0 only), and the canvas & backdrop fields: image, fit, blur, dim, hideGrid, node opacity.

      Then every colour, one row each, as a swatch + alpha slider + literal text. Alpha is first-class here because the stock dark theme is layers of rgba() - that's how a wallpaper shows through at all.

      Buttons: Reset, Copy, Load, Save as, Download. Download writes <name>.json with the colours plus two keys ComfyUI ignores but this node reads back, nova_backdrop and nova_preset, so one file carries the whole look.

      Outputs: none. Nothing to wire, nothing downstream. It's a panel you park in a corner of the graph.

      Installing it

      cd ComfyUI/custom_nodes
      git clone https://github.com/NovaFemme/ComfyUI-NovaAudioPlayer.git
      

      Or comfy node install comfyui-novaaudioplayer from the registry. Restart, then find it under โ–ถ๏ธ Nova Audio โ†’ ๐Ÿ› ๏ธ Utility & IO.

      The pack's two declared dependencies, mutagen and pymysql, belong to the tag and SQL dump nodes - Theme Studio needs neither. Its JS loading is the whole requirement.

      Where people get burned

      It's global and it sticks. The theme applies on every page load, whether or not a Theme Studio node is on the canvas, to every pack's nodes. Delete the node and the theme stays. Back out with Reset or by picking one of ComfyUI's own palettes under Settings โ†’ Appearance.

      Two copies installed. ComfyUI loads every .js under the extension folder, so a stale duplicate can win the registration race on some reloads and not others: "Extension named 'Nova.ThemeStudio' already registered", plus a page that comes up unthemed. The console names the copy that is standing down; delete it.

      Glass or Frosted over a bright wallpaper puts text straight on the image. When blur and dim are both still 0, the studio sets them to 12 and 0.3 for you, once per wallpaper.

      A URL wallpaper is fetched by your browser on every page load - use a file in ComfyUI/input if you'd rather not.

      Save as carries colours only. The wallpaper and finish aren't part of ComfyUI's palette format, so send the Download .json if you want to share the whole look.

      One deliberate quirk, so you don't file a bug: the alpha sliders only move if you grab the thumb, because a near-miss click used to silently zero a colour.

      Categoryโ–ถ๏ธ Nova Audio/๐Ÿ› ๏ธ Utility & IO

      Inputs (0)

      No inputs

      Outputs (0)

      No outputs