← Back to Projects

leptons1618@anishgiri.dev:~/projects/arccluster cat project.toml

Computer Vision 2025 Stable

ArcCluster

Local-first desktop monitor for a face detection agent — Tauri shell serves a Dioxus WebAssembly UI while a Python pipeline runs YuNet ONNX detection and online clustering on Jetson, syncing via TCP JSONL IPC.

category
Computer Vision
year
2025
status
Stable
stack
9 tools
highlights
6
write-up
5 min read

01Highlights

  1. Tauri desktop shell serves Dioxus WebAssembly UI locally with zero external dependencies
  2. Python pipeline runs YuNet ONNX face detector on Jetson with histogram fallback for embedder
  3. Online clustering uses cosine similarity gating (default 0.62) with minimum cluster size of 3
  4. TCP-based JSONL IPC pushes face events and clusters from Python to Tauri in real time
  5. Shared data directory (ARC_DATA_DIR) synchronizes events.jsonl and clusters.json between processes
  6. Detector and embedder backends are swappable via environment variables without code changes

02Built with

  • 01Rust
  • 02Tauri
  • 03Dioxus
  • 04Python
  • 05ONNX Runtime
  • 06YuNet
  • 07WebAssembly
  • 08CSS
  • 09Tokio

03Case study

September 22, 2026 5 min read 850 words

ArcCluster: Local-First Desktop Monitor for a Face Detection Agent

Two processes, one socket, one data directory — and the handful of places where that arrangement is honest about being unfinished.

The problem

Deploying a face detection and clustering system on a Jetson edge device required a local-only desktop monitor that could receive real-time events without cloud dependencies, handle model swapping (YuNet ONNX detector, ONNX/histogram embedder) without code changes, and synchronize state across a Rust desktop app and a Python pipeline over an unreliable local network.

The solution

Built a Tauri desktop shell that serves a Dioxus WebAssembly UI from the local filesystem, paired with a Python pipeline on Jetson that runs YuNet ONNX detection with a histogram fallback embedder and online cosine-similarity clustering; both sides share a data directory (ARC_DATA_DIR) for events.jsonl and clusters.json and push updates over a TCP JSONL socket (default 0.0.0.0:8787) with all model and clustering knobs controlled by environment variables.

Outcomes

  • A YuNet ONNX detector and an ONNX or histogram embedder, both swappable at startup through `ARC_*` environment variables, so no model change needs a recompile.
  • Cluster assignment is gated on both similarity and cluster size, so one bad embedding cannot define a face on its own.
  • The desktop UI is a Dioxus WebAssembly bundle served locally by Tauri — no CDN, no webfonts, no network dependency at render time.

+2 more in the write-up

Inside the write-up

  1. Two processes and a socket
  2. Swapping models without rebuilding
  3. Clustering is deliberately slow to trust itself
  4. Persistence is two files and no more
  5. The socket is the weakest part, on purpose
  6. What is not finished
Read the full case study →

Related projects