Track every concert you've been to. Next.js App Router frontend with Prisma/PostgreSQL and Better Auth.
Repository: github.com/Juuro/Concertivity
- Node.js 22 (see
.nvmrc) - Yarn 4 (see
packageManagerinpackage.json; enable via Corepack if needed) - PostgreSQL — connection string for Prisma (
DATABASE_URL) - Photon reverse geocoding (no API key; please be fair with usage)
- Last.fm API keys (optional; band enrichment when
ENABLE_LASTFMis on)
- Clone the repository.
- Install dependencies:
yarn install- Copy the environment template and fill in values (see Environment variables):
cp .env.example .env.local- Create the database schema (requires
DATABASE_URL):
yarn db:migrate- Start the development server:
yarn devOpen http://localhost:3000 to view the app.
| Command | Description |
|---|---|
yarn dev |
Generate Prisma client and start the Next.js dev server |
yarn build |
Generate Prisma client and production build |
yarn start |
Start the production server |
yarn lint |
Run ESLint |
yarn format |
Format with Prettier |
yarn test |
Run Vitest once |
yarn test:watch |
Vitest watch mode |
yarn test:coverage |
Vitest with coverage |
yarn db:generate |
prisma generate |
yarn db:migrate |
prisma migrate dev |
yarn db:migrate:deploy |
prisma migrate deploy (e.g. production) |
yarn db:push |
prisma db push (prototype / non-migration workflows) |
yarn db:reset |
prisma migrate reset |
yarn db:studio |
Open Prisma Studio |
yarn commitlint --edit <file> |
Validate a commit message file (the Husky commit-msg hook passes .git/COMMIT_EDITMSG) |
yarn tsx --env-file=.env scripts/prefetch-lastfm.ts |
Optional: prefetch Last.fm JSON from band names in Postgres (requires ENABLE_LASTFM, LASTFM_API_KEY) |
yarn tsx --env-file=.env scripts/prefetch-geocoding.ts |
Optional: prefetch Photon geocoding cache from concert coordinates in Postgres |
Authoritative template: .env.example. Highlights:
- Database —
DATABASE_URL(use the pooled Prisma URL on Vercel when offered). - Auth —
BETTER_AUTH_SECRET,BETTER_AUTH_URL,NEXT_PUBLIC_APP_URL, and OAuth client IDs/secrets (e.g. GitHub; Google optional). - Integrations (optional) — Last.fm, Ticketmaster, Resend (email), PostHog, Sentry, GitHub feedback escalation tokens,
CRON_SECRETfor secured cron routes.
Feature flags (ENABLE_LASTFM, ENABLE_MAP_PAGE, ENABLE_STATISTICS_WIDGET, etc.) are documented in .env.example.
- Visit https://www.last.fm/api/account/create
- Create an API account
- Add the key (and optional secret) to
.env.local
Without a Last.fm key, or with Last.fm disabled via feature flags, the app uses cached fallbacks and built-in defaults.
| Method | Path | Description |
|---|---|---|
POST |
/api/feedback |
In-app feedback (validated, rate limited). |
GET |
/api/admin/feedback |
Admin queue (queue=active default or all, filters, pagination). |
GET / PATCH |
/api/admin/feedback/[id] |
Admin detail and triage updates. |
POST |
/api/admin/feedback/[id]/github |
Create a linked GitHub issue. |
POST |
/api/admin/feedback/[id]/github/sync |
Refresh linked issue state from GitHub. |
GET |
/api/cron/feedback-github-sync |
Cron: batch-sync stale issues (Authorization: Bearer CRON_SECRET). |
Other routes under app/api/ cover authentication, concerts, bands, venues, festivals, user profile, and admin tools.
Version bumps, CHANGELOG.md, git tags, and GitHub Releases are automated with Release Please (.github/workflows/release-please.yml) when changes on main follow Conventional Commits. Open and merge the release PR when you want to ship a new version.
Pull request titles are checked by .github/workflows/conventional-commits.yml (use titles like feat: … or fix: …, especially if you squash-merge).
The project was migrated from Gatsby to Next.js (App Router). Older migration notes are not shipped in this repo; use git history if you need the full story.
- Next.js 16 — App Router
- React 19
- Prisma — PostgreSQL
- Better Auth — sessions and OAuth
- MapLibre GL — maps
- SCSS modules — styling
- Last.fm — artist metadata (optional, feature-flagged)
- Photon — reverse geocoding
- Sentry / PostHog — error monitoring and analytics (optional, env-gated)