figcraft/docs/file-format-parity.md

5.8 KiB
Raw Blame History

File format parity

Last reviewed: 2026-10-10 · Last updated: 2026-10-11 · Change: minor (animated GIF fills and TIFF images; last major: created, formats from the installed Figma's Info.plist and help center, ours from source) · Target: Figma Design (desktop app 126.10.7)

Every format Figma reads or writes, with FigCraft's support. Sources: Info.plist of /Applications/Figma.app (document types only; nothing inside the bundle's code was read), Figma's help center (image and video types, export formats), and FigCraft's source.

Summary (estimated): ~40% ready. The core interchange formats (SVG, PNG, JPG, PDF) are solid and tested; Figma's own document, .fig, can't be read or written, which alone keeps FigCraft at alpha.

Documents

Format Figma FigCraft read FigCraft write Fidelity / testing Hours
.fig (Figma Design, com.figma.document, application/x-figma) native (cloud; "Save local copy") no no none read 30–60, write 15–30
.jam (FigJam), .deck (Slides) native to other Figma products no no out of scope —
REST API file JSON (GET /v1/files/:key) + local variables JSON + images/ folder the API's output yes (file.open, file.import, CLI) no pages, layer tree, geometry, paints, strokes, effects, text runs, vectors, auto layout, constraints, grids, components, sets, instances with overrides, component properties, styles, prototyping (incl. conditionals and variable modes), variables with modes, aliases, scopes and bindings; warnings for what's skipped (video triggers and actions, modifier keys). Unit tests in crates/format/src/rest/*_tests.rs —
.figcraft (ours: zip of document.json + images, versions inside) — yes yes streamed JSON, 50k layers save ~0.09 s / load ~0.16 s (cargo xtask bench); old files keep opening (large_tests.rs) —
Local library files team libraries in the cloud yes (enable a .figcraft as a library) yes (publish) per-asset versions, updates with overrides kept see collaboration-parity

Import (place / paste / drop)

Format Figma FigCraft Notes Hours
SVG editable vectors yes, editable corpus of 21 synthetic files with hand-computed expected pixels, structure and round-trip checks; gradients, patterns as image fills, clip paths, masks, shadow/blur filters, blend modes, text as text layers; other filters dropped with a warning; text on a path as outlines; fuzzed 2–4 (filters)
PNG, JPG yes yes —
GIF yes (animated) yes, animated the file is kept as is; the canvas and PNG, JPG and PDF exports show the first frame (SVG exports embed the file, so viewers that animate GIFs animate it), the presenter and the preview play it (frames decoded on first play: at most 500 frames and 128 MB, past that the rest don't play; always loops) —
WebP yes yes —
HEIC yes no shortcut: no Rust decoder; the usable ones (libheif, libde265) are C libraries, and HEVC carries patents. Revisit when a Rust decoder exists 2–3
TIFF Safari only yes open, import, place, drop (the image crate's TIFF decoder); SVG exports embed it (and BMP) as PNG, which SVG viewers show —
BMP — yes —
MP4, MOV, WebM (video fills, paid plans) yes no shortcut: decoding H.264/HEVC/VP9 needs non-Rust libraries (FFmpeg or each platform's media framework); presenter playback would reuse the animated GIF clock 4–8
Images over 4096 px downscaled to 4096 kept —
Pasted content from other apps images, SVG, text, Figma clipboard images, SVG, text (newest clipboard content wins) no Figma clipboard (it carries Figma's own binary) with .fig

Export

Format Figma FigCraft Notes Hours
PNG yes, scales/suffixes yes export settings per layer, presets (2x, 512w, 512h), preview, "Export N layers" —
JPG yes yes —
SVG yes (outline text option, ids) yes alpha/luminance masks kept; noise, texture, progressive and background blur, glass embedded as images 1–2
PDF yes yes one page per frame, real selectable text in subset fonts, links, vectors and gradients as vectors, effects as images; bleed, crop/bleed marks, page boxes, naive CMYK; checked by rendering the PDF back against PNG exports CMYK output intent 2–4
WebP — yes (ours) —
Copy as CSS / SVG / PNG / text / link yes yes —
Dev Mode code (CSS, iOS SwiftUI, Android Compose) yes yes, plus HTML and React see dev-mode-parity —
.fig ("Save local copy") yes no 15–30

Fonts

Figma FigCraft
Local fonts yes (font helper / desktop app) yes (system scan)
Bundled/shared fonts Google Fonts in the cloud optional CRAFT_FONTS_DIR build input (storytold/craft-fonts)
Variable fonts yes yes (axes, named instances, per-range axis values)
Missing-font replacement on open yes warnings only (REST import)

Revision history

Date Change Summary
2026-10-11 minor Animated GIF fills and TIFF images (gap 12, without video and HEIC): GIF fills keep the original file, show the first frame on the canvas and in exports and play in the presenter and the preview (frames decoded on first play, at most 500 frames and 128 MB; always looping; the window wakes only for a GIF's next frame); TIFF images open, import, place and paste. Paint breadth 85% → 87%, 5–9 h → 4–7 h; gap 12 6–12 h → 5–10 h (video playback and HEIC left, both needing non-Rust decoders); feature breadth (~79%), ready for real work (~47%) and full parity hours unchanged at this rounding
2026-10-10 major Created from the 2026-10-10 re-measure