The drag-and-drop workspace for building BI122G exercise sheets, served by the Workshop at /projects/exercise-builder. Plain HTML, CSS and ES modules; no build step. It runs entirely in the browser — work in progress lives in localStorage and finished sheets leave as downloads, so nothing is written on the server. This directory is canonical. It began as a deployment target for deploy_builder.sh syncing from the BI122G course folder, and that arrangement has ended; see the README. Includes the sheet's light/dark switch: the stylesheet already carried both themes and followed the reader's system setting, so this adds the control that overrides it — a corner toggle built by sheet.js, applied before first paint by a head script the exporter writes, and hidden in print. The builder's toolbar previews the same attribute on the canvas. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ed5kU3HfZq9dfj7EYj5J2v
Exercise Builder — hosted copy
The drag-and-drop workspace for building BI122G exercise sheets, served by the Workshop at:
/projects/exercise-builder landing page
/projects/exercise-builder/app the builder itself
Open to everyone; no sign-in.
What is here
app/ the builder — plain HTML, CSS, and ES modules. No build step.
app/ is the whole application. It runs entirely in the browser: work in
progress lives in the visitor's localStorage, and finished sheets and project
files leave as downloads. Nothing is written on the server, and there is no
endpoint that could write anything. That is what makes it safe to host without a
login.
Note this differs from the local development setup in the course folder, where
edit_server.py accepts POST /__save and writes sheets straight to disk. That
server is not deployed here, and must not be — reachable without a login it
would be a write primitive for anyone who could load the page.
How it is served
workshop/src/routes/projects/exercise-builder/app/[...file]/+server.ts reads
this directory at request time. Consequences worth knowing:
- Updating the builder does not need a site rebuild. Sync new files here and
a reload picks them up (responses are
no-cachewith an mtime-based ETag). A rebuild is only needed when the landing page or the route itself changes. - Only recognised asset extensions are reachable, and paths are contained to
this directory — so nothing outside
app/can be requested. .jsis served astext/javascript, without which browsers refuse ES modules outright.- The route injects
<base href="/projects/exercise-builder/app/">into the served HTML, so the builder's relative URLs resolve whether or not the visitor typed a trailing slash.
Override the location with EXERCISE_BUILDER_ROOT in the workshop .env if it
ever moves.
Updating
Edit the files here. There is no build step and no sync — a reload picks the change up, for the reasons above.
Source of truth
This directory. The builder was developed in the BI122G course folder on
the workstation (/Muspelheim/Employment/HiS/Teaching/BI122G) and pushed here
by deploy_builder.sh. That arrangement has ended and this installation is now
canonical: do not run deploy_builder.sh again, as it would overwrite this
directory with the older course-folder copy.
The course folder still holds test.mjs, a Node test harness that was never
deployed here — it needs linkedom and is no use in a browser.