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.