Open-source API monitoring & testing platform.
Self-hostable. No limits. Free forever.
Features · Quick Start · Development · Self-Hosting · Contributing
Toastman combines API monitoring (like UptimeRobot) with API testing (like Postman) in a single self-hosted platform. Monitor your endpoints, test your APIs, get instant alerts when things break, and share status pages with your users -- all from one place.
No pricing tiers. No feature gates. No vendor lock-in. Just run docker-compose up and you're done.
- HTTP/HTTPS endpoint checks with configurable intervals (down to 10 seconds)
- Custom headers, body, and authentication per monitor
- Expected status code validation
- Response time tracking with historical graphs
- Rolling uptime percentage (24h, 7d, 30d)
- Automatic UP/DOWN status change detection
- Postman-like request builder (GET, POST, PUT, PATCH, DELETE, HEAD)
- Tabbed interface for headers, body, auth, and params
- JSON, form-data, and raw body types
- Pretty-printed response viewer with status badges
- Server-side proxy to avoid CORS issues
- Environment variables with
{{variable}}substitution
- Organize requests into named collections
- Reusable environments (Development, Staging, Production)
- Variable substitution across URLs, headers, and body
- Email (Resend or SMTP)
- Slack (incoming webhooks)
- Discord (webhooks)
- Webhooks (JSON payloads to any URL)
- 15-minute cooldown to prevent alert storms
- Per-monitor channel configuration
- Custom URL slug (
/status/your-service) - Choose which monitors to display
- Live green/red/gray status indicators
- Rolling 30-day uptime percentages
- No authentication required for viewers
- Platform-wide stats (users, monitors, checks/day, DB size)
- User management (search, disable, delete)
- Full audit log with timestamps and IP addresses
- Brute-force protected with separate passphrase
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router, TypeScript) |
| UI | Tailwind CSS v4 + shadcn/ui |
| Database | PostgreSQL 16 |
| ORM | Prisma v7 |
| Queue | BullMQ + Redis 7 |
| Auth | NextAuth.js v5 |
| Charts | Recharts |
| Container | Docker + docker-compose |
git clone https://github.com/aliacollins/ToastMan.git
cd toastman
cp .env.example .env
# Edit .env — at minimum set JWT_SECRET, NEXTAUTH_SECRET, and ADMIN_SECRET
docker-compose upOpen http://localhost:3000, create an account, and start monitoring.
| Service | Port | Purpose |
|---|---|---|
app |
3000 | Next.js web app |
worker |
— | Background monitor check processor |
postgres |
5432 | PostgreSQL database |
redis |
6379 | BullMQ job queue |
If you want to run locally without Docker:
Prerequisites: Node.js 20+, PostgreSQL 16, Redis 7
# Install dependencies
npm install
# Generate Prisma client
npx prisma generate
# Push schema to database
npx prisma db push
# Seed sample data (optional)
npx tsx prisma/seed.ts
# Start the dev server
npm run devIn a separate terminal, start the background worker:
npx tsx src/worker/index.tsOpen http://localhost:3000. The seed creates a test account: test@example.com / password123.
Copy .env.example and configure:
| Variable | Required | Description |
|---|---|---|
DATABASE_URL |
Yes | PostgreSQL connection string |
JWT_SECRET |
Yes | Random string for JWT signing |
NEXTAUTH_URL |
Yes | Your app URL (e.g. https://monitor.example.com) |
NEXTAUTH_SECRET |
Yes | Random string for NextAuth encryption |
REDIS_URL |
Yes | Redis connection string |
ADMIN_SECRET |
Yes | Passphrase for the admin panel |
RESEND_API_KEY |
No | For email alerts via Resend |
SMTP_HOST |
No | SMTP server for email alerts |
SMTP_PORT |
No | SMTP port (default: 587) |
SMTP_USER |
No | SMTP username |
SMTP_PASS |
No | SMTP password |
ADMIN_ALLOWED_IPS |
No | Comma-separated IP allowlist for admin panel |
NEXT_PUBLIC_APP_URL |
No | Public-facing URL |
- Set strong random values for
JWT_SECRET,NEXTAUTH_SECRET, andADMIN_SECRET - Use
ADMIN_ALLOWED_IPSto restrict admin panel access - Configure at least one alert channel (email or webhook) to get notified of downtime
- The worker runs cleanup daily, keeping 365 days of check history
- Status pages are cached for 30 seconds to handle traffic spikes
git pull
docker-compose build
docker-compose up -dsrc/
├── app/
│ ├── (auth)/ # Login & signup
│ ├── (dashboard)/ # Dashboard pages (monitors, alerts, collections, etc.)
│ ├── admin/ # Admin panel
│ ├── api/ # API routes
│ └── status/[slug]/ # Public status pages
├── components/ # React components (shadcn/ui + custom)
├── lib/ # Core logic (auth, plans, validators, alerts)
└── worker/ # Background job processor
Contributions are welcome! Feel free to open issues and pull requests.
- Fork the repository
- Create a feature branch (
git checkout -b feature/your-feature) - Make your changes
- Run the dev server and verify everything works
- Commit and push
- Open a pull request