Submit any website and get a brutally honest AI critique of its design, copy, and conversion strategy.
- AI-generated roast posts with scores, sections, pros/cons
- Gallery scrapers (SaaS Landing Page, Landingfolio, Lapa Ninja)
- Bulk URL import
- Admin dashboard with queue management
- Dynamic OG images per roast
- RSS feed (
/api/feed) and sitemap (/api/sitemap) - JSON-LD structured data
- View tracking
- User auth (better-auth) and separate admin auth
- Payments via Lemon Squeezy
- Transactional email via Postmark + React Email
- Screenshot storage on Cloudflare R2
- Filterable categories with sorting
| Framework | Next.js 16 (App Router) |
| Database | PostgreSQL 18 |
| ORM | Drizzle |
| Auth | better-auth |
| Storage | Cloudflare R2 |
| AI | Claude CLI |
| Screenshots | Playwright |
| Postmark + React Email | |
| Payments | Lemon Squeezy |
| CSS | Tailwind 4 |
| Deploy | Docker / Coolify |
docker compose up db -d
npm install
cp .env.example .env # fill in your values
npm run db:push
npm run devApp runs at http://localhost:3000.
| Variable | Required |
|---|---|
DATABASE_URL |
yes |
ADMIN_USERNAME |
yes |
ADMIN_PASSWORD |
yes |
ADMIN_SESSION_SECRET |
yes (min 32 chars) |
BETTER_AUTH_SECRET |
yes (min 32 chars) |
BETTER_AUTH_URL |
yes |
NEXT_PUBLIC_APP_URL |
yes |
NODE_ENV |
no |
R2_ENDPOINT |
for screenshots |
R2_ACCESS_KEY_ID |
for screenshots |
R2_SECRET_ACCESS_KEY |
for screenshots |
R2_BUCKET_NAME |
for screenshots |
R2_PUBLIC_URL |
for screenshots |
POSTMARK_API_KEY |
for email |
POSTMARK_FROM_EMAIL |
for email |
LEMONSQUEEZY_API_KEY |
for payments |
LEMONSQUEEZY_WEBHOOK_SECRET |
for payments |
LEMONSQUEEZY_STORE_ID |
for payments |
Go to /admin/seed, pick a scraper source, set page count, and hit scrape. URLs get added to the queue.
You can also paste URLs (one per line) at /admin/new.
- URL added to queue
- Playwright takes screenshots, uploads to R2
- Claude CLI analyzes screenshots, generates the roast
- Zod validates the output
- Post saved to DB and published
Manage everything from /admin/queue.
- Spin up a Hetzner server (CPX21+, Ubuntu 22.04)
- Install Coolify:
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash - Create a project in Coolify, add Docker Compose resource, connect your repo
- Set env vars in Coolify dashboard (see table above +
POSTGRES_PASSWORD) - Deploy
- Point your domain A record to the server IP. Coolify handles SSL via Let's Encrypt.
src/
actions/ server actions (generate, posts, queue, seed)
app/
admin/ dashboard pages (analytics, health, queue, posts, seed)
api/ auth, feed, sitemap, webhooks
category/ category pages
roast/ individual roast pages
login/ login
register/ register
pricing/ pricing
components/
admin/ admin UI
roast/ roast display
shared/ header, footer, etc.
db/
schema.ts drizzle schema
queries/ query helpers
lib/
auth.ts admin auth
better-auth.ts
env.ts zod env validation
lemonsqueezy.ts
postmark.ts
r2.ts R2 uploads/deletes
score-utils.ts
scrapers/ gallery scrapers
emails/ react email templates
tests/ vitest tests
| Route | Method |
|---|---|
/api/auth/[...all] |
ALL |
/api/auth/admin-login |
POST |
/api/auth/register |
POST |
/api/feed |
GET |
/api/sitemap |
GET |
/api/webhooks/lemonsqueezy |
POST |
Source available, non-commercial. See LICENSE for details. For commercial use, reach out.