Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

18 · The mobile app

There is a native Android app: the same review loop as the web app, running the same core (parser, scheduler, progress store) compiled into the app, so it works entirely offline, including a trace deck’s predict/reveal/self-grade trace. It is early software with a deliberately small surface: reviewing decks. Pairing it with a running alix server on your network lends it the tutor, the AI exam, deck generation, and note-taking: see Pairing a device.

Settings (the ☰ button) → Theme picks from the web gallery’s 18 non-kids themes (the three Kids palettes are web-only; see Themes); the app re-themes live, no restart.

Install

Grab alix-arm64-v8a.apk from the project’s GitHub Releases (the alix mobile vX.Y.Z releases) and install it. Android will warn about installing outside a store; that is expected for now. The app works on Android 7+ and keeps its decks in private app storage. A fresh install’s deck list is empty and offers a Tutorial button (see The tutorial); pairing with a desktop server (see Pairing a device) adds the Generate deck row for bringing in decks.

Settings → About shows two versions: the app’s own and the embedded core’s. The app has its own release stream; it does not track the CLI’s version.

The deck list

The first screen lists the phone’s own decks and, once paired, the pulled copy of the desktop’s below them. The two are listed separately and the phone’s own appear first; the screen stays responsive while a large workspace is still being read, and shows nothing in place of the list until the first answer arrives. A deck read once stays parsed in memory for as long as the app runs, so coming back to the list after a review does not read every deck again; a deck whose file changed on disk is read fresh.

Each deck row, at the top level and inside a workspace, carries a thin strip under its title with one cell per card in file order, colored by that card’s learning tier: the same signal as the web picker’s deck drawer heatmap. The number at the strip’s end is the deck’s card count. A workspace row has no strip. Rows appear as soon as the list is read; the strips fill in a moment later, so a large deck never holds the list back. A deck has no icon unless it declares one; a workspace shows its own icon or its initial.

The search button in the top bar opens a search field over everything on the phone: its own decks and workspaces, the pulled desktop copy, and every deck inside a workspace. A row matches when its name contains the query, ignoring case. While a query is active the matching rows are listed flat, without the workspace tree, and “No decks match.” shows when nothing does. Tapping a result opens it exactly as tapping it in the list would.

Tapping a deck opens the launch sheet: pick the depth for this session, and the review starts there. A long-press on a deck does nothing. The sheet opens with a Cram switch above the depths. Switch it on, then pick a depth: that one session also serves cards that are not due yet, under exactly the rules the web app applies (see Cramming). Cram belongs to the launch and is never saved, so the switch is off again the next time the sheet opens.

Below Cram sits Skip introduction. Switched on, that one session grades every new card on first sight instead of showing it first, waiting for the settle gap and only then asking (see New cards). The two switches are independent: a cram over a deck you already know usually wants both, a first pass over new material wants neither. Like Cram, it belongs to the launch and is off again the next time the sheet opens.

The last row of the sheet, below a short centered hairline, is Walk: Cram and Skip introduction do not apply to it. A walk is an unscheduled read-through of the deck, the same walk the web app runs (see Walking a deck). Tapping a trace deck opens the trace itself, never this sheet. Each item shows its front; pick an authored choice or Reveal (one line at a time on a reveal: line card), then grade it as in a session: Missed it, Partly or Got it after a reveal, Next or I guessed after a correct pick, Continue after a wrong one. Hint opens a card’s authored hint on its front. Missed and partly cards come back first in the next walk. The section sheet opens by itself the first time each walk reaches a section, Ask reaches the tutor once an answer shows (when paired with a desktop that can run it), and the done screen’s Next walk starts the next pass.

The tutorial

Settings → Tutorial, or the Tutorial button on an empty deck list, opens the same tutorial as the web app (see The tutorial) as a walk; leaving it returns to the deck list. It teaches the phone’s own gestures too: tapping a revealed answer to hide it, and switching that sheet to Source on a cited card. The tutorial and its progress live in a tutorial folder in the app’s private storage, beside the decks folder, and are never listed among your decks. Its tutor offers Ask (when paired) but not notes or cards.

Reviewing

The review screen is the web app’s loop on a phone: reveal, then grade, or pick a choice, with the legend row at the bottom holding the primary action and the quiet extras. The card is laid out as on the web: the question at the top, the answer below it, and a revealed note at the bottom, directly above the legend row, taking only the height its text needs; a long note takes the room the answer is not using, and room the answer is using only down to a third of the card, and each of the three scrolls on its own past its space, with a “more” marker at the edge that hides something. Question and answer prose follows the web’s alignment rule: left-aligned inside a block that shrinks to its content and is centred in the card, so a short question or answer sits in the middle and a wrapped paragraph reads as a left-aligned block; a note is always left-aligned at the full width. A card that sits under a # section in its deck (see Sections and sub-cards) shows a quiet Context chip left of Reveal until you reveal the answer; it opens the whole section, heading and prose, in a sheet. The section helps you answer, so the chip is gone once the answer shows. The card face names the section nowhere else, and the card never moves to make room. The first card you ever meet from a section opens that sheet by itself, once; swipe it away or tap the × in its top-right corner, and the chip brings it back. Every later card from the section, in this sitting or any later one, waits for the chip. A tap on the question does nothing.

A card with hints shows a quiet Hint chip to the right of the main button (Context sits to its left) while you are still answering. It opens the first hint in the same sheet; Next hint adds each later hint below the earlier ones, and reopening restores the hints already shown. When both context and hints exist, the sheet’s selector swaps between them without losing that stack. Opening a hint turns a pass on the card into Partial. Introductions offer no hints, and the reverse half of a two-direction card carries none.

To set a card aside for later in the session, open the ⋮ menu in the review header and pick Skip card; it is offered until the answer shows.

Tapping a revealed answer opens its answer sheet. An uncited card keeps the single Hide view: the sheet rises from the answer’s top edge to the bottom of the screen, covering the answer, the note and the grade buttons while the question stays in view. A cited card adds a Hide / Source switch in the sheet header. Source stacks every cited path and numbered excerpt, or its error when the excerpt is unavailable, using the same editor-style presentation as a trace. The Source sheet reaches the bottom of the session header so long lines have more room; only the code turns sideways when its longest line would overflow the portrait width, while the header and paths stay upright, and a line too long even sideways wraps. Reopening the sheet on the same card shows the view last used; the next card starts on Hide. The × in the top-right corner, or a swipe down, closes either view. A choice pick, a typed check and a sketch have nothing to hide.

The bar at the top names the deck, cut to one line, and counts the cards left. New session on the summary starts the next sitting with the same launch settings; after a cram launch it carries a small “cram” caption.

Syncing with the desktop

Once paired (see Pairing a device), a pulled entry’s row gains a Sync action in its ⋮ menu: it pushes every local deck whose progress changed, then pulls that entry when the desktop’s copy differs from the phone’s. The app also runs one cycle in the background each time it opens, for every entry already on the phone, once the paired desktop answers and still serves the same root; an entry whose files did not change on the desktop is left as it is. A review session’s summary silently pushes that deck’s progress too, with no visible step on a normal pass.

A pull replaces the files the desktop owns for that entry (its decks, their augment and asset files) with the desktop’s current copies; anything the phone added on its own inside the entry is left alone and reported as phone-only. Every card arrives with its id: a card you added on the desktop gets one there before it travels, so reviews and exam results the phone records for it stay attached after the next pull. A member the desktop deleted stays on the phone while its progress is not yet pushed, listed as kept, so nothing you reviewed is lost before it reached the desktop. A conflicting deck, one whose progress changed on both sides since the last sync, stops review of that deck and asks: keep the phone’s progress or keep the desktop’s. Each choice names what it keeps (the phone side’s number of cards with progress, or which desktop saved it, and when), marks the side that saved last as newer, and the side you don’t keep is lost. A conflict that a background sync records while a review or a trace is running does not interrupt it: the choice opens when that session ends, whether you finish it or leave early. An entry the desktop no longer serves stays on the phone, reviewable, listed as orphaned, with a Remove action once you’re done with it. A deck whose progress file on the phone cannot be read is not pushed, and the next pull puts the desktop’s copy in its place, listed as replaced.

A desktop entry the phone has never pulled shows below the phone’s own entries: its name and size only, in a subdued row with no ⋮ menu and no review action. Tapping it pulls it for the first time; once it lands it becomes an ordinary entry, reviewable like any other.

Tapping the status line above the deck list (shown while a cycle runs, or its last report is unread) opens the full report: landed, pushed, kept, phone-only, removed, replaced, renamed, and refused categories, plus left out on the desktop (members inside an entry the desktop could not load) and not on this phone (entries the desktop serves that this phone has never pulled, the same ones shown as rows below the deck list).

Settings gains a Paired desktop row once a pairing is saved, opening a sheet to choose which paired desktop’s entries the picker shows below the phone’s own; the phone’s own decks stay listed whichever desktop is active.

Workspace deadlines

A workspace’s personal “ready by” date shows on its row (date, days left, and ready percent, colored to flag urgency inside the last week or past due) and again once you drill in, the same readout as the web picker. Long-press the workspace row to set, move, or clear it. The date lives in the workspace’s own alix.local.toml (see Workspaces); the phone’s own offline sessions bend their scheduling toward the date exactly as the desktop does.