Skip to content

About

SaaS schema planner for Danish friskoler and private/independent schools. Schools build, manage, and print their weekly class schedules — with real-time conflict detection for teachers, rooms, and aides.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Repository files navigation

Skoleoverblikket

SaaS schema planner for Danish friskoler and private/independent schools. Schools build, manage, and print their weekly class schedules — with real-time conflict detection for teachers, rooms, and aides.

What it does

  • Schema planner — weekly grid per class, assign course + teacher + room to each time slot
  • Conflict detection — real-time validation: no double-booked teachers, rooms, or aides
  • Time slot wizard — school defines default lesson structure (durations, breaks); classes inherit with optional overrides
  • Staff management — teachers, aides, substitutes; invitation-based onboarding
  • File explorer — upload files linked to courses for easy reference
  • Stats — hours per course, hours per teacher/aide, unassigned slots
  • Printable schemas — per class, per teacher, per room; designed for A4 print
  • Billing — self-serve via Stripe Checkout, 30-day free trial, auto-renew monthly

Tech stack

Layer Choice
API ASP.NET Core Web API, C# / .NET 10
ORM Entity Framework Core
Database PostgreSQL (Docker Compose, self-hosted on OVH VPS)
Frontend React + Vite + TypeScript + Tailwind CSS
Auth Keycloak (Docker Compose)
API client Generated from OpenAPI spec (openapi-typescript)
Email Scaleway TEM via SMTP (MailKit)
Object storage OVHCloud Object Storage (S3-compatible, EU)
Reverse proxy Traefik (managed by Dokploy)
Hosting OVHCloud VPS + Dokploy + Docker Compose

Repository layout

/api                    ASP.NET Core Web API
/web                    React + Vite frontend
/infrastructure/aspire  .NET Aspire local orchestration
/infrastructure/docker  Production docker-compose + Caddyfile
/infrastructure/keycloak  Keycloak realm export
/scripts                Developer scripts
/docs                   PRD, pricing, decisions, and other documentation
/tasks                  Phase-by-phase implementation tasks

Key architecture rules

Multi-tenancy: every query that touches school, staff, class, course, schema, or file data must be scoped to a tenant via EF Core global query filters. Never bypass them. Never trust a URL slug as an authorization signal — always resolve to a TenantId at the middleware boundary.

Responsive UI: admin UI (schema builder) is laptop-first. Staff schedule views must work on phones and tablets.

Simplicity first: the primary admin user is a school secretary with limited time. Every feature must be operable without training.

Pricing

Tier Storage Monthly
Basis 100 GB 499 kr
Skole+ (future) 1000 GB 499 kr

30-day free trial with full access. No per-student pricing.

See docs/PRICING.md for full details.

Local development

Prerequisites

Run the setup script (Windows) to install prerequisites automatically:

.\scripts\setup.ps1

Start the dev stack

The local dev environment runs via .NET Aspire, which orchestrates all containers (PostgreSQL, Keycloak, Silo, API, web).

aspire run

This starts:

Service URL
Web app http://localhost:5173
API http://localhost:5000
Swagger UI http://localhost:5000/api/v1/openapi
Keycloak http://localhost:8080
PgAdmin http://localhost:5050
Silo (S3) http://localhost:9000
Silo console http://localhost:9001

The Keycloak realm (Skoleoverblikket) is imported automatically from infrastructure/keycloak/realms/Skoleoverblikket-realm.json on first startup.

Aspire parameters

Aspire uses parameter secrets for local dev. On first run, set:

# PostgreSQL password
dotnet user-secrets set "Parameters:postgres-password" "your-dev-password" --project infrastructure/aspire/Skoleoverblikket.AppHost

# Keycloak admin password
dotnet user-secrets set "Parameters:keycloak-admin-password" "your-dev-password" --project infrastructure/aspire/Skoleoverblikket.AppHost

# Scaleway TEM (Email)
dotnet user-secrets set "Smtp:Username" "your-scaleway-username" --project api/Skoleoverblikket.Api
dotnet user-secrets set "Smtp:Password" "your-scaleway-api-key" --project api/Skoleoverblikket.Api


# OVHcloud S3
dotnet user-secrets set "ObjectStorage:AccessKey" "your-s3-accesskey" --project api/Skoleoverblikket.Api
dotnet user-secrets set "ObjectStorage:SecretKey" "your-s3-secretkey" --project api/Skoleoverblikket.Api

Dev login credentials

A test school and admin user are seeded automatically in development:

Field Value
URL http://localhost:5173
Username admin@debugskolen.dk
Password test1234
School Debugskolen (debugskolen)

The Keycloak user is imported from the realm JSON. The school row is seeded by the API on startup.

First run only: Keycloak imports the realm only when its database is empty. If Keycloak was already running before these credentials were added, delete the keycloak-db Docker volume and restart the stack so the realm is re-imported.

Database migrations

Add a new EF Core migration from the repo root:

.\scripts\add-migration.ps1 -MigrationName YourMigrationName

Migrations live in api/Skoleoverblikket.Api/Data/Migrations/. Never edit an existing migration file — always add a new one.

API client codegen

When the API has changed, regenerate the typed TypeScript client:

# Builds the API (emits openapi/Skoleoverblikket.Api.json), then generates web/src/api/generated
cd web && npm run codegen

The API build goes to bin/codegen/, so it works while the Aspire stack is running.

Documentation

  • PRD — product requirements and feature spec
  • Personas — the real users every design decision is measured against
  • Schema features — schema planner detail
  • Decisions — product and architecture decisions
  • Tasks — numbered task specs
  • Pricing — tier breakdown
  • Testing — testing strategy
  • Contacts (media/CONTACTS.md, gitignored, local only) — discovery interview contacts

About

SaaS schema planner for Danish friskoler and private/independent schools. Schools build, manage, and print their weekly class schedules — with real-time conflict detection for teachers, rooms, and aides.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages