Four intakes, four rewrites, and not one of them began with me pitching it.

I have built the freshmen welcome platform at Khon Kaen University four times — once for each intake from KKU60 through KKU63. Not one of them started with me pitching the idea.
The first came from a senior I met while serving on a student organization subcommittee. The next came from someone I met at a camp, who later joined the organization themselves and came back to ask. After that it simply became the thing I did each year.
Every one of the four started with someone asking, not with me proposing.
The reason I kept saying yes is duller than it sounds: when I arrived, the university's websites and systems were dated, and I wanted to be one of the people helping move them forward. Volunteering on the welcome system was the nearest place to start.
Each year is a new repository, not last year's with the number changed. The first commit of each lands in May or June — the intake sets the deadline, and the deadline does not move.
| Intake | Files | Lines | Commits |
|---|---|---|---|
| KKU60 · 2023 | 80 | 7,092 | 7 |
| KKU61 · 2024 | 76 | 5,980 | 40 |
| KKU62 · 2025 | 153 | 14,822 | 223 |
| KKU63 · 2026 | 934 | 124,012 | 364 |
The jump from 2025 to 2026 is not ambition. It is the year the app stopped being a registration form with extras bolted on and became a set of separate features that happen to share a login.
Only two things survived all four: Next.js and Firebase. Everything else was replaced at least once.
2023 src/{components,hooks,redux,services,styles}
2024 src/features/{collect-points,events-registration} + src/shared
2025 src/modules/{freshmen,participant,staff} + src/shared
2026 src/app/[locale] + src/app/api + src/modules/core/{...16}Three renames of the same idea, each a little less wrong. features/ was better than a flat components/, and modules/ was better than features/ once a module needed its own models, schemas and hooks rather than just its screens.
The current one signs students in against the university's own account system rather than asking them to make another password:
/api/auth/kku/login → hand off to the university
/api/auth/kku/callback → come back, mint a session
/api/auth/session → who is this, server-side
/api/recaptcha/verify → keep the bots off registrationBehind that sit the features the organizers asked for, each its own module: e-ticket, check-in, point collection, clubs, a campus map, a photo booth, a feedback form, and a sponsor section.
Most students open it on a phone, not a laptop, so the phone layout is the one that gets designed first and tested hardest. 2025 was the year that stopped being an afterthought.
The hard part was never the difficult problems. It was picking up code — usually my own from the year before — and finding the conventions on paper had not held in practice. Which is most of why I now care about the boring things: naming, code review, and writing down why rather than what.
It is also why 2026 is the first year with tests and a written brief for the codebase, sitting next to the code as AGENTS.md.
The four case studies are on the projects page if you want the details of any one year.