CLI tool
omeka/omeka-s avatar
omeka/omeka-s

omeka-s: a publishing system for collections that share a pool

Omeka S is a web publication system for universities, galleries, libraries, archives, and museums. It consists of a local network of independently curated exhibits sharing a collaboratively built pool of items, media, and their metadata.

522 stars176 forksPHPGPL-3.0

At a glance

What is it?
Omeka S is the web publishing system used by libraries, archives and museums, and its central idea is unusual for content management software. Each institution runs its own site, with its own curation and its own interface, and all of them draw from a shared pool of items, media and metadata. The readme is short, but the install and update procedures it does contain are unusually careful, and the update procedure is a small lesson in how to replace a web application without losing the parts that matter.
Who is it for?
Omeka S fits an institution that wants to present its own collections with its own editorial voice while sharing the underlying data with a network of peers, and it fits a developer extending a system with a documented module and theme model. It does not fit a project that needs a modern content management system with a rich plugin ecosystem.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 4 days ago.
What is it written in?
Mainly PHP, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 20, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The idea, and who it is for

The readme's description is two sentences, and the second one is the whole design.

Omeka S is a web publication system for universities, galleries, libraries, archives and museums. It consists of a local network of independently curated exhibits sharing a collaboratively built pool of items, media and their metadata.

So it is not one big site with everybody's content in it. It is many sites, each run by the people who own the collection, each with its own front end, its own design and its own editorial decisions, all drawing items from a shared pool that is built collaboratively.

That is a genuinely different architecture from the usual content management arrangement, and it solves a problem that museums and libraries actually have. A national archive with fifty partner institutions does not want one institution to curate everything, and it does not want fifty disconnected catalogues either. The pool is the collaboration; the local exhibit is the local voice.

And the pool is not just a pile of files. The repository's topic tags include linked data, and the dependency list includes a library for reading and writing resource description formats, which is what turns a shared pool into a shared description. The front end also includes two deep-zoom image viewers, which is the tool you need for a manuscript or a map that should be examined at high resolution rather than looked at.

The institution behind it is a non-profit corporation for digital scholarship based in Virginia, and the readme is careful about its legal position. The source code is under the copyleft licence, the name is a registered trademark, third-party copyright in the distribution is noted where it applies, and all rights not expressly granted are reserved. That is a more precise statement than most projects make about the difference between the code and the name, and it matters for a system that institutions deploy under their own brands.

Two install routes, and the steps they share

The install section gives two procedures, and reading them together tells you how the project expects to be deployed.

The first is from the source repository, and it is the longer one. It assumes a JavaScript runtime and its package manager are installed, it clones the repository into the web server's document root, and then it runs a first-time setup that is two commands: one to install the dependencies and one to run an initialisation task.

sh
$ npm install
$ npx gulp init

Then there is a step that is the part everybody forgets on a first install: open the database configuration file and enter the database user name, password, database name and host, and note that the user and the database have to exist before that step rather than after it. Then the files directory has to be writable by the web server, and then you open the site in a browser to finish.

The second route is a release archive, and it is much shorter: download the first asset listed on the releases page, edit the same database configuration file, make the same directory writable, and open the site. No JavaScript toolchain, no initialisation task.

So the difference is whether you want the source or the artefact, and the three steps they share are the same three: the database credentials, the writable directory, and the browser.

That last one is a nice piece of design. The installation is not finished by a command; it is finished by loading the site, and the site then walks the administrator through the remaining configuration. Which means the same completion flow serves both routes, and a person who installs from a release and a person who installs from the source end up in the same place.

And the readme points out where the application code lives, under a directory named for the application, next to the modules and the themes. That is the extension model in one sentence: the core is an application, the plugins are modules, and the appearance is a theme.

Updating, and the four directories to save

The update section opens with a warning in italics that is worth taking literally: make a backup copy of your entire site and its database.

Then there are two procedures again, and the second one is the more interesting because it is a complete recipe for replacing a web application without losing what matters.

The source route is four steps. Pull the changes, using the branch that carries the latest releases rather than the development branch. Run a task that makes sure the dependencies are up to date. Compare the local configuration file against the distributed version of it, because some defaults may have changed and you may have to reconcile them, for instance a path particular to your server or the development mode settings. And then open the site and run the migrations that are needed.

That third step is the one that catches people. The distributed configuration file is the template, and the local one is yours, and a version bump can change the template in ways your copy has not absorbed. The readme says to compare them, and gives two examples of what might differ. A system that ships a diffable template for its configuration and tells you to compare it is doing the right thing, because the alternative, a configuration file that the update silently overwrites, loses every local setting.

The release route is longer and more physical. Download the archive. Copy the configuration directory, and the modules and themes directories, and the files directory. Remove all the application files and replace them with the ones from the archive. Put back your configuration file and the three directories you copied. And then run the migrations.

So the rule is: everything the application owns is disposable and comes from the archive, and four things are yours and are saved and restored by hand. The files directory in particular holds the uploaded media, and the modules and themes directories hold the local customisations, which are exactly the things a careless update destroys.

The readme does not say that last part explicitly, but the shape of the procedure says it: the four saved directories are the four that are not reproducible from the archive.

The build system, and the front end

The front end is built with a task runner, and the manifest shows the whole toolchain in one place.

The build dependencies are the pipeline itself: the task runner and its command line, a stylesheet compiler with a post-processor plugin, a renamer, a search and replace step, a zip step, a minifier for arguments, a glob helper, a post-processor, a prefixer, and a date formatting library. The last one is a small curiosity worth noting, because a date library in a build toolchain usually means the build stamps something with a date.

There is a task to create the release archive, which stores the result in a build directory, and a flag that omits the development dependencies of the PHP side so the package is smaller and suitable for end users. And the readme says the official releases follow exactly the same process, from a new clean checkout. That is a good practice: the artefact that people download is produced by the same command that a contributor can run, so there is no separate release machine whose configuration nobody else can reproduce.

The runtime dependencies are the interesting part, because they say what the interface is made of. Two of them are the deep-zoom image viewers, and having both is normal: one is the older and more capable of the pair and the other is the newer, and shipping both means the site can choose per use case. Then there is a dropdown library, a tree widget, a gallery, a sortable list library, a small table library, and a version comparison helper, which is there for the migration logic that has to decide whether a stored record needs upgrading.

The browsers list is short and conservative: the versions used by more than a small share of traffic, and the versions used by more than a small share in one country. Which tells you the project optimises for the institutions it serves rather than for the widest possible audience, which is the right trade for a cultural heritage system used by a few thousand organisations and their visitors.

And the whole front end is built with a stylesheet preprocessor and a grid system from that era, which is worth a sentence in itself: a system that universities deploy and keep for a decade is not going to have its asset pipeline rewritten every two years, so the toolchain ages with the installations.

The libraries, the standards and the legal position

The libraries section lists five and says, honestly, that these are among others.

A framework for the application layer, an object relational mapper, a library for reading and writing resource description formats, the test framework, and a JavaScript library. The third of those is the one that matters for this project, because it is what lets the shared pool be described in a way that other systems can consume, and it is why the linked data tag is on the repository rather than being aspirational.

The development standards section names three commitments. The coding style follows a published guide from the framework's own project, which is a good choice because it means the code reads like the surrounding ecosystem. The branching model is git-flow, which is a heavyweight model by today's standards and a sensible one for a project with many maintainers and long-lived branches. And the version scheme is semantic versioning, second edition.

The copyright section is the most careful paragraph in the readme. The code is copyright a non-profit corporation for digital scholarship and is distributed under the copyleft licence, with the full text in the licence file. The name is a registered trademark of that corporation. Third-party copyright in the distribution is noted where it applies. And all rights not expressly granted are reserved.

Read together, those four statements say something particular. The copyleft licence guarantees that anyone who modifies and redistributes the software releases the modifications. The trademark protects the name, which is what an institution puts on its own site. The third-party note handles the libraries whose licences require attribution. And the reservation of rights covers everything else, which in a project that also has documentation, a user manual and a brand is not nothing.

It is a mature position for a project that has been running for more than a decade, and it is the kind of legal clarity that makes an institution comfortable deploying it.

The repository, and the file layout

The top level of the repository is the deployment itself, and every entry has a job.

There is the entry point for the web server and the bootstrap file it includes, and a command line configuration file so that the same code can be driven from a terminal. There is the application directory, the modules directory, the themes directory, and the configuration directory, which together are the three extension points the readme mentions. There is the files directory, which holds the uploaded media and which the install instructions insist must be writable by the web server. There is a logs directory.

Then there are the files that a maintainer touches rather than a deployer. The composer manifests, which pin the PHP dependencies. The package manifests, which pin the front end ones. The build file for the task runner. And a set of configuration templates: a distributed Apache configuration file whose local counterpart is not checked in, and a coding standard configuration with its own module directory, which is how a project that enforces a published style guide does it without asking every contributor to install the tool in the right way.

And there is a directory whose name is a shorthand everybody in open source recognises. It is the configuration for a hosted translation service, and its presence says that the interface is translated and the translations are maintained somewhere with a workflow around them, rather than in a file that only one person can edit.

So the layout is the deployment, the extension points, the build, and the housekeeping. There is no separate development environment in the tree, no container file, and no infrastructure configuration, because this is a system that goes into an existing web host's document root, with a database that somebody creates by hand. That is a deliberate choice about what this software is: an application you install into a server you already have, not a service you run in a platform.

Editorial conclusion

Omeka S fits an institution that wants to present its own collections with its own editorial voice while sharing the underlying data with a network of peers, and it fits a developer extending a system with a documented module and theme model. It does not fit a project that needs a modern content management system with a rich plugin ecosystem. Verify first which of the two install routes you want, because the one from source is the one that continues to be maintained, and that you keep a copy of the four directories the update procedure tells you to save, because the release route replaces everything else in the tree and those four are what you put back afterwards.

Frequently asked questions

What is Omeka S?

It is a web publication system for universities, galleries, libraries, archives and museums, with a linked data component. Its model is a local network of independently curated exhibits that share a collaboratively built pool of items, media and their metadata, so each institution keeps its own voice and its own interface.

How do I install Omeka S?

Either from the source repository, which needs a JavaScript runtime and its package manager, a clone into the web server's document root, and a dependency install and an initialisation task, or from a release archive, which needs none of that. Both routes then need the database credentials entered in the configuration file, the files directory writable by the web server, and a visit to the site in a browser to finish.

What has to be backed up before updating Omeka S?

The entire site and its database, as the readme says in italics. For the release archive route the procedure saves four directories by hand, the configuration, the modules, the themes and the files, removes everything else and replaces it with the archive, and then puts those four back. The uploaded media and the local module and theme customisations are the parts that the archive cannot supply.

How is the Omeka S release archive built?

With a task in the build tool, which stores the archive in the build directory, and a flag that omits the development dependencies of the PHP side for a smaller package. The readme says the official releases follow the same process from a new clean checkout, so the published artefact is produced by the same command a contributor can run.

What are the development standards of the Omeka S project?

The coding style follows the framework's own published style guide, the branching model is git-flow, and the version scheme is semantic versioning. The readme also sets out the legal position precisely: the code is under the copyleft licence, the name is a registered trademark of the corporation that holds the copyright, third-party copyright is noted where it applies, and all other rights are reserved.

Official sources

  1. Issues
  2. License: GPL-3.0
  3. omeka/omeka-s on GitHub
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/omeka-omeka-s.svg)](https://hysenlabs.com/projects/omeka-omeka-s)

Was this useful?