Skip to content

Repository files navigation

Model Vault Desktop

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).

What works today

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

Architecture

┌─────────────────────────────────────┐
│  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

Quick start

Prerequisites

  • Node.js 20+
  • Rust toolchain (for Tauri)
  • Linux/macOS/Windows desktop environment

Install & run desktop

npm install
npm run tauri:dev

Port note: Vite is fixed on http://127.0.0.1:3000 (same URL Tauri loads).
Do not run npm run dev and npm run tauri:dev at the same time — free the port first
(fuser -k 3000/tcp) if you see Port 3000 is in use / blank window.

Coordination server (multi-machine discovery)

cd server && npm install && npm run dev
# listens on http://127.0.0.1:8787 by default

Or from repo root: npm run server:dev.

Coordination API (metadata only)

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.

Two-machine LAN loop

  1. Shared index: start server on a host both machines can reach (or one machine’s LAN IP:8787).
  2. Machine A: npm run tauri:dev → Settings → Network: Use remote index ON, set Index base URL, enable Auto-start P2P node, bind 0.0.0.0:0.
  3. Publish a GGUF with seed + announce.
  4. Machine B: same index URL + remote index ON → Discover finds the model → Download.
  5. 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).

Tests

# 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 build

Last 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

Project layout

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

Milestone summary

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

Explicitly later

  • Production TLS + auth + moderation
  • Creator economy / paid models
  • Full LM Studio / llama.cpp import
  • DHT / libp2p rewrite
  • Mobile clients
  • TCP relay / UPnP

Tech stack

  • Desktop: Tauri 2, React 18, TypeScript, Vite, Tailwind, Zustand
  • Backend: Rust, rusqlite, ureq, ed25519-dalek
  • Index: Node 20, Fastify, better-sqlite3, Zod

Contribute

Prefer small, test-backed slices. Open an issue/PR with scope and the component you own.

Tone

Open, practical, builder-friendly. Ship a desktop tool people actually use — not hype.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages