Chapter 27: Importing and Exporting
Templates do not have to start blank, and they do not have to stay inside FX Express. The File menu handles both directions.
Getting a template out
| Command | Produces | Use it for |
|---|---|---|
| File ▸ Download template (.fxt) | The template JSON alone | Version control, hand-editing, sending to someone who already has the media |
| File ▸ Download with assets (.fxz) | A ZIP with the template plus its images, audio, and custom fonts | Moving a template between accounts, projects, or regions |
| File ▸ Save to Library… | An entry in the shared Library tab | Making a design reusable inside your own workspace |
| File ▸ Duplicate | A copy beside the original | Branching a design without losing the original |
About .fxz bundles
An .fxz is a ZIP containing template.fxt, a manifest.json, and the referenced assets under assets/media, assets/fonts, and assets/audio. The manifest records how each original reference maps to a bundled file, so importing rewrites the references back correctly.
Everything the template references is collected: image and video layers, scene backgrounds and layout media, audio layers and scene sounds (including generated voiceover that has been stored beside the template), subtitle files, and the fonts used by text, table and list layers or by a custom theme. Each file is read from wherever the template itself lives — its project, or your UserFS folder — so a template in a subfolder or a project bundles exactly the files it plays.
Scene layers are followed: an imported scene’s media is bundled from the source template’s own directory and project, which is what makes an .fxz self-contained even when it contains borrowed scenes.
A source written as a {variable} travels as the file the variable’s default value names — what the template shows when nothing is personalised. That is how an imported After Effects template’s footage, which arrives as media variables, comes along: importing the bundle puts the file beside the new template and points the variable’s default at it.
Two things do not travel, by design:
- Media referenced through a
{variable}with no default. A source likeproducts/{sku}.jpgwhoseskuhas no default value (or an empty one) names a different file per render, so there is no one file to bundle. - Media at an external URL. An
https://source is kept as-is and keeps loading from that address.
Both are recorded in the manifest as not bundled and produce no warning.
Media that could not be read is different. If a referenced file is missing from its store, or a locally recorded sound is no longer in this browser, the bundle is still saved but a Bundle incomplete notice lists every file that was left out and where the editor looked for it. Treat that as a failed export: fix or re-upload the asset and export again, rather than sending a bundle that will show gaps at the far end.
One rare case is also reported there: when an imported scene uses the same relative name (say media/logo.png) as the host template for a different file, only the host’s copy can be bundled under that name.
Getting a template in
File ▸ Import Template… is one picker for every supported format. The extension decides which importer runs:
| Extension | Importer |
|---|---|
.fxt, .json | Template JSON |
.fxz | Bundle — unpacks assets and rewrites references |
.zip | A bundle saved as .zip, or a zipped After Effects Collect Files folder — the ZIP’s contents decide |
.idm | iDooMo / After Effects composition |
.aep | After Effects project — a new template whose precomps arrive as AE comps |
An unrecognised name goes to the template importer, which sniffs the bytes and reports its own error.
An .aep or a Collect Files ZIP picked here becomes a new template beside the open one, named after the file you picked. Its import report shows first; closing it opens the new template — the same as importing from the New Template dialog.
Importing After Effects compositions (.idm)
An .idm file is an After Effects composition exported by iDooMo. Importing one is not a mechanical file conversion — the composition is recreated:
- Reading the file — a deterministic extractor pulls out a digest: layer names, fonts, placeholder images, numeric evidence.
- Installing fonts — custom fonts found in the composition are uploaded.
- Recreating with Claude — a model writes the FX Express document from the digest. This is the slow stage; the progress dialog shows elapsed seconds so a multi-minute analysis doesn’t look stuck.
- Storing images — placeholder and embedded images are uploaded.
- Saving template — the result is compiled and saved.
The import report
When it finishes you get a report dialog:
- What came across — canvas size, duration, layers by kind, variables, media, custom fonts.
- What didn’t — diagnostics grouped by code, each with a count, the affected layers, and help text.
- The layer map — how each source layer was interpreted, with notes on what was recovered, what was inferred, and what was dropped.
Read the layer map. An AE composition has features FX Express does not, and the notes tell you exactly where the model made a judgement call — that is where to look first when something is off.
An import is a starting point, not a finished template. Expect to fix typography and timing by hand.
Importing After Effects projects (.aep)
FX Express can also import an After Effects project file (.aep) directly, without going through iDooMo first. Projects saved by After Effects 2018 through 2026 are supported.
This path is not a recreation by a model — the importer reads the project file’s own format and converts layout, text, and keyframe animation exactly, including After Effects’ own easing curves. Where FX Express has an equivalent, the numbers match the original project precisely.
.aepx — After Effects’ XML project format — is not read directly. Re-save the project as a regular .aep from After Effects (File ▸ Save As…) and import that instead.
Importing a project with its footage (Collect Files ZIP)
An .aep holds none of its footage (see below). To bring the footage along, package the project in After Effects with File ▸ Dependencies ▸ Collect Files…, zip the folder it writes, and import the ZIP wherever you would import the .aep — New Template, File ▸ Import Template…, or Media ▸ Import ▾ ▸ After Effects comps….
The importer opens the project inside the ZIP and uploads each footage file a layer uses beside the template before it maps the project, so those layers arrive showing their real image, video or sound. The import report’s Media line says how many files came from the ZIP — 12 of 14 files — and the Missing media list holds only what the ZIP did not have.
- Which project. The
.aepnearest the top of the ZIP. A ZIP with two projects side by side is refused (AEP_ZIP_SEVERAL_PROJECTS) — zip one Collect Files folder at a time. A ZIP with none is refused withAEP_ZIP_NO_PROJECT. - Which file is which footage. Each footage item is matched by the path After Effects recorded for it: Collect Files keeps the project’s folder structure under
(Footage), so the file sharing the most of that path wins. A footage item that two files in the ZIP fit equally well is left missing rather than guessed. - Only what is used. Footage that no layer of the imported compositions uses is not uploaded, even if Collect Files gathered it.
- Names. Each file is uploaded the way the Media panel uploads it. A name already taken in the template’s folder gets
-2,-3… added, so no existing file is overwritten. - Fonts. After Effects does not collect fonts, but a
.ttfor.otfyou put in the folder before zipping it is installed in your workspace’s font library first, so text set in it is matched rather than substituted. - Size. The ZIP is read in place, one file at a time, so a large archive does not have to fit in memory — but every footage file is uploaded, so a big project takes a while. A footage upload that fails stops the import, and no template is saved.
- The extras Collect Files writes — the report
.txt, and the__MACOSXfolder a Mac adds when it zips — are ignored.
The main composition and every comp it uses
An After Effects project can contain many compositions — precomps, alternate cuts, unused drafts. The import starts from the main composition, the one the project renders as its output:
- The main composition becomes the template’s scene.
- Every composition it uses — directly, or through other precomps at any depth — comes in once, as an AE comp, however many times it is placed. Each keeps its own layers, size, frame rate and duration. AE comps are editable: see Chapter 28.
- Every precomp layer becomes a Comp Layer showing its comp. It keeps the layer’s position, scale, rotation and anchor, with their keyframes; its in point and length; its start time, as the Comp Layer’s Content Offset; its time stretch; its opacity, blend mode and Gaussian blur; its mask (as a shape matte, below) and its track matte. A 3D precomp layer is one flat picture placed in 3D, as After Effects draws it without Collapse Transformations.
- Compositions the main one never uses are listed in the report as not imported, by name.
Nothing is flattened, so an animated precomp position — which a flattened import could only fold in at its starting value — moves as it does in After Effects.
Templates imported before AE comps existed keep the structure they were imported with: their precomp layers were pulled up into the scene, and precomps that had to stay whole became imported scenes. Import the project again to get comps.
To bring the comps of a project into a template you already have, use Media ▸ Import ▾ ▸ After Effects comps… — see Chapter 28.
Within the main composition and its comps, layout, text and keyframed transform animation are recreated. These are not:
- Shape layers
- Effects
- Expressions
- Cameras and lights
- 3D — a 3D layer comes in flattened to 2D
Variables from names
Text, image and video layers that are meant to change per video come in as variables, so a template is personalisable straight after import. A layer becomes a variable when:
- its own name matches one of the variable patterns — by default
{name},$name,PH_*,Media_*,Title_*,Header_*,Text_*,Logo*andYour * Here(case doesn’t matter); or - it carries the iDooMo placeholder effect; or
- it sits inside a precomp whose layer name matches a pattern — a slot. The
name that counts is the precomp layer’s, in the comp that holds it: the
precomp’s own name unless that layer was renamed. The slot’s text and
image/video layers become variables named after it (
Media_05→{media_05}, a second text layer →{media_05_2}); shapes, solids and other decoration inside it stay as they are.
A precomp placed more than once is still one slot: its layers get one variable
each, however often it appears. Names are made valid for a variable — spaces and punctuation become _, umlauts are spelled out (Überschrift → ueberschrift) and other accents dropped.
With comps, each comp’s layers carry the comp’s own variable names and each Comp Layer maps them to template variables — so the template ends up with the variables described here, named as a flattened import would have named them: {title_01} under one precomp layer, {title_01_2} under a second placement of the same comp. One addition: a layer that is a slot in one placement but plain decoration in another gets a variable for that second placement too, holding what the project showed there, because both placements share the one layer inside the comp. The report lists it with the rest.
Each variable starts with what the project held: the text, or the media file the layer is waiting for. The import report lists every variable it created.
The patterns and the placeholder rule can be changed per import only through
the MCP import_aep tool (variablePatterns, placeholderVariables) and the
aep2fx command line (--var-patterns, --placeholder-vars). The editor has no setting for them: New Template, File ▸ Import Template… and Import ▾ ▸ After Effects comps… always use the defaults above.
Masks come across
FX Express masks one layer with another rather than with a path on the layer itself — but a mask is the same idea, a shape deciding what of a layer shows, so every mask outline is re-made as a shape element matting the layer. It lands where the mask was and moves, scales and turns with the layer. You will see it in the scene as an extra element named after the layer, drawn only as a mask and never on its own; deleting it un-masks the layer.
A mask that is a plain rectangle or ellipse becomes a rectangle or circle shape. Any other outline — a free-drawn path, a star, a traced silhouette, a rotated rectangle — becomes a path shape carrying the mask’s own vertices and curve handles, so the cut is the one After Effects makes rather than the nearest tidy shape.
Several masks that all add come across as one shape with a contour each, unioned together. A single mask set to Subtract, or an inverted mask, comes across as the layer’s own rectangle with the outline cut out of it as a hole — which is what those two do.
What still cannot come across is never about the outline, and each has its own row in the report saying what to change:
- a mix of adding and subtracting masks on one layer, or an inversion among several masks. The result depends on whether the subtracted region sits wholly inside the added one, and drawing it wrong would look plausible
- a mode of Intersect, Lighten, Darken or Difference — these are operations on coverage that no single filled outline performs
- an inverted or subtracted mask on a text layer, which has no rectangle of its own to cut the hole in
- a feather, an expansion, or a mask opacity below 100%, each of which puts the edge somewhere the outline does not
- an animated mask path
- a mask that was never drawn on, and so encloses nothing
A layer whose mask could not be carried comes in whole and unmasked. The most reliable fix for any of these is to bake the mask into the artwork — export the layer from After Effects with the mask already applied — and import that.
A layer that has both a mask and a track matte keeps the track matte: an element is matted by exactly one other, and the track matte is exact where the mask is re-drawn as a shape. The report names which one survived.
Track mattes come across
A layer matted by another in After Effects arrives matted here too, pointing at the same layer. After Effects switches a matte layer’s video off — it shapes another layer rather than drawing — and the import keeps such a layer for that reason, where it would otherwise drop a switched-off layer.
Two kinds of matte differ:
- Alpha and inverted alpha mattes convert exactly.
- Luma and inverted luma mattes are reported as approximated. FX Express mattes on one colour channel and has no luminance one, so the red channel stands in. For the greyscale artwork a luma matte is nearly always made of the two are the same picture; for a coloured matte the coverage will differ.
A matted precomp comes across as a Comp Layer with the same matte, applied to the comp’s picture as a whole, as After Effects applies it. A precomp used as the matte for another layer comes across too: its Comp Layer is the matte. (Templates imported before AE comps existed could not do either, and their reports say so.)
What the report says about comps
| Report row | Code | What happened |
|---|---|---|
| Collapse Transformations not carried | AEP_COLLAPSE | The precomp layer had Collapse Transformations on. The comp is drawn as one flat picture inside its Comp Layer’s box — clipped to its frame and seen through its own camera — rather than mixed into the comp around it |
| Part of the project was not read | AEP_SIDECAR_WARNING | A precomp that is time-remapped (it plays straight through), stretched to zero or backwards (it plays at 100%), contains itself, is nested deeper than 10 levels, or would take the project past 500 layers. The detail says which |
| Composition not imported | AEP_COMP_IGNORED | A composition the main one never uses |
Precomp flattened (AEP_PRECOMP_FLATTENED) and Precomp kept as a scene layer (AEP_PRECOMP_SUBSCENE) only appear while the server still runs the previous importer, which flattens.
Media and fonts arrive as placeholders
An .aep never stores the media it uses or the fonts it names — only the absolute file paths recorded on the machine that made it, and PostScript font names. Every bare .aep import is missing that media and those fonts, no matter how simple the project, because the file itself never had them. Import a Collect Files ZIP instead (above) and only what the ZIP lacks is missing.
The import report says exactly what to supply:
- Missing media — each layer whose source wasn’t found, with its name, size, the path After Effects recorded (so you know which file on your own machine belongs there), and the name that file needs once it is here. The layer already points at that name, so uploading the file beside the template finishes the import on its own — there is nothing to re-point by hand. Until it arrives, the layer draws as unreadable media rather than as an empty slot.
- Fonts — each PostScript name the project asked for and what FX Express substituted for it, so you know which faces to double-check.
Treat the result the same way as an .idm import: supply the missing media and fonts, then fix up anything the report’s “not imported” list calls out.
Authoring templates as FXHTML
For building templates from scratch programmatically — rather than clicking them together — FX Express accepts FXHTML, an HTML dialect that compiles to a template. It is the recommended route for AI-assisted authoring and for generating families of similar templates.
FXHTML is a developer feature rather than an editor one; see docs/ in the repository and the fxhtml-authoring skill for the profile and the compiler CLI.
Troubleshooting
The .fxz imported but images are missing. The export would have shown a Bundle incomplete notice listing the files it could not read; check the bundle’s manifest for references recorded as not bundled. Variables with no default value and external sources are expected there (nothing to bundle); anything else was unreachable at export time. Re-export from a session where the media resolves.
“Unsupported bundle version”.
The .fxz was written by a newer FX Express. Bundle version is a hard compatibility boundary; importers refuse versions they don’t know.
The IDM import is taking minutes. Expected during “Recreating with Claude…”. The dialog counts elapsed seconds so you can tell it is still working.
The IDM import lost an effect or an animation. Check the diagnostics and the dropped notes in the report. FX Express implements a smaller feature set than After Effects; anything with no counterpart is reported rather than silently approximated.
Fonts came in with the wrong name. Custom fonts are installed from the composition and referenced by family. Check the Uploaded group in any Font Family dropdown and re-point the text layers if the family name differs from what the composition used.
A comp looks different from After Effects where its layer had Collapse Transformations on. The import draws every comp as one flat picture inside its Comp Layer: contents that spilled past the comp’s frame are cut off, and 3D layers inside see the comp’s own camera. The report lists each such layer under Collapse Transformations not carried. Switch the option off in After Effects to preview what the import shows, and rebuild the effect from there.
A precomp’s animation runs straight through instead of following its time remap. Time remapping is not carried: the comp plays at its normal speed from the Comp Layer’s Content Offset. Use Stretch on the Comp Layer for a constant speed change, or split the comp into several Comp Layers with different Content Offsets.
Importing an .aep says the file couldn’t be read.
Check that it’s actually an .aep, not an .aepx. After Effects’ XML project format isn’t read directly — open the project in After Effects and use File ▸ Save As… to write a regular .aep, then import that.
The .aep import is missing footage, images, or audio.
Expected. An After Effects project only records where the designer’s copy of a file lived, never the file itself. The import report’s Missing media section names every one, and each layer already points at the name its file will have — upload the files beside the template and the layers resolve themselves. The report’s upload as line is the name to match; uploading renames a file the same way the import predicted, so supplying the original usually just works.
Two files whose names differ only in capitals, spaces or punctuation end up as one stored name. The report calls that out as Two missing files want the same name — rename the originals apart before uploading, or only one of them will ever arrive.