From Idea to Deployment: My 30-Day Web App Challenge
February 10, 2025
7 min read
From Idea to Deployment: My 30-Day Web App Challenge
Last month, I challenged myself to build and deploy a complete web application in 30 days. The result? FPL Banter - now serving thousands of users daily.
Here's my exact process.
Week 1: Planning & Design (Days 1-7)
Day 1-2: Problem Validation
- Identified pain point: FPL players wanted to share and compare failures
- Surveyed 50 potential users on Reddit r/FantasyPL
- Validated: 78% said they'd use it
Day 3-4: Feature Planning
MVP Features (Must-Have):
- User authentication
- FPL team connection
- Basic banter statistics
- Tournament creation
Nice-to-Have (Post-launch):
- Social sharing
- Advanced analytics
- Mobile app
Day 5-7: Tech Stack Selection
- Frontend: React + Tailwind (fast development)
- Backend: FastAPI (type-safe, fast)
- Database: MongoDB (flexible schema)
- Hosting: Vercel (frontend) + DigitalOcean (backend)
Week 2: Core Development (Days 8-14)
Day 8-10: Authentication
# FastAPI JWT auth from fastapi import Depends, HTTPException from jose import JWTError, jwt def get_current_user(token: str = Depends(oauth2_scheme)): try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) user_id: str = payload.get("sub") if user_id is None: raise credentials_exception except JWTError: raise credentials_exception return user_id
Time saved: Used python-jose library instead of building from scratch
Day 11-12: FPL API Integration
import aiohttp async def fetch_fpl_data(team_id: int): async with aiohttp.ClientSession() as session: async with session.get( f"https://fantasy.premierleague.com/api/entry/{team_id}/" ) as response: return await response.json()
Gotcha: FPL API rate limits. Solved with 5-minute caching.
Day 13-14: Database Models
from pydantic import BaseModel from typing import List class Tournament(BaseModel): id: str name: str commissioner_id: str members: List[str] created_at: datetime
Week 3: Features & Polish (Days 15-21)
Day 15-17: Banter Statistics
Built 8 different stat calculators:
def calculate_benched_beast(team_history): total_benched_points = 0 for gameweek in team_history: bench_points = sum(player.points for player in gameweek.bench) total_benched_points += bench_points return total_benched_points
Day 18-19: UI/UX
- Used Shadcn UI components (saved 3 days)
- Dark mode by default (FPL players love it)
- Mobile-first design
Day 20-21: Testing
import pytest def test_tournament_creation(): response = client.post("/api/tournaments", json={ "name": "Test League", "fpl_league_id": 123456 }) assert response.status_code == 201 assert response.json()["name"] == "Test League"
Week 4: Deployment & Launch (Days 22-30)
Day 22-24: Deployment Setup
Frontend (Vercel):
vercel --prod
Done in 2 minutes!
Backend (DigitalOcean):
FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Day 25-26: Performance Optimization
- Added Redis caching
- Optimized database queries
- Compressed images
- Result: <200ms response times ✅
Day 27: Soft Launch
- Posted on r/FantasyPL
- Shared with Twitter FPL community
- 50 users in first 24 hours!
Day 28-29: Bug Fixes
Real users found issues I missed:
- Rate limiting too aggressive
- Email verification broken on mobile
- Tournament invites not working
Fixed all within 48 hours
Day 30: Official Launch
- Product Hunt launch
- LinkedIn announcement
- Email to beta users
Results: 500+ signups in first week!
Lessons Learned
What Worked ✅
- MVP First: Launched with core features only
- Familiar Stack: Used technologies I knew well
- User Feedback: Involved users from day 1
- Time Boxing: Strict daily goals kept me on track
What I'd Do Differently ❌
- More Testing: Found embarrassing bugs post-launch
- Beta Program: Should have had 20 beta testers, not 5
- Documentation: Wish I'd documented API earlier
- Marketing Plan: Launch day was chaotic
The Tools That Saved Me
- Cursor/VSCode: AI pair programming
- Figma: Quick mockups
- Linear: Task management
- Vercel: Zero-config deployment
- Sentry: Error tracking
Time Breakdown
| Phase | Days | Percentage |
|---|---|---|
| Planning | 7 | 23% |
| Development | 14 | 47% |
| Testing | 3 | 10% |
| Deployment | 3 | 10% |
| Launch | 3 | 10% |
Could You Do It Faster?
Yes, if:
- You use no-code tools (Bubble, Webflow)
- You skip custom features
- You use templates
No, if:
- You want custom functionality
- You're learning new tech
- You have a complex backend
My 30-Day App Checklist
Week 1: Planning
- Validate problem with real users
- Define MVP features
- Choose tech stack
- Set up project structure
Week 2: Core Development
- Authentication system
- Database models
- Core API endpoints
- Basic UI
Week 3: Features
- Main features complete
- UI polished
- Write tests
- Get user feedback
Week 4: Launch
- Deploy to production
- Performance optimization
- Fix critical bugs
- Official launch!
Final Thoughts
30 days is doable, but it's intense. I worked:
- Weekdays: 6-8 hours after work
- Weekends: 10-12 hours
Total: ~200 hours of focused work
Worth it? Absolutely. FPL Banter now has thousands of active users and growing.
Want to try your own 30-day challenge? Start with a problem you're passionate about. The motivation will carry you through the hard days.
Connect with me:
Let's Build Something Great
I'm open to freelance, full-time, or collaboration opportunities.