A small Go server-rendered app for anonymous community reports on whether a website host is "AI Slop" or "Not Slop".
- Go HTTP server with server-rendered HTML
- Postgres for sites, reports, and precomputed aggregates
- Redis for optional rate limiting
- No frontend build step
Create Postgres and Redis, then copy the environment example and adjust values:
cp .env.example .envApply migrations:
just db-setupRun the app in Docker:
just runRun the app locally without Docker:
just devOpen:
http://localhost:8080
just docker-buildbuilds the app image asslopyard:localjust runorjust docker-runstarts one named app container using.envjust stoporjust docker-stopstops and removes the app containerjust logsorjust docker-logsfollows app container logsjust db-setupcreates the configured local database if missing, then applies migrationsjust devruns setup, then starts the Go server locallyjust migrateorjust db-migrateapplies pending migrationsjust db-resetrolls back all app migrations, then reapplies themjust seedorjust db-seedinserts sample reports through the Go write path
just run does not start Postgres or Redis. It expects your existing services to be reachable from the app container. By default the provided .env.example includes DOCKER_DATABASE_URL and DOCKER_REDIS_URL values that point at host.docker.internal, which is usually what Docker Desktop needs when Postgres and Redis are exposed on your host.
For non-Docker local development, run:
go run ./cmd/slopyardMigrations use golang-migrate. Schema changes live in versioned up and down files under migrations/.
Create future migrations with paired files like:
migrations/000002_add_admin_fields.up.sql
migrations/000002_add_admin_fields.down.sql
DATABASE_URL is required.
SETUP_DATABASE_URL is used only by just db-setup. Set it to a local Postgres role that can create roles and databases. The default local .env uses the current machine user for setup and the slopyard role for the app connection.
REDIS_URL is optional. If it is unset, the app still runs but rate limiting is disabled. In production, set Redis so these rules are enforced:
- Global submissions per fingerprint per minute
- One report per fingerprint per host per 24 hours
Set FINGERPRINT_SECRET to a long random value in any shared environment. The development fallback is intentionally not suitable for production.
If the app runs behind a trusted reverse proxy, set TRUST_PROXY_HEADERS=true so fingerprints use X-Forwarded-For or X-Real-IP.
GET /home, report form, lookup form, recent and trending hostsPOST /reportsubmit a report and redirect to the host pageGET /lookup?input=...normalize and redirect to the host pageGET /site/{host}aggregate host viewGET /healthzhealth check