Launch week
Engineering10 min read

How we shipped FDX round-trip in four weeks

From 'import mostly works' to 'export is production-safe' — the parser fights, the PDF fights, and the one Final Draft quirk that ate a Thursday.


Four weeks ago we set a deadline: ship FDX round-trip good enough that a working screenwriter wouldn't notice they'd gone through us. Today Arqo is live. The exporter isn't perfect, but it is production-safe — which is a specific bar we didn't understand until we started fighting for it.

What "production-safe" actually means

Production-safe means the PDF you export survives a producer reading it on a tablet, a line producer stripping it with Movie Magic, and a script supervisor continuing it at the monitor. The three things that will get you thrown out of a writers' room are, in order: (1) scene numbers that don't lock, (2) revision marks that don't match the change, (3) page breaks that re-flow when you reopen the file. We had to get all three.

The parser fight

FDX is XML, which is the good news. The bad news is that every FDX exporter in the wild produces subtly different output. Final Draft itself writes a Generator="Final Draft 12" attribute; WriterDuet writes Generator="WriterDuet"; Celtx doesn't bother. We sniff the generator to branch through a few known quirks — the one that bit us hardest was WD's habit of wrapping dual-dialogue pairs in a <DualDialogue> element (correct!) while setting dual-right on the second cue via an otherwise-undocumented attribute.

The one quirk that ate a Thursday

Final Draft's revision marks are attached to paragraphs, not to diffs. If you change one word in a line, FD asterisks the whole line. Our diff engine was smarter than that — it tried to highlight just the word. The result was a PDF that was technically more informative and practically unusable, because script supervisors scan for asterisks to find revision markers. We reverted to paragraph-level marking by Friday.

What's next

The next four weeks are voice-tuned AI. We'll write that up too.