Repository navigation
⭐️ If you find Artemis valuable, please consider giving our GitHub project a star! ⭐️
Highlights
-
🤖 Instructors can let coding agents work in Artemis on their behalf: With a personal access token, an agent such as Claude Code or Codex can manage competencies, announcements, exercises and lectures through a documented part of the REST API or a small MCP server. Content an agent creates gets a release date in the future. See #14417.
-
📈 A public dashboard shows how much an Artemis instance is used: The new page
/usageshows anonymous numbers for the last four semesters, such as courses, students, submissions, builds, exams and Iris messages. All numbers are aggregated from existing data, without new tables or tracking. See #14437, #14461, #14463, #14472, and #14476. -
🧪 More languages support sequential test runs and static code analysis: Sequential test runs, available before only for Java, Kotlin and Haskell, now also work for nine more languages. Static code analysis now works for Kotlin, C#, Go and Swift on LocalCI, so LocalCI supports every feature that Jenkins supports. See #14481, #14488, and #14466.
-
📄 Instructors can hide slides without uploading the PDF again: The server now builds the student version itself, which avoids new versions, repeated splitting and repeated Iris ingestion. The instructor preview no longer shows duplicated or outdated slides after saving. See #13212 and #14448.
-
🗂️ The exercise details page for instructors is easier to scan: All exercise types share grouped headings and actions. Programming exercises show repository and build details side by side. See #14500.
-
⚙️ User settings use a sidebar: The many separate settings tabs are now grouped into Profile, Credentials, Learning, AI Experience and Exercises, in a sidebar like the course view and administration. See #14475.
-
🗓️ Editing a tutorial group's schedule keeps its session data: Extending a schedule regenerated every session, which lost recorded attendance and cancellations. Existing sessions are now kept and only the missing ones are added. See #14408 and #14407.
Improvements
Assessment: Suggest students while typing the login for an external submission by @LukaPetrovicTUM in #14468Athena: Add a dedicated Athena settings page by @musaberkay in #13809Exercises: Redesign instructor exercise details by @krusche in #14500Lectures: Update PDF slide visibility without reuploading by @bassner in #13212Programming exercises: Support Kotlin sequential test runs and Swift static code analysis with LocalCI by @krusche in #14466Programming exercises: Enable sequential test runs for nine more languages by @krusche in #14481Programming exercises: Add static code analysis for Kotlin, C# and Go by @krusche in #14488Usability: Renew user settings sidebar by @marlonnienaber in #14475Usability: Improve course overview and notification layouts on small screens by @krusche in #14497General: Add agent access for instructors with an MCP server by @krusche in #14417General: Add a public usage dashboard with anonymous semester numbers by @krusche in #14437General: Add builds, Iris messages, communication and tutorial groups to the usage dashboard by @krusche in #14461General: Add exams and competencies to the usage dashboard by @krusche in #14463General: Add course enrollments and exam registrations to the usage dashboard by @krusche in #14472General: Explain the usage dashboard numbers in tooltips and add staff, lecture units and exam participations by @krusche in #14476
Bugfixes
Assessment: Fix the narrow feedback text box in text exercise assessments by @musaberkay in #14483Assessment: Fix tutor participation graph alignment and contrast by @krusche in #14501Athena: Keep Athena's own title for a non-graded programming suggestion that references a line by @musaberkay in #14263Lectures: Prevent duplicated and stale slides in the instructor preview by @krusche in #14448Notifications: Preserve read state for course messages by @krusche in #14459Programming exercises: Use the Node 24 image for JavaScript and TypeScript by @krusche in #14424Programming exercises: Fix duplicate code-style deductions and build detail access by @krusche in #14453Programming exercises: Run only one test file per stage in Ruby sequential test runs by @krusche in #14495Programming exercises: Add the student workspace to the lock files of the JavaScript and TypeScript tests by @krusche in #14499Tutorial groups: Fix missing attendance indicator in the sidebar by @krusche in #14425Tutorial groups: Fix edit, import, and configuration bugs by @az108 in #14407Tutorial groups: Preserve session data when editing schedules and sessions by @az108 in #14408General: Fix exercise titles, date sorting and connection warnings by @krusche in #14452
Development
Important information for administrators
-
⚠️ Deploy the matching Pyris version before Artemis: Pyris callbacks are now authenticated with signed tokens, so first deploy Pyris from edutelligence#1361, which also works with 10.5. Then stop every Artemis node that servesapi/iris/internal/**before starting 10.6, without running old and new nodes side by side. See #14382. -
⚠️ Rate limiting is now on by default:artemis.rate-limiting.enableddefaults totrue, which limits registration, password reset, login and git authentication per client address; set it tofalseto restore the old behavior. Make sure the reverse proxy forwards the real client address, otherwise all clients share one limit. See #14431. -
📉 Sentry is replaced by a built-in error analysis: The
sentry.*properties andSENTRY_DSNare ignored and can be removed. Server and client errors are now written to the server log and grouped under Administration > Error Analysis, without being stored in the database. See #14430, #14431, and #14432. -
🗓️ Jenkins and MySQL will be removed in Artemis 11: Artemis 11 is planned for March 2027, and a new Jenkins to LocalCI migration guide describes the move, though it has not yet been tested with a real migration. The startup telemetry now also reports the CI system, the distributed data provider and the websocket broker. See #14464.
-
🤖 Agent access is off by default: Enable it with
artemis.agent-access.enabled=true, after which instructors and editors, but not administrators, can create tokens that expire after at most 90 days. Token calls go to a dedicated audit log, and administrators can list and revoke the tokens of any user. See #14417. -
🐳 New default build images for Kotlin, Go, JavaScript and TypeScript: New exercises use
artemis-kotlin-docker:v1.0.0,artemis-go-docker:v1.1.0andartemis-javascript-docker:v1.2.0, so installations that set these images themselves need to update them. Existing exercises keep their stored image and therefore get no static code analysis. See #14488 and #14424. -
📄 Slides record the file they were split from: A migration adds and backfills
slide.attachment_versionandslide.attachment_sha256_hash, and both a Liquibase rollback and a WAR rollback to 10.5 work. A new hourly job (artemis.lecture.student-version-repair.interval) creates missing student versions of PDFs. See #13212. -
🔑 OIDC logins work on multi-node installations: The pending login is now kept in the distributed data, so the identity provider's callback can reach any node. Deployments served over plain HTTP need
jhipster.security.authentication.jwt.cookie-secure: false. See #14402.
Security hardening
- Authenticate Pyris callbacks with signed tokens and use plain run ids by @bassner in #14382
- Require course checks before writing messages by @HannesHarbeck in #14261
- Improve input validation of build log parsing by @krusche in #14492
- Update vulnerable dependencies by @krusche in #14494
API, client architecture, and code quality
- Migrate assessment and exercise management to TUM AET UI by @krusche in #14400
- Move lectures and tutorial groups to TUM AET UI by @krusche in #14404
- Use the generated Angular client in tutorial groups by @WoH in #14117
- Use generated APIs for tutorial group management lists by @WoH in #14433
- Use generated tutorial group titles in breadcrumbs by @WoH in #14435
- Enforce length cap on the code of conduct by @HannesHarbeck in #14076
- Fix open sonar issues by @krusche in #14436
Operations, logging, and build
- Remove sentry error reporting by @krusche in #14430
- Report client errors to the Artemis server by @krusche in #14431
- Add an error analysis dashboard by @krusche in #14432
- Keep OIDC authorization requests in the distributed store by @bensofficial in #14402
- Preserve build-agent state during runner refresh by @krusche in #14428
- Cache files whose names do not change for only five minutes on test servers by @bensofficial in #14498
Documentation
- Document the removal of Jenkins and MySQL and report the CI system and middleware by @krusche in #14464
- Check the documentation against the code and review it regularly by @krusche in #14477
- Check versions, defaults, commands, routes, images and the glossary in the documentation by @krusche in #14484
- Update the platform comparison with recent features by @krusche in #14479
- Render the documentation screenshots from the demo course by @krusche in #14485
- Render more documentation screenshots from the demo course by @krusche in #14503
- Document lecture citations, point-outs and the combined view by @vivienxr in #14169
Tests and CI
- Require sonar quality gates before merging by @krusche in #14427
- Remove PR image cleanup and fix affected test diagnostics by @krusche in #14423
- Skip server tests when only stylelint configuration changes by @krusche in #14429
- Fix flaky server tests failing on unrelated threads by @krusche in #14426
- Fix the verify course guard test after the course role checks by @krusche in #14469
- Stabilize error analysis pagination tests by @krusche in #14457
- Start the error analysis tests from an empty analysis by @krusche in #14470
- Use the test repositories in PublicUsageStatisticsTest by @krusche in #14480
- Install the pinned pnpm in the E2E container if the image has no corepack by @krusche in #14444
- Prevent authentication throttling in isolated e2e stacks by @krusche in #14449
- Switch off the rate limits in the e2e stacks by @krusche in #14456
- Preserve setup failures during course exercise e2e cleanup by @krusche in #14450
- Restore e2e report ownership after container execution by @krusche in #14455
- Fix the e2e checkout on runners with leftover output and remove stale Javadoc by @krusche in #14478
Full Changelog: 10.5...10.6