Skip to content
Docs

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

FormatContentsStatus
OpenKitchen3D JSONFull project, catalog references and licence metadataMVP
CSVCabinet schedule and bill of materialsMVP
PDFPlan, elevations and estimateMVP
PNG / SVGSnapshots of any viewMVP
GLB3D sceneMVP
DXFElevations, cabinet outlines, later part outlinesLater
IFC, OBJ, ColladaCasework and equipment exchangeLater