🧭 Unity of Knowledge & Action AI Lab

A personal AI-app lab I built from scratch with AI, exploring the boundaries of what AI applications can do. Full content needs a login — this is the public dev changelog.

Log in

How this site gets built

🤖 AI development mode (how this site actually works)
💬
Chat with Claude
about what to build
🤖
Claude Code
writes the code
🐙
Push to
GitHub
🚂
Railway
auto-deploys
Update
goes live
⏱ Idea to live: minutes to hours
🧑‍💻 Traditional dev mode (for comparison)
📋
Write a spec
doc
🧑‍💻
Engineer
hand-writes code
🧪
Write tests
run tests
👀
Code
Review
🔄
CI/CD
auto-deploy
Ship
⏱ Same idea to live: usually days to weeks

Not a single line hand-written by me — I just describe what I want and review the result; every change is logged in detail below.Source on GitHub →

What the Site Can Do

📈

Trading P&L

Import broker exports and get an auto-generated daily P&L calendar, a cumulative equity curve, and fees broken out separately.

Take a look →
💰

Expense Tracking

Upload a bank statement PDF and it's parsed automatically into a spending calendar, income/expense breakdown, and a top-merchants ranking.

Take a look →
📖

Novel Writing

Write and publish novels chapter by chapter, with characters and video, right from the browser -- readers follow along on the same site.

Take a look →
🗺️

Routes

Hand-draw a route on a real map, or just type place names and have them connected automatically -- save it and share the link whenever you're ready.

Take a look →
📝

Life Moments

Log day-to-day life -- books, shows, workouts, thoughts -- or just hand a screenshot to AI and let it fill the entry in for you.

Take a look →

Technical architecture

🖥️📱 Browser / mobile PWA HTTPS 🌍 Railway edge CDN Global edge nodes, caches images/static assets Cache miss / dynamic request → forwarded to origin 🐳 Origin container · Railway (Singapore) gunicorn: 1 process + 4 threads, shared in-memory state ⚙️ Flask app (app.py) 🔐 Routing + login auth 🧩 Jinja2 server-side rendering 🖼️ Pillow images / ffmpeg video processing 🗜️ Gzip / Brotli compression 📊 Request latency stats 💾 Persistent storage Railway Volume · /data • tracker.db (book/show, moments, novel data) • uploads/ (photos uploaded in moments) • novel_media/ (novel covers / character art / videos) • cover_cache/ (Douban cover cache) 🔌 External services Outbound requests at runtime • Douban page scraping + cover proxy • Claude API (AI screenshot recognition, optional)

The backend is a Flask + SQLite monolith with no separate frontend build — pages are server-rendered directly with Jinja2, run with gunicorn (1 process, 4 threads) in a Docker container in Railway's Singapore region. Images go through Pillow (share cards, upload compression), video through ffmpeg (compression, thumbnail extraction). The database, user photos, novel covers/character art/videos, and the Douban cover cache all live on a Railway persistent volume; images and static assets are cached at the CDN edge. Douban book/show info comes from scraping their pages; AI screenshot recognition calls Anthropic's Claude API.

Changelog

A record of this site's development from scratch to now (screenshots are freshly regenerated to reflect the current UI, not the original at the time of each change).

SepOctNovDecJanFebMarAprMayJunJulAugSep
22 active days in the past year, 147 updates, ~17374 lines of code changed

Code volume: entries from before this session (marked "estimated") are rough figures reconstructed in hindsight; every entry from this one onward is measured precisely at the time of the change.

2026-09-13

1 updates · ~47 lines that day
  • Route maps in novel chapters now always sit at the top

    +47 lines

    The route outline map embedded in a travelogue chapter used to follow the text -- it appeared right after the paragraph that mentioned the route's title, or got tucked into a small card at the very end of the article if the title never came up. It now always shows at the very top of the chapter regardless of whether the text mentions it -- right under the chapter title, ahead of even the share/read-aloud buttons -- on both the live page and the generated share image. Character standees keep their original mention-triggered behavior; only routes changed.