Independent Developer · Taichung
Five apps on the App Store.
And fifteen more sites and services still running today.
Third-year Photonics student at Feng Chia University, not a CS major. Here is what I actually finished and handed over — including one product I shut down myself.
- iOS apps shipped
- 5
- sites and services running
- 15
- security defects fixed in production
- 2
What I've Built
The five apps ship under my own company account, Gomiigo Games (legal entity: Tuthome Co., Ltd.); I built each of them end to end. Every site and service below runs on a single Linux server I administer myself.
ShippedHavenCircle
Turns roughly 10 government and news sources into disaster alerts that only fire when the event is actually near someone you care about.
Most alert apps don't fail by missing events — they fail by firing so often that people mute them. This one deduplicates incoming events, scores them across three trust tiers, and notifies only when an event intersects a user-defined life circle: family members and places, each with a radius and time window. Home addresses are stored with AES-GCM encryption, and the home-screen widget reads only App Group snapshots, never location data.
- days to submission
- 19
- lines of Swift
- 20,867
- data sources
- ~10
- Swift
- SwiftUI
- SwiftData
- MapKit
- WidgetKit
- Firebase
- APNs
ShippedGridDay
Lays today out as a 3×3 grid — finish something, light up a cell. Zero to submission in eight days.
Built on a custom UI component system rather than the stock List and TabView. Its seven locales — 871 strings — are assembled by three scripts instead of hand-copied, and the store listing, review information, and 84 localized screenshots are all uploaded through the App Store Connect API.
- days, zero to submission
- 8
- UI tests
- 40
- languages
- 7
- Swift
- SwiftUI
- SwiftData
- XCUITest
- App Store Connect API
LiveWanQu Game Box
A free browser-game site I built, filled with games I also built.
The platform itself is Next.js, but the games are where the time went: four different technical routes — Godot, Phaser 3, React, and raw Canvas — because I wanted to know what the same kind of gameplay actually costs in each engine. One of them was ported wholesale from Godot to Phaser, and that port became a reusable process I've since followed again.
- games
- 12
- game engines
- 4
- game slots
- 13
- Next.js 14
- Prisma
- Godot
- Phaser 3
- TypeScript
- Canvas
OngoingEducation Platform Audit & Fixes
Worked inside a live Next.js + Supabase platform as a contractor; found and fixed two security defects.
Not a greenfield build — this meant working inside someone else's codebase with real users already on it. The two defects were a privilege-escalation path in the multi-role permission model, and a cross-tenant data exposure. Everything shipped as reviewed pull requests against a Postgres schema governed by row-level security policies. The client is not named here by agreement.
- security defects fixed
- 2
- commits delivered
- 54
- database migrations
- 44
- TypeScript
- Next.js
- React
- Supabase
- PostgreSQL
- RLS
OngoingDevelopment System
A set of working rules I wrote for myself: how work gets dispatched, how it gets verified, and how each mistake becomes a rule.
The core rule is one line: whoever produces the work never verifies it. When something is finished, I open a fresh session with no memory of how it was done, and it can return only three answers — pass, fail with evidence, or cannot verify. Alongside it sits a 34-entry log of things that went wrong over ten months, each rewritten as a rule that applies to later work.
- reusable skills
- 126
- postmortem entries
- 34
- of cost sat in the main session, across 170 measured
- 88%
- Claude Code
- Markdown
- Shell
- Node.js
- Python
DeliveredMove On Australia
A moving company's CRM in Australia, where I built three pieces of automation: AI crew scheduling, order extraction from email, and route optimisation.
The client already had a Base44 low-code CRM; my job was to make it run itself. AI scheduling assigns crews by availability and location, email parsing turns incoming enquiries into structured orders, and route optimisation works out the cheapest way to drive the day. The AI calls go through serverless functions with the model named explicitly in code. Delivered and closed out, with all three payment milestones released.
- lines of code
- 30,005
- automation functions
- 32
- data entities
- 15
- Base44
- Serverless Functions
- Claude API
Other Apps on the App Store

CamMenu
ShippedPhotograph a menu you can't read, and get back phrases you can point at to order.
- 16,229 lines of Dart
- 5 languages

Fooda
ShippedPhotograph a meal, get it turned into the day's nutrition intake.

DueBox
ShippedPhotograph a bill; it pulls out the amount and the due date.
Sites & Services
All of these are still running and you can open them directly. The ones marked "login required" have account systems — you'll reach a sign-in page rather than the product itself.

Idea Manager
LiveSketch ideas onto a canvas and let AI expand them along the links between nodes.
- 7,064 lines of code
- 20 API routes

One-Person Shop
EndedAn order system for micro-businesses. I pitched eight shops by direct message; on the date I'd set to judge it: zero sales. I shut it down.
The idea was one config file per shop — a white-label order page that could be restyled for a new store in an hour. I wrote the pass/fail rule and the exit clause before starting, then settled up on the date I'd set. All three conditions failed. The site is still up, because it says more about how I decide than any of the successes: define what failure looks like first, then actually call it.

Zhi Jian Studio
LiveThe site for my own contracting studio: keep your tools, automate the workflow.
- 6,354 lines of code
- 4.5 months maintained

ChatCal
LiveKeep a calendar by chatting with it instead of filling in forms.
- 2,015 lines of code
- 26 routes

Threads Filter
LiveClassifies and filters Threads posts so only what I want to read gets through.
- 2,505 lines of code
- 4 database tables

Survival Wallet
LiveAn expense tracker whose data stays in your own browser and is never uploaded.
- 2,696 lines of code
- 17 tests

MathBox
LiveA maths toolbox that keeps the common calculations and plots in one place.
Mentora
Login requiredAn AI study companion; one question chains five or six analysis passes before it answers.
- 7,038 lines of code
- 12 AI routes
- Next.js 16
- Clerk
- Supabase
- gRPC
AgentHub
Login requiredA personal AI assistant platform; answers stream in as they are generated.
- 4,974 lines of code
- 13 routes
SocialAgents
LivePuts AI assistants on LINE and Telegram; one workspace manages several personas and their contacts.
- 2,119 lines of code
- 7 database tables
- Next.js 16
- Drizzle
- PostgreSQL 18
- LINE
- Telegram
Homework Solver
LivePhotograph or type a problem and get a step-by-step walkthrough; the AI layer has six levels of fallback.
- 4,428 lines of code
- 29 endpoints
KeyStorage
LiveStores keys encrypted in the browser using the built-in Web Crypto API.
Worklog
LiveOne line a day for what got done. Runs on the NAS at home.
Developer Tools & Backends
Things I wrote to solve my own problems. Most have no public interface.
DingDong
OngoingThe earliest project here: a LINE bot with a full backend behind it — scheduling, task queues, and data models all built from scratch.
This was my first real backend: a LINE bot at the front, and behind it FastAPI serving 44 endpoints across 18 data models, Celery running scheduled and async jobs, MySQL for storage and Redis for caching — all in Docker, next to a Gitea instance I host myself. There is no AI anywhere in it; I hadn't started with that yet.
- 12,618 lines of Python
- 44 API endpoints
- 18 data models
- Python
- FastAPI
- Celery
- MySQL
- Redis
- Docker
- LINE API
Job Screening System
Login requiredBuilt to solve my own problem: scrape job listings, screen them through a tiered AI filter, and track what I applied to.
- 195 commits
- 82 API endpoints
- 11 database tables
- Node.js
- SQLite
- Playwright
- nginx
- systemd
SkillsHub
PrototypeA Model Context Protocol server that lets an AI read my own skills library directly.
Model Context Protocol lets an AI read external data directly. I wrote an MCP server in Next.js so an AI can query my own skills library instead of me pasting it in a chunk at a time. Drizzle and SQLite underneath, plus the GitHub API for repository data.
- 3,755 lines of code
- 4 database tables
- Next.js 15
- Drizzle
- SQLite
- MCP SDK
- Docker
FocusMask
PrototypeA Chrome extension that masks the parts of a page I find distracting.
A Chrome extension on Manifest V3. It does one thing: mask the parts of a page I can't stop looking at — the sidebar recommendations, the related videos below, the social feed. Rules live in the browser; no account, nothing uploaded.
Not Public Yet
FirstFrame
In testingA photography assistant built on the Vision framework, in eight languages. Currently on TestFlight.
Real-time frame analysis with Apple's Vision framework, with AVFoundation driving the camera, so it tells you what's wrong with the composition before you press the shutter. Eight locales, 114 commits, currently on TestFlight and not yet submitted to the App Store.
- 10,955 lines of Swift
- 114 commits
- 8 languages
- Swift
- SwiftUI
- Vision
- AVFoundation
- fastlane
Bloopz
SubmittedA small game app taken from concept to App Store submission in three days.
The point wasn't complexity — I wanted to know how long it takes me to push an idea all the way to submission. Three days, including artwork, IAP setup, and store assets.
- 3,659 lines of code
- 3 days, concept to submission
ERP Prototype
PrototypeAn inventory-management prototype — the only project here written in Vue.
An inventory-management prototype: nine tables covering products, stock, inbound, outbound, and customers. It's the only project here written in Vue, chosen deliberately so I'd know where Vue and React actually differ on real work.
- 3,086 lines of code
- 9 database tables
How I Work
Whoever produces it doesn't verify it
Most people use AI as an answer machine: ask, accept, move on. The habit that changed my results was separating producing from checking. I never let the session that just finished something be the one that judges it. A session that just wrote something will defend it. A session that has never seen it won't.
Measure before trusting your own assumptions
I used to be sure that delegating work across multiple AI agents was what made things expensive, so I kept everything in one conversation. Then I measured it across 170 of my own sessions: the main conversation accounted for roughly 88% of the cost, and every delegated agent combined accounted for about 12%. I had the causality backwards. What stuck with me wasn't the number — it was that I'd held a confident opinion for months without once checking it, and checking it took about an hour.
The judgment stays mine
Most of my work is AI-assisted, and I don't hide that. But the split is clear: the AI covers the volume, the judgment stays mine. What to build, what counts as done, and where not to compromise — those don't get delegated.
About
I'm Po-Han Hua, a third-year Photonics student at Feng Chia University in Taichung, graduating in spring 2028.
I didn't come from a computer science background — I learned to build software by building things I wanted to exist. I think a lot of students outside CS could build real things this way. So could the person sitting next to me in optics lab; most of them have just never been told that.