You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Port the 2007 Jottit codebase (Python 2, web.py 0.22, Jinja 1, psycopg2 0.6, reCAPTCHA v1) to a modern Python stack and deploy it to Fly.io — as a natural progression of what's here, not a from-scratch rewrite.
Target stack
Python 3.12, Flask + Blueprints with host_matching=True (subdomain routing day 1)
SQLAlchemy Core + Alembic
mistune v3 (markdown) replacing markdown2 1.0
nh3 (HTML sanitizer) replacing the bespoke sanitize.py
Cloudflare Turnstile replacing reCAPTCHA v1
uv + ruff + pyright for tooling
Deployed to Fly.io (Dockerfile + fly.toml + wildcard cert)
Approach
Incremental — one small PR per step, merged to main continuously. Original 2007 code at app.py, db.py, etc. stays as the starting point; new code lands in a jottit/ package alongside.
Milestones
M1: Project skeleton (Flask app, blueprints, DB tables)
Goal
Port the 2007 Jottit codebase (Python 2, web.py 0.22, Jinja 1, psycopg2 0.6, reCAPTCHA v1) to a modern Python stack and deploy it to Fly.io — as a natural progression of what's here, not a from-scratch rewrite.
Target stack
host_matching=True(subdomain routing day 1)sanitize.pyApproach
Incremental — one small PR per step, merged to
maincontinuously. Original 2007 code atapp.py,db.py, etc. stays as the starting point; new code lands in ajottit/package alongside.Milestones
Each PR in this effort links back here.
🤖 Tracked with Claude Code