Project: "Where Has Benny Been?" - Decision History & Milestones
Decision: Build gamified QR code campaign "Where Has Benny Been?"
Rationale: More engaging than traditional "sign up for newsletter" - creates story and interaction
Decision: Use n8n for workflow automation instead of custom code
Decision: Use PostgreSQL as single shared database for all services
Decision: Register mmlnk.us for short URLs
Decision: Create two card types with different behaviors
| Type | Quantity | Behavior | Move Code |
|---|---|---|---|
| Nest Cards | 200-300 | Stationary at venues | No |
| Traveler Cards | 50-100 | Mobile, passed person-to-person | Yes |
Rationale: Nest cards provide consistent local engagement, travelers create viral spread and storytelling opportunities
Decision: Self-host Listmonk instead of using SaaS email provider
Decision: Abandon multi-subdomain approach under mmc.fit
list.mmc.fit - Listmonk UIbenny.mmc.fit - Landing pagemmlnk.us - Short URLsmmlnk.us - Short URLs only (public)mad-monkey-creations.com/benny - Landing page (subpath)hooks.mad-monkey-creations.com - n8n webhooks (internal)mail.mad-monkey-creations.com - Email serverDecision: Use ForwardMail.net instead of Brevo for SMTP relay
| Feature | Brevo | ForwardMail.net |
|---|---|---|
| Free Tier | 300 emails/day | More generous |
| Deliverability | Good | Excellent |
| Setup | Moderate | Simple |
Decision: Host at /benny subpath instead of separate container
Decision: Generate both SVG and PNG formats
Decision: Create distinct back designs for nest vs traveler cards
Discovery: Comcast ISP blocks outbound port 25 (SMTP)
Decision: Accept SMTP relay as permanent solution
Decision: Implement strict data minimization policies
Decision: Multi-layer rate limiting strategy
| Endpoint | Limit | Window | Key |
|---|---|---|---|
| /scan | 10 requests | 1 minute | IP address |
| /entry | 3 submissions | 1 hour | |
| /entry | 1 entry | 30 days | Email + month |
Decision: Six-phase gradual rollout
Decision: Move from multi-server architecture to single Docker host
| Component | Old IP | New Location |
|---|---|---|
| PostgreSQL | 10.0.0.151 | 10.0.0.250:5432 |
| n8n | 10.0.0.198 | 10.0.0.250:5678 |
| Shlink | 10.0.0.152 | 10.0.0.250:8081 |
| Listmonk | 10.0.0.153 | 10.0.0.250:9000 |
| Version | Date | Strategy | Status |
|---|---|---|---|
| V1 | Nov 2024 | Multiple subdomains under mmc.fit (list., benny.) | Abandoned |
| V2 | Dec 10, 2024 | Hybrid: mmlnk.us + mmc.fit subdomains | Abandoned |
| V3 (Current) | Dec 15, 2024 | Two domains: mmlnk.us + mad-monkey-creations.com subpaths | Active |
mmlnk.us → Apex domain for short URLswww.mmlnk.us → Redirects to apexadmin.mmlnk.us → Admin interface (IP-restricted)mad-monkey-creations.com → Main websitewww.mad-monkey-creations.com → Canonical versionmad-monkey-creations.com/benny → Landing pagehooks.mad-monkey-creations.com → n8n webhooksmail.mad-monkey-creations.com → Email serverDecision: All services require SSL/TLS via Let's Encrypt
Decision: IP whitelist for admin endpoints
admin.mmlnk.us/rest → Shlink API (IP-restricted)Decision: Rotate API keys every 90 days
Decision: Daily automated backups with encryption
| Version | Date | Changes | Reason |
|---|---|---|---|
| V1 | Nov 2024 | Single card type, QR + URL only | Initial concept |
| V2 | Dec 5, 2024 | Added move code to all cards | Enable traveler tracking |
| V3 | Dec 10, 2024 | Split into Nest vs Traveler types | Different use cases require different features |
| V4 (Final) | Dec 21, 2024 | Distinct back designs, clear CTAs | Reduce user confusion, improve clarity |
Timeline: December 26, 2024 - January 10, 2025 (estimated)
Status: 35% complete
Timeline: January 11-20, 2025 (estimated)
Timeline: January 21-31, 2025 (estimated)
Timeline: February 1-7, 2025 (estimated)
Timeline: February 8-28, 2025 (estimated)
Scale: 20-50 cards at 10-15 local venues
Timeline: March 1, 2025+ (estimated)
Scale: 200-300 cards across region
Original Plan: Build custom Node.js API with Express
Change: Use n8n for visual workflow automation
Impact: Faster development, easier debugging, more maintainable
Original Plan: list.mmc.fit, benny.mmc.fit, mmlnk.us
Change: mmlnk.us + mad-monkey-creations.com subpaths
Impact: Simplified DNS, better UX, clearer branding
Original Plan: Direct email delivery from self-hosted server
Change: Relay through ForwardMail.net
Impact: Better deliverability, workaround ISP port blocking
Original Plan: One card design for all use cases
Change: Separate designs optimized for stationary vs mobile
Impact: Clearer user instructions, better tracking, richer story
Original Plan: Print 300 cards and deploy all at once
Change: Six-phase gradual rollout starting with 10 test cards
Impact: Lower risk, catch issues early, validate assumptions