A Denver events feed with three linked apps sharing one codebase and database, switchable via the title dropdown in each navbar:
- Setlist Social Feed (
/) — indie music shows: chronological feed, filters by month/genre/location/recency, upvoting, Google Calendar / Maps / Spotify integrations, CSV bulk import, AI artist analysis, and an automated concert-discovery admin panel. - Amuse Bouche (
/amuse-bouche) — foodie popups with its own gold/cream design, AI blurb parser (paste an Instagram/social blurb → Claude extracts name/venue/dates/price/cuisine), and a curated "Best Of Denver" restaurant list. - Artistry & Nerdistry Live (
/artistry-nerdistry) — art, science, literary & cultural events with an AI screenshot/blurb parser and category filters.
Migrated off Replit in July 2026. The stack is now GitHub + Vercel + Supabase:
- Frontend: React 18 + TypeScript, Vite, Wouter routing, TanStack Query, Radix UI / shadcn-style components, Tailwind CSS. Built to static assets in
dist/public. - Backend: Express (TypeScript) with a RESTful API under
/api. The app factory lives inserver/app.tsand is shared by two entries:server/index.ts— local dev/prod server (Vite middleware in dev, static serving in prod).api/index.mjs— Vercel serverless function;npm run build:vercelbundlesserver/app.tsintoapi/_app.mjs(gitignored) with esbuild.
- Database: Supabase Postgres via Drizzle ORM (
drizzle-orm/node-postgres, singleDATABASE_URLconsumed inserver/db.ts). Schema is declared inshared/schema.tsand pushed withnpm run db:push. Sessions are stored in the same database (connect-pg-simple). - AI features: Anthropic API (
@anthropic-ai/sdk) for blurb/screenshot parsing and artist analysis. - Analytics: PostHog page-view tracking (
client/src/lib/posthog.ts); events carry asiteproperty (setlist-social,amuse-bouche,artistry-nerdistry). - Routing on Vercel:
vercel.jsonrewrites/api/*to the serverless function and everything else toindex.html(SPA fallback).
Tables (see shared/schema.ts): users, events (music shows), upvotes, playlists, artists, discovered_events, discovered_artists, venues, food_events (Amuse Bouche), art_events (Artistry & Nerdistry), restaurants (Best Of Denver), plus a session table auto-created by the session store.
The automated venue-scraping/discovery services (server/venue-scraper.ts, server/omr-headless-scraper.ts) use Puppeteer and were designed for Replit's long-running VM. They still work locally, but headless-Chromium scraping is not supported inside the Vercel serverless function — the admin discovery endpoints will error in production. Core feeds, upvoting, adding events, and AI parsing are unaffected.
Copy .env.example to .env and fill in:
| Variable | Required | Purpose |
|---|---|---|
DATABASE_URL |
yes | Supabase Postgres connection string (Session pooler URI) |
SESSION_SECRET |
yes (prod) | Signs Express session cookies |
ANTHROPIC_API_KEY |
yes | AI blurb/screenshot parsers, artist analysis |
SPOTIFY_CLIENT_ID / SPOTIFY_CLIENT_SECRET |
optional | Artist lookup enrichment |
SERPER_API_KEY |
optional | Automated concert discovery web search |
VITE_POSTHOG_KEY |
optional | PostHog analytics |
Production values are set as Vercel environment variables (vercel env add …), never committed.
npm install
cp .env.example .env # fill in values
npm run db:push # create/sync schema in the database
npm run dev # serves client + API on http://localhost:5000Other scripts: npm run check (typecheck), npm run build (self-hosted prod build → dist/), npm run build:vercel (Vercel build: static client + serverless bundle), npm start (run self-hosted prod build).
Pushes to main deploy via the Vercel Git integration, or deploy manually with vercel --prod. The Vercel project uses npm run build:vercel (configured in vercel.json).