awl

Reference

Every command, key, setting, world, and construct.

Nothing on this page is transcribed by hand. Each table is built from the same roster the running app reads, and a test rebuilds every table on each run and fails if this page differs by a byte.

REFERENCE.md is the same reference as a file in the repository. The guide explains how awl's pieces fit together and is a separate document.

Commands

Every command carries up to two chord slots. Slot 1 is the platform-native binding; slot 2 is an Emacs-style binding. Both fire. A cell showing two chords shows both slots.

The chords below are the defaults; [keys] in config.toml replaces them. An empty macOS or Linux cell means the command has no default chord on that platform and is reached from the command palette, which lists every command by name.

Files

CommandWhat it doesmacOSLinuxBuilds
Open file…Choose a file with the platform file chooser.Native, browser
Open folder…Choose the active writing folder with the platform folder chooser.Native, browser
Version history…Summon the version timeline — git log if tracked, saved snapshots otherwise.⌘⇧HCtrl+Shift+HNative
Compare with version…Open the read-only prose diff comparing the current buffer against a past version.Native
Keep version…Prompt for a name, then record the buffer text as a pinned history snapshot under it.Native
New documentStart a new, empty document in the current project folder.⌘NCtrl+NNative, browser
Keep tutorial…Mark the tutorial to be saved once a folder is chosen, opening the project switcher.Native
Move…Summon the destination browser to move the current file to another folder.Native, browser
Rename note…Open the rename prompt, seeded with the current file's name.Native, browser
Duplicate noteSave a copy of the file beside it, deduplicated, and switch to editing the copy.Native, browser
Reveal in file managerShow the current document's file in the platform's file manager (Finder on macOS).Native
Copy file pathCopy the current document's absolute file path to the clipboard.Native
Finish fileSave the file, notify any daemon `--wait` client, and close it.⌘WCtrl+WNative
Download fileDownload the buffer's text as a file — the web export, since there is no real disk.Browser
Export as Word…Export as `.docx`; markdown buffers only, folder chosen on native.Native, browser
Export as HTML…Export as `.html`; markdown buffers only, folder chosen on native.Native, browser
Export as PDF…Choose a folder, then export as `.pdf`; markdown buffers only, native builds only.Native
SaveSave the buffer to disk.⌘SCtrl+SNative, browser
Review the changeShow an unresolved change: differences, your version, disk version. Changes nothing.Native
Save your versionSettle an unresolved external change by writing the buffer over the file on disk.Native
Use disk versionSettle an unresolved change by replacing the buffer with the disk file, as one edit.Native
QuitQuit the application.⌘QCtrl+QNative

Navigate

CommandWhat it doesmacOSLinuxBuilds
Command palette…Summon the command palette, searchable across every catalog command.⌘PCtrl+PNative, browser
Go to…Find files, headings, folders, and recent destinations.⌘OCtrl+ONative, browser
Last fileSwitch to the previously open file; a no-op with nothing to switch back to.⌃TabCtrl+TabNative, browser
Follow linkOpen the caret's markdown link URL in the default browser, if there is one.C-c C-oNative, browser
Copy link destinationCopy the URL of the markdown link under the caret to the kill buffer.Native, browser
Search forwardOpen incremental search (prefilled from selection or last query), forward.⌘F · C-sCtrl+FNative, browser
Search backwardOpen incremental search (prefilled from selection or last query), backward.⌘⇧F · C-rCtrl+Shift+FNative, browser
Find and replace…Open the search panel with its replace row revealed.⌘RCtrl+RNative, browser
Forward wordMove the caret forward one word.⌥RightAlt+RightNative, browser
Backward wordMove the caret backward one word.⌥LeftAlt+LeftNative, browser
Line startMove the caret to the start of the visual line (logical without an oracle).⌘Left · C-aHomeNative, browser
Line endMove the caret to the end of the visual line (logical line without a layout oracle).⌘Right · C-eEndNative, browser
Document startMove the caret to the start of the document.⌘UpCtrl+HomeNative, browser
Document endMove the caret to the end of the document.⌘DownCtrl+EndNative, browser
Forward charMove the caret forward one character.C-fNative, browser
Backward charMove the caret backward one character.C-bNative, browser
Next lineMove the caret down one visual line, following soft wraps and a sticky goal column.C-nNative, browser
Previous lineMove the caret up one visual line, following soft wraps and a sticky goal column.C-pNative, browser
Delete word forwardDelete the word or punctuation run after the caret; a selection deletes instead.Native, browser
Delete word backwardDelete the word or punctuation run before the caret; a selection deletes instead.Native, browser

Format

CommandWhat it doesmacOSLinuxBuilds
Align tableRe-pad the GFM table under the caret so its `|` columns line up.Native, browser
Tag document languageAdd a `lang:` frontmatter tag naming this document's detected CJK language.Native, browser
Insert DateInsert today's date at the caret, in the configured date format.⌘⇧D · C-c .Ctrl+Shift+DNative, browser
BlockquoteToggle a `> ` blockquote prefix on the caret line or each line of the selection.Native, browser
Bullet listToggle a `- ` bullet marker on the caret line or each line of the selection.Native, browser
Numbered listToggle a numbered-list marker on the line or selection, renumbering sequentially.Native, browser
Task listToggle a `- [ ] ` task checkbox on the caret line or each line of the selection.⌘⇧LCtrl+Shift+LNative, browser
HeadingToggle a level-1 `# ` heading marker on the caret line.Native, browser
Cycle headingCycle the caret line's heading level 1 → 2 → 3 → plain text.Native, browser
Code blockWrap the caret line or selection in a fenced code block, unwrapping if fenced.Native, browser
BoldToggle `**bold**` markup around the selection or the word at the caret.⌘BCtrl+BNative, browser
ItalicToggle `*italic*` markup around the selection or the word at the caret.⌘ICtrl+INative, browser
Inline codeToggle `` `inline code` `` markup around the selection or the word at the caret.⌘ECtrl+ENative, browser
HighlightToggle `==highlight==` markup around the selection or the word at the caret.Native, browser
StrikethroughToggle `~~strikethrough~~` markup around the selection or the word at the caret.Native, browser
Insert link…Summon the URL prompt for a markdown link: wrap, edit, or insert a link at the caret.⌘KNative, browser
UndoUndo the last edit group.⌘Z · C-/Ctrl+Z · C-/Native, browser
RedoRedo the last undone edit group.⌘⇧ZCtrl+Shift+ZNative, browser
CopyCopy the selection to the kill buffer, leaving the text and clearing the mark.⌘CCtrl+CNative, browser
CutCut the selection into the kill buffer and remove it from the buffer.⌘X · C-wCtrl+XNative, browser
PasteInsert the OS clipboard's content — an image reference if it holds one, else text.⌘V · C-yCtrl+V · C-yNative, browser
Select allSelect the entire buffer.⌘ACtrl+ANative, browser

View

CommandWhat it doesmacOSLinuxBuilds
Switch theme…Summon the theme (world) picker.⌘TCtrl+TNative, browser
Toggle page modeToggle between the centered writing column and full window width.Native, browser
Widen pageWiden the page column by one step.Native, browser
Narrow pageNarrow the page column by one step.Native, browser
Reset page widthReset the page column to the buffer's default width, clearing any override.Native, browser
Toggle debugToggle the debug overlay.Native, browser
Toggle outlineToggle the heading outline panel.⌘⇧OCtrl+Shift+ONative, browser
Fold sectionToggle collapse of the section under the caret; view state, not on the undo timeline.⌘⇧E · C-c C-fCtrl+Shift+ENative, browser
Collapse other sectionsCollapse every markdown section except the one under the caret.⌘⇧M · C-c C-tCtrl+Shift+MNative, browser
Toggle typewriter scrollToggle keeping the caret vertically centered as you type.Native, browser
Toggle menu barToggle the menu bar's visibility.Native, browser
Zoom inStep the editor's zoom level up.⌘=Ctrl+=Native, browser
Zoom outStep the editor's zoom level down.⌘-Ctrl+-Native, browser
Reset zoomReset the editor's zoom level to its default.⌘0Ctrl+0Native, browser

Tools

CommandWhat it doesmacOSLinuxBuilds
Spell suggestions…Summon spelling suggestions for the misspelled word at the caret.⌘;Ctrl+;Native, browser
Clean unused assets…Summon the list of orphaned image files under the project, for moving to the trash.Native
AboutShow the About panel.Native, browser
CreditsOpen the bundled Credits document in a read-only viewer.Native, browser
Lifetime statsOpen the lifetime writing statistics panel.Native
Writing streaksOpen the writing-streaks panel (per-day heatmap and cumulative total).Native
Line endings…Toggle the file's on-disk line ending between LF and CRLF; not on the undo timeline.Native, browser
Report a ProblemCompose a `mailto:` bug report, attaching the newest crash log's path if one exists.Native, browser
Check for UpdatesRecord a last-checked marker and open the site's version-check page in the browser.Native

Settings

CommandWhat it doesmacOSLinuxBuilds
Caret style…Summon the caret style picker.Native, browser
Dictionary…Summon the spelling dictionary picker.Native, browser
Keymap…Summon the keymap flavor picker (native/emacs).Native, browser
Toggle spellcheckFlip spellcheck on or off globally, silencing every squiggle when off.Native, browser
Toggle caret styleCycle to the next caret style.Native, browser
Toggle writing nitsToggle the writing-nits style underlines on or off.Native, browser
Settings…Summon the settings picker.⌘,Ctrl+,Native, browser
Keybindings…Summon the keybindings rebind menu.Native, browser

Chords with no command

This one is matched by the keymap directly and cannot be rebound.

Chord formacOSLinux
Held stats HUD⌘⌥ICtrl+Alt+I

Settings

The Settings overlay edits the rows below. A row with a config.toml key persists to that key on change; a row without one does not persist.

SettingGroupControlconfig.toml key
Caret styleEditorOpens a picker
Page modeEditorOn/offpage_mode
Typewriter scrollEditorOn/offtypewriter_scroll
Reduce motionEditorOn/offreduce_motion
Page width (prose)EditorNumeric railpage_width_prose
Page width (code)EditorNumeric railpage_width_code
ZoomEditorNumeric railzoom
Scroll sensitivityEditorNumeric railscroll_sensitivity
Date formatEditorOpens a picker
ThemeAppearanceOpens a picker
WYSIWYGAppearanceOn/offwysiwyg
Format popoverAppearanceOn/offpopover
Inline imagesAppearanceOn/offinline_images
Code ligaturesAppearanceOn/offcode_ligatures
OutlineAppearanceOn/offoutline
Menu barAppearanceOn/offmenu_bar
SpellcheckWritingOn/offspellcheck
DictionaryWritingOpens a picker
Writing nitsWritingOn/offwriting_nits
Ambiguous CJK reads asWritingOpens a picker
Default folderFilesPicks a folderdefault_folder
Projects folderFilesPicks a folderworkspace
Project rootFilesPicks a folder
File visibilityFilesOn/offfile_visibility
AutosaveFilesOn/offautosave
Local historyFilesOn/offhistory
Session restoreFilesOn/offsession_restore
KeymapKeybindingsOpens a picker
KeybindingsKeybindingsOpens a submenu
Report a ProblemAdvancedRuns a command
Edit config as textAdvancedRuns a command

Configuration file

The config file is TOML at $XDG_CONFIG_HOME/awl/config.toml, or ~/.config/awl/config.toml when XDG_CONFIG_HOME is unset. awl opens it as ordinary text; saving it reloads it live. Precedence is command-line flag, then file, then default.

Keys

An absent key takes the default below. A command-line flag overrides the file; the file overrides the default.

KeyValueDefault
default_folderpath
workspacepath
themeworld nameSaltpan
zoompercent100%
scroll_sensitivitypercent100%
page_modetrue | falsetrue
page_width_prosewhole columns70
page_width_codewhole columns100
caret_modeblock | morph | ibeamblock
dictionaryen_US | en_GB | en_AUen_US
writing_nitstrue | falsetrue
spellchecktrue | falsetrue
historytrue | falsetrue
autosavetrue | falsetrue
wysiwygtrue | falsetrue
popovertrue | falsetrue
inline_imagestrue | falsetrue
code_ligaturestrue | falsetrue
cjk_prioritylist of language codes
session_restoretrue | falsetrue
outlinetrue | falsetrue
menu_bartrue | falsefalse on macOS, true elsewhere
typewriter_scrolltrue | falsefalse
file_visibilitytrue | falsefalse
statstrue | falsetrue
reduce_motiontrue | falsefalse
ambient_motiontrue | falsetrue
keymapnative | emacsnative
date_formatddmmyy | mmddyy | iso | yyyymmdd | dmonthyyyyddmmyy
keystable of chord lists
linux_keep_emacslist of chords

Numeric bands

A value outside the band is clamped to it, then snapped to the step.

KeyMinimumMaximumStepDefault
zoom50%300%10%100%
scroll_sensitivity25%400%5%100%
page_width_prose20200170
page_width_code202001100

Rebinding

[keys] maps a command's slug to its chords. A slug is the command's name lowercased, spaces replaced with _, and any trailing ellipsis dropped.

lineeffect
save = ["Cmd-S", "C-x C-s"]slot 1 native, slot 2 emacs
switch_theme = "Cmd-T"a single chord binds slot 1 only

A chord is written as Modifier-Key, modifiers joined by -: Cmd, C (control), M (alt), S (shift). A multi-chord sequence is separated by a space. On Linux, Cmd in slot 1 resolves to Ctrl. linux_keep_emacs lists chords that keep their Emacs meaning on Linux where a native binding would otherwise displace them.

Worlds

A world is a complete visual environment: ground, ink ladder, display face, mono face, section-break ornament, and background. THEMES.md states the laws a world must satisfy; WORLDS.md describes each world's flavour.

The default world is Saltpan. `--list-worlds` prints this roster; `--theme <World>` selects one for a single run.

WorldGroundDisplay faceMono face
TawnyDarkIBM Plex MonoIBM Plex Mono
MopokeDarkBitterIBM Plex Mono
CurrawongDarkIosevkaIosevka
PotorooDarkMonaspace XenonMonaspace Xenon
GumtreeLightLiterataMonaspace Xenon
BilbyLightNewsreader 16pt 16ptMonaspace Xenon
SaltpanLightFraunces 9ptMonaspace Xenon
QuokkaLightSour GummyIBM Plex Mono
BomboraDarkEB GaramondMonaspace Xenon
BowerbirdDarkIBM Plex SansJetBrains Mono
MulgaDarkZilla SlabMonaspace Xenon
MangroveDarkJetBrains MonoJetBrains Mono
GalahLightFigtreeIBM Plex Mono
MagpieLightBitterMonaspace Xenon
BrolgaLightIBM Plex SansIBM Plex Mono
WagtailDarkJetBrains MonoJetBrains Mono
FiretailDarkMonaspace XenonMonaspace Xenon
CassowaryDarkIosevkaIosevka
PaperbarkLightEB GaramondMonaspace Xenon
KiteLightFira SansJetBrains Mono

Markdown

The file on disk stays plain text. awl renders it live and shows raw markdown on whichever line the caret is on.

Constructs

The file stays plain text. Only the render changes.

ConstructWritten as
Heading, levels 1–6# Heading
Bold**bold**
Italic*italic*
Bold italic***both***
Inline code and code blocks`code`
Syntax highlighting in a fenced block```rust
Blockquote> quoted
List, bulleted or numbered- item
Link[text](target)
Task list- [ ] task
Highlight==highlight==
Strikethrough~~struck~~
Thematic break---
Table| a | b |
Syntax characters of every construct above# * ` > [ ] |

What hides off the caret

With `wysiwyg = true`, the markup below hides while the caret and the selection are elsewhere.

ConstructHidden markupRevealed byReveals in place
HeadingThe leading `#` runThe lineYes
Bold and italicThe `*` or `_` delimitersThe lineYes
Inline codeThe backticksThe lineYes
HighlightThe `==` delimitersThe lineYes
StrikethroughThe `~~` delimitersThe lineYes
Fenced code blockBoth fence lines and the info stringThe whole blockYes
FrontmatterThe whole `---` blockThe whole blockYes
TableThe whole source, replaced by a drawn gridThe whole blockNo
ImageThe whole `![alt](path)` sourceThe lineYes
LinkThe brackets and the targetThe lineYes
BlockquoteThe `>` markerThe lineYes

Command line

The browser build has no command line; these are the native binary's flags. awl takes a file to open and, for headless verification, a capture mode plus the hooks that compose with it.

Every flag below is one row of the same roster the parser resolves arguments through, so this table and awl --help cannot disagree about a flag's spelling, its arguments, or what it does.

Capture modes

At most one capture mode per run: awl refuses a second rather than silently preferring one.

FlagTakesWhat it does
--screenshotOUT.pngcaret at rest (rounded square)
--screenshot-motionOUT.pngcaret mid-glide (centred trailing streak)
--screenshot-motion-vOUT.pngcaret mid-glide vertical (left-edge bar)
--screenshot-motion-dOUT.pngcaret mid-glide diagonal (slanted tracer)
--screenshot-appOUT.pngdrive --keys into a REAL headless App (hermetic) and capture ITS state — the only door that sees a live-App-only transition; sidecar carries driver: "live-app"
--capture-timeline"0,16,50,150" OUT.pngdeterministic timeline: step the caret glide by injected ms, frame per step (OUT.t<ms>.png)
--capture-heldDIR "0,30,60,90" OUT.pngdeterministic HELD arrow (DIR=left|right|up|down): re-target one char/line per step (held=true), frame per step with trail geometry

Options

FlagTakesWhat it does
--selL0:C0-L1:C1selection highlight from (l0,c0)..(l1,c1)
--zoomFzoom factor (0.5..3.0)
--scrollN[:Q]scroll to row N plus Q fixed 1/64px units
--preeditSTRrender STR as an IME preedit at the caret
--searchSTRopen isearch panel for STR + highlight hits
--search-casemake --search case-sensitive
--themeNAMEset the active color theme (Tawny, Mopoke, Currawong, Potoroo, Gumtree, Bilby, Saltpan, Quokka, Bombora, Bowerbird, Mulga, Mangrove, Galah, Magpie, Brolga, Wagtail, Firetail, Cassowary, Paperbark, Kite)
--list-worldsprint every theme name, one per line, then exit (the roster `--theme` accepts; see scripts/capture-worlds.sh)
--icon-manifestprint the app-icon export manifest as JSON (per world: icon palette tokens + display face + its logo-cursor; per face: the bundled font files), then exit — run from the repo root; see scripts/icons/
--ground-auditionWprint the world's A/B/C ground-audition manifest, exit
--pack-icns[DIR]cut every world's rendered tiles (default assets/macos/candidates/tiles) into assets/macos/world/<World>.icns + the canonical assets/macos/Awl.icns, and regenerate src/app_icon/embedded.rs, then exit — run from the repo root AFTER scripts/export-icons.sh
--export-linux-iconOUT.pngcut the 256px PNG out of the committed canonical assets/macos/Awl.icns, then exit — run from the repo root; see scripts/package-appimage.sh
--caret-modeMODEcaret look: block, morph, ibeam (default: block, on every world)
--capture-sizeWxHphysical canvas size for the capture (default 1200x800)
--capture-dpiNrenderer scale factor (default 1.0); WxH at dpi N == (W/N)x(H/N) logical retina window
--measureNpage-mode column width in chars (default 70 for prose, 100 for code; implies --page on)
--pageon|offpage mode: centered column (on, default) vs edge-to-edge (off)
--debugDEBUG: draw the dim top-right dev panel — frametime/zoom/viewport/cursor/theme/md+syn (OFF by default; frametime is a fixed placeholder in a headless capture)
--hudsummon the HELD stats HUD (live: hold Option-Cmd-I; clock/file-date fields are fixed placeholders in a capture)
--menu-barshow the web/Linux MENU BAR (default on web/Linux, off on macOS which has the native bar); --menu-open N drops menu N's dropdown
--peeksummon the HOLD-⌘ shortcut peek (live: hold the convention's bare arming modifier — ⌘ on Mac, Ctrl on Linux — ~600ms; a capture shows the curated starter six)
--streakssummon the WRITING STREAKS card (live: palette "Writing streaks"; a capture shows a fixed synthetic year + streak numbers)
--whichkeysummon the WHICH-KEY panel: the C-x prefix's follow-up keys (live: press C-x and pause ~500ms)
--default-folderDIRset the fallback active folder for a first launch with nothing remembered
--configPATHload settings from PATH (default ~/.config/awl/config.toml)
--waitwindowed editor only: single-instance daemon — hand `file` to an already-running awl and block until "Finish file" finishes it (EDITOR=awl --wait for git)
--keys"SPEC"replay emacs chords (e.g. "C-n C-n M->") then capture
--seed-dataDIRseed awl's own DATA ROOT (the unresolved-change record, the scratch stash, session.toml, history) into a hermetic scenario sandbox from DIR's files — the only way a --screenshot-app run can START from state awl already had; refused outside a hermetic door
--seed-treeDIRseed a whole fixture PROJECT (DIR's files, recursively, at their own paths) into a hermetic scenario sandbox — the only way a --screenshot-app run can open a SECOND file, since --root alone seeds an empty directory marker; refused outside a hermetic door
--strict-replaywith --screenshot --keys: abort (naming the offender) on an unbound chord, a live-only effect the replay can't perform, or a missing layout oracle; runs HERMETIC (an in-memory fs seeded from the named file + --config — a replayed save never touches the real file, the user's own config/notes/history are never read or written)
--storyboardTOMLrun a scenario storyboard (press/type/pause/run_for/expect steps — see scenarios/): strict + hermetic, emitting per-step PNG+JSON, deterministic film frames, a byte-stable trace.json, and (with ffmpeg on PATH) film.webm/film.mp4
--storyboard-outDIRwhere the storyboard run's artifacts land (default: <storyboard>.run/ beside the .toml)

Unlisted flags

`awl --help` does not print these. They work like any other flag; they are benchmark, diagnostic and verification hooks rather than everyday arguments. Every benchmark opens no window.

FlagTakesWhat it does
--screenshot-framesN OUT.pngcapture N successive settled frames of the real App scheduling body, stepped --frame-step-ms per frame
--semantic-jsonprint the headless App's accessibility tree as JSON instead of a PNG
--help, -hprint the usage summary above and exit
--frame-step-msMSmilliseconds of virtual clock between --screenshot-frames frames
--search-replaceopen the search panel's labelled replace row — the fresh Cmd-R state
--menu-open[N]show the menu bar and drop menu N's dropdown (0 = the App menu)
--lifetimesummon the LIFETIME STATS card (live: the palette's "Lifetime stats"; a capture renders fixed placeholders rather than a live store)
--rootDIRthe active project root: scopes the go-to overlay and fills the sidecar's project block (default: the launch file's parent, else the working directory)
--workspaceDIRworkspace parent whose child directories are the switch-project candidates
--live-script"STEPS"drive the REAL windowed app through a live-probe step script; refused alongside any capture mode
--live-shotsDIRwhere --live-script writes its shots (default: the system temp directory)
--bench-typingtime the per-keystroke update path on 100/1000/5000-line documents, whole-buffer reshape against incremental
--bench-perftime the traced hot paths over the long fixtures under benches/fixtures
--bench-frameper-stage frame profile of the live redraw sequence over the real repo docs
--bench-theme-burstprofile successive font-changing theme switches — the reshape and the first frame after each — cold and warm
--bench-a11ytime one keystroke's accessibility projection at 100 to 50 000 lines, the whole-snapshot path against the incremental one
--bench-zoom-burstreplay a rapid adjacent-level zoom burst: eager reflow against latest-wins coalescing
--bench-frostprofile the frost field's steady frames and its rebuilds, for both lava worlds
--bench-caretrecord the caret glyph lookup's cost at the document top, middle and tail
--bench-suiterun the unified bench suite — corpus tiers by interaction scenarios — printing a table and writing bench.json beside the invocation
--bench-baselinePATHdiff --bench-suite against a machine-keyed baseline, exiting nonzero on a >20% cell
--soak-gpurun the bounded native window/surface robustness probe, isolated from the daemon, session, history and user config
--soak-gpu-secondsSECONDShow long --soak-gpu runs, in seconds (default 900)