Inspired by Laurie Hérault's article and Coding With Lewis' YouTube video
- What is FaxMeMaybe?
- Why Is This Over-Engineered?
- Architecture Overview
- Technology Explained (For Beginners)
- Features
- How It Works
- Project Structure
- Configuration
- Usage
- Contributing
- License
- Acknowledgments
FaxMeMaybe is a purposefully over-engineered TODO and reminder system that takes a simple concept, which is "send yourself a reminder", and turns it into a distributed, cloud-native, edge-computing masterpiece that physically prints your TODOs on thermal paper.
Instead of using a simple note-taking app, FaxMeMaybe:
- 📝 Accepts TODOs through a beautiful web interface
- 🌐 Runs on the edge using Cloudflare Workers
- 🎨 Renders tickets using a headless browser (Puppeteer)
- 💾 Stores data in Cloudflare D1 (SQLite at the edge)
- 📤 Sends print jobs to AWS SQS
- 🍓 Polls messages on a Raspberry Pi
- 🖨️ Physically prints your TODO on a thermal printer
This is engineering for the sake of engineering, and I have learned alot from it! 🎉
Because we can! But also because it's a fantastic learning project that demonstrates:
- Modern web development practices
- Cloud infrastructure and edge computing
- Serverless architecture
- Message queue patterns
- Hardware integration
- CI/CD pipelines
- Full-stack development
I did not know most of these technologies before starting this project. By combining them into a single, silly application, I was able to learn how they all work together in a real-world scenario.
┌─────────────────────────────────────────────────────────────────┐
│ USER │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ React Frontend (Vite + TypeScript) │ │
│ │ • shadcn/ui components • Dark/Light mode • QR codes │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Cloudflare Workers (Edge Runtime - Hono) │ │
│ │ • API endpoints • Rate limiting • Authentication │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ D1 Database│ │ R2 Storage │ │ Puppeteer │ │
│ │ (SQLite) │ │ (Tickets) │ │ (Headless) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ AWS SQS │ │
│ │ Message Queue │ │
│ └─────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────┐ │
│ │ Raspberry Pi Client (Python) │ │
│ │ • SQS Polling • Image Download │ │
│ └───────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Thermal Printer │ │
│ │ (USB Device) │ │
│ └─────────────────┘ │
│ │
│ ┌───────────────────────────────────┐ │
│ │ GitHub Actions (CI/CD) │ │
│ │ • Auto-deploy on push │ │
│ └───────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
- ✅ Beautiful, responsive React UI with dark/light mode
- ✅ Real-time TODO submission with validation
- ✅ Importance levels (Low, Medium, High, Urgent, Critical) with 🔥 indicators
- ✅ Optional due dates and sender information
- ✅ Live counter showing total TODOs sent
- ✅ Admin dashboard for managing TODOs
- ✅ Automatic ticket generation with QR codes
- ✅ Printable ticket view optimized for thermal printers
- ✅ QR code leads to ViewTodo page for easy completion tracking
- ✅ Tickets stored as images in R2 storage
- ✅ Access TODO details via QR code or direct link
- ✅ Mark TODOs as complete with one click
- ✅ Beautiful themed UI matching the main app
- ✅ No authentication required (perfect for QR code access)
- ✅ Rate limiting (10 requests per minute)
- ✅ Input validation and sanitization
- ✅ CORS configuration
- ✅ Edge computing for global low latency
- ✅ SQLite database at the edge (D1)
- ✅ Automated deployments via GitHub Actions
- ✅ Automatic server rebuild on code changes
- ✅ SQS message polling on Raspberry Pi
- ✅ Automatic ticket rendering and storage
- ✅ USB thermal printer support
- ✅ Automatic paper size detection
- ✅ Image preprocessing for optimal print quality
- ✅ Error handling and retry logic
- Visit
remind.deadpackets.pw - Fill out the TODO form (importance, message, due date, sender)
- Click "Send TODO"
- The form validates input and sends a POST request to the API
- Cloudflare Worker receives the request
- Rate limiting checks (max 10 per minute)
- TODO is saved to D1 database with a unique UUID
- A headless browser (Puppeteer) renders a ticket page as an image
- The ticket image is uploaded to R2 storage
- A message is sent to AWS SQS with the image URL
- Python client continuously polls SQS for new messages
- When a message arrives, it downloads the ticket image
- The image is preprocessed (resized, converted to 1-bit)
- The USB thermal printer receives the data and prints!
- The printed ticket includes a QR code
- Scanning it opens the ViewTodo page
- User can see full TODO details
- Clicking "Mark as Complete" updates the database
- The TODO is now tracked as done!
FaxMeMaybe/
├── 📂 fax-me-maybe-server/ # Cloudflare Workers backend + React frontend
│ ├── 📂 src/
│ │ ├── 📂 worker/ # Hono backend (TypeScript)
│ │ │ ├── index.ts # Main API routes
│ │ │ ├── rate-limit.ts # Rate limiting middleware
│ │ │ └── api.types.ts # TypeScript type definitions
│ │ ├── 📂 react-app/ # React frontend
│ │ │ ├── App.tsx # Main TODO submission page
│ │ │ ├── AdminDashboard.tsx # Admin panel for managing TODOs
│ │ │ ├── TodoTicket.tsx # Printable ticket view
│ │ │ ├── ViewTodo.tsx # QR code accessible TODO viewer
│ │ │ └── main.tsx # React router setup
│ │ ├── 📂 components/ # shadcn/ui components
│ │ │ └── ui/ # Reusable UI components
│ │ └── 📂 lib/
│ │ └── utils.ts # Utility functions
│ ├── 📂 public/ # Static assets
│ │ ├── og-image.png # OpenGraph preview image
│ │ └── flame.svg # Logo/icon
│ ├── 📂 migrations/ # D1 database migrations
│ ├── package.json # Node.js dependencies
│ ├── wrangler.json # Cloudflare Workers configuration
│ ├── vite.config.ts # Vite build configuration
│ └── tsconfig.json # TypeScript configuration
│
├── 📂 fax-me-maybe-client/ # Raspberry Pi printer client
│ ├── main.py # SQS polling and printer control
│ ├── pyproject.toml # Python dependencies
│ ├── Dockerfile # Container configuration
│ └── docker-compose.yml # Docker Compose setup
│
├── 📂 .github/
│ └── 📂 workflows/ # GitHub Actions CI/CD
│ ├── build-server-on-push.yml # Auto-deploy server
│ └── build-client-on-push.yml # Build client
│
├── LICENSE # MIT License
├── README.md # You are here! 👋
└── TODO.md # Project roadmap
- Node.js 24+ (for the server)
- Python 3.14+ (for the client)
- npm or yarn (package manager)
- Cloudflare account (free tier works!)
- AWS account (for SQS)
- Raspberry Pi (optional, for physical printing)
- USB Thermal Printer (optional)
name: Your worker namecompatibility_date: Cloudflare runtime versionroutes: Custom domain mappingd1_databases: Database bindingr2_buckets: Storage bindingbrowser: Puppeteer browser binding
Edit src/worker/rate-limit.ts:
simple: {
limit: 10, // Max requests
period: 60 // Time window (seconds)
}- Create an SQS queue in AWS Console
- Set visibility timeout to 60 seconds
- Enable server-side encryption (optional)
- Copy the queue URL to
.dev.vars
- Visit your deployed site (e.g.,
remind.deadpackets.pw) - Select importance level (🔥 Low → 🔥🔥🔥🔥🔥 Critical)
- Enter your TODO message (max 64 characters)
- (Optional) Set a due date
- (Optional) Add your name in "From" field
- Click "Send TODO"
- Your TODO is now in the queue!
- Navigate to
/admin - View all pending and completed TODOs
- Filter by completion status
- Mark items as complete/incomplete
- Delete TODOs
- Print a TODO ticket
- Scan the QR code with your phone
- View full TODO details
- Click "Mark as Complete" when done
POST /api/todos # Create new TODO
GET /api/todos/count # Get total TODO count
GET /api/todos/:id # Get TODO by ID
GET /api/todos/:id/complete # Mark TODO as complete
GET /api/todos # List all TODOs
PATCH /api/todos/:id/incomplete # Mark as incomplete
DELETE /api/todos/:id # Delete TODO
Contributions are welcome! This is a learning project, so don't be shy.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Laurie Hérault - Original inspiration from "A receipt printer cured my procrastination"
- Coding With Lewis - YouTube tutorial that sparked the idea
- Cloudflare - For amazing edge computing tools
- python-escpos - For making thermal printer integration easy
- shadcn/ui - For beautiful, accessible components
- The open-source community ❤️
If you found this project helpful or entertaining, give it a ⭐!