Producto: RutBusiness (multi-rubro). Repo git:
pharma-server(nombre histórico; rename físico pendiente de go del fundador).
ERP/POS offline-first para microempresas chilenas: 1 RUT = 1 negocio = 1 agente.
Farmacia es el beachhead, no el límite ni la marca. Server Rust on-prem + clientes
operador + API HTTP /api/v1. Modelo freemium MSI (core gratis + tiers) - ADR-0001.
No es un scaffold. En main vive el ERP usable en desarrollo:
| Superficie | Path | Rol |
|---|---|---|
| Server / API | crates/ (~14 crates) |
axum + SurrealKV embebida, JWT, dominio ERP, DTE, license, agent, jobs, MSI service |
| Android operador | client-android/ |
Kotlin + Jetpack Compose nativo - cliente móvil de primera clase (ADR-0021) |
| Desktop Windows | client/ (Tauri 2) |
MSI escritorio; mismo frontend TS que la web |
| Web operador (PWA) | client/ + crates/api/static/ |
Operador en navegador / Free Web servido por el API |
| CLI admin | crates/cli |
migrate, seed, usuarios, license |
Módulos de dominio en main (no exhaustivo): inventario multi-SKU/variants, POS, compras/OC, caja, fiado, reportes, multi-sucursal, rubro-pack, country-pack (moneda/impuesto por tenant), capa license Ed25519, rieles de agente/Fase 13 parciales. Suite workspace del orden de 1000+ tests (audit 2026-08-08: 1019 passed).
- No es un esqueleto vacío ni "solo API de farmacia".
- No es SaaS-only: offline-first on-prem es el core; cloud companion es opt-in.
- No es un solo frontend universal en móvil: Android es Compose nativo; Tauri/TS sigue vivo para desktop + web (ADR-0015 superado en Android por ADR-0021).
- No renombra crates/binarios/MSI sin go explícito del fundador (
pharma-api,PharmaServer, etc. son nombres de repo/instalador).
# Server (puerto 8080). En Windows, si sccache falla: $env:RUSTC_WRAPPER = ""
cargo run -p api
curl http://localhost:8080/health/live
# O wrapper con DB del árbol de trabajo (ajustá paths en el .cmd si hace falta):
# .\start-server.cmd# Desktop / web operador
cd client
npm install
npm run tauri dev # escritorio
# npm run build # typecheck + Vite (PWA/web)# Android (server ya corriendo). Emulador: http://10.0.2.2:8080
cd client-android
.\gradlew assembleDebug
# Instalá el APK del ABI del aparato (no hay APK universal - piso de hardware)Primera cuenta: POST /api/v1/setup (business_name, tenant_slug, email, password).
No hay contraseña default commiteada. Demo histórico (si está seedado): ver docs/ops y CLI seed.
DB: SurrealKV en path configurable (PHARMA__DB__PATH). Servicio Windows e instancia
dev no pueden compartir el mismo directorio (file lock).
| Crate | Rol |
|---|---|
api |
Axum HTTP (cargo run -p api), OpenAPI, static Free Web |
domain |
Invariantes de negocio (inventario, ventas, caja, fiado, rubro, …) |
core |
Tipos, errores, config |
db |
SurrealDB client + repos + migraciones |
auth |
JWT + argon2id, claims multi-tenant |
dte |
Boleta/factura electrónica SII (nativo Rust) |
license |
Entitlements Ed25519 offline + 402 |
agent |
Identidad/envelopes firmados, assist |
assist |
Capa assist del agente |
jobs |
Cron / workers |
sync |
Sync / seams interop |
telemetry |
tracing + OTLP + Prometheus |
service |
Windows service + embebido del API |
cli |
Admin CLI |
- Rust 1.95 pin (
rust-toolchain.toml) · MSRV 1.85 · axum 0.8 · SurrealDB 2.xkv-surrealkv - Cliente desktop/web: Tauri 2 + TypeScript + Vite (
client/) - Cliente móvil: Kotlin, Jetpack Compose, minSdk 23 (
client-android/)
Release histórico: v0.1.23.
Build local: cargo build --release -p service + cargo wix (WiX v3). Detalle y smoke en
docs/ops/ y installer/.
| Doc | Para qué |
|---|---|
CLAUDE.md |
Contexto agentes, directivas del fundador, stack |
docs/adr/ |
Decisiones arquitectónicas (inmutables) |
docs/strategy/ |
Visión, freemium, multi-rubro, Fase 13 |
HANDOFF.md |
Archivado (promote erp-parity 2026-07-19) - no es entrada viva |
client-android/README.md |
Cómo correr la app Compose |
SO del independiente chileno + riel de confianza entre nodos (identidad, discovery,
negociación, liquidación). Detalle: docs/strategy/ - no re-derivar acá.