Work

2025

CSIALife

The school-wide platform CSIA students use every day for night study requests, seminar room bookings, timetables, meals, and room reservations, with more than 600 users.

users at csialife.com
600+
Django apps in the 2026–27 codebase
13
background jobs scheduled every day
4
processes on Railway: web, worker, and beat
3

Visit site

Year
2025
Timeline
2025 – present
Built with
Django, Gunicorn, Celery, Redis, PostgreSQL, Google Sheets API, NEIS Open API, Railway
Team
Siwoo Kim (leader and developer)

Overview

CSIALife is the school-wide platform students at CheongShim International Academy use for night study requests, seminar room bookings, timetables, meals, and room reservations. It runs at csialife.com with more than 600 users. The production source code stays private because it handles real student records, so every screen shown here uses fictional demo data.

The Problem

Every evening, students declare what they will do in each night study period: self-study, an after-school course, an outing, or a seminar room session. Teachers used to collect these by hand every day and type them into spreadsheets. CSIALife replaced that process, but as features piled up in the first version, the request logic developed a structural bug that left ghost records in the data teachers relied on.

Role

  • Leader and developer: started as a co-developer alongside senior students and now leads development and maintenance
  • Rebuilt the night study request logic after the ghost record bug
  • Started a new codebase for the 2026–27 school year, the version running at csialife.com today
  • Runs the system on Railway as three processes (web, Celery worker, Celery beat) on PostgreSQL and Redis
  • Added daily snapshots of the teachers' sheet history so past records survive even after Google merges old versions

Architecture

System architecture

Students reach the Django and Gunicorn web process on Railway, which reads and writes PostgreSQL, looks up meals from the NEIS Open API, and syncs the music room to Google Sheets. Celery beat publishes scheduled jobs to Redis; the Celery worker consumes them, syncing Google Sheets at 17:30 and 13:00 and writing snapshots and resets to PostgreSQL at 00:10 and 00:30.
Blue arrows are the scheduled jobs run by the Celery worker.
  • Web: Django served by Gunicorn handles every page, form, and the admin
  • Database: PostgreSQL stores requests, bookings, settings, and the daily sheet snapshots
  • Background jobs: Celery beat publishes four scheduled jobs to Redis, and the Celery worker runs them
  • Integrations: the Google Sheets API keeps the teachers' rosters in sync, and the NEIS Open API supplies the school meal menu

A Day in CSIALife

What runs when, on a school day

00:0003:0006:0009:0012:0015:0018:0021:0024:00Seminar booking open · 08:00–13:00Today's night study column locked · 17:30–21:0000:10 Sheet snapshot00:30 Seminar reset13:00 Seminar sync17:30 Night study sync
View data
TimeWhat happens
08:00–13:00Seminar booking open
17:30–21:00Today's night study column locked
00:10Sheet snapshot
00:30Seminar reset
13:00Seminar sync
17:30Night study sync

Scheduled jobs (Celery beat)

JobWhenWhat it does
Night study sync17:30Re-syncs every active request for the day into the teachers' sheet
Seminar sync13:00Writes the day's seminar room bookings to the sheet
Sheet history snapshot00:10Saves the previous day's sheet version to the database
Seminar reset00:30Clears past bookings so the next day starts clean

Modules

The 2026–27 codebase is split into 13 Django apps, one per service.

Apps and their data models

AppWhat it doesModels
Night study (yaja)Weekly night study requests by period, synced to the teachers' sheetNightStudyApplication, NightStudySettings, GoogleSheetSync, SheetSnapshot, SheetSnapshotEntry
Seminar rooms (seminar)Room availability and group bookingsSeminarRoomAvailability, SeminarBooking
Timetable (timetable)Weekly class timetable matched to each student ID, with electivesSubjectOption, StudentElectiveChoice
Meals (meal)Weekly menu from the NEIS Open APINone, read live from the API
Music room (music_room)Weekly music room reservationsMusicRoomBooking, MusicRoomSettings, MusicRoomSlotAvailability
Labs (lab)Lab bookings with capacity, equipment, and statusLab, LabBooking
Special rooms (special_room)Special room reservations within opening hoursSpecialRoom, SpecialRoomReservation, SpecialRoomSettings
Exams (exams)Exam timetable shown on the home screen ahead of each exam periodExam, ExamSlot
Guidelines (guideline)Guideline files uploaded by administratorsGuidelineFile
Home (home)Dashboard with night study and reservation statusNone
Login (login)Sign-in and stale-form handlingNone
Block Blast (blockblast)Browser puzzle game with a scoreboardBlockBlastScore, BlockBlastBan
Gomoku (gomoku)Online gomoku with game records, challenges, and a match queueGomokuProfile, GomokuGame, GomokuMove, GomokuChallenge, GomokuQueueEntry

Python code per app (lines, excluding migrations)

  • Games
  • School services
  • Night study1,155
  • Music room622
  • Seminar rooms490
  • Timetable479
  • Special rooms350
  • Exams330
  • Labs309
  • Home251
  • Meals175
  • Login152
  • Guidelines143
  • Gomoku3,049
  • Block Blast282
View data
ItemValue
Night study1,155
Music room622
Seminar rooms490
Timetable479
Special rooms350
Exams330
Labs309
Home251
Meals175
Login152
Guidelines143
Gomoku3,049
Block Blast282

Engineering Details

  • Night study lock: today's column cannot be edited from 17:30 to 21:00, so the roster teachers receive at 17:30 stays fixed; every other day can be changed at any time
  • Ghost record fix: at 17:30 the worker resets every active request for the day to unsynced and writes all of them to the teachers' sheet again
  • Sheet history: at 00:10 the previous day's final sheet version is saved to the database, before Google merges old versions together
  • Seminar rooms: bookings open on weekdays from 08:00 to 13:00 for up to six students; at 13:00 the day's bookings go to the sheet, and at 00:30 the previous day is cleared so the 08:00 opening starts clean
  • Meals: NEIS caps date-range queries at five rows without an API key, which drops lunch and dinner, so the service asks for one day at a time and splits snack items out of dinner
  • Music room: each week's reservations sync to their own worksheet tab, and slots already marked unavailable for class are never overwritten
  • Stale forms: when a form expires because the user signed in or out in another tab, the page asks them to try again instead of showing a bare 403 error

Development

Commits per week to the 2026–27 codebase

  • 104Sep 14
  • 9Sep 21
  • 35Sep 28
  • 7Oct 5
  • 0Oct 12
  • 4Oct 19
159 commits from September 14 to October 22, 2026. Weeks start on Monday.
View data
ItemValue
Sep 14104
Sep 219
Sep 2835
Oct 57
Oct 120
Oct 194

Stack

Django, Gunicorn, Celery, Redis, PostgreSQL, Google Sheets API, NEIS Open API, Railway