Paste a URL. 12 AI personas stress-test your site in 60 seconds. Get a scored report with exactly what to fix.
We ship fast. But who's actually testing? trashmy.tech lets you paste any URL and instantly see how real users would experience it — accessibility issues, broken flows, SEO gaps, security holes, and content problems.
One free analysis per visitor. $5 one-time payment for unlimited.
- Paste a URL, click "Trash It"
- 12 AI personas launch in parallel — each a real Playwright browser instance. A blind user on a screen reader. A skeptic looking for trust signals. Googlebot checking crawlability. A chaos agent breaking forms.
- Scoring engine calculates a deterministic 0-100 score across 6 categories
- Report generates with annotated screenshots, ranked fixes, and a copy-paste prompt for ChatGPT/Claude to implement the fixes
Results are deterministic — same site always gets the same score. Reports are cached for 7 days.
- 40 persona types across 7 categories: accessibility, demographic, security, usability, chaos, content/SEO
- 6-category scoring: Accessibility (25%), SEO (20%), Performance (20%), Content (15%), Security (10%), UX (10%)
- Hard caps: No HTTPS = max 40/100. Critical a11y failure = max 50 accessibility score
- Lite mode: Near-zero API cost using only free checks (SSL, DNS, robots.txt, axe-core)
- Full mode: Google PageSpeed, Mozilla Observatory, Safe Browsing integration
- Real-time streaming: WebSocket updates as agents crawl, test, and find issues
- Auth + payments: NextAuth.js (Google OAuth), Stripe ($5 one-time)
- Caching: Redis + PostgreSQL, 7-day TTL, domain normalization for deterministic results
| Layer | Tech |
|---|---|
| Frontend | Next.js 16, React 19, Tailwind CSS v4, Framer Motion, Three.js, Recharts |
| Backend | FastAPI, WebSockets, asyncio |
| Browser agents | Playwright (local or Modal for scaling) |
| AI | Gemini 2.0 Flash (personas, report generation) |
| Accessibility | axe-core |
| Auth | NextAuth.js, JWT, Google OAuth |
| Payments | Stripe (one-time $5) |
| Database | PostgreSQL (Supabase/Neon), Redis (Upstash) |
| Deploy | Vercel (frontend), Render/Railway (backend) |
- Node.js 18+
- Python 3.11+
- A Gemini API key
git clone https://github.com/pranjalbhatia710/trashmytech.git
cd trashmytech
# Frontend
npm install
# Backend
cd backend
pip install -r requirements.txt
playwright install chromiumBackend — create backend/.env:
GEMINI_API_KEY=your-gemini-key
ANALYSIS_MODE=lite
HEADLESS=true
AGENT_COUNT=12
# Optional (for persistence):
# DATABASE_URL=postgresql://user:pass@host:5432/trashmytech
# REDIS_URL=redis://default:token@host:6379
# Optional (for auth):
# JWT_SECRET=your-random-secret
# STRIPE_SECRET_KEY=sk_test_...
# STRIPE_WEBHOOK_SECRET=whsec_...
# STRIPE_PRICE_ID=price_...Frontend — create .env.local:
NEXT_PUBLIC_API_URL=http://localhost:8000
# Optional (for auth):
# NEXTAUTH_URL=http://localhost:3000
# NEXTAUTH_SECRET=your-random-secret
# GOOGLE_CLIENT_ID=your-google-client-id
# GOOGLE_CLIENT_SECRET=your-google-client-secret
# NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...# Terminal 1 — Backend
cd backend
uvicorn main:app --reload --port 8000
# Terminal 2 — Frontend
npm run devOpen http://localhost:3000, paste a URL, hit Trash It.
Only GEMINI_API_KEY is required. Everything else (database, Redis, auth, Stripe) is optional and degrades gracefully — the app works without them.
┌─────────────────────────────────────────────────────┐
│ Browser (localhost:3000) │
│ Next.js + React + Tailwind + Framer Motion │
└──────────┬──────────────────────────────┬───────────┘
│ REST │ WebSocket
▼ ▼
┌─────────────────────────────────────────────────────┐
│ FastAPI Backend (localhost:8000) │
│ │
│ POST /v1/tests → create analysis │
│ WS /ws/{test_id} → stream live progress │
│ GET /v1/tests/{id} → get results │
│ GET /v1/recent → recently analyzed sites │
│ │
│ Pipeline: │
│ ┌──────────┐ ┌──────────┐ ┌────────┐ ┌───────┐ │
│ │ 1. Crawl │→ │ 2. Swarm │→ │3.Score │→ │4.Save │ │
│ │Playwright│ │12 agents │ │ Pure │ │PG+Redis│ │
│ │ axe-core │ │ Gemini │ │functions│ │ │ │
│ └──────────┘ └──────────┘ └────────┘ └───────┘ │
│ │
│ External APIs (full mode only): │
│ PageSpeed · Observatory · Safe Browsing · SSL · DNS │
└─────────────────────────────────────────────────────┘
| Mode | Cost | What runs | Use case |
|---|---|---|---|
lite |
~$0.01/analysis | Playwright + axe-core + Gemini Flash + free checks (SSL, DNS, robots.txt) | Development, demos |
full |
~$0.05/analysis | Everything above + Google PageSpeed + Mozilla Observatory + Safe Browsing | Production |
Set via ANALYSIS_MODE=lite or ANALYSIS_MODE=full in backend/.env.
All scores are deterministic — pure functions, no AI calls, no randomness. Same input = same output.
| Category | Weight | Data sources |
|---|---|---|
| Accessibility | 25% | axe-core violations, Lighthouse a11y, persona testing |
| SEO | 20% | Meta tags, structured data, robots.txt, sitemap, AI bot access |
| Performance | 20% | PageSpeed (full) or agent-measured load times (lite) |
| Content | 15% | Readability, trust signals, value proposition clarity |
| Security | 10% | SSL, DNS, headers, Observatory (full), HTTPS check |
| UX | 10% | Persona task completion, mobile testing, form usability |
Hard caps:
- Site flagged by Safe Browsing → overall max 15
- No HTTPS → overall max 40
- Critical accessibility failure → accessibility max 50
Push to GitHub. Vercel auto-deploys from main branch. Set env var:
NEXT_PUBLIC_API_URL=https://your-backend-url.onrender.com
- New Web Service → connect GitHub repo
- Root directory:
backend - Runtime: Docker
- Add env vars:
GEMINI_API_KEY,HEADLESS=true,ANALYSIS_MODE=lite,AGENT_COUNT=12
Free tier (500MB). Set DATABASE_URL on Render. Migrations run automatically on startup.
Free tier (10K commands/day). Set REDIS_URL on Render.
| Endpoint | Method | Description |
|---|---|---|
/v1/tests |
POST | Create analysis {"url": "...", "mode": "standard"} |
/ws/{test_id} |
WS | Stream live progress |
/v1/tests/{test_id} |
GET | Get test status + report |
/v1/tests/{test_id}/report |
GET | Get report only |
/v1/recent?limit=6 |
GET | Recently analyzed sites |
/v1/stats |
GET | Aggregate stats |
/v1/health |
GET | Health check |
/v1/auth/register |
POST | Register (email/password) |
/v1/auth/login |
POST | Login, returns JWT |
/v1/auth/me |
GET | Current user (requires JWT) |
trashmytech/
├── app/ # Next.js pages
│ ├── page.tsx # Landing page
│ ├── test/[id]/page.tsx # Live dashboard + report
│ ├── api/auth/ # NextAuth routes
│ └── api/stripe/ # Stripe checkout + webhook
├── components/ # React components
│ ├── url-input.tsx # URL input with validation
│ ├── auth-modal.tsx # Auth + payment modal
│ └── ui/ # Score gauge, toast, counters
├── lib/ # Config, auth helpers
├── backend/
│ ├── main.py # FastAPI + WebSocket orchestration
│ ├── pipeline.py # 4-phase pipeline (crawl→swarm→score→persist)
│ ├── agent.py # Gemini-powered persona engine
│ ├── scoring.py # Deterministic scoring (pure functions)
│ ├── report.py # Report generation
│ ├── personas.py # 35 base personas
│ ├── personas_content_seo.py # 5 content/SEO personas
│ ├── crawler.py # Playwright + axe-core
│ ├── external_apis.py # PageSpeed, Observatory, etc.
│ ├── analysis_lite.py # Lite mode config
│ ├── quick_wins.py # Fix recommendations
│ ├── auth/ # User auth + Stripe webhooks
│ ├── db/ # PostgreSQL schema + queries
│ ├── cache/ # Redis caching layer
│ └── services/ # Persistence service
└── render.yaml # Render deployment config
Solo project. Started 15 hours into the hackathon after the original team dropped out. Won first place.
MIT