Dr. Claw
Full-stack research workspace. From idea to paper with AI agents.
Billig og enkel skoleadministration. Skema, SFO, ugeplan, fravær og forældrekontakt samlet i ét system — i stedet for fem. Prøv gratis i 30 dage.
Translation pending
EducationTypeScript · C#GitHub @NielsPilgaardAvailability needs another checkOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
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.
Taken from the repository README
Loading the full README.
Read the full 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