A lexicon-driven AppView for ATProto.

Local Development from Source #

This guide runs HappyView directly with cargo run, with you managing Tap separately. If you'd rather use Docker Compose to run everything together, see Local Development with Docker.

Prerequisites #

  • Rust (stable)
  • A running Tap instance (delivers real-time records and handles backfill). See the Tap documentation for setup.
  • (Optional) PostgreSQL 17+ if you prefer Postgres over the default SQLite

1. Clone and configure #

git clone https://github.com/graze-social/happyview.git
cd happyview
cp .env.example .env

Edit .env to point at your running services:

# SQLite (default — no setup needed, file created automatically)
DATABASE_URL=sqlite://data/happyview.db?mode=rwc
PUBLIC_URL=http://localhost:3000
SESSION_SECRET=change-me-in-production
TAP_URL=http://localhost:2480
TAP_ADMIN_PASSWORD=your-secret-here

Or if you prefer Postgres:

DATABASE_URL=postgres://happyview:happyview@localhost/happyview

See Configuration for all available variables and the database setup guide for details on both backends.

2. Create the database (Postgres only) #

If using SQLite, skip this step — HappyView creates the database file automatically.

If using Postgres:

createdb happyview

Or if using a Postgres user with a password:

psql -c "CREATE DATABASE happyview;" -U postgres

HappyView runs migrations automatically on startup, so no manual migration step is needed.

3. Start HappyView #

cargo run

HappyView starts on port 3000 (configurable via the PORT environment variable).

Next steps #

Your HappyView instance is running. Follow the Statusphere tutorial to upload lexicons, add custom query logic, and start indexing records from the network.