No description
  • TypeScript 55.5%
  • Rust 21.3%
  • Slint 15.1%
  • CSS 7.1%
  • JavaScript 0.3%
  • Other 0.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
tim 95a77f3b75
Some checks are pending
web-ci / test (push) Has started running
feat(web): every price a person is shown is in compute units
- BREAKING CHANGE Interface the roster reads `estimated_cu_per_round` — the orchestrator dropped dollars from its agent responses
- Improved Interface the cost column is CU/cycle, and the run's cost on the Details tab is the reported charge in units where there is one, the estimate until then
- Fixed Bug a mind that reports no price showed a dollar figure of zero; unquoted is not free, and it reads as an em dash
2026-09-20 15:24:06 +02:00
.cargo feat(billing): BalanceScreen redesign (subscription + top-up + TEE teaser); fix export crash + git fetch 2026-08-01 07:25:14 +02:00
.gitea/workflows ci(web): Gitea Actions — vitest + build + playwright e2e on web/ changes 2026-08-10 23:42:20 +02:00
.github/workflows chore(security): scrub internal-confidential references from the public repo 2026-08-10 10:46:42 +02:00
.issues Record why a question read back on another device is cut 2026-08-22 16:28:33 +02:00
crates chore(security): scrub internal-confidential references from the public repo 2026-08-10 10:46:42 +02:00
demo chore(security): scrub internal-confidential references from the public repo 2026-08-10 10:46:42 +02:00
deploy Record that both readiness probes were actually exercised 2026-08-20 08:30:25 +02:00
design chore(security): scrub internal-confidential references from the public repo 2026-08-10 10:46:42 +02:00
docs docs: the visual system as a deck needs it, not as a stylesheet states it 2026-09-18 14:09:25 +02:00
examples export: extract transcript_rows/summary to lib + headless dump_transcript example 2026-07-25 09:40:49 +02:00
packaging chore(security): scrub internal-confidential references from the public repo 2026-08-10 10:46:42 +02:00
scripts feat: White-Flame audit-trace MVP + CI, hooks, Makefile 2026-07-19 03:51:54 +02:00
src chore(security): scrub internal-confidential references from the public repo 2026-08-10 10:46:42 +02:00
tests feat: White-Flame audit-trace MVP + CI, hooks, Makefile 2026-07-19 03:51:54 +02:00
ui chore(security): scrub internal-confidential references from the public repo 2026-08-10 10:46:42 +02:00
web feat(web): every price a person is shown is in compute units 2026-09-20 15:24:06 +02:00
.dockerignore web-deploy: Dockerfile + tuned nginx for noolog-web (Coolify/Hetzner) 2026-08-08 11:52:08 +02:00
.gitignore feat(ui): also export a round-summary CSV 2026-07-20 08:10:37 +02:00
build.rs build(ui): relative imports instead of @noolog_ui alias — fix mobile remote-preview 2026-07-26 09:01:23 +02:00
Cargo.lock web: fix stale-vault login error + errors/logs to browser console 2026-08-08 20:03:12 +02:00
Cargo.toml fix(web): iPhone tap dead — size canvas to visualViewport, not layout viewport 2026-08-09 15:28:10 +02:00
Makefile release pipeline scaffold: macOS dmg / Linux AppImage / Android apk + auto-update 2026-08-08 10:32:14 +02:00
privatekey feat(ask): full-screen iOS-Mail compose + Send goes straight to the deliberation (no email wall) 2026-07-30 06:32:06 +02:00
README.md Update README.md 2026-09-06 11:10:40 +00:00

noolog-app

Slint (Rust-native) desktop client for Noolog — a White-Flame audit-trace view over the NSED / quorum-rs multi-agent deliberation engine. Left pane = the clean client deliverable; right pane = the full deliberation trace (the centerpiece). See docs/SPEC.md for the product spec and docs/IMPLEMENTATION_NOTES.md for how the shipped engine schema maps onto it.

Architecture

One package (lib noolog_trace + bin noolog) over a workspace of pure helper crates. The evidence/logic layers are headless (SPEC §4 M1 — CI-provable without Slint or a GPU); only the bin pulls the renderer.

Target / crate What GPU
lib noolog_trace headless model: wire types, TraceGraph (+ agent_phase/claim_tally/flagged_claims/dissents/final_agreement/compliance/transcript_*), convergence, reveal, budgetwire, loader, demo, auth launch-gate none — CI-provable
crate noolog-graph pure layout + report logic: swimlane/branch DAG, matrix, blame, transcript + compliance + CSV rendering none
crate noolog-ui the @noolog_ui Slint component library (White-Flame widgets, theme from design/tokens.json)
crate noolog-3d portable 3D noosphere (deps-free core + glow GL backend behind a flag) GL (opt)
crate noolog-web WASM build of the shell for phone/PWA preview femtovg
bin noolog Slint shell: Split-Brain UI, base-trunk audit trace, compliance console, live SSE + budget poll, desktop biometric unlock femtovg / software
flowchart LR
  SSE["GET /job/{id}/stream (SSE)"] --> W[wire::DeliberationEvent]
  JSONL["captured .jsonl / demo"] --> W
  W --> TG[model::TraceGraph]
  BUD["GET /deliberation/{id}/budget (~4s poll)"] --> P
  TG --> P[main::present]
  P --> UI[Slint shell: console · audit trace · evals · agents]
  TG --> CMP["compliance() / transcript_*()"]
  CMP --> EXP["Export .md + rounds.csv (~/Downloads)"]
  TOK[design/tokens.json] -->|build.rs| TH[ui/theme.slint]
  TH --> UI
  TOKN["~/.nsed/operator.token"] --> GATE["auth::launch_gate"]
  GATE -->|lock on| BIO["biometric unlock (Touch ID / Hello)"]
  BIO --> UI

Server auth stays invite/token redeem; biometrics is a LOCAL guard on the stored token (web/PWA WebAuthn is a separate track, T013). The headless core is deliberately independent of the heavy quorum server crate: src/wire.rs mirrors the exact SSE payloads so the evidence layer builds and tests with only serde + serde_json — no axum/nats/LLM graph, no GPU.

Renderer policy — NO Skia

Skia is banned (Google-origin). Cargo.toml pins renderer-femtovg (GPU tier-1) + renderer-software (CPU / headless-CI fallback); never renderer-skia. See docs/RENDERER.md. Run with SLINT_BACKEND=winit-femtovg (or winit-software).

Build / run / test

# Headless evidence layer — no Slint, no GPU (this is what CI gates on):
cargo test --no-default-features --lib

# Full build + tests (Slint shell included):
cargo test
cargo build --release

# Run the demo (labelled in-repo deliberation, no server needed):
./target/release/noolog                 # or: cargo run

# Replay a captured SSE stream. One JSON object per line; `data` must be a JSON
# object (not a stringified payload), e.g.:
#   {"event":"round_summary","data":{"round":1,"convergence_score":0.9,"proposal_scores":[]}}
./target/release/noolog --stream capture.jsonl

# Live: stream a running job from the orchestrator:
NOOLOG_BASE_URL=https://api.peeramid.xyz NOOLOG_TOKEN=… ./target/release/noolog --job <job_id>

Previewing the UI (slint-viewer) vs running the app (cargo run)

# Static visual + compile check of every screen with MOCK data:
slint-viewer --library noolog_ui=crates/noolog-ui/ui demo/preview.slint

The slint-viewer preview is a visual/compile check only — it renders the screens from demo/preview.slint's mock data with no Rust backend. Purely-Slint interactions work there (screen switch via the top toolbar, thread fold/focus/collapse, keyboard nav, flame transitions), but anything host-driven does not run in the preview:

  • text search (Slint has no substring match → filtering is Rust-side),
  • mailbox counts and the live network fetches (inbox list, policy catalog, budget),
  • launching / streaming a real job.

For the interactive app with all of that live, use cargo run (Demo mode, the labelled in-repo deliberation) or --job <id> against a real orchestrator. The demo gate in this repo only checks that preview.slint compiles, not that it's functional.

Dev workflow

make help            # list common commands
make install-hooks   # pre-commit gate: cargo fmt --check + clippy -D warnings
make ci              # run the CI gates locally (fmt-check -> clippy -> tests)
make headless        # fast: build + test the no-GPU core only

Crash diagnostics: any panic is appended to ~/.nsed/crash.log (message + location + backtrace, captured even without RUST_BACKTRACE). If the app crashes on an interaction, send that file — it points straight at the source line.

CI (.github/workflows/ci.yml, GitHub-Actions compatible) runs the same gates: format, clippy (-D warnings), the headless core (no system deps), the full Slint build/test, and a spell check.

Design tokens

design/tokens.json is the single source of truth for the White-Flame palette/typography/motion. build.rs generates ui/theme.slint (git-ignored) from it; the landing's css/tokens.css must derive from the same file or screenshots drift (SPEC M2). See docs/DESIGN_TOKENS.md.

Deploy

Distributed desktop binary (release binaries), not a web service — only the landing is a container-platform deploy (SPEC §5). This is a UX demonstrator of the already-shipped engine.