GospelChannel — The Church Guide
Find the right church before your first visit.
Free global church guide with worship-aware profiles, built with Next.js 16, OpenNext on Cloudflare Workers, Neon, Spotify, and YouTube.
Solo-maintained project, and my first open source project. This repository is public so people can report bugs, suggest improvements, and send small focused pull requests. I am still learning the open source side of things, so patience and clarity help a lot.
Status
- Production site:
https://gospelchannel.com - Contributor language: English or Swedish is fine
- Project direction is maintainer-led
What the app does
- Find and compare churches by location, tradition, language, worship style, and service details
- Browse curated worship and gospel music connected to church profiles
- Explore church pages with Spotify embeds and YouTube video grids
- Submit church suggestions and ownership claims
- Run scheduled content refresh jobs
- Generate SEO assets such as
sitemap.xml,robots.txt, and structured data
Stack
- Next.js 16 (App Router)
- OpenNext + Cloudflare Workers
- Neon Postgres + Drizzle
- Better Auth
- Spotify Web API
- YouTube Data API
- Cloudflare R2 for media
- PostHog for analytics
Local setup
Prerequisites:
- Node 22.x
- npm
If you use nvm, run:
nvm use
Install and start:
pnpm install
cp .env.example .env.local
pnpm dev
Helpful commands:
pnpm lint
pnpm build
pnpm smoke
pnpm check:env
Database (Neon)
This project uses Neon serverless Postgres with Drizzle ORM.
- Create a free project at neon.tech
- Copy the connection strings into
.env.local:DATABASE_URL- pooled connection stringDATABASE_URL_UNPOOLED- direct connection (used by Drizzle migrations)
- Run migrations:
npx drizzle-kit push
Environment variables
You do not need every external integration to read the code or work on docs and UI.
Typical local development:
NEXT_PUBLIC_SITE_URLNEXT_PUBLIC_MEDIA_BASE_URLBETTER_AUTH_URLBETTER_AUTH_SECRETDATABASE_URL
Needed for specific integrations and production-like flows:
YOUTUBE_API_KEYSPOTIFY_CLIENT_IDSPOTIFY_CLIENT_SECRETAPIFY_TOKENANTHROPIC_API_KEYBREVO_API_KEYCRON_SECRET
Admin access is database-backed. Promote an account to admin with:
pnpm db:seed -- --emails=you@example.com
Notes:
pnpm builduses offline mode for the content pipeline.- Full admin, mail, sync, and deployment flows need real service credentials.
- Keep secrets in
.env.local. Do not commit them.
Contributing
Ideas, bug reports, and small PRs are welcome.
If you want to help, the easiest path is:
- open an issue
- keep the idea or fix small
- explain the problem in plain language
Best ways to help:
- Open an issue for bugs or feature ideas
- Send focused PRs that solve one problem at a time
- Include screenshots when changing UI
- Update docs if behavior changes
See CONTRIBUTING.md for the short version of how this repo is run.
Security
Please do not post security issues publicly. See SECURITY.md.
Deployment
The production app is deployed on Cloudflare Workers via OpenNext. Contributors usually do not need deployment access.
Maintainer deploy command:
pnpm deploy
Project notes
- Spotify can require Extended Quota Mode for some external playlist access.
- The app has manual data fallbacks in
src/data/manual/for cases where API data is limited or unavailable.
License
MIT. See LICENSE.