From Idea to Deployment: My 30-Day Web App Challenge

February 10, 2025

7 min read

Project ManagementWeb DevelopmentStartupBest Practices

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 ✅

  1. MVP First: Launched with core features only
  2. Familiar Stack: Used technologies I knew well
  3. User Feedback: Involved users from day 1
  4. Time Boxing: Strict daily goals kept me on track

What I'd Do Differently ❌

  1. More Testing: Found embarrassing bugs post-launch
  2. Beta Program: Should have had 20 beta testers, not 5
  3. Documentation: Wish I'd documented API earlier
  4. 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

PhaseDaysPercentage
Planning723%
Development1447%
Testing310%
Deployment310%
Launch310%

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.