← All projects
04 Publishing infrastructure · May 2025-Jun 2026

A school day,
published
itself.

I built the infrastructure behind a school announcements platform used by 1,000+ students and 50+ staff. Teachers edited familiar Google files; scheduled Python jobs handled the path to production.

CADENCEHourly + daily builds
REACH25K+ monthly visits
OUTPUTStatic production site
SOURCE 01GOOGLE DRIVEslides + document
SOURCE 02GOOGLE SHEETSevents + office news
CONTROLTORONTO CLOCKhourly / 08:58
PYTHONBUILD PIPELINEingest → transform → publish
EDGENGINX + CLOUDFLAREstatic delivery
01
THE OPERATING PROBLEM

Publishing could not depend on one technical person being awake.

Announcements, club calendars, concessions, office messages, and slideshow changes arrived through different sources and changed at different speeds. The system needed to preserve the tools staff already understood while making every update repeatable.

SLSS PUBLISHER / TORONTO
READY FOR BUILD
ONE FULL REFRESH

Follow an announcement to production.

01TRIGGERToronto scheduler

At 08:58, the daily workflow starts with a local timezone-aware clock.

America/Toronto
02INGESTDrive export

The source document becomes plain text for analysis and PDF pages for the slideshow.

text/plain + application/pdf
03STRUCTURESheets ranges

Known cells become typed event, concession, and announcement records.

Main!A7:B14 / Main!G7
04TRANSFORMPython + AI

A unified diff isolates changes; prompts turn source material into highlights.

difflib + GPT-4o
05COMPILEStatic build

Generated text and JSON are injected into templates, then assets are copied cleanly.

replacement/ → prod/
06DELIVERProduction edge

Nginx serves the generated site while Cloudflare protects and accelerates it.

static HTML / CSS / JS
  1. Press run publish to trace the build
BUILD PROGRESS
02
TWO SPEEDS

Fresh where it matters.
Heavy work only when needed.

TORONTO08:58timezone-aware scheduler
EVERY HOUR
DAILY
LIGHTWEIGHT REFRESHFast-changing school data
CALENDAROFFICECONCESSIONSCLUBSCACHE

Small focused scripts keep operational information current without rebuilding the entire slideshow and summary pipeline.

FULL REFRESHSource-to-production rebuild
BACKUPDRIVE EXPORTPDF RENDERAI DIFFBUILD

The expensive path runs once each morning, preserving yesterday's source before generating the day's complete production bundle.

03
BUILD ANATOMY

One source becomes several interfaces.

The pipeline does more than move files. It deliberately reshapes each source into the format the browser needs.

STAFF INPUTGoogle workspacedocuments, slides, cells
01Parserows become event objects
02RenderPDF pages become PNGs
03Summarizediff becomes readable changes
04Injectplaceholders become assets
HTMLHighlights
JAVASCRIPTEvents + office
IMAGESDaily slides
STATICProduction bundle
04Reliability choices

Automation that leaves evidence
and preserves a way back.

01

Keep the previous source.

Before a new Drive export lands, the last text and PDF files are renamed as backups. The diff and a recovery copy come from the same decision.

slides-new → slides-old
02

Fail ranges independently.

A missing calendar range logs a warning and the loop continues, so one malformed section does not erase every other event.

warn + continue
03

Generate browser-ready data.

Structured records are serialized with JSON rather than assembled by hand, keeping quotes and punctuation valid in production JavaScript.

json.dumps(...)
04

Report every run.

Refresh milestones go to stdout and Discord, making success, failed dependencies, and deployment timing visible away from the server.

timestamp + webhook
THE RESULT

Staff kept editing familiar files. Students received a dependable product.

The infrastructure removed repetitive publishing work without forcing a new content system onto teachers. It supported 1,000+ students, 50+ staff, and more than 25,000 monthly visits at peak usage.

1,000+ students served50+ staff contributors25K+ monthly visits2 refresh cadences
Next projectcritical.lol