An open specification that stores a building model, including its 3D geometry, as plain tables. A .bos file is a zip of Parquet files, so the model opens in pandas, DuckDB, Power BI, or any tool that reads columnar data, with no vendor's API in the way.
What is in the repository
- The specification, as a small dependency-free C# project under
src/Ara3D.BimOpenSchema. The C# is the normative text; the schema itself is independent of language and of serialization format. - Sample files under
examples, generated from the Autodesk sample models. - An exporter for Revit 2025, on the releases page.
The reference implementation in .NET, with readers, writers, IFC conversion, DuckDB loading, and tests, is BIM Open Data.
The tables
Every .bos archive holds these Parquet files. The non-geometry tables describe what the building contains; the geometry tables describe what it looks like. Rename the file to .zip to look inside with any archive tool.
| File | Holds |
|---|---|
Entities.parquet data | One row per entity: an element, a type, a category, a level, a room, a material, or a document, with a name and an index into its category and type |
Descriptors.parquet data | Parameter definitions: name, units, group, and the value's type |
Parameters.parquet data | One row per parameter value: which entity, which descriptor, and an index into the value table for its type |
Strings.parquet, Numbers.parquet, Points.parquet data | The value tables that parameters point into, so each value is stored once |
Documents.parquet data | The source files the entities came from |
Relations.parquet data | Typed edges between entities: part of, member of, contained in, hosted by, has material, connects to, bounded by, and more |
Diagnostics.parquet data | Messages the exporter recorded while producing the file |
Instances.parquet, Transforms.parquet geometry | Each placed instance with its entity, mesh, material, and a hidden flag; transforms as translation, quaternion, and scale |
Meshes.parquet, VertexBuffer.parquet, IndexBuffer.parquet geometry | Triangle meshes as flat vertex and index buffers, shared between instances |
Materials.parquet geometry | Red, green, blue, alpha, roughness, and metallic for each material, one byte each |
How the specification is written
Five C# files define the tables and nothing else. BimOpenSchema.cs holds the entity, descriptor, parameter, document, and relation records and the enums for parameter and relation types. BimGeometry.cs holds the geometry tables. BimData.cs and BimGeometryTableName.cs name the tables an archive contains. CommonRevitParameters.cs lists the parameter names a Revit export produces, so a reader can find a door's width without guessing. source-code.md explains how to build the project and how to change a table.
Principles
- Plain tables. A model is rows and columns, not an object graph behind an API. Any columnar tool is a BOS tool.
- Honest absence. A missing measure stays missing. No null becomes a zero and no size is read from a name.
- Self-describing. Parquet carries the column names and types, so a reader knows the shape of the data before reading a row.
- Small and stable. The specification is a few hundred lines. A change to it is a change to a C# record, reviewed as code.