Repository navigation
Releases: Vumlo/vumlo-core
Release list
Vumlo 0.4.1
Branding, and a menu for the file types of a file assignment.
- File assignments: the accepted types are picked from a menu of groups, with a field for other types.
acceptentries may be one character long (.c,.h) (ADR-0023, amended). - Branding. The logo is always Vumlo's: the favicon, the app icons, the navbar and the sign-in page.
institution.logois removed (ADR-0054, amended), andresvgwith it. - The name of the app is "Vumlo | Short name" on the web and "Vumlo Short name" on the desktop (the installers cannot have a
|in their name). - The title of a browser tab says where you are: "Lab report · Course · Vumlo | Short name".
- The sign-in page has Google's logo on its button and a proper language icon.
Upgrade notes. This release removes a configuration key, which a patch release should not. If your vumlo.toml has logo = ... in [institution], delete that line: config check and the server stop with "institution.logo: unknown key". Then run ./vumlo brand apply and rebuild the images. No migrations, no new config_version.
Vumlo 0.4.0
File uploads (ADR-0069).
Added
- Files in the editor and in assignments:
imageandfileblocks in documents, the item kindfile, and the
assignment typefile(a hand-in of up tomax_filesfiles, graded by hand). A teacher can preview a hand-in
while grading. POST /api/v1/files(the raw file as the body) andGET /api/v1/files/{id}; a file is served only through an
item or a submission the caller may read (otherwise404), withRangeandETag; it isinlineonly for
PDF, PNG, JPEG, GIF, WebP and plain text, always withX-Content-Type-Options: nosniff, and with
Content-Security-Policy: sandboxfor every type except PDF (Chrome and Edge do not show their PDF viewer in a
sandboxed response; the type is verified by the file's signature at upload, ADR-0069).- Storage in a directory on the server or in an S3-compatible bucket (
[files]invumlo.toml). A file that no
item and no submission names is deleted after 24 hours; the sweep runs hourly. - Desktop app: upload a file, and "open" a file, which saves it in Downloads. Documents, spreadsheets,
presentations, text, images, audio and video are opened; archives, programs, scripts and every other kind are
only shown in their folder. Windows and macOS mark the file as downloaded (not run on those systems in testing).
Changed
- The crate chain gained
filesbetweenauthandevents(ADR-0065, ADR-0069). - A document that holds only an
imageor afileblock is no longer counted as empty. - An answer option of a quiz may hold an image as its one block.
Upgrade notes
config_versionis still 1.- The newest core migration is
0038(0036to0038are new: thefilestable, the tables that record which
files an item or a submission names, and the item kindfile). Take a backup, then runvumlo db migrate
(deploy/update.shdoes both). A server older than this release cannot run against a migrated database. - New optional section
[files]:storage = "local"(default) or"s3",path(defaultfiles, relative to
the directory ofvumlo.toml),max_size(default 52428800, 50 MiB; at most 1073741824). Withs3, add
[files.s3](bucket,region, optionalendpoint) and setVUMLO__FILES__S3__ACCESS_KEYand
VUMLO__FILES__S3__SECRET_KEYin the environment. - The server creates the local files directory when it starts and refuses to start if it cannot. The shipped
files now point it at a writable place withVUMLO__FILES__PATH(which overridesfiles.path). systemd:
copy the newdeploy/systemd/vumlo-core.serviceandvumlo-worker.serviceover the installed units (they add
StateDirectory=vumlo, which creates/var/lib/vumlo, andVUMLO__FILES__PATH=/var/lib/vumlo/files; keep
your own edits, such as paths), runsystemctl daemon-reload, thendeploy/update.sh --systemd;update.sh
does not copy units. Docker:deploy/compose.yamlgets thefiles-datavolume oncoreandworker
and the image creates its mount point, so rebuild withdeploy/update.sh --docker. Nothing to move: no
uploaded files exist before this release. See Uploaded files. - A reverse proxy in front of the API must allow request bodies of
files.max_size. The Caddyfile of the release
already does; with nginx setclient_max_body_size. vumlo db backupdoes not contain the files. Back up the files directory or the bucket separately and restore
it together with the database.- An upload is held in memory while it is stored: plan
files.max_sizeof memory per upload in progress. - Desktop: build a new app to get file upload and open; an app built against an older release does not have them.
Vumlo 0.3.0
Plugins and optional modules, a redesigned web app, and a page for grading.
Upgrade notes
config_versionis still 1.- The newest core migration is
0035. Take a backup, then runvumlo db migrate(deploy/update.shdoes both). The
migrations rename the Postgres schemaidentitytoauth(0032), add five read-only views (0033) and the schema
plugins(0034,0035). A server older than this release cannot run against a migrated database, and anything of
your own that reads the database directly (a report, a backup script that dumps--schema=identity) must sayauth. - To install plugins set
VUMLO__PLUGINS__SECRET_KEY(32 characters or more) in the environment; without it none can be
installed. Nothing else changes if you use none. - The web app has a new look and a new page for grading; there is nothing to configure. Run
vumlo-cli brand applyand
rebuild the web image as always. - The web image no longer serves
mockServiceWorker.jsormock-plugin/, and the build fails if the browser bundle carries
the mock API's sample data. They were fornpm run dev:mockonly.
Added
- Plugins (ADR-0066): external HTTP services in any language that the core
does not trust.vumlo-cli plugin install|list|grant|disable|enable|remove; the core sends the events a plugin subscribed to
(submission.submitted,grade.published), signed withX-Vumlo-TimestampandX-Vumlo-Signature, and the plugin calls
/api/v1/plugin-api/*with its token, where every call needs a scope (submissions:read,reports:write). Staff read what
plugins reported atGET /api/v1/submissions/{id}/plugin-reports. An example is inexamples/hello-plugin/.- Upgrade notes: run
vumlo db migrate(migrations0034_plugins.sqland0035_reports_follow_their_submission.sqladd the
schemaplugins). To use plugins set
VUMLO__PLUGINS__SECRET_KEY(32 characters or more) in the environment; without it none can be installed.
- Upgrade notes: run
- A plugin can show a page in a tab of an assignment (ADR-0066). The page is a sandboxed frame with no session and no access
to the web app; it learns who is looking from a signed token the core issues for a minute (POST /assignments/{id}/plugin-launch)
and draws with the theme and the design tokens the web app sends it.GET /api/v1/plugin-slots?slot=assignment.tablists the
pages. The tab is on text assignments and on assignments that take no submission, not yet on quizzes and forms, and the desktop
app shows none.deploy/Caddyfilehas an optionalframe-srcline for the origins of your plugins. GET /api/v1/metalists the enabled optional modules and their versions.- A page for grading a student's work: a cell of the gradebook opens it (the drawer is gone). It shows the submission, a
rail of students with a mark for where each one stands, previous and next, a filter (to grade, drafts, all), and the grade
panel with points, a comment, save, publish and the history. "Save and next" moves on; so does "Publish", which is off
while there is nothing to publish. Enter in the points field saves and moves on. The confirmation is a toast, and a saved
draft can be put back with Undo (a published grade cannot: students have seen it). - The gradebook can be filtered by assignment, by status and by late work.
Changed
-
The web app is redesigned in a new visual system, and the teacher's course screens are recomposed. Formulas are drawn
by KaTeX (ADR-0068). -
Optional modules are a
Moduletrait (ADR-0066): a manifest (id, version,
requires, permissions, settings), migrations, andregisterfor routes, event handlers and background jobs; they start in
the order of theirrequires. Module routes moved to/api/v1/modules/{id}/...and sign in like the core's, with permissions
decided byaccess. A module's tables are in the schemamod_<id>with its history inmod_<id>._sqlx_migrations.
vumlo-configno longer lists modules, and a name in[modules]that the binary was not built with is a configuration error
whether it is on or off. Several event handlers may listen to one event type. The only module in the tree is still the
test-onlydummy, so a release installation has nothing to migrate; a fork with its own module has to port it to the trait. -
The backend is one crate per layer (ADR-0065):
server→learning→org
→auth→events→access→common, so the compiler refuses a call from a lower layer to a higher one. The HTTP API,
its OpenAPI document, the configuration and the commands are unchanged. For a build from source: the library crateserver
no longer holds the modules (server::identityis the crateauth,server::policyisaccess), and the database harness
is the cratetest-support, which the release archive leaves out.- Upgrade notes: run
vumlo db migrate: migration0033_read_views.sqladds five read-only views
(auth.people,org.term_list,org.group_list,org.subgroup_list,events.audit_entries) next to the rename of
the next entry. Nothing else to do.
- Upgrade notes: run
-
The Postgres schema
identityis nowauth(migration0032_auth_schema.sql,ALTER SCHEMA ... RENAME), and the
identitymodule of the server is theauthmodule.vumlo-cli modules listnamesauthandaccess(it named
identityandpolicy). The HTTP API is unchanged.- Upgrade notes: run
vumlo db migrateas always; rows, keys and indexes are kept. Anything of your own that reads the
database directly (a report, a backup script that dumps--schema=identity) must sayauth. A server older than this
release cannot run against a migrated database.
- Upgrade notes: run
Vumlo 0.2.2
The names of the desktop installers, and of the app.
Fixed
- A login at the moment an administrator resets that user's password could fail with 500 (a deadlock in the database: the
login held the user while it waited for the password, the reset held the password and wanted the user). The login now
locks them in the order the reset writes them. Nothing to do on upgrade. - The installers of the desktop app are named after the URL scheme,
vumlo-ucu_0.2.2_amd64.deb,..._x64-setup.exe,
..._aarch64.dmg,..._x64.dmg,..._amd64.AppImage, and not after the institution's name. A name with spaces or
Cyrillic broke the checksum step ofdesktop-release.yml, so no release was made.scripts/build.mjscopies them to
desktop/dist/. - A
vumlo-ucu://link reaches the desktop app on Linux. The.deb's desktop file hadExec=vumlo-ucuwithout%u, so
"Open app" at the end of a sign-in with Google started the app but never gave it the code. (The AppImage is built by
Tauri with its own desktop file, which cannot be replaced: for Google sign-in on Linux use the.deb; password sign-in works in both.) - The desktop app is called by the short name (
institution.short_name,UCU) in the shortcut and the installer's
metadata, not by the full name; the full name is the publisher. (A name in another alphabet made a.debthat dpkg
refuses, "invalid package name"; the app is then called by its URL scheme.) Upgrade notes: nothing to change invumlo.toml. If you copieddesktop-release.ymlinto your
repository, copy it again fromdesktop/release/.
Vumlo 0.2.1
The Vumlo logo.
Changed
- The Vumlo logo is the placeholder logo (
brand/logo.png, in place ofbrand/logo.svg), and the web app shows an
institution's logo as it is, in the header and on the sign-in pages, instead of the first letter of its name in a
coloured tile. An institution with noinstitution.logostill gets the letter. Upgrade notes: if your
vumlo.tomlhaslogo = "brand/logo.svg"and you did not replace that file, change it tobrand/logo.pngor point it
at your own logo; a logo of your own needs no change.
Vumlo 0.2.0
The desktop app, and the two API conventions it needs.
Upgrade notes
config_versionis still 1.- The newest core migration is
0031(idempotencyschema; Google sign-in for apps; download links of the desktop app).vumlo-cli db migrate
applies it; take a backup first, as always. - The addresses of the web app changed (ADR-0057). A course is
/course?id=<id>and an item
/course/item?id=<id>&item=<id>(was/courses/<id>/items/<id>);/coursesand/courses/neware as they were.
Old bookmarks show "not found"; nothing is redirected. - Run
vumlo-cli brand applyagain before you build the web app:client-config.jsonhas a newdesktoppart
(the scheme of the desktop app's links) and the generated directory a 1024-pixelicon-1024.png. - New optional section
[desktop]withurl_scheme. Nothing to do unless you build the desktop app. - Cross-origin frontends (ADR-0041) may now send
Idempotency-KeyandIf-None-Match, and readETag.
Added
- A desktop app (ADR-0056, ADR-0060, ADR-0061, ADR-0062, ADR-0063;
docs/desktop.md): Tauri 2 for Linux,
Windows and macOS, built by each institution from its ownvumlo.toml(desktop/). It reads courses,
materials, deadlines and grades without a connection, keeps a student's drafts and submits in a send queue that
the server always has the last word on, stays in the tray, announces deadlines, opensvumlo-<abbr>://links,
keeps the session in the operating system's keychain and signs in with Google through the browser.
desktop/release/desktop-release.ymlbuilds and (with certificates) signs the installers. Idempotency-KeyonPOST(ADR-0058) andETag/If-None-MatchonGET(ADR-0059), for every client.POST /auth/app/exchangeand an optionalapp_challengeonPOST /auth/google/start(ADR-0062).- Download links of the desktop app (ADR-0064): an administrator pastes the installers' addresses on the
Institution page (PUT /admin/institution/app-downloads);GET /institutionlists them. With at least one, the
home page shows a notice with a button for the visitor's system, there is a public page/download, and the account
menu has an entry. No links, none of it.
Changed
- A teacher can publish a course from the course page: a draft course shows a notice ("Students cannot see it yet,
even those you have added") with a "Publish course" button, and a Draft badge by the title. The endpoint existed
since 0.1.0, but no screen used it, so a new course could not be shown to students from the web app. - The web app builds in two modes: the server build as before, and a static export for the desktop
(npm run build:desktop). Ids are in the query string in both. - A student's pending draft is sent when they leave the page (it used to be dropped).
vumlo-cli brand applymakes every icon from a 1024-pixel master.
Vumlo 0.1.0
The first release: a complete core for one school or university, and the tool to install it.
Upgrade notes
There is nothing to upgrade from; follow docs/install.md.
config_versionis 1. A newer value invumlo.tomlis refused.- The newest core migration is
0028.vumlo-cli db migrateapplies the migrations; a database that
is newer than the binary is refused. Take a backup first (vumlo-cli db backup, or
deploy/update.sh, which does it for you). - The institution mode (
schooloruniversity) is chosen before the first start and cannot be
changed afterwards (ADR-0031).
Added
- Installation (ADR-0054, ADR-0055):
vumlo-cli, the administrator tool:init,config check,
config show,modules list,brand apply,build web,db status,db migrate,db backup,
admin create,seed --demo,doctorandversion. One configuration schema (vumlo-config) is
shared by the server and the CLI; every key ispublic,privateorsecret, and secrets are read
from the environment only.doctorfails when the CLI, the server and the web app are not one release. - Deployment templates in
deploy/: a Docker Compose file (PostgreSQL, core, worker, web), the
Dockerfiles,vumlo.example.toml,env.example, hardened systemd units, a Caddyfile andupdate.sh
(backup, stop, migrate, start, check). The./vumloscript runs the CLI from a local binary or from
the compose service. Each release is a source archive with a checksum file, attached to its GitHub
Release; its builds are tested from scratch in CI. - Placeholder brand: the name "Vumlo" and a marked placeholder logo,
brand/logo.svg, so that
init,brand applyand the build work with no assets of your own. Replace the logo;brand apply
generates everything from it again. - Branding at build time: the institution's name, short name, language, time zone, grading scale and
logo fromvumlo.tomlbecome the web app's configuration, favicon, icons and manifest
(brand apply). There is no runtime branding endpoint and no theme settings. - Optional modules: a Cargo feature plus
[modules]invumlo.toml. None is included in this
release; the mechanism is tested with a test-only module. - Identity (ADR-0003, ADR-0017, ADR-0038, ADR-0046, ADR-0047): password login for web and app
clients, sessions, login hardening, self-registration limited toauth.allowed_domains, email
verification, password reset and Google sign-in. Administrators create accounts with a temporary
password that is shown once. - Organisation and teaching (ADR-0005, ADR-0006, ADR-0032, ADR-0033, ADR-0037, ADR-0048):
terms, groups and subgroups, courses and templates, group links and the live roster, course
archiving and deletion, course owners. - Content (ADR-0010, ADR-0019, ADR-0020, ADR-0024, ADR-0025, ADR-0026, ADR-0049): the content
tree of modules with text items and assignments, block documents, self-check questions, publishing
with dates, unpublished revisions and class dates. - Assessment and gradebook (ADR-0008, ADR-0009, ADR-0011, ADR-0015, ADR-0021, ADR-0023,
ADR-0028, ADR-0035, ADR-0050, ADR-0051): thetext,no_submission,quizandformassignment
types, submissions with drafts, attempts and deadlines, quiz auto-scoring, draft and published
grades, and the grade history. Students never see draft grades or answer keys. - Mail and events (ADR-0007, ADR-0045): a transactional outbox and a worker that sends mail.
- API (ADR-0012, ADR-0018, ADR-0039, ADR-0041): everything under
/api/v1, OpenAPI at
/api/v1/docs, Problem Details errors, cursor pagination, opt-in trusted cross-origin frontends. - Home and admin read models (ADR-0052, ADR-0053): course cards, the work list, search, admin
reports and the audit log, which records every administrator action and every CLI command that
changes the database. - Web app (ADR-0042, ADR-0043): Next.js, client-rendered, with a Ukrainian and an English interface.
Not in this release
- File uploads: the
fileassignment type and file and link items are designed (ADR-0023, ADR-0024)
but not built. - Any optional module, and an end-user CLI (ADR-0055).
- Published container images: the images are built on your server from the archive.