Outline for Android

An independent client for Outline, the team wiki. It renders every document feature Outline can store, keeps what you have read available offline, and holds several workspaces at once.

A document open in the reader, showing a breadcrumb, title, byline and body text.
The home screen listing recently viewed documents with icons and metadata.
The sidebar showing the workspace switcher, navigation and collections.

Two people, one document

The app joins the same live session the web client joins. Type in either one and it appears in the other as you go, with everyone's caret visible and named. Nobody's work lands on top of anybody else's.

The app beside Outline's own web client, in the same page, as two different people. Neither side is a recording of the other.
Both edits survive
Two people typing in the same sentence each keep what they typed. The document is a conflict-free replicated type, not a file that gets saved over, so there is no last write to win.
Named carets
Everyone else's cursor is drawn where they are, in their colour, with their name on it — the same colour the web client gives them, so the two views agree on who is who.
Edits in a tunnel
Keep typing with no signal. What you wrote merges with whatever changed in the meantime when the connection comes back, rather than replacing it.
Never a requirement
A workspace with no collaboration service, or a page you may only read, leaves the editor working exactly as it did. The status line says which of the two you are in.

This meant writing a Yjs client in Kotlin, since taking part in the session is the only way to edit a document without discarding what anyone else did while you were typing. It is checked against the real JavaScript implementation in both directions, including ten concurrent-editing scenarios it has to converge on and a check that every document it writes is valid under Outline's own editor schema.

It renders the whole document

Outline's markdown is a superset of CommonMark, and a client that only speaks the standard silently drops the parts people actually use. This speaks all of it.

Text
bold, italic, underline, strikethrough, highlight, inline code
Blocks
headings with a table of contents, quotes, dividers, page breaks, code highlighted for 18 languages
Notices
info, success, warning and tip callouts
Lists
bullets, numbers, and checkboxes you can tick from the reader
Tables
columns sized to their content, scrolling sideways when they need to
Maths
inline and display TeX, mapped onto Unicode
References
mentions, footnotes, links between documents, backlinks
Media
images at the author's aspect ratio, file attachments, embed cards
A document showing a table, an info notice, a mention and a quote.
Tables, notices, mentions, quotes.
The same document rendered in the dark theme.
The same document, dark.

Ticking a checkbox in the reader rewrites the markdown and saves it, so a runbook can be worked through without ever entering an editing mode.

Signing in to a wiki that could be anywhere

Outline is self-hostable, so there is no single address to sign into and no client ID that would work everywhere. Type your wiki's address and the app works out how that particular server will let it in.

  1. It registers itself

    If the server supports dynamic client registration, the app registers a public client on the spot and opens your browser. Nothing to set up.

  2. Or it asks for a client ID

    If the server will not self-register, the app shows the redirect URI to paste into Outline's application settings, with a button to copy it. slop.outline://oauth/callback

  3. Or it takes an API token

    If the server has no usable OAuth at all, a personal API token gets you in.

Whichever applies, the workspace's own name and logo appear before you are asked for anything, so a mistyped hostname is caught before it matters. Passwords go into your browser, never into the app. Tokens are sealed with a key that never leaves the Android keystore.

Write it the way you read it

Editing happens in place. A heading is a heading while you type it, a table is a grid of cells, a callout is a tinted panel with a caret in it. Everything the reader shows can be written: all six inline marks, the three list kinds with nesting, quotes, callouts, code with a language, tables with alignment, images, files, links, mentions, maths, footnotes.

The highlighter has all six of Outline's pens, and one tap uses the one already shown, so marking a page up in a single colour does not mean a trip through a menu each time. The colour is a real attribute of the document rather than something markdown can carry, which is why it only survives a save through the live session.

Markdown is what reaches Outline, never what you are asked to type. A visual editor over a markdown store can rewrite documents behind your back, so the writer is held to two tested properties: opening and saving without typing changes nothing, and writing twice is byte-identical. The source is one tap away for anything the editor cannot express.

The editor with a table, a callout and a checklist being edited in place.

Built for the 2am read

Everything you have opened stays readable with no network. An edit that cannot reach the server is kept on the device, marked as such in the reader, and sent when the connection comes back. Search falls back to the titles it has cached, and says that is what it did.

The sidebar carries the whole wiki rather than flattening it into tabs: search, home, starred, drafts, templates, every collection as an expandable tree, then archive, trash and settings. Rows sit a rung below stock Material 3, because seeing more of the hierarchy at once is the point.

What someone renames, moves or deletes on the web turns up here without being asked for, and you can move things from the phone too — drag a document into another collection, reorder the sidebar, and the position it lands in is the one Outline agrees with. Outline pushes those changes over a channel that only accepts a browser session cookie, so that is offered rather than assumed: paste a session token in settings and changes arrive as they happen, or leave it and the activity feed keeps everything current on its own.

Signed into three workspaces, each keeps its own cache, its own credentials and its own accent colour, so it is never ambiguous which one you are looking at.

Search results with matched terms marked in the snippets.

Install

Sideload only. Obtainium watches the releases and installs each new one. Scan the code with Obtainium already installed, or add it by hand: source GitLab, URL git.is.horse/slop/outline-for-android.

Requires Android 8.0 or newer. The APK is also on the releases page.

QR code that adds Outline for Android to Obtainium