{write} guide
{write} (formerly uPub) is a distraction-free Markdown writing app with two things most writing apps don't have: built-in git-style version history and EPUB export — and it runs fully offline. Nothing ever leaves your device: no server, no account, no sync, no telemetry.
The editor
You write plain Markdown. The text you see is the file — syntax markers stay visible but are dimmed, headings are emphasised, and list items get a proper hanging indent: when a bullet wraps onto a second line, the wrapped text lines up under the item's text, not under the bullet.
The caret line's paragraph can be isolated with Focus mode (in the ⋯ menu): everything except the paragraph you are writing is dimmed.
Swipe to indent — on a touch screen, flick a list or quote line
sideways, the way Notes does it: swipe right to indent, left to
outdent. The line snaps between indent stops as you drag, and the
change lands when you let go. Keep dragging for more than one level
(a long swipe walks several; one undo reverts the whole swipe). If you've selected several
lines, swiping any of them moves the block together. The swipe is a quick
flick — start moving right away; a slow press-and-drag is left to iOS for
selecting text, and dragging the cursor or a selection handle never
indents. /indent and /outdent in the / menu do the same thing.
While you write on a phone, the title bar slides away so its space goes to your text; dismissing the keyboard (the ✓ on iOS's keyboard bar) brings it back, along with its menu. The title bar also slides away in step with your scrolling — scrolling down tucks it away at the rate you scroll, and scrolling up (or returning to the top) slides it back the same way.
The / menu
There is no toolbar. Type / to open the insertion menu — at the
start of a line, or anywhere after a space. Keep typing to filter
(/h2, /task, /div …), then tap an entry, or use ↑/↓ and
Return on a hardware keyboard. Esc, deleting the /, or moving
the caret away closes it. The /word you typed is removed when the
action runs, so it never lands in your text.
At the start of a line the menu offers block inserts — Heading 1–3, Text,
bullet / numbered / task lists, quote, code block, divider, table. After a
space mid-sentence it offers inline actions — bold, italic,
strikethrough, code, link, indent, outdent — plus undo and redo. A / inside a word
(and/or), a URL, or a code block never opens the menu.
On a hardware keyboard: ⌘B bold, ⌘I italic, ⌘K link,
⌘Z / ⇧⌘Z undo/redo, Tab / ⇧Tab indent/outdent in lists, ⌘/
(Ctrl+/ on Windows and Linux) comments out the selected lines — they are
wrapped in an HTML comment, <!-- … -->, which no reader or export shows;
press it again to bring them back (inside the front matter it toggles a
YAML # instead). On iOS, undo is also the system three-finger swipe (or
shake).
Pressing Return inside a list continues it (numbered lists renumber,
task lists add a fresh [ ]). Pressing Return on an empty list item
exits the list. ⇧Return inserts a plain line break without continuing
the list.
Markdown reference
{write} supports the CommonMark + GFM constructs that map cleanly onto an EPUB. This is the complete list — everything here survives the round trip into an e-book:
Headings
# Chapter title (h1 — starts a new EPUB chapter)
## Section (h2 — listed in the EPUB table of contents)
### Subsection (h3 … ###### h6)
Emphasis
**bold** __bold__
*italic* _italic_
***bold italic***
~~strikethrough~~
`inline code`
Lists
- bullet item
* also a bullet
+ also a bullet
1. numbered item
2) also numbered
- [ ] open task
- [x] done task
Indent two spaces to nest. Wrapped lines hang-indent under the item text in the editor and export as proper nested lists.
Block elements
> blockquote
> > nested quote
```js
a code block, fenced with three backticks (or three tildes)
```
--- (horizontal rule / scene break)
Links & images
[link text](https://example.com)

Images referenced by URL stay URLs in the EPUB — most readers won't load
them offline. Images pasted as data: URIs are extracted into real image
files inside the EPUB and work everywhere.
Tables (GFM)
| Name | Value |
|-------|------:|
| alpha | 1 |
Tables render in the preview and export into the EPUB as real tables.
Document metadata (front matter)
An optional block at the very top of the document sets the book's metadata. It must start on line 1:
---
title: My Novel
author: Jane Doe
language: en
description: A short description for the book record.
identifier: urn:isbn:9780000000000
---
All keys are optional. title falls back to the document title in the
top bar; language defaults to en; identifier defaults to a
generated UUID. description becomes the EPUB's description field.
EPUB export
⋯ menu → Export → EPUB. The export is built entirely on your device
and handed to the browser/share sheet as a .epub file (on iOS, use
"Save to Files" or share it straight to Apple Books).
How the document maps to the book:
- Every
#(level-1) heading starts a new chapter (its own XHTML file in the book, so readers paginate cleanly). - Text before the first
#becomes an untitled opening chapter. ##headings appear as sections beneath their chapter in the reader's table of contents.- A title page is generated from the metadata (title + author).
- The output is standard EPUB 3 with an EPUB 2 fallback TOC, so it opens in Apple Books, Kindle (via Send-to-Kindle), Kobo, Calibre, and friends.
You can also export the raw Markdown (.md) at any time — your text
is never locked in.
Comments
Comments live on the text, the way a word processor does them. Select some words, then long-press the selection (right-click on a desktop) and choose Comment. A card opens under the selection; write and tap Comment. The commented text keeps a soft highlight; tap it to read the thread, reply, or Resolve it (resolving removes the highlight and keeps the thread under ⋯ menu → Comments…, which also lists every open comment — tap one to jump to it). Comments follow the text as you edit; a comment whose text you delete resolves itself. On a hardware keyboard, ⌃⌥M / ⌘⌥M comments on the selection.
Comments are saved with the document (and in its data file), so they travel with it into any other unifile app.
Documents, saves and your device
The ‹ button at the top left opens your documents — every piece you have written in {write}, newest first, each one exactly as you left it. Tap one to open it, + New to start another, ⋯ on a row to rename, duplicate or delete it. You never have to save before switching: the text you are typing is remembered as you type.
The list has a search bar: it searches document names and their text, and shows the matching lines under each document — tap a line to open the document right there.
Two things keep your writing safe, all on your device — nothing is ever sent anywhere:
- Remembered as you type. Every document's current text, including changes you haven't saved, is stored on the device the moment you type it. You never have to do anything for this.
- Save (⋯ menu → Save, or the Save button in History) writes the
text to your device as a file — just the text, nothing else — and keeps
the same snapshot in the document's history. Every save is a new
file:
name-A00.uni, thenname-A01.uni,name-A02.uni… The name is asked for once, when the document is created, and never changes (it is what the files are called; the title you see at the top is separate and can change freely). The three-character version counts up by itself; Save as new major turnsA07intoB00— for a draft you consider a new stage. On desktop Chrome and Edge you pick the folder once and later versions land in it silently; on iPhone and iPad the share sheet offers Files / iCloud Drive; elsewhere the file downloads. A note on the version is optional (History → the pending node). In History, tap any version to restore its text into the editor — restoring deletes nothing, it puts the old text back as the current (unsaved) state; save again to keep it.
Open from device brings a .uni file back into the documents list on
any device: the name and version come from the file name, and the history
starts from there. (Older .unifile.json files still open, history
included.)
The dot next to the title (and on the Save menu item) means the device doesn't have your latest changes yet. The documents list shows each document's last saved file.
Set your author name for saves in ⋯ menu → Settings.
Where your text lives
- App (PWA): documents are stored in the browser's IndexedDB on your device and remembered as you type. Browsers can evict site data under storage pressure — Save anything you care about; each version is a plain-text file you keep, and it opens on any device.
- Single-file (.html): the downloaded file is the app and the document in one (there is no documents list in this mode). "Save a copy" regenerates the file with your latest text and history embedded.
iOS install
Open the {write} page in Safari → Share → Add to Home Screen. The app then launches full-screen, works completely offline, and keeps your documents on the device. The share sheet is used for all exports, so you can save straight to Files, Books, or any app.
Updates
The installed app keeps itself current: every time it opens (or returns to the foreground) it looks for a new build, and when one is found the app saves your document and refreshes itself once onto the new version — no cache-clearing, no reinstalling. A tappable notice also appears when a newer version is published. The running version and build time are shown in ⋯ menu → About, with a manual "Check for updates" button.
Privacy
There is no server. The only network request the app ever makes is a
version check against unifile.app/version.json to offer updates. Your
text never leaves the device unless you export or share it.