尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证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.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗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.
| 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) |
| 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 |
/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
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.
| 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.
Run the setup script (Windows) to install prerequisites automatically:
.\scripts\setup.ps1
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 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
A test school and admin user are seeded automatically in development:
| Field | Value |
|---|---|
| URL | http://localhost:5173 |
| Username | [email protected] |
| 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-dbDocker volume and restart the stack so the realm is re-imported.
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.
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.
media/CONTACTS.md, gitignored, local only) — discovery interview contacts