Clone
Feature Plan: QRurl MVP Implementation
Status: Planning Created: 2025-08-22 Author: Claude
Overview
Building a serverless URL shortener with QR code generation capabilities using Cloudflare Workers, D1 database, and R2 storage. The MVP will include magic link authentication, custom branded QR codes, basic analytics, and a simple management interface.
Requirements
- URL shortening with custom slugs
- QR code generation with logo embedding
- Magic link authentication (passwordless)
- Email whitelist for access control
- Basic analytics tracking (clicks, referrers, geographic data)
- Admin interface for managing links
- Serverless deployment on Cloudflare Workers
Technical Approach
Leverage Cloudflare's edge infrastructure for global low-latency redirects. Use D1 for data persistence, R2 for image/QR storage, and Workers for all compute. Frontend will be a SPA served from Workers or Pages.
Architecture Decisions
- Cloudflare Workers: Chosen for edge performance and cost-efficiency
- D1 Database: SQLite-based, perfect for read-heavy workloads
- R2 Storage: Cost-effective object storage for QR codes and logos
- Magic Links: Simpler than password management, better UX
- QR with High Error Correction: Allows 30% obstruction for logo overlay
Implementation Tasks
Phase 1: Foundation (Week 1)
- Initialize Cloudflare Workers project with Wrangler
- Set up development environment and local testing
- Create D1 database and implement schema
- Configure R2 bucket for storage
- Set up basic routing structure
- Implement health check endpoint
- Configure environment variables and secrets
Phase 2: Core URL Functionality (Week 1-2)
- Implement slug generation (nanoid with custom alphabet)
- Create URL entry CRUD operations
- Build redirect handler with analytics capture
- Add URL validation and sanitization
- Implement slug collision handling
- Create basic rate limiting
- Write unit tests for URL operations
Phase 3: Authentication System (Week 2)
- Design magic link token generation
- Create email whitelist management
- Implement token storage with expiry (15 min)
- Build email sending integration (Resend/SendGrid)
- Create JWT session management
- Add authentication middleware
- Implement logout functionality
- Write auth system tests
Phase 4: QR Code Generation (Week 3)
- Research and select QR library for Workers
- Implement basic QR code generation
- Add logo overlay functionality (max 30% area)
- Create QR caching strategy in R2
- Build image upload and processing
- Implement logo resizing (128x128 standard)
- Add QR customization options (colors, margins)
- Test QR scanning reliability with logos
Phase 5: Analytics & Tracking (Week 3-4)
- Design analytics data model
- Implement click tracking
- Add geographic detection via CF headers
- Create user agent parsing
- Build referrer tracking
- Implement analytics aggregation
- Add batch write optimization
- Create analytics API endpoints
Phase 6: Frontend Interface (Week 4-5)
- Set up frontend framework (React/Vue)
- Create authentication flow UI
- Build link management dashboard
- Implement QR code preview
- Add analytics visualization
- Create link creation form
- Build responsive mobile interface
- Add dark mode support
Phase 7: Polish & Optimization (Week 5-6)
- Implement comprehensive error handling
- Add input validation across all endpoints
- Set up monitoring and alerting
- Optimize database queries
- Implement caching strategy
- Add security headers
- Create API documentation
- Write deployment scripts
Files to Create/Modify
Project Structure
/
├── wrangler.toml # Workers configuration
├── package.json # Dependencies
├── src/
│ ├── index.js # Main worker entry
│ ├── routes/
│ │ ├── auth.js # Authentication endpoints
│ │ ├── api.js # API routes
│ │ └── redirect.js # Redirect handler
│ ├── lib/
│ │ ├── db.js # Database operations
│ │ ├── qr.js # QR generation
│ │ ├── email.js # Email service
│ │ └── analytics.js # Analytics tracking
│ ├── middleware/
│ │ ├── auth.js # Auth middleware
│ │ └── rateLimit.js # Rate limiting
│ └── utils/
│ ├── slug.js # Slug generation
│ └── validation.js # Input validation
├── schema/
│ └── schema.sql # D1 database schema
├── frontend/
│ ├── src/ # Frontend application
│ └── public/ # Static assets
└── tests/
├── unit/ # Unit tests
└── integration/ # Integration tests
Testing Strategy
Unit Tests
- Slug generation uniqueness and format
- URL validation and sanitization
- Token generation and expiry
- QR code generation with various inputs
- Analytics data aggregation
Integration Tests
- Full authentication flow
- URL creation → redirect → analytics
- QR generation with logo upload
- Rate limiting behavior
- Email delivery
Performance Tests
- Redirect latency under load
- QR generation performance
- Database query optimization
- Concurrent user handling
Edge Cases & Error Handling
- Duplicate slugs: Retry with different random slug or return error
- Invalid URLs: Validate protocol, prevent javascript: and data: URIs
- Large logo files: Resize before storage, reject if > 5MB
- Email delivery failure: Queue for retry, provide alternate auth method
- Rate limit exceeded: Return 429 with retry-after header
- Database connection issues: Implement circuit breaker pattern
- QR generation timeout: Pre-generate and cache popular QRs
Security Considerations
- Input sanitization for all user inputs
- CSRF protection on state-changing operations
- Secure random token generation (crypto.getRandomValues)
- Content Security Policy headers
- SQL injection prevention via parameterized queries
- XSS prevention in frontend
- Rate limiting per IP and per user
- Secure cookie settings (httpOnly, secure, sameSite)
Performance Targets
- Redirect latency: < 50ms globally
- QR generation: < 500ms with logo
- API response time: < 200ms
- Time to interactive (frontend): < 2s
- Database queries: < 10ms for reads
Cost Estimation
- Workers: ~$5/month (10M requests)
- D1: Free tier (5GB, 500M reads)
- R2: Free tier (10GB storage)
- Email service: ~$10/month (Resend starter)
- Total: ~$15/month for moderate usage
Open Questions
- Should we support custom domains for branded short links?
- How should we handle GDPR/privacy for analytics?
- Should QR codes support dynamic content updates?
- Do we need bulk import/export functionality?
- Should we add team/organization support later?
Future Considerations
- Custom domain support for enterprise users
- API access for programmatic link creation
- Webhook support for analytics events
- A/B testing for destination URLs
- Link expiration and scheduling
- Password-protected links
- Browser extension for quick shortening
- Mobile app for QR scanning and management
Documentation Plan
After implementation, create dev/docs/20250822-qrurl-mvp.md with:
- System architecture overview
- API documentation with examples
- Deployment guide
- Configuration options
- Troubleshooting common issues
- Performance tuning guide
- Security best practices
Success Metrics
- Successfully deploy to production
- Handle 1000+ redirects/day without issues
- Generate QR codes with logos that scan reliably
- Achieve < 50ms redirect latency globally
- Pass security audit
- Complete implementation within 6 weeks
Next Steps
- Review and approve this plan
- Set up Cloudflare account and services
- Initialize project repository
- Begin Phase 1 implementation
- Set up CI/CD pipeline