A foundation for building your next application

A reusable fullstack template: GraphQL API, admin panel, web portal and native mobile app, with an end-to-end local demo.

Terminal

Prepare the demo

bun run demo:setup

Start the API and the web apps

bun dev

How the pieces connect

Three clients talk to a single GraphQL API, the only piece that touches the data.

Clients

  • AdminWeb
  • PortalWeb
  • MobileNative

API

GraphQL APIFastify and GraphQL YogaBetter Auth: sessions and permissions

Data

  • PostgreSQLData, through Prisma
  • S3 local (RustFS)Images with presigned URLs
  • RedisRate limiting and readiness

Images do not go through the API: it signs the URL and the client uploads (PUT) and reads (GET) straight from storage.

Admin, Portal and Mobile send GraphQL queries and mutations to a single API built with Fastify and GraphQL Yoga, with Better Auth for sessions. The API stores data in PostgreSQL through Prisma, signs URLs for S3-compatible storage (RustFS locally) and uses Redis for rate limiting. Images do not go through the API: clients upload and read them directly from storage with those presigned URLs.

Three applications on the same foundation

Each user type has its own application, sharing the same design tokens and the same GraphQL contract.

  • Admin

    Web

    Moderation panel for posts and accounts.

    • ADMIN
    • Publishes a post or moves it back to draft
    • Deletes posts
    • Never edits other people's content
    Open admin
  • Portal

    Web

    Workspace for the people who publish.

    • PARTNER
    • Creates, edits and deletes their own posts
    • Uploads one image per post
    • Chooses between draft and published
    Open portal
  • Mobile

    Native

    Expo app for iOS and Android.

    • PARTNER
    • CLIENT
    • PARTNER writes in "My posts"
    • CLIENT reads the feed of published posts
    • Same visual system as the web

    No URL: it runs on your simulator or device with a development client, not in Expo Go.

How to run the local demo

Postgres, Redis and a local S3 run in Docker Compose. Three commands get login and posts working across the three applications.

Sample accounts

They are generated on your machine and never published here. To learn how to get them, see the local fixture guide:

docs/operations/local-dev-fixture.md

  1. Gets everything ready: environment variables, Docker Compose, migrations and sample data.

    bun run demo:setup

  2. Starts the API, admin, portal and this landing.

    bun dev

  3. Starts the mobile app. It needs a development client installed.Optional

    bun run dev:mobile

Technologies used

A Bun and Turborepo jey. A single tokens package themes Mantine on web and Unistyles on mobile, in light and dark.

  • API

    • FastifyHTTP server for the API
    • GraphQL YogaGraphQL server with SDL schema and codegen
    • Better AuthEmail and password identity
    • PrismaORM and migrations
  • Data and storage

    • PostgreSQLMain database
    • RedisRate limiting and readiness
    • S3 local (RustFS)S3-compatible storage with presigned URLs
  • Web

    • ReactAdmin and portal interface
    • ViteDev server and build
    • MantineComponents, through the web-ui package
  • Mobile

    • ExpoNative app for iOS and Android
    • Expo RouterFile-based navigation
    • UnistylesStyling with the shared tokens
  • Landing

    • AstroStatic site, the one you are viewing
  • JEY

    • BunRuntime and package manager
    • TurborepoTasks and caching
    • TypeScriptTypes across every piece

An AI agent harness included

The jey ships with navori: an orchestrator that splits the work across specialized agents, with skills, quality gates and hooks that stop destructive actions. It is versioned in the repo, not on your machine.

Specialized agents

  • OrchestratorDecomposes, coordinates and synthesizes; every change goes through implementer and reviewer
  • ImplementerExecutes one scoped task and leaves the quality gate green
  • ReviewerApproves or rejects the diff against the repo rules
  • ScoutRead-only reconnaissance with cited evidence
  • AuditorAudit with a verdict: root cause and plan, no code edits
  • ArchitectProposes what to build and why when there is an architectural decision
  • PublisherDrafts the commits and opens the PR after approval
  • ScribeTurns verified evidence into Markdown artifacts
  • Skills

    Reusable procedures the agents apply depending on the task.

    • Resolve tickets: from the verified problem to a verdict
    • Design solutions and plans before implementing
    • Debug failures and locate code before touching it
  • Gates and receipts

    Nothing is called done without evidence.

    • Lint, format and typecheck before every commit
    • A reviewer receipt backs the creation of the PR
    • The versioned pre-commit runs ast-grep and jscpd on staged files
  • Safety hooks

    Rules that run on their own, without relying on anyone to remember them.

    • Block destructive commands before they run
    • Ask for confirmation before opening a PR or posting comments
    • Flag generated files that someone edited by hand

Works across several hosts

  • Claude Code
  • Codex
  • Pi

Each host gets its own configuration generated from the same navori.config.json; on Pi, implementer, reviewer and scout run.