Lucas WintherandClaude Opus 5.5 f02e30450c fix(studio): review round 2 - a conversion that fails after its commit recovers without a restart
- The convert job reloads the course on success and on failure, so learners
  get the intact import (rolled back) or the published studio course, never a
  course whose folder moved away.
- POST /convert on a course with an incomplete conversion (.converting-<id>,
  staging or retired folders) queues a job that recovers and finishes it
  instead of answering 409; the studio page shows "Conversion incomplete" with
  Retry for the owner.
- The 409 for pending import jobs names their kinds and ids; the dead withLock
  in git.ts is gone; the dot-folder discovery rule is documented in
  docs/operations.md and spec section 5.
- Route tests (SQLite and Postgres) inject a failed cross-filesystem copy, a
  checksum mismatch and a pre-commit failure.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 21:00:45 +01:00
2026-10-30 15:17:58 +01:00
2026-10-30 02:47:42 +01:00
2026-10-30 02:47:42 +01:00
2026-10-30 02:47:42 +01:00
2026-10-30 15:17:58 +01:00

STCourses

STCourses is a self-hosted course platform. Homelabbers, universities and companies host their own courses, plus material they already own such as Packt video packages or Pluralsight slide PDFs, in one place that tracks progress. Authors write in Markdown in a git repo or in a browser studio; both edit the same files. Each install has one owner and is not multi-tenant.

Development

bun install          # install workspace dependencies
bun test             # run all tests
bun run typecheck    # tsc --noEmit
bun run dev          # start the server with hot reload

Running it

STC_SECRET=... docker compose up -d (add --profile postgres and STC_DATABASE_URL for Postgres). Mounts, configuration and the measured memory budget are in docs/operations.md.

License: AGPL-3.0-only.

S
Description
No description provided
Readme AGPL-3.0
958 KiB
Languages
TypeScript 97.8%
CSS 1.7%
Dockerfile 0.2%
Python 0.1%