First Steps
What to do after the dev server is running — create your admin, rebrand, publish your first batch.
Now that your local dev runs at http://localhost:3000, here's what to do before sharing your instance with anyone.
1. Create your admin account
If you ran bun run setup, its final output walks you through this. Summary:
- Sign up at
/sign-upwith your email - Verify your email — without Plunk configured, the link is printed to your
bun devterminal: Copy it into your browser. Once Plunk is configured, real emails are sent.[Email] Plunk not configured — verification link for [email protected]: http://localhost:3000/api/auth/verify-email?token=... - Promote yourself with the helper script:
The script setsbun run promote-admin [email protected]role = 'admin'and revokes your active sessions so the role change picks up immediately. - Sign out, then sign in again → the
/adminlink appears in the header.
Alternative: open Drizzle Studio (
bun run db:studio), find your row inuser, changeroletoadmin. You still need to sign out + back in (Better Auth caches the session role for 5 min).
2. Rebrand
Everything rebrandable lives under /admin/settings. Changes apply instantly (no redeploy).
Minimum checklist:
| Setting | Group |
|---|---|
site_name | general |
site_tagline | general |
site_description | general |
contact_email | general |
font_sans, font_serif | appearance |
launch_day, launch_hour_utc | schedule |
boost_price_cents, highlight_price_cents | pricing |
Replace public/logo.webp and public/logo-dark.webp with your own.
See the full settings reference for all 28 keys.
3. Seed demo content (optional)
If you want something to look at while developing:
bun scripts/seed-products.tsInserts a batch with 9 demo products. You can delete them later from /admin/products.
4. Submit your first real product
/submit while logged in. The submission lands in /admin/submissions with status pending. Accept it there to schedule it to the next batch.
Paid tiers (Boost / Highlight) require Stripe — skip for now and test with free tier.
5. Trigger the weekly batch locally
You don't need to wait for a real cron. Hit the endpoint with curl:
curl -X POST \
-H "Authorization: Bearer $CRON_SECRET" \
http://localhost:3000/api/cron/weekly-batchMake sure CRON_SECRET is set in your .env first. The call will:
- Create a batch for the current ISO week
- Publish your accepted submissions into it
- Set dofollow flags
- Create and send a Plunk campaign (if Plunk is configured)
- Revalidate
/and/batches
Or use the in-memory simulation:
bun scripts/simulate-crons.tsThis is a dry-run that doesn't actually mutate the database or send emails.
6. Verify everything works
- Homepage shows the new batch
- Each product has its thumbnail
- Voting works
- Commenting works (sign in as a second user to test)
-
/admin/contentshows the calendar view - Dofollow check: view source on a product link from a Boost/Highlight submission — should NOT have
rel="nofollow"
What to configure next
Start with the integrations that match your goals:
| Goal | Integration |
|---|---|
| Real email verification + welcome emails | Plunk |
| Google / GitHub login | Better Auth OAuth |
| Accept payments for Boost / Highlight / sponsors | Stripe |
| Move uploads off disk for prod | R2 Storage |
| Rate limit in prod | Redis |
| Admin alerts on new signups / submissions | Discord |
| Bot-proof sign-up | Turnstile |
Then pick a deployment path (Vercel or self-hosted).