Run it on your machine
Local Setup
Uses a fake inbox instead of a real mail provider, so you can try registration and invite flows without owning a domain.
Get the code and create your environment file
# clone and enter the repo git clone https://github.com/pentestguy/scanhive-dashboard.git cd scanhive-dashboard # create the backend environment file cp backend/.env.example backend/.env
No secrets to fill in. DATABASE_URL already points at the postgres service, and SECRET_KEY is generated and persisted automatically on first boot.
Start the stack with the local mail catcher
Mailpit catches every outgoing email locally so nothing ever reaches a real address.
docker compose --profile mail-testing up -d --build
Verify everything is healthy:
docker compose ps
curl http://localhost:8000/health
→ {"database":"Connected","status":"Healthy"}
Don't want email at all? Leave SMTP_HOST blank in backend/.env. Invitations still work — an admin copies the link straight from Settings → Users and shares it manually.
First run
Open http://localhost in a browser.
- Click Create one to register your organization — the account you sign up with becomes its first administrator, and you're signed in immediately.
- Go to Settings → Users → Invite member to invite a teammate. Each invite creates a link at
/accept-invite/:token, valid for 7 days. - Read the caught invite email at
http://localhost:8025— no login needed. The invite API response also includes"email_sent": true, so you know instantly it fired.
Troubleshooting
Port 80 is already in use. Something else on your machine is bound to it. Change the frontend's host-side mapping in docker-compose.yml, e.g. "8080:80", then open http://localhost:8080 instead.
Mailpit's inbox stays empty. Confirm the stack was started with --profile mail-testing, and that SMTP_HOST is exactly mailpit — that's the service name on the Compose network, not localhost or host.docker.internal.