If smartphones and the internet were built by the people for the people. Create services on the EVY platform and get paid every time your contribution is used.
The EVY app is privacy-focused and local-first: the iOS client keeps a persistent on-device store, reads from it offline, and writes optimistically before syncing. Today all clients sync through a central JSON-RPC WebSocket gateway backed by Postgres — peer-to-peer transport and enforced per-user data scoping are roadmap goals, not the current architecture.
flowchart LR
ios[iOS app]
web[Web builder]
api[api JSON-RPC WebSocket gateway]
marketplace[marketplace service JSON-RPC WebSocket]
evyDb[(Postgres evy DB)]
mpDb[(Postgres marketplace DB)]
ios -- WebSocket --> api
web -- WebSocket --> api
api -- evy core resource handlers / Drizzle --> evyDb
api -- service marketplace JSON-RPC --> marketplace
marketplace -- Drizzle --> mpDb
- EVY Platform
- Platform
- Services
Run Postgres (in Docker), the marketplace service, the main API, and the web app:
bun devThis will watch for file changes in any project and restart them as well as re-generate types
Start Postgres (docker compose up --build postgres), then in separate terminals from the repo root:
bun install
bun run types:generate
bun run db:seed
cd services/marketplace && bun run dev
cd api && bun run dev
cd web && bun run devUses pre-built images from GitHub Container Registry (requires authentication). Also copy
.env.prod.example and merge it with .env (Traefik/domain variables — see that file's
header for how it combines with .env.example):
docker compose -f docker-compose.prod.yml up./run-e2e.sh runs API, web, and iOS end-to-end tests with Docker Compose.
You can optionally skip the iOS tests (which are heavy and slow) by running ./run-e2e.sh --skip-ios
The --ci flag is intended for CI only and is not meant for regular local runs. It runs API, marketplace, and web directly with Bun and expects PostgreSQL to already be running on the host. It exists because the macOS CI runner cannot run a container runtime (no nested virtualization), so PostgreSQL is provided on the host instead. For local development, use ./run-e2e.sh (or ./run-e2e.sh --skip-ios) rather than --ci.
- API lint, build, and tests, and web lint run on Linux.
- Web tests run on Linux and install Playwright before running.
- E2E tests run on macOS with
./run-e2e.sh --ci. PostgreSQL is started on the host (the macOS runner cannot run Docker), then API, marketplace, web, and iOS Simulator tests run with Bun. iOS tests target iPhone 17 / iOS 26.5.