MUCODI
MuCoDi · Documentation

Build a museum platform, documented end to end.

Everything your team and your agency need: connecting collections, translating content, theming the site, building pages, and the API beneath it all.

Getting started

Platform overview

MuCoDi is a headless platform for museums. It connects to your collection system, structures the data, and gives you the tools to publish it — as a website, an online collection, AI search, interactive maps, and in-gallery screens.

You manage everything from one place. Your collection stays the source of truth in your existing system; MuCoDi keeps a live, structured copy and hands it to every audience-facing surface through a single API. Non-technical staff work in the page builder; developers (yours or your agency's) work against the API.

  1. 01
    Connect your collection system — Axiell, MuseumPlus, Primus, TMS or a custom source.
  2. 02
    Map each field to a MuCoDi content type once; syncing is automatic from then on.
  3. 03
    Curate content — translate objects with AI assistance, and curate content like themes, periods and exhibitions.
  4. 04
    Build pages with the component-based page builder and theme them to your brand.
  5. 05
    Publish to web, kiosks and search — all reading from the same API.
Who does what
Curators and communications staff live in the page builder and content editor. The API and theming layer is where a developer or agency extends the platform — neither side blocks the other.
Getting started

How it fits together

Three layers, one pipeline: your sources feed the MuCoDi core, which publishes to everything your visitors see.

  1. Sources — your CMS / collection database, archives, and any other data source via the API.
  2. Core — import, curate, model your data, build and theme the site, then publish. The API sits underneath every step.
  3. What visitors see— online collections, archives, AI search, touchscreen & QR, interactive maps, exhibition websites, or a custom experience you build on the platform.
One source of truth
A record is mapped once. Change it in your collection system and it updates everywhere it appears — website, kiosk, and search — without re-publishing each surface.
Content

Adding files & collections

Collections come in through a connection to your existing system. Individual files — images, documents, 3D models, audio — are added in the media library and attached to records.

Connect a collection source

  1. 01
    In Settings → Sources, choose your system (Axiell, MuseumPlus, Primus, TMS) or Custom API.
  2. 02
    Authenticate with the credentials your system provides. MuCoDi only ever reads from the source.
  3. 03
    Map each source field to a MuCoDi content type and field. Save the mapping — it is reused on every sync.
  4. 04
    Run the first import. Progress, retries and the sync queue are visible in Sources → Activity.
From source to live site in weeks, not months
Because the mapping is configuration rather than a custom build, getting from a connected source to a live collection is simply faster and easier.

Add individual files

Drag files into the media library or upload in bulk. MuCoDi generates responsive derivatives and IIIF tiles for high-resolution images automatically.

  1. Supported: JPEG, PNG, WebP, TIFF, PDF, MP3/MP4, glTF/GLB for 3D.
  2. Each file carries its own metadata, alt text and rights statement.
  3. Attach a file to any record or page block by reference — never by duplicating it.
Attach media via the API
POST /v1/objects/{id}/media
{
  "mediaId": "med_8f2a1c",
  "role": "primary",
  "altText": "Maritime compass, brass, 17th century"
}
Content

Managing translations

MuCoDi is multilingual at the content-type level. Every text field can hold a value per locale, with a defined fallback so nothing ever renders empty.

Set up locales

  1. 01
    In Settings → Languages, add the locales you publish in (e.g. da, kl, en).
  2. 02
    Pick a default locale — this is the fallback when a translation is missing.
  3. 03
    Optionally mark a locale as draft so it stays hidden from visitors until ready.

Translate content

Open any record or page and switch locale with the language selector. Fields show side-by-side with the default-locale value for reference. Imported collection fields can be machine-pre-translated and then reviewed by staff.

Fallback behaviour
If kl (Kalaallisut) has no value for a field, the visitor sees the default-locale value rather than a blank — so a half-translated record is still complete and usable.
Request a specific locale
curl https://api.mucodi.co/v1/objects/obj_1763 \
  -H "Authorization: Bearer $TOKEN" \
  -H "Accept-Language: kl, da;q=0.8, en;q=0.5"
Building

Themes

A theme controls how your site looks — type, colour, spacing and the styling of every component — without touching content. Start from a theme, restyle it, and extend it with new functionality.

What a theme defines

  1. Design tokens — typefaces, colour palette, spacing scale, radii and shadows.
  2. Component styles — how the collection grid, object detail, hero and navigation render.
  3. Layout — page widths, header/footer structure, breakpoints.

Edit tokens visually in Design → Theme, or take over with custom CSS and components for a fully bespoke look. Themes are versioned, so you can preview and roll back.

Theme tokens
{
  "color": { "ink": "#0e0e0f", "paper": "#f4f2ec", "accent": "#d61a37" },
  "font":  { "display": "Instrument Serif", "body": "Geist" },
  "radius": { "card": "0px" },
  "space":  { "section": "76px" }
}

Components live in the theme

A theme is more than styling — it is a package that also contains the site’s React (Puck) page-builder components. Tokens, layout, component styles and the components themselves all travel together in one bundle.

Download, edit & re-upload

  1. 01
    Download the theme as a package from Design → Theme → Export.
  2. 02
    Edit it locally — adjust tokens, restyle components, or add new React/Puck components to the bundle.
  3. 03
    Upload the package back in. Themes are versioned, so you can preview and roll back.
Theme & extend
Because the components are packed into the theme, “theming” and “adding capability” are the same round-trip: export the theme, change its styles and components, and upload it again.
Building · inside the theme

Page builder & components

The components your pages are built from live inside the theme package (above). Each block — collection grid, object detail, artist directory, your own custom hero — is a React component with typed props, edited in a visual drag-and-drop page builder.

Using the page builder

  1. 01
    Create a page and drag components from the palette onto the canvas.
  2. 02
    Select any block to edit its typed props in the side panel — no code.
  3. 03
    Bind a block to live data (e.g. “objects where period = Bronze Age”) so it updates as the collection does.
  4. 04
    Preview across breakpoints, then publish.

Built-in & custom components

Ship with the components we provide, or have your developer add new ones to the theme package. A component declares its props; the page builder renders the right controls automatically. The editor runs on Puck, so custom React components drop straight into the same drag-and-drop surface your staff already use — and travel with the theme whenever it is exported.

Register a custom component
export const config = {
  components: {
    GalleryHero: {
      fields: {
        title:   { type: "text" },
        object:  { type: "external", fetchList: searchObjects },
        layout:  { type: "radio", options: ["left", "centered"] },
      },
      render: ({ title, object, layout }) => (
        <Hero title={title} image={object?.image} align={layout} />
      ),
    },
  },
};
Typed props, safe edits
Because every prop is typed, staff can only enter valid values — a layout field offers the allowed options, an object field opens a collection search. The page can't be put into a broken state.
Developers

API platform

Everything in MuCoDi is reachable through a REST API documented with an OpenAPI 3.1 spec. The page builder, search and kiosks all use the same endpoints your developers do.

Authentication

Requests are authenticated with a bearer token from Settings → API keys. Tokens are scoped (read-only, content, admin) so you grant only what an integration needs.

Authenticated request
curl https://api.mucodi.co/v1/search?q=maritime+navigation \
  -H "Authorization: Bearer $TOKEN"

Core endpoints

GET
/v1/objects
List & filter collection objects
GET
/v1/objects/{id}
Fetch a single object with media & relations
GET
/v1/search
Natural-language & faceted search
POST
/v1/objects/{id}/media
Attach a media file to an object
GET
/v1/pages/{slug}
Rendered page tree for a route
GET
/v1/openapi.json
The full machine-readable spec

Example response

GET /v1/search
{
  "total": 47,
  "results": [
    {
      "id": "obj_1763",
      "title": "Maritime compass",
      "period": "17th century",
      "image": "https://cdn.mucodi.co/med_8f2a1c/800.webp"
    }
  ]
}
Hand it to your developers
Import /v1/openapi.json into Postman, an SDK generator, or your editor. Your team never has to see a line of code; your developers get a fully typed contract.
Need a hand?Book a walkthrough →info@mucodi.co