[package]
name = "monetize-admin"
version = "0.1.0"
edition = "2021"
rust-version = "1.85"
license = "AGPL-3.0-only"
publish = false
description = "The SOLO monetize box (G6, owner 2026-10-10): ONE machine runs monetize-server and the operator console for every product, as two processes of this binary (`server`, `ui`) under its PID 1 on a tunnr kernel with no shell — the installer's view of the box (a front of an estate of one), the edge on :443 (webhooks and estate-facing gRPC to the server, the rest to the console), and an operator-only door that takes the feed after the install."
# Its OWN workspace (A28 M1, T14: xtask/tests/detached_locks.rs): the ONE box's static musl
# build, which the Build Thing builds by `manifest_dir` (monetize-build-thing ADMIN_MANIFEST_DIR)
# for the release, and TASKS-2's DO-NOT-TOUCH row on monetize-admin/tests is not lifted.
[workspace]
[[bin]]
name = "monetize-admin"
path = "src/main.rs"
[dependencies]
monetize-ui-server = { path = "../monetize-ui-server" }
monetize-proto = { path = "../monetize-proto" }
monetize-front = { path = "../monetize-front" }
# A32-15: the vendor kinds' shapes (monetize_pay::shapes), the site book editor's vendor data.
monetize-pay = { path = "../monetize-pay" }
monetize-server = { path = "../monetize-server", features = ["narrate"] }
# The shop's own installer (G11): the solo box pairs the estates it sells, with no gunnar in it.
monetize-shop-pairing = { path = "../monetize-shop-pairing" }
nordisk-pairing = { path = "../../../Skidbladnir/crates/installer/nordisk-pairing", version = "0.5.11", features = ["wireguard"] }
# `acme` (estate-front 0.1.5, A32-11): the ACME client is a default-off feature of estate-front
# now; the ONE box takes its own certificate from Let's Encrypt (`web::start`), so it names it.
estate-front = { path = "../../../edda/crates/estate-front", version = "0.3.0", features = ["acme"] }
appliance-pid1 = { path = "../../../edda/crates/appliance-pid1", version = "0.1.2", features = ["dhcp", "runtime"] }
wg-appliance-core = { path = "../../../edda/crates/wg-appliance-core", version = "0.1.5" }
# The box's own clock (no front to follow): the fronts' estate-clock, stepped and slewed by PID 1.
estate-clock = { path = "../../../edda/crates/estate-clock", version = "0.1.0", features = ["fetch", "adjust"] }
axum = { version = "0.8", default-features = false, features = ["tokio", "http1", "http2"] }
hyper-util = { version = "0.1", features = ["server", "server-auto", "service", "tokio", "client", "client-legacy", "http1", "http2"] }
tokio = { version = "1", features = ["rt-multi-thread", "macros", "net", "time", "sync", "io-util", "process"] }
tokio-rustls = { version = "0.26", default-features = false, features = ["ring", "tls12"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tonic = { version = "0.14", default-features = false }
tracing = "0.1"
tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt", "env-filter", "ansi"] }
toml = "1"
# The off-box copy (BK-0, offsite.rs): sealed with age to the vault-held off-site
# key (X25519, pure Rust, no plugin), the ledger verified with monetize's own
# stores, shipped to R2 over HTTPS (ring provider, Mozilla roots — no C crypto),
# SigV4 signed with ring.
monetize = { path = "../monetize" }
age = "0.11"
ring = "0.17"
reqwest = { version = "0.13", default-features = false, features = ["rustls-no-provider", "blocking"] }
rustls = { version = "0.23", default-features = false, features = ["ring", "std"] }
webpki-root-certs = "1"
# **The ONE box updates ITSELF** (owner 2026-10-14, `self_update`): korp's generic live update —
# the two app slots, the slot setting, the BASE, the stage's checks against the ENROLLED root,
# the trial and its rollback in korp-start — and the box's own half: stage, confirm, re-exec.
korp-installer = { path = "../../../tunnr/crates/korp-installer", default-features = false }
nix = { version = "0.31", default-features = false, features = ["signal", "fs"] }
# OXG-4: the next release's app is read out of its archive (korp's app .znippy, blake3-chunked,
# OpenZL) and asked about the box's fed config before it is staged (`self_update::ask_next_app`).
znippy-common = "0.10.0"
blake3 = "1"
# **The buy trials on this program** (`tests/site_buy_trials.rs`, A15 moved in v2.0 P1): the 12
# trials over `linked()` with the signed guests. Never in `default`: the test needs the built
# guests and the fake Stripe's binary (`cargo xtask trials` in monetize builds and sets them);
# with the feature on and an input missing it FAILS by name.
[features]
trials = []
[dev-dependencies]
# The tests take monetize-server's test doubles (feature `testing`, A28 M15).
monetize-server = { path = "../monetize-server", features = ["testing"] }
tempfile = "3"
# The sweep test (tests/sweep_one_box_*.rs): the ONE box through `linked()` lays an estate at
# mock-upcloud through the signed UpCloud guest. Dev only: nothing of it is in the binary.
mock-upcloud = { path = "../mock-upcloud" }
guest-host = { path = "../../../edda/crates/guest-host", version = "0.2.0", features = ["wasmtime", "verify-modules"] }
monetize-embed = { path = "../monetize-embed" }
base64 = "0.23"
http = "1"
http-body-util = "0.1"
estate-front = { path = "../../../edda/crates/estate-front", version = "0.3.0", features = ["test-support"] }
# tests/site_buy_trials.rs (feature `trials`): the product site's relay (its testkit site), the
# UpCloud mock in process, the guests signed under a run CA, the sites' enrolment at the attach
# door (the owner's ssh key, the wire), the boxes' signed Fleet calls, the relay's TLS.
monetize-site-buy = { path = "../monetize-site-buy", features = ["testkit"] }
monetize-product = { path = "../monetize-product" }
plugin-door-wire = { path = "../../../Skidbladnir/crates/installer/plugin-door-wire", version = "0.1.0" }
ssh-key = { version = "=0.7.0-rc.11", default-features = false, features = ["ed25519", "std", "alloc"] }
ed25519-dalek = "3"
tower = { version = "0.5", features = ["util"] }
# tests/front_certs_cli.rs: estate-front's real certificate report as `monetize front certs` says it.
monetize-cli = { path = "../monetize-cli" }
[profile.release]
lto = true