Format id massing.project · version 2 · media type application/zip
A .mass file is one project: its model, all of its data, and its attachments, in a single file you
can copy, email, archive or check into version control. It is a plain ZIP archive. Everything
inside is either UTF-8 JSON or a standard AEC file format. There is no proprietary encoding anywhere,
and you do not need Massing to read it.
It was .mmproj through version 1. That name read as Microsoft Project to people who had never
seen it, which is the opposite of what it is — this container has never held a byte of XML or any
vendor format. An extension that misleads about its own contents is a defect, so it became .mass.
Version 1 .mmproj files still open. A rename that orphans everything anyone already saved is
not a rename; it is data loss. Massing reads v1 forever and writes v2 only.
project.mass (ZIP)
├── manifest.json what this container is + a full inventory + what was excluded
├── README.txt plain-English explanation, written INSIDE the file
├── project.json id, name, origin, source IFC file name
├── data/<table>.json one file per table; a JSON array of row objects, keys = column names
├── geometry/
│ ├── <name>.ifc the source model — open it with any IFC tool
│ └── model.frag pre-converted geometry tile for fast viewing (derived, regenerable)
└── blobs/<storage key> file attachments under their original keys
The README is written into the archive on purpose. Documentation that lives in a repository is documentation the person holding the file does not have — somebody who unzips this in ten years with none of our software should be able to work out what they are holding.
Without any of our code:
- Unzip it. It is an ordinary ZIP.
- Read
README.txt. It describes the layout in plain English. - Read
manifest.jsonfor the format id, version, an inventory of every entry with its size, and — the field most containers omit —excluded, naming what deliberately did not travel. - Open
geometry/*.ifcin any IFC viewer. That is the source of truth for the building. - Read
data/*.jsonas ordinary JSON arrays. Rows reference building elements by IFC GlobalId, never by a viewer-local or database-local id, so any row can be tied back to an element in the IFC — across exports and across tools.
| Field | Meaning |
|---|---|
format |
massing.project |
version |
2 |
extension |
.mass |
exported_at |
UTC ISO-8601 |
project |
{id, name} at export time |
tables |
row count per table actually written |
has_frag |
whether a pre-converted geometry tile is present |
entries |
every path in the archive with its uncompressed size |
excluded |
{tables, why} — see below |
reads |
the format versions this build accepts |
users, audit_log, app_settings, connections and the migration marker never travel.
They are account- or machine-specific: they belong to an installation, not to a project, and
importing them would overwrite the destination's own accounts and credentials. This is listed in
excluded with the reason rather than left to be discovered, because a container that silently
drops them looks complete and is not.
- A fresh project id is minted on every import, and row primary keys are regenerated (with
topic_idand modulerecord_idforeign keys remapped). A container can therefore be cloned into the same database, or moved to another machine, without collisions. - A container from a newer build is refused, not partially read. It may hold structures an older build would silently misinterpret, and a half-imported project is worse than a declined one: the user believes they have their data.
- An unrecognised format id is refused, and the error names what was expected.
.mass is a bespoke container today. The intended direction is that it becomes an
ISO 21597 Information Container for linked Document
Delivery — payload documents plus RDF linksets — so a .mass is a standards-conformant ICDD
container carrying our extension, rather than a format only we can read. That is tracked as
R28-ICDD in roadmap.md; rdflib (BSD-3) is approved for it, and the licensing is
recorded in ATTRIBUTIONS.md.
The reasoning is the same bet this platform already made with BCF: a bespoke container round-trips with nothing; a standard one round-trips with everyone.
Schedules arrive as Primavera P6 .xer (tab-delimited) or PMXML, or Microsoft Project MSPDI XML.
Those are import on-ramps, not storage — every real contractor has one of those tools, and
refusing to read their file means refusing the customer. .mpp is deliberately unsupported: it is a
proprietary binary, and the right answer is to export XER or CSV.
Once imported, a schedule lives in the model as native IFC 4D — IfcWorkSchedule / IfcTask /
IfcTaskTime, bound to elements by IfcRelAssignsToProduct — so it travels inside the IFC and any
openBIM tool can read it. That is the modern, standard, vendor-neutral home for schedule data, and
it is where ours lives.