# IFC Desk > https://ifc-desk.skillsafe.ai/ The IFC model a design consultant just delivered, read properly in your browser and then judged. Drop an `.ifc` file; a real ISO 10303-21 STEP-physical-file reader parses it locally — no converter, no CAD licence, nothing uploaded — and four AI lanes then work over the same parsed model. Built on SkillSafe. Derived from the agent skill [@datadrivenconstruction/cad-to-data](https://skillsafe.ai/skill/@datadrivenconstruction/cad-to-data/) (convert CAD/BIM files to structured data; extract element data from Revit, IFC, DWG and DGN), applied to the IFC leg of that skill in a browser. Not affiliated with that skill's author, with DataDrivenConstruction, with buildingSMART International, or with Autodesk. IFC is an open standard published by buildingSMART International. ## What it is for One work object: a single `.ifc` exchange file. One sitting: you receive a model, you find out whether it is fit for what you need, you decide what data comes out of it, you find out what can be measured, and you send the gaps back to whoever authored it. ## The free lane — a real IFC reader, in the browser This is not a keyword search over the text. Statements are split on semicolons outside quoted strings and arguments on commas outside quotes and parentheses, and the STEP escapes (`''`, `\X\hh`, `\X2\…\X0\`, `\S\`) are decoded — so a wall named `Wand, tragend` is one attribute and `\X2\00DC\X0\berbau` comes back as `Überbau`. What it resolves: - **Header** — `FILE_SCHEMA` (IFC2X3 through IFC4X3), the `ViewDefinition` in `FILE_DESCRIPTION`, authoring tool, preprocessor, author, organisation and timestamp from `FILE_NAME`. - **Spatial structure** — `IfcProject` → `IfcSite` → `IfcBuilding` → `IfcBuildingStorey` → `IfcSpace`, followed through `IfcRelAggregates`, with every element placed by the `IfcRelContainedInSpatialStructure` that actually points at it. Elements hanging off an `IfcSpace` inherit that space's storey. - **Property sets and quantities** — `IfcRelDefinesByProperties` to `IfcPropertySet` / `IfcElementQuantity`, with `IfcPropertySingleValue` nominal values and `IfcQuantityArea` / `Volume` / `Length` / `Count` / `Weight` unwrapped from their defined types. - **Types, materials, classification** — `IfcRelDefinesByType`, `IfcRelAssociatesMaterial` (including `IfcMaterialLayerSetUsage` → `IfcMaterialLayerSet`), `IfcRelAssociatesClassification` → `IfcClassificationReference`. - **Units** — `IfcUnitAssignment`, `IfcSIUnit` with its prefix, `IfcConversionBasedUnit`, and which unit types are missing. - **Georeferencing** — `IfcSite` RefLatitude/RefLongitude/RefElevation, `IfcMapConversion`, `IfcProjectedCRS`, true north; reported as `none`, `elevation-only`, `site-lat-long` or `map-conversion`. - **Integrity** — GlobalIds validated against the 22-character IFC base-64 alphabet and checked for duplicates across the file; `#n` references that point at instances which are not present; instance ids defined twice; statements inside `DATA` that are not instance definitions. Two traps it handles specifically, because both produce a wrong answer rather than an error: 1. **Only `IfcRoot` subtypes are checked for a GlobalId.** Treating any entity whose first attribute is a string as rooted reports `IfcMaterial` names and `IfcPropertySingleValue` keys as malformed identifiers. 2. **The negative-zero longitude.** A site seven minutes west of Greenwich is written `(-0,-7,-32,100000)`, and `-0 < 0` is false in JavaScript, so the obvious sign test places the building on the wrong side of the prime meridian. Free exports, no account needed: an element register CSV (one row per element with storey, type object, materials, classification, property counts and base quantities), type counts CSV, storey CSV, prescan Markdown and prescan JSON. ## The four lanes Every lane takes the same work object and sends the same derived digest. The model returns one JSON object with a common envelope — `lane`, `title`, `posture` (`ready` / `conditional` / `blocked`), `verdict`, `headline`, `exec_summary`, `findings[]`, `reconciliation[]`, `assumptions[]`, `open_questions[]`, `summary` — plus that lane's own body. | Lane (`task`) | Stage | What it adds | | --- | --- | --- | | `audit` | Inspect | `checks[]` — fourteen named handover checks, each decided in the browser first — and `risk_register[]` | | `extract` | Produce | `tables[]` with a source-backed column spec, `join_keys[]`, `blocked_columns[]`, `export_notes[]` | | `takeoff` | Produce | `quantities[]` split into read / derive, `gaps[]`, and a `method_statement` | | `rfi` | Return | `requests[]` with acceptance criteria, a sendable `email_draft`, and `reissue_criteria[]` | The fourteen audit checks, in order: schema and header, view definition, spatial structure, element containment, storey elevations, GlobalId integrity, reference integrity, naming, type objects, property sets, quantities, materials, classification, units and georeferencing. The audit lane hands its output to the RFI lane with one button, so the request that goes back to the model author is written from the findings rather than retyped. ## What leaves your browser Never the file. What is sent is a derived digest: the header, the unit and georeference facts, the spatial tree, per-type element counts, coverage percentages, the property-set and quantity vocabulary present, and a bounded stratified sample of real element rows — one block per element type, largest types first. Every count and coverage figure in that digest is computed over the whole parsed file; the sample is a sample and the app says so, to both you and the model. The page states the digest's size and how many elements it sampled before you pay for a run. ## What it will not do It reads. It never modifies your model, never runs a checker or a validator, never uploads the file, and never claims to have done any of those. It is not clash detection, not code compliance, and not a substitute for opening the model in a viewer. The prescan figures are computed locally and are reliable; the review is written by a language model and is advice, not a certified check. ## Practical notes - `.ifcZIP` must be unzipped first; `.rvt` must be exported to IFC by its authoring tool. - The browser reader handles the leading 24 MB of a file and says so when it truncates. - Runs are metered and need a signed-in SkillSafe account. `estimate` is free and the price is shown before you run. Both bundled examples replay a saved run for every lane at no cost. - Reviews are saved to your SkillSafe account (a declared `reviews` collection) and mirrored in the browser, with a re-issue delta showing which findings closed, stayed open or appeared since your last review of the same model. ## Pages - `/` — the app - `/api.html` — driving it programmatically, with the `task` router documented first - `/tokens.html` — token management (noindex)