All work

Project

Wisuda Oktober ITB 2026 Website

Official website of the October 2026 ITB graduation. I built the graduate CSV import, the synthetic seed data and the profile API.

Context
IT Division, Wisuda Oktober ITB 2026
Role
Backend Developer
Stack
TypeScript, Bun, Hono, Prisma, PostgreSQL, Zod
Year
Sep – Oct 2026

Overview

The official website of the October 2026 ITB graduation parade, live at wisokto2026.wisudaitb.id. It has a graduate directory, a TA Fair where visitors like final projects, Words of Appreciation messages, merchandise and donations. A team of 12 staff and 2 leads built it in five sprints, from 15 September to 17 October 2026.

Stack

A Bun monorepo with a Hono and Prisma API on PostgreSQL, a React 19 public site and a committee dashboard. Zod schemas generate the OpenAPI contract, and orval generates typed TanStack Query hooks from it, so frontend and backend share one source of truth. Every task was a work order merged through a reviewed pull request.

Graduate import

The committee needed to load the graduate roster from a CSV. I built the admin-graduates module: it parses the file, validates every row with Zod and upserts by NIM, so importing the same file twice is safe. The same module serves the admin endpoint POST /api/v1/admin/graduates/import and a command-line tool for the leads.

Seed data

I generated 1,000 synthetic graduates across 12 faculties and 50 study programs, 17.5% of them with a final-project title and abstract. With it the graduate directory and the TA Fair could be demoed and load-tested with more than one page of data.

Profile API

GET /api/v1/profile returns everything the profile page needs in one authenticated call: the user's profile, their roster entry, the messages they sent and received, the TA Fair entries they liked and the totals. It ships with its own test suite and a generated client hook.

Graduate directory page with search, faculty and study program filters and a grid of graduate cardsTA Fair page listing final projects with a preview, the graduate, a like counter and an open button