Back to Portfolio
Python Journey

Learning Python in Public

Coming from a JavaScript background with 8+ years of experience, I started learning Python from scratch — and built two fully deployed, production-grade web applications along the way. This page documents what I built, what I learned, and the stack I used.

2 Products Built
1 Live Deploy
FastAPI Framework
AWS Cloud

From Zero to Production

Started Python

Learned Python syntax, data types, functions, and OOP coming from a JavaScript background.

Learned FastAPI

Picked up FastAPI for building REST APIs — similar to Express.js but with type hints, Pydantic, and automatic docs.

SQLAlchemy & Alembic

Used SQLAlchemy ORM for database models and Alembic for schema migrations — the Python equivalent of Eloquent + migrations.

Docker & CI/CD

Containerized the first app, set up docker-compose for local and production, and automated deployment to AWS EC2 via GitHub Actions.

Built PDF Extractor

Applied Python's ecosystem (pypdf, pandas, openpyxl) to build a real-world document processing tool with admin dashboard.

Product 01

Expense Tracker

A full-stack personal finance manager built with Python & FastAPI. Users can register, log in, and track daily expenses across 7 categories with a Bootstrap 5 admin dashboard showing monthly and yearly statistics. Fully containerized with Docker and deployed live to AWS EC2 via GitHub Actions CI/CD.

Session-based authentication with bcrypt
Dashboard with monthly & yearly stats
Add, Edit, Delete expenses (full CRUD)
7 categories: Food, Transport, Health, Shopping & more
Responsive Bootstrap 5 UI with Jinja2 templates
MySQL 8 database with Pydantic schemas
Docker + docker-compose (local & production)
GitHub Actions: build → push Docker Hub → deploy EC2
Live on AWS EC2 (Ubuntu 24.04, t3.micro)
Python FastAPI MySQL 8 Docker AWS EC2 GitHub Actions Bootstrap 5

CI/CD Pipeline

Push to main
Build Docker image
Push to Docker Hub
SSH into EC2
App goes live!

Infrastructure

  • AWS EC2 — t3.micro (Free Tier)
  • Ubuntu 24.04 LTS
  • Docker v28.2.2
  • docker-compose v5.1.1
  • Port 8000 (public)
Product 02

PDF Link Validator

A document intelligence tool built with Python & FastAPI that uploads PDF files, extracts all URLs and email addresses from page text and clickable annotations, normalizes and compares them, then exports a color-coded Excel report (green = matching, red = not matching). Includes a full admin area with authentication, user management, and category management backed by MySQL and Alembic migrations.

PDF upload & text extraction (pypdf + pdfplumber)
Extracts URLs & emails from raw text via regex
Reads clickable annotation links (/URI) from PDFs
Normalizes & compares extracted vs annotation links
is_matching flag — Yes (green) / No (red) in Excel
Instant .xlsx download with conditional formatting
Admin dashboard — users, categories, PDF history
SQLAlchemy ORM + Alembic schema migrations
Session-based auth with bcrypt password hashing
Python FastAPI MySQL SQLAlchemy Alembic pandas / openpyxl pypdf

How It Works

Upload PDF file
Extract text & annotations
Normalize & compare links
Flag matching / not matching
Download Excel report

Tech Stack

  • FastAPI + Uvicorn
  • pypdf + pdfplumber
  • pandas + openpyxl
  • SQLAlchemy 2.x + Alembic
  • passlib (bcrypt)
  • Jinja2 templates

What I Learned Building in Python

Python Core

Syntax, OOP, type hints, virtual environments, pip, and the Python ecosystem coming from JavaScript.

FastAPI

Route handlers, dependency injection, Pydantic models, request validation, Jinja2 templating, and middleware.

SQLAlchemy & Alembic

ORM models, relationships, sessions, and database migrations — Python's answer to Sequelize migrations.

Document Processing

Extracting structured data from PDFs using pypdf and pdfplumber, regex parsing, and exporting formatted Excel reports.

Docker & DevOps

Dockerfile, multi-service docker-compose, production configs, Docker Hub publishing, and SSH-based EC2 deployment.

CI/CD Automation

GitHub Actions pipeline: automated build, Docker Hub push, SSH into AWS EC2, pull and restart containers on every push.