Files
iris b0e83059a3 dev-updater: build an app on the machine, install it on the phone
A Rust backend that discovers Android projects under configured roots,
builds one on request, and serves the APK over pinned TLS on a WireGuard
interface; an Android client that lists what is buildable, watches a build,
and installs the result. Enrolment carries the token and the CA, so the
phone trusts exactly the machine that issued it and nothing else.

`AGENTS.md` is the working guide and `README.md` the configuration
reference. The shared tunnel-and-TLS code lives in `vendor/wg-app-link`,
which ai-app uses too.

History before this point was squashed away, and a stale `config.json` went
with it: nothing had read that file since the config moved to RON outside
the checkout, and what it still held was one machine's absolute paths and
the names of projects on it.
2026-08-31 20:31:08 -04:00

44 lines
1.7 KiB
TOML

[package]
name = "dev-updater"
version = "0.1.0"
edition = "2024"
[[bin]]
name = "dev-updater"
path = "src/main.rs"
[dependencies]
# The private link between a phone and a machine you run: the WireGuard
# binding, the CA the app pins, QR enrollment, owner-only file creation and
# the RON house rules. Shared with ai-app as a submodule rather than a
# published crate, so the two cannot end up on versions of it that disagree
# -- a pull that moves one moves the other.
wg-app-link = { path = "../vendor/wg-app-link/server" }
axum = { version = "0.8", features = ["json"] }
axum-server = { version = "0.8", features = ["tls-rustls"] }
tokio = { version = "1", features = ["rt-multi-thread", "macros", "net", "fs", "io-util"] }
tokio-util = { version = "0.7", features = ["io"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
serde = { version = "1", features = ["derive"] }
clap = { version = "4", features = ["derive"] }
anyhow = "1"
thiserror = "2"
zip = "8"
serde_json = "1"
tempfile = "3"
# The format of both this server's own config and the file a project carries
# to describe itself -- both read and edited by hand, where comments earn
# their keep, and both describing things that are genuinely sums (a
# component is an APK or a server, not a tagged bag of every field). TOML
# can express the second only as a tag plus flat sibling keys, which nothing
# checks until run time. serde_json is still here for the HTTP surface.
ron = "0.12.2"
[dev-dependencies]
# ServiceExt::oneshot, to drive the auth middleware without a socket.
tower = { version = "0.5", features = ["util"] }
# Setting an explicit mtime is the only way to test "newest build wins"
# deterministically -- files written in the same instant tie.
filetime = "0.2"