Daily digest and message backup system
| data | ||
| docs | ||
| memory | ||
| public | ||
| scripts | ||
| src | ||
| supabase | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| eslint.config.mjs | ||
| next.config.ts | ||
| package-lock.json | ||
| package.json | ||
| PODCAST_ARCHITECTURE.md | ||
| PODCAST_SETUP.md | ||
| PODCAST_SUMMARY.md | ||
| postcss.config.mjs | ||
| README.md | ||
| schema.sql | ||
| tsconfig.json | ||
| vercel.json | ||
Daily Digest Blog
Next.js App Router blog with Supabase-backed posts, authenticated admin panel, and MP3 audio hosting.
Run locally
npm install
npm run dev
Dev server runs on http://localhost:3002.
Environment variables
Set these in .env.local:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEY(used by external scripts/tools if needed)CRON_API_KEY
Public vs admin access
- Public blog (
/) is open to everyone. - Reading messages (
GET /api/messages) is public. - Admin UI (
/admin) requires a signed-in Supabase user. - If not signed in,
/adminredirects to/login. - Write APIs (
POST/DELETE /api/messages) require either:- a valid Supabase user bearer token, or
x-api-key: <CRON_API_KEY>(for automation/cron).
Login flow
- Open
/login - Sign in with a Supabase Auth email/password user
- You are redirected to
/admin
Digest automation endpoint
POST /api/digestrequiresx-api-key: <CRON_API_KEY>- Used for cron-based digest publishing
RSS feeds
GET /api/rss- Standard digest RSS feed for blog/article consumersGET /api/podcast/rss- Podcast RSS feed (audio episodes)
MP3 Audio Hosting
Upload and host MP3 files for individual blog posts.
Features
- Upload audio files up to 50MB
- Custom audio player with play/pause, seek, and volume controls
- Audio indicator in admin post list
- Automatic duration estimation
- Stored in Supabase Storage (
podcast-audiobucket)
Usage
- Go to
/adminand log in - Click "Edit" on any post
- Scroll to "Audio Attachment" section
- Upload an MP3 file
- Save changes
API Endpoints
GET /api/audio?postId={id}- Get audio info for a postPOST /api/audio- Upload audio file (requires auth)DELETE /api/audio- Remove audio from post (requires auth)
See docs/MP3_AUDIO_FEATURE.md for full documentation.