Dear all,
If you follow the projects development work (https://gitlab.com/OsloMet-ABI/nikita-noark5-core), you will know that the work continues, albeit slowly. Today we tagged a 0.8 release. The description below in no way reflects the actual effort that has gone into it. Looking ahead to a version 1.0, the release today is more like a 0.95 release, as that is how close we are to reaching 1.0. I don't think there are any new technical features planned, just tying up loose ends and small bits and bobs.
Recently we have been using language models to help with coding. These have been surprisingly good, but it is clear to me that they work best under strict guidance and on narrow, focused tasks. I have been using Claude, and Petter has been using Qwen 3.6. I tried Fable, as I wanted to experiment with OData, and found Fable very competent. It also found a very nasty security bug that could have allowed someone to bypass multitenant and group limitations.
Using language models is controversial, and there may be issues later with regard to copyright. I chose to use Claude because I have used it for prototyping in other projects, and it works well. The main reason for using them in this project is to actually move the codebase forward. Nikita had accumulated a lot of technical debt and needed many smaller and larger refactoring jobs to address it. Some changes did not result in new or changed functionality, but reduced coupling and tightened cohesion. Previously, small changes would fan out and touch large portions of the codebase. I look at the codebase now and think it is reaching a nice level of maturity and stability.
The two most nerdy additions that have been fun to land are:
1. A systemId endpoint that lets you submit a UUID/systemId. If an object with that systemId exists and you have access to it, it will be returned to you. This works irrespective of type (mappe, klasse, registrering).
2. Full-text search functionality using the OData $search parameter. We use PostgreSQL tf*idf indexing to provide full-text search on both database contents and file contents (Tika handles the parsing). The advantage of using PostgreSQL for both the database and the full-text index is that it allows us to combine $filter entity filters with $search. This means you can start at any point in the Noark hierarchy and search below that point, for example, starting at arkiv or mappe. You can also add filter conditions using boolean expressions alongside $search, for example:
mappe?$filter=contains(tittel, 'tilskudd') or contains(tittel, '2026') &$search=Fotball+VM
This is a really powerful addition to Nikita.
What's next, I am not sure. A lot of new features were added, so I expect there could be some bug reports. I have a lot of teaching to do this autumn, so I will not have time to do any development work (I never really did anyway). We are developing a new course called document forensics, and that will consume my time. The National Archives did not approve Nikita as a Noark 5 Core. The basis for rejection and feedback was very weak. To be honest, I don't think formal approval ever was important . We use nikita in teaching at OsloMet and it is a solid teaching reference for so many topics. And the two examples above show how it can be used to explore the technical side of what is possible. I had hoped that the National Archive would have published XSD for Noark 5v6, but alas nothing has been published to their GitHub (https://github.com/nasjonalarkivet/schemas/tree/master/N5) as of today. So, we have a Noark 5.6 standard, but no corresponding XSD.
Thanks to everyone who has contributed to the latest release!
Thomas
PS. We will soon move the codebase over to https://codeberg.org/noark, which, by the way, is a great resource that gathers a lot of interesting Noark realted stuff.
PPS: Here are the release notes.
Release 0.8 2026-07-07 (2a239e811cc5c9c1675ff1562a18341262a34eaa) ------------------------
Platform and runtime: * Upgraded Spring Boot from 2.6.1 to 4.1.0, migrating from javax to jakarta namespace throughout the codebase. * Raised minimum Java version from 11 to 21. * Switched default development base image to Debian Stable (trixie). * Added Woodpecker CI support alongside existing GitLab CI. * Added JaCoCo code coverage reporting (available under target/site/jacoco/ after build).
Security: * Replaced username/password authentication with Keycloak/JWT. Removed BCryptPasswordEncoder and username/password login. * Integrated Keycloak as identity provider; updated to Keycloak 26.0.6. * Introduced group-based access control: every entity is associated with one or more groups; users only see entities belonging to their groups. Unauthorized access returns 404 Not Found (not 403) to avoid information leakage. * User roles are now extracted from the full JWT token claims.
New features: * Fulltext search using postgresql tsvector * Screening/Classified with inheritence * Implemented chunked file upload for large documents. * Activated Spring Boot Actuator endpoints for monitoring. * Added H2 console in demo mode for browsing the in-memory database. * New cross-type systemId lookup endpoint: GET /api/arkivstruktur/{systemId} accepts any SystemIdEntity UUID and returns the correctly serialised entity regardless of its concrete type. * Added child type constraint on classification system, class and file. * Introduced support for outgoing email. * Added internal logging to change log and event log. * Added CORS filter.
Business rule enforcement: * Series is assumed closed when finalisedDate is set. * Files and Classes can only be associated at the lowest hierarchy level. * Records cannot be added to a closed File. * DocumentDescription is not added if the record is archived. * Records are only expanded if associated with a CaseFile. * New Class creation is restricted to users with the required role. * A Class must be open before assignment.
Bug fixes and serialization: * Fixed ChangeLog serialization: correct field names, added referanseEndretAv, removed duplicate systemID write. * Fixed too many systemID attributes appearing in serialized output. * UUID used consistently for entity deletion (was sometimes String). * Deleting a DocumentObject now also removes the file from disk. * Document store path stored relative to directory-store-name. * Fixed null link issue in HATEOAS link generation (getBaseRel() now throws NikitaMisconfigurationException if not implemented, rather than silently producing a broken link). * Added getBaseRel() to MeetingFile, MeetingRecord, MeetingParticipant and Part, which were missing overrides.
OData: * OData parser updated to latest ANTLR version. * OData filters now accept double quotes as well as single quotes. * Combined $top/$skip with $search is now supported. * Added missing OData parameters to templated objects. * Restructured: OData code moved to webapp package.
Database and persistence: * Removed MariaDB support; PostgreSQL and H2 are the only backends. * Brought in Flyway database migration framework. * Added BSMBase indexes for foreign key columns. * Added PostgreSQL bootstrapping scripts for organisations, administrative units and users. * UUID type enforced at the database level. * Renamed owned_by to organisation throughout.
Removed dependencies: * Removed ElasticSearch support entirely. * Dropped Testcontainers from the test suite. * Removed org.apache.poi (unused). * Removed jaxb-runtime (unused). * Removed joda-time (replaced by standard Java time). * Removed org.json (unused).
Testing: * Added controller tests for Series, Class, Metadata and AdministrativeUnit. * Added unit tests for 18 entity and utility classes. * Added integration tests for group-based access control covering GET, PUT, DELETE and child-creation scenarios. * Added FondsStructureTest: 25 integration tests covering all SystemIdEntity types via the new systemId lookup endpoint.
General: * Restructured and made source code more tidy with focus on coupling and cohesion * Removed stale, unused and dead code throughout. * Made actuator collection scriptable.
[Thomas John Sødring]
Thanks to everyone who has contributed to the latest release!
Fanstastiske nyheter, og et veldig godt utgangspunkt for videre arbeid med arkivet som API. Jeg ser det er en liten detalj som ble glemt i src/main/resources/application.yml, byggedatoen burde vært byttet fra 2021-04-22+0200 til 2026-07-08+0200. Jeg tror det eneste stedet dette vises er i system-endepunktet som viser versjonsinformasjon.
I tillegg ser jeg at en av endringene jeg er veldig glad for å ha med, S3-støtte, ikke fant veien til NEWS.
Bare så det er klart, versjon 0.8 av Nikita støtter S3 som lagringsløsning, der arkivdokumentene lages som objekter. :)
Jeg fortsetter å se på støtte for møter i Nikita, og har i tillegg et utkast til støtte for HTTP Basic Auth (i stedet for OIDC), som jeg bruker lokalt hjemme for å slippe å sette opp lokal OIDC-tjeneste kun for Nikita.