Plotzilla
Unleash your plot on the world.
A screenwriting app for Linux that formats scripts to the Hollywood standard as you type. It saves plain-text Fountain files, imports and exports Final Draft, and prints industry-standard PDFs.
Plotzilla is built with Go and Wails (GTK 3 and WebKitGTK), with a ProseMirror editor. It has a GNOME look but is not tied to GNOME: it runs on any Linux desktop (KDE Plasma, Xfce, Cinnamon, MATE…), on Wayland or X11, and follows the desktop's window button layout and light/dark preference.
Contents
- Installation
- The editor
- Screenplay elements
- Typing a script
- Outline and notes
- Autocomplete
- Find and replace
- Spelling
- Pages and scenes
- Revisions and locked pages
- Title page
- Saving and files
- Exporting
- Keyboard shortcuts
- Desktop integration
- Development
- Not supported yet
- License
Installation
Requirements (Arch Linux package names): go 1.23 or later, nodejs 20.19 or later, npm,
webkit2gtk-4.1, gtk3.
make # builds build/bin/plotzilla
./build/bin/plotzilla my-film.fountain # the file argument is optional
Install the Courier Prime font (ttf-courier-prime on the AUR) so the text on screen matches
the PDF exactly. Without it, Plotzilla uses Courier New, Nimbus Mono or Liberation Mono.
Spell checking uses the system's Hunspell dictionaries: install one per language you write in,
for example hunspell-en_us, hunspell-en_gb or hunspell-fr.
The editor
The script is shown as a sheet of paper, at the real size and with the real margins of the printed page. The window has four areas:
- Header bar (top): file name and save status, file buttons, the element type menu, formatting and note buttons, find, spelling and revisions buttons, title page and export buttons, and the scene navigator and focus mode toggles. Drag it to move the window; double-click it to maximize.
- Scene navigator (left): every scene with its number, heading and page, grouped under the script's sections, with their synopses. The current scene is highlighted. Click an entry to jump to it. The autosave switch is at the bottom.
- Page (center): the script, with scene numbers in the left margin and live page breaks.
- Status bar (bottom, floating): the current element type, what
EnterandTabwill do next, the current page out of the total, the word count and, while revising or once pages are locked, the current revision andPages Locked.
The bold, italic, underline, note and dual dialogue buttons light up when the cursor is inside
such text; the revisions button lights up while revisions are marked or pages are locked. The save status shows Edited, Saving…, Saved · auto (or Saved when autosave is
off) and, for a script that has never been saved, Draft backed up.
Focus mode (Ctrl+Shift+F) hides the navigator, the header bar and the status bar so only
the page remains. Move the pointer to the top or bottom edge to bring the bars back.
Zoom goes from 60% to 200% (Ctrl+=, Ctrl+-, Ctrl+0). Zoom, the navigator's visibility,
autosave, spelling and the export options are remembered between sessions.
Screenplay elements
| Element | Shortcut | Format |
|---|---|---|
| Scene heading (slugline) | Ctrl+1 |
Capitals, 1.5" from the left edge, numbered |
| Action | Ctrl+2 |
1.5" from the left edge, full width |
| Character | Ctrl+3 |
Capitals, 3.7" from the left edge |
| Parenthetical | Ctrl+4 |
3.1" from the left edge, in parentheses, hanging indent |
| Dialogue | Ctrl+5 |
2.5" from the left edge, 35 characters wide |
| Transition | Ctrl+6 |
Capitals, right-aligned |
| Insert / shot | Ctrl+7 |
Capitals, like a scene heading but not numbered and not a scene |
| Intertitle | Ctrl+8 |
Capitals, centered (title cards such as PARIS, 1942) |
| Centered | Ctrl+9 |
Centered text (for example THE END) |
| Section | type # |
Outline heading (#, ##, ###…), not printed |
| Synopsis | type = |
Summary of a scene or section, not printed |
The element type menu in the header bar lists them all with their shortcuts. Use the arrow
keys and Enter to pick one from the keyboard. Sections and synopses are described in
Outline and notes.
Dual dialogue puts two speeches side by side, for characters talking at the same time.
Press Ctrl+D (or the columns button) in a dialogue:
- If the next or previous dialogue block is adjacent, the two are placed side by side.
- Otherwise an empty right column opens with a new character cue.
- Inside a dual dialogue,
Ctrl+Dsplits it back into two blocks.
In the editor, the columns are drawn side by side, marked by a thin line in the margin.
Enter at the end of the left column moves to the right column, and at the end of the right
column it leaves the block.
Text formatting: bold, italic and underline (Ctrl+B, Ctrl+I, Ctrl+U) are kept in
Fountain, Final Draft and PDF files. Notes (Ctrl+Shift+N) are described in
Outline and notes.
Typing a script
Plotzilla follows the Final Draft conventions, so a script can be written without touching the mouse.
Enter at the end of an element creates the element that usually follows it:
| After | Enter creates |
|---|---|
| Scene heading | Action |
| Action | Action |
| Character | Dialogue |
| Parenthetical | Dialogue |
| Dialogue | Action |
| Transition | Scene heading |
| Insert, intertitle, centered | Action |
| Section | Scene heading |
| Synopsis | Action |
Enter on an empty element changes its type instead: an empty action becomes a scene
heading, an empty character or dialogue becomes an action, and an empty parenthetical becomes
dialogue. Enter in the middle of an element splits it in two.
Tab changes the type of the current element: Action → Character → Transition → Scene heading
→ Action, and Dialogue ⇄ Parenthetical. Shift+Tab goes the other way.
Shift+Enter adds a line break inside the same element.
Some elements are recognized as you type:
INT.,EXT.,EST.,INT./EXT.orI/Eat the start of an action makes it a scene heading.INSERTat the start of an action makes it an insert.#at the start of an empty action or scene heading makes it a section (##a subsection, down to######), and=makes it a synopsis.(at the start of an empty dialogue opens a parenthetical, with the closing parenthesis already in place.- An all-caps action ending in
TO:becomes a transition when you pressEnter.
Changing an element to a parenthetical adds the parentheses; changing it back removes them.
Inside a parenthetical, Enter just before the closing parenthesis moves on to the dialogue.
Pasted plain text is read as Fountain, so a script copied from another app or a text file keeps its scene headings, characters and dialogue.
Undo and redo: Ctrl+Z, Ctrl+Shift+Z or Ctrl+Y.
Outline and notes
Plotzilla keeps the outline tools of Fountain. None of them is printed; they are saved in Fountain files, and as script notes in Final Draft files (see Saving and files).
- Sections (
# Act One,## The Rialto) structure the script into acts, sequences or any grouping you like. Type#(or##,###…) at the start of an empty line, or pick Section in the element type menu. The level shows as#marks in the left margin. - Synopses (
= The young woman smuggles the can into the cinema.) sum up a section or a scene. Type=at the start of an empty line, or pick Synopsis in the menu. - Notes (
[[Warmer light here?]]) are remarks inside the text. PressCtrl+Shift+N(or the note button) to start or end a note, like bold; select text and press it to turn the selection into a note. Notes are shown highlighted in yellow.
The scene navigator shows the sections as headings above their scenes and each synopsis under the entry it follows, so the navigator reads as an outline. Sections, synopses and notes do not count in the word count, and a line that only holds a note takes no room on the printed page.
Autocomplete
Suggestions appear under the cursor while you type. Use ↑ and ↓ to browse, Enter or
Tab to accept, and Esc to dismiss.
- Character: names already used in the script, most frequent first. After an opening
parenthesis:
V.O.,O.S.,O.C.,CONT'D. - Scene heading:
INT.,EXT.,INT./EXT.,EST.; then the locations already used; then, after-, the time of day (DAY,NIGHT,CONTINUOUS,LATER,MOMENTS LATER,MORNING,EVENING,DUSK,DAWN,SAME) and any other time used in the script. - Insert:
INSERT -,CLOSE ON,ANGLE ON,POV -,WIDE ON,EXTREME CLOSE UP ON,BACK TO SCENE. - Transition:
CUT TO:,FADE OUT.,FADE TO:,DISSOLVE TO:,SMASH CUT TO:,MATCH CUT TO:,JUMP CUT TO:,FADE TO BLACK.
Find and replace
Ctrl+F (or the magnifier button) opens the find bar at the top right of the page. Text
selected in the script is searched right away. Every match is highlighted and the counter shows
which one is selected (3 of 12).
EnterandShift+Enterin the find field go to the next and previous match;F3andShift+F3(orCtrl+GandCtrl+Shift+G) do the same from anywhere. The search wraps around the script.- The two buttons next to the field match the case exactly and match whole words only.
Ctrl+H(or the arrow at the left of the bar) shows the replace field.Enterthere, or Replace, replaces the selected match and moves to the next one. All (Ctrl+Alt+Enter) replaces every match at once.- Replaced text keeps its bold, italic and underline. Each replacement, and a whole
Replace all, is undone in one step with
Ctrl+Z. Esccloses the bar and returns to the script.
The search covers the script, not the title page.
Spelling
Misspelled words get a wavy red underline, half a second after you stop typing. The word you are typing is left alone until the cursor leaves it. Right-click an underlined word for:
- corrections, most likely first, in the word's case (
TEHgivesTHE); - Add to Dictionary: the word is accepted from now on, in every language. The personal
dictionary is the plain text file
~/.local/share/plotzilla/dictionary.txt; - Ignore All: the word is accepted until Plotzilla is closed.
The spelling button in the header bar lists the installed dictionaries. The first time,
Plotzilla picks the one matching the system language. F7 turns spell checking on and off.
Screenplays are full of names, so:
- Character cues are not checked, and the names they introduce are accepted everywhere,
possessive included (
ELODIE's). INT.,EXT.,EST.andI/Eat the start of a scene heading, and common abbreviations such asCONT'D,V.O.,O.S.andPOV, are accepted.- Words with digits (
3rd,R2D2) and single letters are not checked.
Plotzilla reads Hunspell dictionaries itself (in $DICPATH, ~/.local/share/hunspell,
/usr/share/hunspell and /usr/share/myspell). It understands prefixes, suffixes, elisions
(l'homme), capitalization and compound words: a German, Dutch or Scandinavian compound
missing from the dictionary (Haustürschlüssel) is accepted when the dictionary allows its
parts to be joined, including the compound patterns some dictionaries describe with Hunspell's
COMPOUNDRULE.
Pages and scenes
Page breaks are computed by the same engine as the PDF export and drawn live in the editor, with the page number, so the screen always matches the printed script.
Pagination follows the usual conventions:
- A page holds 54 lines of Courier 12 pt (58 on A4), so one page is about one minute of screen time.
- A scene heading or an insert never ends a page.
- Action and dialogue only break at the end of a sentence, with at least two lines on each side.
- A page never ends on a parenthetical.
- Dialogue that continues onto the next page gets
(MORE)at the bottom andNAME (CONT'D)at the top of the next page. - A dual dialogue is never split across pages.
- The title page and page 1 are not numbered.
- Sections, synopses and notes are not printed.
Forced page breaks: Ctrl+Enter starts a new page at the cursor (Fountain's ===). In the
middle of an element it splits it, at the end it opens the next element on a new page, and at
the start of an element it puts that element on a new page, or takes it back if it already was.
In a dialogue block or a dual dialogue, the whole block moves to the next page: dialogue is
never split by hand. A forced break is labelled PAGE BREAK in the editor, next to the page
number.
Scenes are numbered automatically. Scene numbers written in a Fountain file (#12A#) or a Final
Draft file are kept.
Revisions and locked pages
Once a script is in production, changes are issued as colored revision pages. The revisions button in the header bar opens the revision menu:
- Start Revisions creates the first revision set, Blue, dated today, and starts marking changes. New Revision Set starts the next color, in the industry order: Blue, Pink, Yellow, Green, Goldenrod, Buff, Salmon, Cherry, then Double White, Double Blue and so on.
- Mark Revisions turns marking on or off. While it is on, everything you type, paste or replace is marked with the current set, and a deletion marks the character next to it so the line still shows as changed. Undo removes a change and its mark together.
- Revised text is tinted with the color of its set, and the status bar shows the set being marked. The menu lists every set with its date.
- Clear Revision Marks… turns all revised text back into original text (it can be undone); the sets are kept.
- Lock Pages fixes every page where it starts now. Material added to a page then flows onto
A pages (
12A,12B) instead of pushing the following pages, and a page whose material has all been removed is merged with the page before it (12-13). Each locked page starts on the same text however the text around it is edited. Choose Lock Pages again to unlock: the script is paginated normally, and locking again numbers the pages afresh.
In the PDF, a revised page gets a header naming its revision and date (Pink Revision - 09/28/26), and each line changed in that revision an asterisk in the right margin. A page
keeps the color of the latest revision that changed it; its older changes are no longer starred.
The export dialog can leave revision marks out.
Title page
Ctrl+Shift+T (or the title page button) opens the title page: title, credit ("Written by"),
authors, source ("Based on…"), contact, draft date and notes. On the PDF, the title block is
centered in the upper half, the contact is at the bottom left and the draft date and notes are
at the bottom right.
Saving and files
Fountain (.fountain) is the native format. It is plain text, readable in any editor, easy
to track with git, and supported by Highland, Fade In, WriterDuet and Arc Studio. Plotzilla also
opens .spmd and .txt files as Fountain.
Final Draft (.fdx) files can be opened and saved. Styles, scene numbers, dual dialogue and
forced page breaks are kept. Final Draft stores the title page as free text, so on import
Plotzilla fills the title page fields from how each line is aligned. In Final Draft files:
- notes are script notes at their place in the text;
- sections and synopses, which Final Draft does not have, are script notes starting with
#or=at the start of the paragraph that follows them, and are read back as sections and synopses; - revised text keeps its revision set, and the sets are named like
Pink Revision - 09/28/26(a set named by Final Draft, such asGoldenrod Rev., keeps its color); - locked pages and the paper size are not written: save as Fountain to keep them.
Fountain has no insert or intertitle elements, so Plotzilla writes them the usual way:
- An insert is written as an all-caps line. It is read back as an insert when it starts like
one (
INSERT,CLOSE ON,ANGLE ON,POV,WIDE ON,BACK TO SCENE…). Otherwise it comes back as an all-caps action line, which prints the same way. - An intertitle is written as centered text (
> PARIS, 1942 <). Any all-caps centered text is read back as an intertitle.
In Final Draft, inserts map to the Shot element and intertitles to centered action.
Sections (#), synopses (=) and notes ([[…]]) are read and written as Fountain defines
them. What Fountain has no syntax for is stored in boneyard comments, which other Fountain apps
ignore:
- revised text is wrapped in
/*rev 2*/…/*/rev*/, where the number is the revision set; - a locked page starts at
/*page 12*/; - the paper size, the revision sets and whether revisions are marked and pages locked are kept
in one
/* Plotzilla {…} */line at the end of the file.
A forced page break is written === on its own line. A script that uses none of these features
is written exactly as before. Other boneyard comments in a Fountain file are ignored when it is
opened, so they are lost when Plotzilla saves it.
Autosave is on by default; turn it off with the switch at the bottom of the scene navigator.
When it is on, Plotzilla saves the script to its file 1.2 seconds after your last keystroke. A
script that has no file yet is backed up to ~/.local/share/plotzilla/recovery.fountain, and on
the next launch Plotzilla offers to restore it.
Before closing the window, creating a new script or opening another one with unsaved changes, Plotzilla asks whether to discard them.
A script can be opened from the command line: plotzilla path/to/script.fountain.
Exporting
PDF (Ctrl+P): US Letter or A4, Courier 12 pt, 10 characters per inch, 6 lines per inch.
The export dialog can include the title page, print scene numbers in both margins (for a
shooting script) and, when the script has revisions, print the revision headers and asterisks.
The PDF uses the standard Courier fonts built into every PDF reader, and its properties carry
the title and author.
The paper size is chosen in the export dialog and saved with the script, because it changes the pagination: the editor shows the A4 page and its page breaks as soon as it is chosen. A4 keeps the same margins and text widths as US Letter; the longer page holds 58 lines instead of 54.
| Element | Position | Width |
|---|---|---|
| Scene heading, action | 1.5" from the left edge | 60 characters |
| Character | 3.7" | 38 characters |
| Parenthetical | 3.1", hanging indent | 25 characters |
| Dialogue | 2.5" | 35 characters |
| Transition | right-aligned at 7.5" | |
| Insert / shot | 1.5", capitals, not numbered | 60 characters |
| Intertitle | centered, capitals | 60 characters |
| Dual dialogue | columns at 1.5" and 4.5" | 27 and 28 characters |
The title page and first pages of a sample script, as exported:
The standard Courier fonts cover Western European characters (accents, curly quotes, dashes).
Other characters, such as Greek, Cyrillic or Asian scripts, are printed as ?.
Final Draft (Ctrl+Shift+E): writes an .fdx file that opens in Final Draft and other apps
that read FDX.
Keyboard shortcuts
| Keys | Action |
|---|---|
Enter |
Next logical element (see Typing a script) |
Shift+Enter |
Line break inside the element |
Ctrl+Enter |
Forced page break |
Tab / Shift+Tab |
Change the element type |
Ctrl+1 … Ctrl+9 |
Scene heading, action, character, parenthetical, dialogue, transition, insert, intertitle, centered |
Ctrl+D |
Dual dialogue on or off |
Ctrl+B / Ctrl+I / Ctrl+U |
Bold, italic, underline |
Ctrl+Shift+N |
Note on or off |
# / = at the start of an empty line |
Section, synopsis |
Ctrl+Z / Ctrl+Shift+Z or Ctrl+Y |
Undo, redo |
Ctrl+N / Ctrl+O |
New script, open |
Ctrl+S / Ctrl+Shift+S |
Save, save as |
Ctrl+P / Ctrl+Shift+E |
Export PDF, export to Final Draft |
Ctrl+Shift+T |
Title page |
Ctrl+\ |
Show or hide the scene navigator |
Ctrl+Shift+F |
Focus mode |
Ctrl+= / Ctrl+- / Ctrl+0 |
Zoom in, zoom out, reset |
↑ / ↓, Enter or Tab, Esc |
Browse, accept or dismiss suggestions |
Ctrl+F / Ctrl+H |
Find, find and replace |
F3 / Shift+F3, or Ctrl+G / Ctrl+Shift+G |
Next, previous match |
Enter / Shift+Enter in the find field |
Next, previous match |
Enter / Ctrl+Alt+Enter in the replace field |
Replace, replace all |
F7 |
Spell checking on or off |
Desktop integration
- The header bar replaces the system title bar: drag it to move the window and double-click it to maximize. The window buttons follow the desktop's button layout, like other GTK applications: which buttons appear (only close with GNOME's default layout) and on which side.
- The window has rounded corners, which become square when maximized, or when no compositor makes the window transparent (some X11 window managers). The header bar dims when the window loses focus.
- The interface is always dark. File choosers follow the desktop's light or dark preference (read from the XDG desktop portal, or from GNOME's setting when no portal is running) and switch when it changes; without an explicit preference they keep the desktop's GTK theme.
- All text is in English, including the buttons of the system file chooser, whatever the system language.
Development
make test # Go tests
make screenshots # regenerate the images of this README (needs Firefox and pdftoppm)
make dev # live reload, requires the Wails CLI:
# go install github.com/wailsapp/wails/v2/cmd/wails@latest
Always build with make, or pass -tags desktop,production,webkit2_41 to go build. The Go
binary embeds frontend/dist, so the frontend has to be built first.
main.go, app.go Wails application and the methods the frontend calls
desktop_linux.go desktop integration: light/dark preference, window button layout
internal/screenplay document model
internal/fountain Fountain reader and writer
internal/fdx Final Draft reader and writer
internal/layout line wrapping and pagination, shared by the editor and the PDF
internal/pdf PDF generator with no dependencies
internal/spell Hunspell dictionary reader and spell checker
frontend/src editor: schema, commands, autocomplete, page breaks, find, spelling,
revisions and locked pages, interface
screenshots/ images used in this README
tools/screenshots the tool behind `make screenshots`
Contributor guidelines (architecture, conventions, testing, and Go, TypeScript and CSS practices) are in AGENTS.md.
Not supported yet
Locked pages and the paper size in Final Draft files; characters outside Western European scripts in the PDF.
License
Plotzilla is free software, released under the GNU General Public License v3.0. See LICENSE.













