Edit every ScriptableObject of a type in one spreadsheet — with validation, formulas, bulk pipelines, snapshots, relational navigation, Google Sheets sync, an AI copilot and headless CI. Editor-only by default: the optional Loom Runtime module is the one part that can ship, and only if you use it.
[SerializeReference] field is an editable variant column; pick the concrete type inline, then ▸ to edit that variant's own fields. Re-selecting the variant a row already has keeps its values.[SerializeReference] values. Renaming a key to one already on that asset is refused, because a duplicate key makes an entry unreachable.=[trophy.power] * 2 follows a reference into another table, aggregates included. Reading through an unset reference is reported rather than silently treated as zero.Docs/BENCHMARK.md. Run it on your own hardware rather than trusting a marketing number.tier=Boss OR (health>500 rarity=Epic), plus @flagged).Loom.Monster.Keys.*, enums from columns, drift check for CI) and a player-side read API (LoomDb.Table<T>()) with delta save files that survive shipped-data rebalances. Your SOs stay plain assets — no lock-in.health>=50, tier=Boss, name~sword (ops: > < >= <= = != ~); terms AND together. @issues filters to rows with validation issues.List (3) ▸) that open the detail pane, where the full native inspector works: add/remove/reorder, custom drawers, and a confirmed single-undo polymorphic type swap.→ button that jumps to that asset's own table. The detail pane's References section answers "points to" and "who points here?" project-wide.Any numeric cell accepts a formula: start with =. Reference other columns of the same row with square brackets — =[Base Damage] * [Attack Rate]. Functions: ABS MIN MAX CLAMP ROUND FLOOR CEIL LERP IF CONCAT LEN UPPER LOWER; aggregates over the whole column: SUM AVG MEDIAN COUNT MINOF MAXOF (e.g. =[Level] / SUM([Level]) * 100). Operators + - * / ^ and comparisons. Formulas are stored per cell (keyed by asset GUID, so renames are safe), recomputed when committed, and errors show an ERR badge with the message on hover.
Right-click a column ▸ Validators… Rules: Required (text/reference), Range (independent min/max, seeded from [Range]/[Min] attributes or observed data), Unique (whole asset set), Regex (multiple allowed). Rules persist per type as a project asset your team can commit. Issues tint cells by severity, the toolbar chip counts them, and clicking it filters to @issues.
Data Health (toolbar ▸ Health) opens empty: press Scan Project to run it. The scan covers
every type with the same rules plus referential integrity (broken references are always errors) and
scores the project 0–100. Apply N Fixes (1 Undo) then applies every auto-fix as one undo, and Save Report…
writes JSON, JUnit (.xml) or SARIF for CI, chosen by the extension you type.
Severity decides whether CI fails. Range and Regex rules are created as Warnings, and warnings never make the report unhealthy or change the CLI's exit code — the gate stays green. If a rule must block a build, set its severity to Error in the validator popup. Required and Unique default to Error already.
Toolbar ▸ Pipeline. Chain steps — Set, Add, Multiply, Clamp, Sequence, Random (deterministic), Find/Replace, Regex — over one column. By default the pipeline targets every row currently matching your search — the filter result, regardless of paging or how far you have scrolled — and the single Selected rows only checkbox narrows it to your selection instead. Preview Diff shows the exact red→green change list without writing anything; Apply commits as one undo with an automatic file backup. Smart Fill ↓ detects constant/linear/geometric/numbered-name series from your selected seed rows and fills downward, previewed first.
Toolbar ▸ Snapshots ▸ Capture before a balance pass; later, Diff vs … shows every changed cell (plus added/removed assets) and exports PR-ready Markdown or CSV patch notes.
Snapshots last for the editor session only. They live in memory and are cleared by any domain reload — recompiling a script or entering play mode discards them — and the list shows only snapshots of the type you currently have open. Capture and diff within one sitting. For a comparison that has to survive a restart, or to compare against a shipped version, export the sheet to CSV and diff the files, or use the review window against two folder states.
Toolbar ▸ Data. CSV, TSV, JSON and XLSX (no external dependency) round-trip losslessly. Delimited exports carry two reserved lead columns: __id (the asset GUID — leave it alone in spreadsheets; it lets a renamed row still update the right asset) and __asset (the name). Rows with no match create new assets (confirmed first); ambiguous or duplicate rows are skipped, never guessed. Everything imports as one undoable batch.
Settings ▸ Google Sheets. Bring your own Google Cloud credentials (see the bundled Sheets Setup guide); DataLoom requests only the per-file Drive scope. One spreadsheet per project, one tab per type; Push replaces the tab with the grid, Pull applies sheet edits back (identity-matched, confirmed, undoable).
Toolbar ▸ AI. Describe an edit in plain language; the model can only emit a declarative plan that is validated against your real schema, previewed as a diff, and applied only when you click Apply (one undo + backup). Anthropic or any OpenAI-compatible endpoint (set a base URL for a fully local model). Keys live in the encrypted per-machine store, never in project files.
The assistant server (Tools ▸ DataLoom Pro ▸ Assistant Server) exposes the same read/preview/apply-with-confirmation tools over MCP at http://127.0.0.1:8471/ — loopback only.
Unity -batchmode -quit -projectPath <project> -executeMethod DataLoom.Editor.LoomCli.Run -- --mode validate --report health.json --junit health.xml --sarif health.sarif # exit 0 = clean, 2 = violations/failure, 3 = bad arguments --mode export --type MonsterProfile --out monsters.xlsx --mode import --type MonsterProfile --in monsters.csv [--apply] [--create] --mode pipeline --spec buff.json [--apply] # dry-run by default --mode pipeline --name "Tier Buff" [--apply] # a pipeline saved in the editor, by its name --mode codegen # regenerate the typed accessors --mode codegen --check # CI drift check: exit 2 if generated code is stale # --apply/--create/--check read their VALUE: bare means true, and "--apply false" means false
Pipeline spec format:
{ "type": "MonsterProfile", "column": "health",
"filter": { "column": "tier", "op": "==", "value": "Dire" },
"steps": [ { "op": "multiply", "factor": 1.15 }, { "op": "clamp", "min": 0, "max": 999 } ] }
Features that exist but are easy to miss — a traceability audit found these shipping with no documentation at all.
+ Add Row in the grid footer, or Insert New Asset in a row's right-click menu. Batch Create is for many at once.sum and avg for the sorted numeric column.LoomSave.SaveSlot/LoadSlot/SlotExists/DeleteSlot and ResetToBaseline, plus a Version field and a Migrate hook so a shipped save can be upgraded when your data changes. Known limit: [SerializeReference] fields are skipped by Unity's JSON layer and so are not captured in a delta.One thing undo cannot do. Every value change is a single undo step with a backup. But Unity's undo system cannot delete a file it created on disk, so if an import creates assets, Ctrl+Z takes back the value changes and the new asset files remain. DataLoom therefore asks straight after such an import whether to remove them, and takes a backup before it does. Nothing is ever removed silently.
DataLoom.Core.ValueOp and OpRegistry.Register("mykeyword", () => new MyOp()); it appears in the pipeline drawer, specs, CLI and AI automatically.DataLoom.Editor.ValidationRule and register in ValidationRuleRegistry.HealthRule and add to DataHealth.Registry (whole-set/relational checks with optional auto-fixes).CommandPalette.Register("Category", "Name", action).LoomAdapters.RegisterRowAction(label, (table,row) => …) adds entries to every row's context menu, RegisterPaletteCommand feeds the palette, RegisterExportFilter rewrites outgoing export grids. Register from any [InitializeOnLoad] class; DataLoom never references the registrant. Rows are also draggable straight into scene/Inspector object fields.LocalizationSeam.BuildTranslatorCsv exports every string field with per-locale columns for translators; ReadTranslations turns a filled sheet back into ChangeRecords for the Transactor. When com.unity.localization is installed the LOOM_HAS_LOCALIZATION define lights up for the 2.x string-table bridge.LoomSchema, ColumnProjection, LoomTable, ReferenceIndex, SnapshotService, Workbook (XLSX), SeriesEngine, ExprEvaluator are all public and never mutate assets.DataLoom ships no Google keys — you create a free Google Cloud project once and your whole team shares it (the four identifiers are committed with the project; secrets stay per machine). Sync only ever requests the per-file Drive scope, so it can touch only spreadsheets you explicitly pick.
console.cloud.google.com ▸ create a project (any name).http://localhost:8472ProjectSettings/DataLoomSheets.json — commit it).http://localhost:8472) opens the Google Picker; pick (or first create in Drive) one spreadsheet for the project.__id column, confirmed, undoable.http://localhost:8472 as an authorized JavaScript origin (no trailing slash, http not https).This section is also what to paste into Project Settings ▸ Assistant Preferences ▸ Custom Instructions so Unity AI (or any coding agent) drives DataLoom correctly.
Assign this file in Project Settings ▸ Assistant Preferences ▸ Custom Instructions so Unity AI (and any agent reading it) knows how to drive DataLoom correctly. It is also the fastest orientation for a coding agent working in a project that has DataLoom installed.
An editor tool that presents every ScriptableObject of a type — and every MonoBehaviour on prefabs — as one editable spreadsheet. The assets stay plain .asset / .prefab files; DataLoom never moves data into a database of its own.
Every write goes through the Transactor. Do not call SerializedObject.ApplyModifiedProperties on data assets directly when a DataLoom path exists. Going through the Transactor is what gives the user one undo step, an automatic file backup, and a revertible history entry. A write that bypasses it is invisible to all three.
| Task | Use |
|---|---|
| Bulk-edit a column | PipelineRunner.RunSpec(specJson, apply) — always preview with apply:false first |
| Read a sheet | new LoomTable() + Load(type), then GetCell / GetCellExport |
| Values for export or comparison | GetCellExport — full precision and stable reference identity |
| Values shown to a person | GetCell — the display form |
| Validate | ValidationState.ValidateAll(table) or DataHealth.Scan() |
| Check data in CI | the CLI: -executeMethod DataLoom.Editor.LoomCli.Run --mode validate (exit 2 = issues) |
DataLoom exposes a loopback MCP server (Tools ▸ DataLoom Pro ▸ Assistant Server ▸ Start). It prints a config block containing a per-session bearer token — requests without it are rejected, as are requests carrying an Origin header. Write tools require confirm: true; that gate exists so a model cannot mutate a project's data without the user's explicit step. Do not attempt to work around it, and do not ask the user to disable it.
guid:<guid>:<localFileId>; instance ids are session-local and change every launch.2,5, which then fails to parse.IF to opt into a default.Assets/ during a batch run. It aborts the run.Prefer proposing a pipeline spec the user can preview as a diff over editing assets one by one. If you are unsure whether a change is safe, run it through the What-If Sandbox (Tools ▸ DataLoom Pro ▸ What-If Sandbox), which applies the pipeline to a shadow copy and proves the real assets were untouched.
Support: szekipapa77@gmail.com · DataLoom Pro is editor-only and adds nothing to your builds.