top of page
Search

How I'm Using Claude + Adobe Animate to Convert Flash to HTML5

RorschachGames
May 22
4 min read

Recently I was handed a library of old Flash projects with one question: can these be saved?

Flash officially died in 2020, but the content inside those .fla files — learning modules, interactive demos, branded animations, training simulations — still has real value. The challenge isn't deciding whether to convert them. It's figuring out how to do it without rewriting every single one from scratch.

Here's the workflow I've landed on.

Adobe Animate does the easy half

Adobe Animate (the rebranded Flash Professional) still opens the original .fla files and can republish them targeting the HTML5 Canvas runtime. That part is genuinely smooth. The animations come over, the timelines stay intact, the symbol library mostly survives the trip. CreateJS handles the rendering in the browser, and for purely animated content you can sometimes get away with a couple of clicks.

The hard part is ActionScript.

Animate gives you a button to "convert AS3 to JavaScript," and it works on trivial frame scripts: stop(), gotoAndPlay(2), the occasional trace(). The moment you have anything resembling a real codebase, custom classes, package structures, event dispatchers, external data loading, anything inheriting from a base class you wrote in 2011, that button waves the white flag.

That's where Claude comes in.

The issues you keep running into

After porting a handful of these, the same problems show up over and over:

AS3 packages and strict typing don't map cleanly to JavaScript. Classes need to be rewritten as ES6 classes or hung off the CreateJS namespace. Types vanish entirely, or move to JSDoc if you care about IDE hints. The Vector.<T> containers become plain arrays, and you lose the compile-time guarantees you used to rely on.

Event handling looks similar but isn't. AS3's EventDispatcher with custom Event subclasses needs to be reframed around CreateJS's on() / dispatchEvent() — or plain DOM events when it's cleaner. Bubbling semantics differ. Weak references on listeners disappear, so you start leaking memory if you forget to remove handlers.

Display list manipulation is close, but not identical. addChild / removeChild work. scaleX, scaleY, rotation, and alpha behave the same. But filters, masks, and blend modes need real attention, and BitmapData operations that were trivial in AS3 become a much bigger conversation in Canvas.

TextField is the worst offender. AS3 TextFields with embedded fonts, htmlText, and TextFormat objects become CreateJS Text instances, and a lot of the rich formatting simply doesn't survive. On harder projects I end up abandoning canvas text entirely and rebuilding the layer as DOM elements positioned over the stage.

Sound, loading, and timers all need adapter layers. URLLoader becomes fetch. Sound becomes createjs.Sound. Timer becomes setInterval or a tick handler on the stage. None of these are hard individually; collectively they're a lot of small surgeries.

The "free" wins. SharedObject -> localStorage. ExternalInterface -> just JavaScript. XML (E4X) -> DOMParser. Those are usually one-line changes once you know the pattern.

And the things that just don't port. Stage3D, Starling, native socket connections, anything that relied on the Flash Player binary itself. If a project leaned on those, "convert" stops being the right word and "rewrite" takes over.

Where Claude actually earns its keep

I paste in an AS3 class. Two hundred lines, a few dependencies, some custom events and ask for a CreateJS-compatible port. Years of JavaScript means I'm not accepting whatever comes back uncritically. I know when the event model is wrong (usually). I know when a Sprite reference should really be a Container (sorta). I know when something needs to be a closure rather than a class method because of how this binds inside a tick listener (sometimes).

What Claude saves me is the typing. It handles the boilerplate, suggests modern JS patterns where AS3 was doing things awkwardly, and catches the "you forgot to detach this listener" details I'd otherwise hit on a second pass. I treat it like a fast junior who has read every CreateJS docs page. Useful, occasionally wrong, always worth reviewing.

The pipeline, end to end

  1. Open the .fla in Animate, switch the runtime to HTML5 Canvas.

  2. Let Animate convert what it can: Timeline, symbols, trivial scripts.

  3. Pull the custom AS3 classes out, hand them to Claude with the context it needs about the surrounding code.

  4. Review the output, fix what's wrong, integrate it. Test in the browser. Repeat for each module.

  5. Patch the things Animate consistently gets wrong. Usually text rendering, font loading, and any audio that needs explicit preloading.

It isn't magic. A project that took six weeks to build in 2008 doesn't suddenly take six hours. But it's the difference between "rewrite from scratch" and "port, with judgment." For a library of dozens of old projects, that's the difference between feasible and not.

If you're sitting on a Flash archive that someone wants brought back to life — it's doable. Just don't expect a one-click conversion. Expect a developer with ActionScript scars and a good AI pair-programmer.

If you've been through this kind of migration, I'd love to hear what trapped you — especially around fonts, audio sync, or anything timeline-driven. Always more edge cases than you remember.

 
 
 

Comments


bottom of page