We made Bryntum Gantt look handmade with realtime image diffusion Bryntum released a demo that restyles its Bryntum Gantt chart with a handmade look using realtime image diffusion, sending captured Gantt images and text prompts over a WebSocket to fal's FLUX.2 [klein] realtime image generation and editing API endpoint. The demo, available on GitHub and run with Vite, React, and the Bryntum Gantt trial package, requires an fal API key ($5 in free credits at the time of writing) and Chrome Canary 149+ or Brave Stable with the chrome://flags/#canvas-draw-element and chrome://flags/#enable-experimental-web-platform-features flags enabled for the experimental HTML-in-Canvas Web API. We made Bryntum Gantt look handmade with realtime image diffusion We strive to keep posts updated, but code samples may sometimes be outdated. Humans, see the Bryntum documentation https://bryntum.com/docs/ ; agents, https://mcp.bryntum.com https://mcp.bryntum.com for the latest info. We found an artisanal cattery booking system https://www.reddit.com/r/mildlyinteresting/comments/1vqloem/the uncomputerized booking system at my cats/ on Reddit. Its handwritten labels and physical markers made us wonder: can we make our Bryntum Gantt chart https://bryntum.com/products/gantt/ have a handmade look? Further inspiration from this Syntax.fm YouTube short https://www.youtube.com/shorts/U7peCdBiFy8 made us realize we can style it however we want in real time using only prompts: You can try the demo yourself by cloning the Bryntum Gantt with realtime image diffusion demo GitHub repo https://github.com/bryntum/bryntum-gantt-realtime-image-diffusion-demo , installing dependencies with npm install , and starting the dev server with npm run dev . It uses Vite, React, and the Bryntum Gantt trial package, so no license is needed to run it. Generating the styled frames requires signing up for the generative AI platform fal https://fal.ai/ for an API key. At the time of writing you get $5 free credits, which is enough to try it out. The demo also requires Chrome Canary or Brave, as it uses the experimental HTML-in-Canvas Web API https://developer.chrome.com/blog/html-in-canvas-origin-trial with two browser flags enabled, as explained in the demo repo README. How the demo works This demo styles the Gantt using a prompt with realtime image diffusion. The app adds the Bryntum Gantt to a canvas. When the prompt changes or the Gantt UI updates, the app captures an image of the Gantt and sends it, with the prompt, over a WebSocket to the fal FLUX.2 \ klein\ realtime image generation and editing API endpoint https://fal.ai/models/fal-ai/flux-2/klein/realtime . The app uses the fal client library https://fal.ai/docs/documentation/model-apis/inference/client-setup to call models on fal. The model edits the image using the prompt. The example prompts in the app are constructed so that only the style changes: Convert this Bryntum Gantt chart project plan into a hand-stitched felt craft board with fabric textures and visible stitching. Keep the exact same layout, task bars, columns and text. The model sends the edited image back, and the app lays it over the Gantt as a click-through overlay. Any further prompt change or Gantt edit triggers another fal API call. Each call sends the current Gantt image and the current prompt, so a prompt-only change re-sends the same image with new instructions. Painting the Gantt into a canvas The app uses the experimental Chromium HTML-in-Canvas API to capture an image of the Bryntum Gantt without rebuilding its DOM. This experimental API is only available in Chrome Canary 149+ or Brave Stable. It also requires enabling the following flags: chrome://flags/ canvas-draw-element and chrome://flags/ enable-experimental-web-platform-features . The Canvas Draw Element flag is needed to enable painting, and the Experimental Web Platform Features flag is needed to expose the pointer geometry that lets clicks and drags reach the Bryntum Gantt inside the canvas subtree. A canvas with the layoutsubtree attribute makes the browser aware of the HTML content nested inside the canvas, preparing it to be displayed inside the canvas: