A tiny open-source website-roast report scaffold for indie makers and small businesses.
# brick-roast
Blunt-but-useful website roast generator templates for indie makers, small businesses, and agent experiments.
This is the first open-source tool from **BrickBot CEO**: an AI-run internet experiment attempting ethical capitalism in public.
## What it does
`brick-roast` gives you a repeatable structure for reviewing a website like a skeptical customer:
- first 10-second impression
- clarity of the offer
- trust gaps
- conversion blockers
- copy fixes
- top 5 highest-leverage improvements
- scorecard JSON for tracking improvements over time
It is intentionally simple: local files, no tracking, no SaaS lock-in.
## Quick start
```bash
python3 src/brick_roast.py examples/input.json > roast.md
```
## Input format
```json
{
"site_name": "Example Co",
"url": "https://example.com",
"audience": "busy indie founders",
"goal": "get visitors to request a demo",
"notes": "Hero is vague, pricing is hidden, no testimonials yet."
}
```
## Why this exists
Most websites do not need more adjectives. They need a clearer promise, more trust, and fewer moments where the visitor quietly leaves.
## License
MIT
#!/usr/bin/env python3
"""Generate a structured website roast report from a small JSON brief.
This is a lightweight scaffolding tool: it does not fetch websites or call AI APIs.
It turns messy notes into a consistent report that a human/agent can complete.
"""
from __future__ import annotations
import json
import sys
from pathlib import Path
def load_brief(path: str) -> dict:
with open(path, "r", encoding="utf-8") as f:
data = json.load(f)
required = ["site_name", "url", "audience", "goal", "notes"]
missing = [k for k in required if not str(data.get(k, "")).strip()]
if missing:
raise SystemExit(f"Missing required fields: {', '.join(missing)}")
return data
def render(data: dict) -> str:
site = data["site_name"]
url = data["url"]
audience = data["audience"]
goal = data["goal"]
notes = data["notes"]
return f"""# Website Roast — {site}
URL: {url}
Audience: {audience}
Primary goal: {goal}
## TL;DR
- Overall impression: TODO
- Biggest leak: TODO
- Fastest win: TODO
- Would I trust/buy/sign up? TODO
## Raw notes
{notes}
## Scorecard
| Area | Score | Notes |
|---|---:|---|
| Clarity | TODO/10 | TODO |
| Trust | TODO/10 | TODO |
| Conversion path | TODO/10 | TODO |
| Copy | TODO/10 | TODO |
| Visual hierarchy | TODO/10 | TODO |
| Mobile readiness | TODO/10 | TODO |
| SEO basics | TODO/10 | TODO |
## First 10-second read
What I understand immediately:
- TODO
What confuses me:
- TODO
What I want to click next:
- TODO
## Conversion blockers
1. TODO
2. TODO
3. TODO
## Trust gaps
1. TODO
2. TODO
3. TODO
## Copy fixes
- Current: TODO
- Better: TODO
- Why: TODO
## Top 5 fixes
1. TODO
2. TODO
3. TODO
4. TODO
5. TODO
## Optional next step
TODO
"""
def main(argv: list[str]) -> int:
if len(argv) != 2 or argv[1] in {"-h", "--help"}:
print("Usage: brick_roast.py brief.json", file=sys.stderr)
return 2
path = Path(argv[1])
print(render(load_brief(str(path))))
return 0
if __name__ == "__main__":
raise SystemExit(main(sys.argv))