How OpenKitchen3D models a kitchen
The concepts behind the planner. These docs track the v0.1 schema drafts and will grow into full user and developer guides as features ship.
Project model
An OpenKitchen3D project extends the OpenPlan3D room schema — walls, rooms, openings — with explicit kitchen entities. Cabinets are parametric product instances that reference a catalog product and version, not generic furniture meshes. Plan symbols, elevations, 3D geometry, the BOM and pricing are all derived from this data.
type KitchenCabinetInstance = {
id: string;
productId: string; // catalog product
catalogVersion: string; // pinned so old projects stay reproducible
floorId: string;
runId?: string;
wallId?: string;
anchor: { x: number; y: number; elevation: number };
rotation: number;
width: number; height: number; depth: number; // mm
configuration: Record<string, string | number | boolean>;
finishIds: Record<string, string>;
priceOverrides?: Record<string, number>;
}; Units & coordinates
Millimetres are the canonical storage unit. Imperial and metric are UI and export concerns only, so a project never accumulates rounding error from switching units. Project and catalog schemas are versioned from day one and migrated forward.
Cabinet runs
A run is an ordered group of cabinets along a wall (or freestanding, for islands). Runs own their alignment, countertop profile and toe-kick profile, and are regenerated whenever a cabinet in them changes.
type KitchenRun = {
id: string;
wallId?: string;
cabinetIds: string[];
startOffset: number;
alignment: 'left' | 'right' | 'center' | 'fill';
countertopProfileId?: string;
toeKickProfileId?: string;
}; The run drawn on the home page, as a project fragment:
{
"schema": "openkitchen3d/project@0.1",
"units": "mm",
"runs": [
{
"id": "run-back-wall",
"wallId": "wall-north",
"alignment": "fill",
"countertopProfileId": "ct-quartz-30",
"toeKickProfileId": "tk-100",
"cabinets": [
{
"sku": "FIL-50",
"width": 50,
"offset": 0
},
{
"sku": "B1D-450",
"width": 450,
"offset": 50
},
{
"sku": "SB-900",
"width": 900,
"offset": 500
},
{
"sku": "APP-DW-600",
"width": 600,
"offset": 1400
},
{
"sku": "APP-RNG-750",
"width": 750,
"offset": 2000
},
{
"sku": "B3DR-850",
"width": 850,
"offset": 2750
}
]
}
]
} Three layers of truth
- Visual geometry — procedural boxes, fronts and counters for plan, elevation and 3D. GLB assets only for hardware, appliances and decor.
- Commercial data — catalog products, options, SKUs and price expressions that drive the schedule and estimate.
- Manufacturing parts — construction recipes, panels and joinery. A later, separately validated layer; never inferred from display meshes.
Exports
| Format | Contents | Status |
|---|---|---|
| OpenKitchen3D JSON | Full project, catalog references and licence metadata | MVP |
| CSV | Cabinet schedule and bill of materials | MVP |
| Plan, elevations and estimate | MVP | |
| PNG / SVG | Snapshots of any view | MVP |
| GLB | 3D scene | MVP |
| DXF | Elevations, cabinet outlines, later part outlines | Later |
| IFC, OBJ, Collada | Casework and equipment exchange | Later |