Waffle — The Waffle Maker
Dead-simple, lightning-fast live spot management for Instagram waffle drops.
Waffle is the production-ready tool in the Project Syrup family. No timers. No randomizers. No payment processing. Just a clean, real-time board where buyers claim spots and admins track payments — built to run inside Instagram's in-app browser, where your buyers already are.
Getting Started
Run the app locally in under five minutes with Docker Compose.
Admin Manual
Complete guide to running waffles, managing spots, admins, and reports.
Deployment
Production setup with Docker Compose, Railway, Render, or Fly.io.
API Reference
All public and admin HTTP endpoints with descriptions.
What is a waffle?
A waffle is a raffle-style drop popular on Instagram. A seller creates a listing with a fixed number of numbered spots at a set price. Buyers claim spots by entering their Instagram handle. The seller collects payments out-of-band (DM, CashApp, Venmo), then draws a winner from the paid spots.
Waffle replaces the copy-paste spot lists, frantic DM management, and manual tracking that sellers previously did by hand — with a real-time, mobile-first web app that works right inside Instagram's browser.
Project Syrup context
Waffle is one of two apps under the Project Syrup umbrella:
| App | Status | What it does |
|---|---|---|
| Waffle — The Waffle Maker | Stable | Production-ready live spot management for Instagram waffle drops. This wiki. |
| Wafflerace | Experimental | Animated waffle boat race tool for dramatic, high-suspense random selection. |
Both apps are open source under MIT and self-hosted via Docker. This wiki covers Waffle only.
How it works
- Admin creates a waffle — sets title, price per spot, total spots, and links to Instagram posts showing the item.
- Buyers claim spots — tap available spots, enter their Instagram handle. Done in under 10 seconds, on mobile, inside the IG app.
- Admin marks paid — as payments arrive via DM, CashApp, or Venmo, the admin marks each spot paid from the manage view.
- Winner drawn — admin enters the winning spot number after an external drawing.
- Everyone sees results — a WebSocket broadcast updates all connected clients instantly. No refresh needed.
Tech Stack
| Layer | Technology |
|---|---|
| Frontend | Go server-side templates + Tailwind CSS + DaisyUI (syrup theme) |
| Backend | Go (Gin framework) + WebSocket hub |
| Database | PostgreSQL 16 with auto-run migrations (pgx driver) |
| DevOps | Docker Compose, multi-stage builds, GHCR image registry |
| PWA | Web App Manifest, service worker, offline caching, installable |
| Security | JWT auth, bcrypt passwords, rate limiting, brute-force lockout, audit log |
Project Status
| Phase | Status | Description |
|---|---|---|
| 1–6 | ✅ | Core waffle CRUD, spot claims, WebSocket live updates, admin dashboard, buyer stats, mobile polish |
| 7 | ✅ | Multi-admin RBAC (super_admin / admin / waffle_manager), password reset, admin management |
| 8 | ✅ | PWA service worker, offline caching, installable app shell |
| 9 | ✅ | DaisyUI migration — syrup/Halloween theme, amber primary palette |
| 10 | ✅ | Production hardening — structured logging, health probes, rate limiting, graceful shutdown |
| 11 | ✅ | Security polish — full audit log, bcrypt password policy, login lockout, destructive confirmations |
| 12 | ✅ | Bugfix release — archived filters, buyer stats recalculation, password reset, accessibility |
| 13 | ✅ | Users registry with backfill, duplicate lockout fix |
Quick Links
- projectsyrup.app — Project Syrup home
- github.com/notfixingit3/waffle — Source code
- Releases — all version tags
- GHCR image — Docker pulls
- Changelog — full version history