ai-app: a phone interface to Claude Code and llama.cpp sessions

A Rust backend that owns the sessions and an Android app that reads them.
The server spawns and adopts CLI processes, normalises everything they emit
into one event model, keeps the transcript, and serves it over pinned TLS on
a WireGuard interface; the phone streams that, replies, sends images, and
imports conversations the machine already has.

`AGENTS.md` is the working guide -- what runs where, what has been measured,
and the faults that were expensive to find. `PLAN.md` is the design record.

History before this point was squashed away. It was a personal project's
running commentary and carried a name and a couple of machine paths that
have no business in a public repository; the tree is what mattered and the
tree is here.
This commit is contained in:
iris committed 2026-08-31 20:29:07 -04:00
commit b172c464ea
100 files changed
+31795

No files matched your search

+48
View File
@@ -0,0 +1,48 @@
// Read by Dev Updater. Structured as the body of the config: no outer
// parentheses, so nothing here is indented for the sake of a wrapper.
//
// This file sits at the checkout root because the project Dev Updater
// serves is the whole repository -- one checkout producing two things.
// Each component says where it lives with `cwd`, relative to this
// directory, rather than one of them reaching out of the other with `../`.
// What to call this project before there is a build to read a label from.
// A built APK wins: it is the authority on what will actually install.
label: "AI Sessions",
// Where this project's own state lives, said rather than guessed: it is
// what the Uninstall dialog offers to delete, and a plausible-looking
// path it worked out would read as "this component keeps nothing here"
// when it was wrong. `Ron` rather than `Script` because the answer is
// three constants -- there is nothing here worth spawning a process for.
resources: Ron("resources.ron"),
// The two halves this checkout produces: the server a phone talks to, and
// the app that talks to it. They are built in parallel -- this list is the
// set, not a sequence, so nothing here should be read as an order.
components: [
Server(
name: "server",
build: "cargo build --release",
cwd: "server",
// Dev Updater's own built-in service implementation, generated
// into its data directory and driven through the same interface a
// project-supplied script would be. ai-app carried a script of its
// own until 2026-08-28; it ran `target/release/ai-server` with no
// arguments and no environment, which is the generic case exactly,
// so it was two copies of one thing and the copy that could not be
// tested from here -- the OpenRC branch -- was duplicated with it.
//
// Resolved against this component's `cwd`, so this is
// `server/target/release/ai-server`.
service: Managed("target/release/ai-server"),
),
Apk(
name: "app",
// Resolved against this directory, and run in `app/` -- the script
// cds to its own directory anyway, so the cwd is here to say where
// the app is rather than because the build needs it.
build: "app/build-apk.sh",
cwd: "app",
),
],