Desktop app for discovering, downloading, verifying, and seeding local AI models over peer-to-peer transfer. A thin Node.js coordination server provides metadata + seeder addresses only — model bytes never leave the Rust TCP stack.
Status (2026-07-16): MVP Phases 0–12 complete · UI/UX + P2P Phases 1–6 complete · local testability fix pass done · ready for LAN dogfood.
Not a production marketplace (no auth, moderation, or payments yet).
| Capability | Notes |
|---|---|
| Publish GGUF packages | Native file picker, manifests, chunk hashes, optional ed25519 sign |
| Local library | SQLite inventory, seed toggle, storage stats, Ollama import |
| Chunked transfer | Pause / resume / verify (SHA-256) via Rust transfer manager |
| LAN P2P | TCP peer node; host:port dial; multi-machine with coordination index |
| Discover | Local SQLite index + optional remote merge; filters; Signed only chip |
| Trust UI | Signed / hash verified / creator / unverified badges on cards & detail |
| Coordination server | server/ — search, manifests, seeder announce (TTL), net echo |
| Settings | Bind address, auto-start node, remote index URL, bandwidth limits |
| Browser preview | Mock catalog only when not in Tauri — never mixed into live mode |
┌─────────────────────────────────────┐
│ Node.js Coordination Server │
│ metadata + seeder host:port only │
│ NEVER stores GGUF blobs │
└──────────────┬──────────────────────┘
│ HTTPS JSON
v
┌─────────────────────────────────────┐
│ Tauri Desktop (React + Rust) │
│ UI · SQLite · transfer · P2P TCP │
└──────────────┬──────────────────────┘
│ TCP chunk protocol
v
Other seeders / peers
- Node.js 20+
- Rust toolchain (for Tauri)
- Linux/macOS/Windows desktop environment
npm install
npm run tauri:devPort note: Vite is fixed on
http://127.0.0.1:3000(same URL Tauri loads).
Do not runnpm run devandnpm run tauri:devat the same time — free the port first
(fuser -k 3000/tcp) if you seePort 3000 is in use/ blank window.
cd server && npm install && npm run dev
# listens on http://127.0.0.1:8787 by defaultOr from repo root: npm run server:dev.
| Method | Path | Purpose |
|---|---|---|
| GET | /v1/health |
Liveness |
| GET | /v1/search |
Search index (q, filters, signedOnly, …) |
| GET | /v1/models/:id |
Model metadata |
| POST | /v1/manifests |
Publish manifest (no blobs) |
| POST | /v1/seeders/announce |
Announce seeder host:port (TTL) |
| GET | /v1/seeders |
List seeders for a model |
| GET | /v1/net/echo |
Client IP helper for LAN setup |
Env defaults live in server/ (port 8787, SQLite under server/data/). Rate limits and Zod validation apply to announce/manifest routes.
- Shared index: start
serveron a host both machines can reach (or one machine’s LAN IP:8787). - Machine A:
npm run tauri:dev→ Settings → Network: Use remote index ON, set Index base URL, enable Auto-start P2P node, bind0.0.0.0:0. - Publish a GGUF with seed + announce.
- Machine B: same index URL + remote index ON → Discover finds the model → Download.
- Pause/resume on Downloads; verify lands in Library; optional Ollama import; seed back.
Firewall: allow the TCP listen port shown on Peers. Prefer non-loopback listen addresses for LAN. WAN needs port-forward (no relay in this build).
# One command — all automated layers
npm run test:all
# Fast coordination-server smoke
npm run smoke
# Or layer by layer
npm test && npm run typecheck && npm run build
cd src-tauri && cargo test && cargo check
cd server && npm test && npm run buildLast green snapshot (2026-07-16 fix pass): frontend unit tests + typecheck + build, cargo test, server tests — all passing.
| Command | What you get |
|---|---|
npm run dev |
Browser UI preview (mock data; no real P2P) |
npm run tauri:dev |
Full desktop app (SQLite, transfers, P2P) |
npm run server:dev |
Coordination index on :8787 |
npm run test:all |
Frontend + Rust + server automated suite |
npm run smoke |
Spin index, hit health/search |
| Path | Role |
|---|---|
src/ |
React UI (Discover, Downloads, Library, Publish, Peers, Settings) |
src-tauri/ |
Rust: SQLite, manifests, hash, transfer, P2P, Tauri commands |
server/ |
Node coordination index (Fastify + better-sqlite3 + Zod) |
scripts/ |
test-all.sh, smoke-local.sh |
testdata/ |
Small hash/manifest fixtures |
| Track | Status |
|---|---|
| MVP Phases 0–12 | Complete — domain, library, transfer, publish, discovery index |
| UI/UX + P2P Phases 1–6 | Complete — design system, live shell, settings/publish/peers, coordination server, multi-machine, trust + ship polish |
| Fix pass | Complete — P2P enqueue crash, typecheck, seed announce, browser mocks, test:all / smoke |
- Production TLS + auth + moderation
- Creator economy / paid models
- Full LM Studio / llama.cpp import
- DHT / libp2p rewrite
- Mobile clients
- TCP relay / UPnP
- Desktop: Tauri 2, React 18, TypeScript, Vite, Tailwind, Zustand
- Backend: Rust, rusqlite, ureq, ed25519-dalek
- Index: Node 20, Fastify, better-sqlite3, Zod
Prefer small, test-backed slices. Open an issue/PR with scope and the component you own.
- Email: theeseus@protonmail.com
- LinkedIn: https://www.linkedin.com/in/theeseus/
Open, practical, builder-friendly. Ship a desktop tool people actually use — not hype.