- Executive Summary
- System Architecture
- Architecture Diagrams
- Data Pipeline & Sync Model
- Technical Deep Dive
- Performance & Metrics
- Developer Experience & Setup
- Visuals & Media
- Releases
- Why Velo is Different
- Conclusion
- License
Modern project management tools assume constant connectivity, which introduces latency, failure points, and degraded UX in real-world mobile environments.
Velo was engineered to solve this problem.
- Network dependency β degraded UX
- High-latency operations (task updates, comments)
- Poor offline support β user frustration
- Sync conflicts β inconsistent state
Velo implements a local-first architecture where:
- All operations execute instantly on-device
- Changes are stored as operation logs (op-based sync)
- Backend acts as a synchronization and reconciliation layer
- β‘ Zero-latency interactions (local writes)
- π‘ Resilient offline usage
- π Eventual consistency across devices
- π Scales from personal use β team collaboration
![]() |
![]() |
![]() |
![]() |
See Velo in action β a lightweight, offline-first project management system built for real-world team workflows.
Mobile App (React Native)
β
Local Database (Offline-first state)
β
Sync Engine (Op-based queue)
β
Backend API (Fastify)
β
Database (PostgreSQL via Prisma)
| Decision | Rationale |
|---|---|
| Offline-first | Eliminates network dependency |
| Operation-based sync | Enables conflict resolution |
| Fastify backend | High-performance, low overhead |
| Prisma ORM | Type-safe schema management |
| PostgreSQL | Strong consistency + scalability |
flowchart TD
UI[UI] -->|mutate| Repo[Repositories]
Repo -->|write| SQLite[(SQLite)]
Repo -->|enqueue| ChangeLog[change_log]
ChangeLog --> SyncEngine[SyncEngine]
SyncEngine -->|push| Server[/Sync API/]
sequenceDiagram
participant Client
participant Server
Client->>Server: POST /sync (ops, cursor)
Server->>Server: apply ops + dedupe + log server_changes
Server-->>Client: ackOpIds + changes + newCursor
Client->>Client: mark ops SENT
Client->>Client: apply changes or create conflicts
flowchart TD
Change[Incoming server change] --> Check{Local pending or newer?}
Check -- No --> Apply[Apply to local DB]
Check -- Yes --> Conflict[Create conflict row]
Conflict --> Resolve[User resolves]
Resolve --> Enqueue[Enqueue resolution op]
Instead of syncing raw state, Velo syncs intent-based operations:
type SyncOperation = {
id: string
entity: "task" | "project" | "comment"
type: "UPSERT" | "DELETE"
payload: object
timestamp: number
}-
User action β stored locally
-
Operation added to sync queue
-
Sync triggered manually or via settings
-
Backend processes operations:
- Deduplicates (
opId) - Applies mutations
- Generates server changes
- Deduplicates (
-
Client pulls updates via cursor
{
"ops": [
{
"id": "op_123",
"entity": "task",
"type": "UPSERT",
"payload": {
"id": "task_1",
"title": "Fix login bug"
}
}
],
"cursor": "abc123"
}{
"ack": ["op_123"],
"changes": [
{
"entity": "task",
"type": "UPSERT",
"payload": {
"id": "task_2",
"title": "New task from another device"
}
}
],
"nextCursor": "abc124"
}-
React Native
0.76+ -
State management: MobX (multi-store architecture)
-
Offline storage:
- MMKV / AsyncStorage
-
Navigation: React Navigation
-
UI: Custom glassmorphism system
// Core stack
import Fastify from "fastify"
import { PrismaClient } from "@prisma/client"- Framework: Fastify (low overhead, high throughput)
- ORM: Prisma (type-safe DB access)
- Database: PostgreSQL 15
- Deployment: Docker + Caddy reverse proxy
Entities:
- Users
- Workspaces
- Projects
- Tasks
- Comments
- Workspace Members
Relational structure managed via Prisma schema.
- Operation queue (client-side)
- Deduplication via
opId - Server change log (
serverChange) - Cursor-based incremental sync
- Last-write-wins (timestamp-based)
- Operation idempotency
- Server reconciliation layer
- Strict schema validation
- Optimistic updates with rollback support
- Sync retries with exponential backoff
| Metric | Value |
|---|---|
| Local write latency | ~0ms (instant) |
| Sync latency | <300ms typical |
| Conflict rate | Low (op-based model) |
| App startup | ~1β2s |
- Unit tests for sync logic
- Integration tests for API routes
- Manual multi-device sync validation
| Action | Traditional App | Velo |
|---|---|---|
| Create task | Network call | Instant |
| Edit task | Network call | Instant |
| Offline usage | Limited | Full |
git clone https://github.com/yourusername/velo
cd velo
pnpm installcd backend
cp .env.example .env
pnpm prisma generate
pnpm prisma migrate dev
pnpm devcd mobile
pnpm startdocker compose -f docker-compose.velo.yml up -dDATABASE_URL=postgresql://user:password@host:5432/db
JWT_SECRET=your_secretπ² Download APK from the latest Release
Most apps degrade offline.
Velo operates fully offline by design.
- More scalable
- Conflict-tolerant
- Efficient over low bandwidth
- No loading states for core actions
- No blocking network calls
- Typed backend (Prisma)
- Structured sync pipeline
- Containerized deployment
- Poor connectivity environments
- Mobile-first workflows
- Distributed teams
Velo demonstrates a production-grade approach to offline-first application design, combining:
- Local-first data modeling
- Robust sync architecture
- High-performance backend systems
It showcases the ability to design systems that are resilient, scalable, and user-centric under real-world constraints.
MIT License β feel free to use and adapt.




