Skip to content

Catalogue format

A QUniLator subscribes to a list of catalogues — the project’s own, a user group’s, an operator’s private one — so publishing your own is a first-class thing to do, not a fork of this site.

A catalogue is a static JSON file on any web server. There is no software to run.

This is the shape this site publishes at /catalog/v1/index.json and the shape QUniLator’s Catalogue screen reads. The schema field is what lets it grow: a reader refuses an index whose schema it does not know.

{
"schema": "qunilator-catalog/1",
"name": "The QUniLator project's own catalogue",
"updated": "2026-08-05",
"configurations": [
{
"id": "211bsd",
"title": "2.11BSD on the RA81",
"summary": "Multi-user Unix on an emulated UDA50 MSCP disk, with DELQA Ethernet.",
"bus": "qbus",
"devices": ["UDA50", "RA81", "DELQA"],
"guest": "2.11BSD",
"page": "https://qunilator.com/configurations/211bsd/",
"download": {
"url": "https://…/211bsd.qcfg.zip",
"bytes": 37139129,
"sha256": ""
},
"images": [{ "path": "du/2.11BSD_qbone.dsk", "bytes": 1000090112 }],
"doc": { }
}
]
}
FieldWhy QUniLator needs it
busA UNIBUS configuration names devices a QBone does not have. QUniLator offers only what it can run.
cpuWhat the backplane must carry beyond the bus — the processor class, memory, a clock. Free text, and optional: the board cannot sense what CPU sits in a backplane, so where bus is checked by the machine, this is shown for the operator to judge.
devicesShown before download, so an operator sees what the machine carries.
bytesMedia runs to hundreds of megabytes. QUniLator reports progress against this rather than downloading blind.
sha256Verified before import. A truncated bundle must fail loudly, not half-import.
pageWhere a human reads the full documentation.
imagesThe bundle’s disk images as images-root subpaths with sizes — so QUniLator can say which are already on the board and how much space an import still needs, before downloading anything. May be omitted.
docThe structured documentation below.

Every configuration carries its own documentation, in named fields rather than free prose — so a catalogue can say what a machine is for without parsing anybody’s Markdown, and a form can validate it.

Field
motivationWhat this machine is for.
usageA list: how to log in, what to try first.
bugsA list of known problems. May be empty.
links{label, url} pairs — manuals, tickets, sources.
maintainer{name, contact}. Who to ask.
addedYYYY-MM-DD.

The fields carry links and lists, not full Markdown: enough for a usage list and a links section, little enough to render without sanitising a document somebody else wrote.

A configuration arriving without documentation, or short a field, is still imported and marked undocumented — every configuration that exists today is one, and refusing them would make this a wall rather than a habit. QUniLator says what is missing, and a catalogue may too.

Two requirements beyond putting the file somewhere:

A route from the board. QUniLator fetches the index and the bundle itself, so the board — not just the operator’s browser — needs to reach your server. Plain https on any host works; a bundle url may also be relative to the index (.. is not resolved — write such a URL absolute).

Stable URLs for bundles. QUniLator records what it has imported by id and checksum. Re-publishing a bundle at the same URL with different contents makes QUniLator’s record wrong — give the new one a new id, or a versioned URL.

Not in git. A .qcfg.zip carries its media and runs to tens or hundreds of megabytes, so bundles are published as release assets and the catalogue points at them. What is committed is the entry: the metadata, the documentation, and the checksum of the bundle it names.