Loading media
Your file never leaves the browser.
Where the file goes
Nowhere. The file is turned into an object URL and assigned to an image or video element. There is no fetch, no form post and no upload endpoint on this path. The previous object URL is revoked first, so a long session does not leak the bytes of every file you opened.
The one exception is a generative render, which necessarily sends a downscaled copy to the model. That is covered under Generative.
Accepted formats and limits
The picker accepts image/* and video/*. Anything whose MIME type starts
with video/ is treated as video, everything else as an image.
| Limit | Value | Applies to |
|---|---|---|
| Max image size | 40 MB | checked after decode |
| Max image pixels | 25,000,000 (about 5000 x 5000) | checked after decode |
| Hard ceiling | 200 MB | rejected before decode |
| Max video size | 150 MB | checked before load |
Images are checked in two stages on purpose. Anything over the hard ceiling is refused without decoding, because decoding it would exhaust the tab. Everything else is decoded and then checked for bytes and pixels together, so one message can tell you which of the two failed.
There is no duration or resolution cap when loading a video. The duration limit appears at export.
Three ways in
- Picker. The Upload button in the bottom bar.
- Drag and drop. Onto the canvas. This works in the empty state only, because the drop target is the empty-state panel itself.
- Paste. Anywhere on the page, at any time, loaded or not. This is the one that always works.
PNG recipes
Dropping in a PNG that ASCII Magic exported will also load the look it was made with. The recipe
rides inside the file in a tEXt chunk, which every other image tool ignores. You will see
a "Recipe loaded from image" toast. If it fails for any reason it fails silently, so an ordinary PNG
never breaks the upload.
Crop and rotate
Opened from the Crop button, never automatically. Rotate is two buttons at 90 degrees each. Aspect ratios are Free, 1:1, 4:5, 3:4, 9:16, 16:9, 4:3 and 3:2.
What you crop is the rendered output, with effects applied, not the raw source. The coordinates stay in source space, so saving applies a purely geometric transform. If a video is playing it pauses while the modal is open and resumes when you close it.
Video
Playback controls appear under the canvas once a video loads: play and pause, a seek bar with a scrub tooltip, a time readout, and a speed menu from 0.25x to 2x. Seeking while paused re-renders, so you can step to a frame and work on it.
Video renders every animation frame so it tracks the source frame rate. Animated stills are capped at about 30fps instead, because running a static animation at 120Hz spends four times the CPU on motion the eye cannot resolve.
Depth estimation is image-only. It costs seconds per frame, so it is cleared when a video loads.
Every way to get a file in
| Route | How | Notes |
|---|---|---|
| Drag and drop | Drop anywhere on the canvas. | The most direct route. |
| Paste | Cmd or Ctrl and V anywhere on the page. | Works with a screenshot straight from the clipboard, with no intermediate file. |
| The Upload button | Bottom bar. | Opens the system picker, filtered to images and video. |
| The library | Left rail, Backgrounds. | Curated photos and video loops that load without touching your disk. Some are Pro. |
| A demo | Loads on boot, or with ?demo=1. | So the editor is never staring at an empty canvas. |
Video
Anything whose MIME type starts with video/ is treated as video. The engine renders
the current frame continuously, so scrubbing the timeline restyles as you scrub and there is no
per-frame render step to wait through.
Duration is not capped on load. It is capped on export, at 9000 frames, which is five minutes at 30fps. A longer source loads and plays fine, and the export is what refuses.
Style choice matters more on video than on stills. An error-diffusion dither carries each pixel's error into its neighbours, so a one-pixel change in the source moves dots across the whole frame, and the result boils. Ordered algorithms are stable frame to frame. Styles lists which is which.
Why images are checked in two stages
A 200 MB ceiling is applied before anything is decoded, and the real limits of 40 MB and 25 megapixels are applied after. That looks redundant and is not.
File size does not tell you pixel count. A heavily compressed 8 MB JPEG can decode to something enormous, and the only way to know is to decode it. But decoding an arbitrarily large file is how you hang a tab, so a coarse pre-check rejects the obviously hostile cases cheaply, and the accurate check runs once decoding is safe.
What happens to the previous file
Each new source revokes the object URL of the one before it. Without that, a long session holds every file you ever opened in memory, which on a phone ends the session for you. This is also why you cannot undo back to a previous source: the bytes are gone, deliberately.
Backgrounds
Separate from your source. The background is what sits behind the glyphs, and
bgMode chooses between a blur of your own image, a solid colour, the original image
underneath, or nothing at all. Only PNG preserves the alpha that none produces, so
exporting a transparent render as JPG silently fills it.
The library also carries background videos and photos. Some of those are Pro, gated by asset rather than by style, so a free account sees them and can tell what is there.
Last updated