Skip to main content

Developer guide

The Sentin8 dev story is deliberately small: clone one repo, build.

The single-repo dev story​

Every repository is independent and builds alone. The SDKs arrive as pinned git dependencies; committed .sqlx caches mean no live database is needed to compile:

git clone https://github.com/Sentin8/sentin8-auth.git
cd sentin8-auth
cargo build # fetches the SDK pin, builds, done
cargo test # offline (SQLX_OFFLINE)

Vertical repos work identically — clone any service from its vertical org and build.

The full tree (aggregation)​

To develop across the tree, clone the group folders (or the Sentin8/verticals aggregation root) and use the per-group Makefiles:

make infra-up # TLS-only PG 18 + Valkey (the single compose)
make build # DAG order: sdk → starters → services → verticals
make status # fleet status (KEY=<ip:port>)

Lifecycle: db bootstrap → vertical init → vertical enroll → start. No migration code exists — schema changes rewrite the init SQL and re-run init (greenfield platform).

Restart discipline​

Restart services only through Sentin8:Captain (never pkill or Ctrl+C — stale registry entries break TLS round-robin):

make status # find KEY=<ip:port>
make upgrade-instance KEY=<ip:port> # rolling, zero-downtime

Debug iterations​

make build-debug # dev profile
make start-debug # captain spawns debug binaries
make upgrade-instance-debug KEY=… # swap one instance

Testing​

LayerWhat it covers
Unitper-crate Rust tests, offline
Integrationper-repo tests/ against local infra
E2E (UI-only)Playwright suites through the browser + BFF proxy — no direct SQL or backend calls, ever

CI​

Every repo runs the shared sentin8-ci reusable workflows (rust.yml / flutter-app.yml / e2e-repo.yml / docs-group.yml) with blocking build/test and advisory fmt/clippy — plus the nightly aggregation build and e2e sweep across the whole public tree.

Further reading​

  • Remote UI — the RFW contract
  • Samples — first calls against the platform
  • Security — what your code inherits by construction