Context
SEDUC-PA needs structured operational data from schools across the state: infrastructure, staffing, services, equipment, and school profile information. I built the data-collection application as its sole author and was the original builder of the administrative dashboard. The system replaces fragmented form-and-spreadsheet flows with a versioned application backed by a Go API and PostgreSQL, while retaining Google Workspace integrations for operational reporting.
Architecture
Polyglot monorepo with a Next.js frontend, Go API, PostgreSQL persistence, and containerized local infrastructure. Business rules and administrative analytics remain separated from the UI layer.
Next.js + TypeScript + React Hook Form + Zod — multi-step, schema-driven data collection and administrative interfaces
Go 1.24 with chi and pgx — authentication, validation, persistence, analytics, exports, and Google integrations
PostgreSQL 16, migrations, Docker Compose, environment configuration, and reproducible local infrastructure
Sheets and Drive integrations preserve reporting workflows used by administrative teams
Engineering Decisions
Go for the backend boundary
The API uses Go as an explicit backend boundary instead of placing server logic inside the frontend application. This keeps validation, persistence, integrations, and administrative analytics independently testable and gives the project a small, predictable runtime surface.
pgx directly — no ORM
Database access uses pgx directly so complex analytics and aggregation queries remain visible, reviewable, and tunable as SQL. Transaction boundaries and query behavior stay explicit instead of being hidden behind an ORM abstraction.
Google Workspace remains an integration, not the database
PostgreSQL is the source of truth. Sheets and Drive are used as operational reporting and export integrations, preserving familiar analyst workflows without making spreadsheets responsible for application integrity.
Schema-driven multi-step collection
The census flow is divided into 14 logical sections and validated across client and server boundaries. The form supports partial progress while keeping submitted data structured and consistent for downstream analytics.