Skip to content
All projects
HackathonIdealizer3 min read

Idealizer: one AI canvas for images, video and copy

Making one piece of content means juggling six disconnected tools. Idealizer puts images, video, voice and copy on one infinite canvas, with an AI agent that can see and build on all of it. Built solo at the Cursor AI Hackathon Hamburg; it won two tracks.

Idealizer landing page: 'Your Creative Infinite Canvas' in white and pink over a dark background, with cards for image generation, video creation and content writing

The problem

People who make content for a living spread a single post across six tools: one for images, one for video, one for the voiceover, a doc for the script, a folder for the brand colours, and a chat window to ask for help with all of it. None of them connect. You download from one, upload to the next, and explain the context again every time.

The AI tools don't fix this on their own. Each one is good at its one thing, but none of them knows what you made in the others, so the person stays the glue between them.

What I built

Idealizer puts all of it in one place: an infinite canvas, like Miro, where everything you make sits side by side, with an AI assistant that can see all of it and build on it. I built it alone in under 24 hours at the Cursor AI Hackathon in Hamburg, run by the AI BEAVERS community, with more than 400 people and around 100 projects over one weekend. I had come off the waitlist and made a long trip for it, without expectations.

What it does

  • Every asset gets a name. The moment an image, video or text lands on the canvas it gets a label: @image_1, @video_2, @content_3, @branding_1. You write "animate @image_3 using the tone in @branding_1" and the agent knows exactly which two things you mean.
  • Short tags pick the tool. @create makes an image, @edit changes one, @combine merges up to eight, @merge joins videos.
  • Images, video, voice and copy from one chat. The agent reads your message, resolves the labels and chains the calls: generate an image, turn it into a clip, add a voiceover, write the caption.
  • Brand kits. Colours and tone saved as an asset, so every new piece can follow them.
  • Masked edits. Paint over part of an image and change only that part.
Idealizer canvas with labelled image and branding cards and a chat panel where the agent twice replies "I'm not sure how to handle that request"
First iteration. The canvas and the labels worked; the agent still shrugged at most requests.

Why these tools

The labels are what make the canvas useful to a model. On a board full of pictures, "make a video from that one" means nothing; @image_3 means one thing. The tags came later for a practical reason: letting the model guess the tool felt cleverer, but tags were the only way to make it behave the same way twice in a row.

Behind the chat sits a LangChain agent, because the whole product is one request turning into several tool calls in the right order, and that is what LangChain agents are for. Each tool calls the provider best at that job: FLUX for images, MiniMax Hailuo for cinematic video, Hera for infographic-style video, ElevenLabs for voice, and OpenAI and Gemini for text, research and reading images. Supabase stores the assets, with a table for each kind. The frontend is React with React Flow for the canvas.

Cursor with the Idealizer README open on the left and the agent panel on the right writing ImageMaskEditor.tsx and a slider component
Most of the weekend looked like this: the plan on one side, Cursor's agent writing the next component on the other.

What was hard

By Saturday night everything lived in one 859-line backend file, and every new provider made it worse: touching the image code risked breaking video. In the early hours of Sunday I stopped adding features and split it into one file per provider, with a proper database table per asset type. It cost me three hours of features and it was the right call. Around noon I could fix one provider without worrying about the others.

The other problem was waiting. A FLUX job doesn't always come back quickly, and a demo in front of judges can't sit there. So every image call got a timer: if FLUX hasn't answered in 30 seconds, the backend sends the same request to a backup (FLUX through fal.ai, or MiniMax's own image model). The user never sees the switch; they just get a picture.

const imageUrl = await pollFluxResult(job.id, apiKey, {
  fallback: { label: "fal.ai", handler: () => generateFalFluxImage(prompt), afterMs: 30000 },
});

That is simplified from the real code. It isn't elegant, but it kept the demo working.

What it became

Idealizer won two tracks (Best use of LangChain, Best use of MiniMax) among about 100 projects, built in under 24 hours. The landing page is still live, and this is the demo I recorded:

The demo video: the canvas, the labels and the agent at work.

Thanks to Alexander Zakharov, Vladyslav Nyzhashchyy and Ramin Azhdari for organising it, to the AI BEAVERS community, and to the sponsors (Cursor, Manus AI, Hume AI, ElevenLabs, Google, n8n, OpenAI, LangChain, Runway, Miro, v0 and MiniMax among them). A weekend like this doesn't happen without them.