Browser-Native ONNX Model Visualizer & Editor
3
stars
141
commits
TypeScript
primary language
Sep 2, 2026
updated
Inspect, edit, and export neural network models entirely in the browser. No Python. No server. No installation.
Forma is a fully client-side web application for loading, visualizing, and analyzing ONNX and TFLite neural network models. Drop a .onnx or .tflite file onto the canvas and the complete computation graph renders immediately: nodes laid out automatically with dagre, every tensor edge routed, each operator inspectable with a single click. ONNX models are fully editable and exportable; TFLite support is read-only.
All computation runs in the browser via WebAssembly. Models never leave the user's machine. ONNX edit sequences can be shared through verified URL hashes without uploading model bytes.
The bundled sample model loaded locally with the Conv node selected and its editable attributes, tensor shapes, parameter count, and graph context visible.

A shared edit sequence requests the exact original model and displays its expected SHA-256 fingerprint before any edits are replayed.

.onnx or .tflite loading with real-time progress indication/ focuses the filter input, Escape clears and deselects, Ctrl/Cmd+Z undoes, Ctrl/Cmd+Shift+Z and Ctrl/Cmd+Y redo.npy file (single-input models) or a .npz archive (array names matched against graph input names); both the plain and DEFLATE-compressed .npz variants that numpy.savez produces are supported, decoded with the browser's native DecompressionStreambatch param) and dropping the shape entirely for a fully dynamic (unranked) declarationk-as-attribute encoding below it -- since onnxruntime resolves op schemas against the model's own opset declaration, not a fixed one. Resize has no such fallback (it didn't exist before opset 10), so it's hidden entirely on an older model rather than failing at exportmodel_export.onnx, never model.onnx_export.onnx)onnxruntime-web in a dedicated Web WorkerorigIndex), so it can be further attribute-edited, renamed, or deleted with no writer code beyond what custom nodes already needed; attribute overrides are now applied to the writer's final node set (after structural edits run, not before), which is what makes editing a freshly inserted node's attributes actually reach the export, not just the live canvasf/s, not the 4/6 this parser used): every float or string attribute in every model ever loaded silently failed to parse rather than erroring, so nothing surfaced it until v2.4 needed to write a fresh string attribute (Resize's mode) and the wrong field number produced bytes onnxruntime's strict protobuf decoder rejected outrightSharedArrayBuffer multi-threading via COOP/COEP headers.npy/.npz reader (no zip library dependency): a minimal central-directory ZIP walk plus the browser's native DecompressionStream for DEFLATE entriesuseOnnxWorker instances (two real Web Worker threads) rather than one, so the baseline and candidate load, benchmark, and infer with fully independent onnxruntime-web sessions; the worker gained one new message, RUN_GENERATED, a single-sided version of the existing VALIDATE handler's internal generated-input inference path, reused as-is rather than duplicatedInferenceSession.create() on the same worker thread with a "Session already started" error, found by driving the real UI end to end, not by unit tests alone.onnx model file onto the canvasgit clone https://github.com/Hussain004/Forma.git
cd Forma
npm install
npm run dev
Open http://localhost:5173.
Requirements: Node.js 18+. No Python, no CUDA, no native extensions.
Browser (main thread)
|
+-- App.tsx
| useOnnxWorker hook (status: idle -> loading -> ready -> benchmarking -> exporting)
| SelectableGraph state (pure immutable transforms: selectNode, filterGraph, excludeNode)
| |
| +-- GraphCanvas React Flow, dagre layout, OperatorNode + IONode, MiniMap, hover tooltip
| |
| +-- LayerInspector Per-node detail, multi-select aggregate, model summary histogram
| |
| +-- ModelDropzone Drag-and-drop with progress bar
| |
| +-- shareLinks.ts Compact edit codec, SHA-256 verification, safe history replay
|
| postMessage (ArrayBuffer transfer, zero-copy)
|
+-- onnxWorker.ts (Web Worker)
onnxruntime-web WASM (ONNX only)
isTfliteBuffer() -> format sniff, decides which parser + whether to create a session
parseOnnxGraph() / parseTfliteGraph() -> OnnxNode[], OnnxEdge[], graphInputs (shapes)
LOAD_MODEL -> MODEL_LOADED + QUANTIZE_ESTIMATE
BENCHMARK -> BENCHMARK_RESULT (ONNX only, no TFLite runtime exists)
EXPORT -> EXPORT_RESULT (ArrayBuffer transfer)
EXPORT_MODIFIED -> EXPORT_RESULT (attribute and structural edits patched into the original buffer, ONNX only)
VALIDATE -> VALIDATION_RESULT (two throwaway sessions -- original bytes and patched bytes -- run against identical inputs; comparison math runs back on the main thread)
EXTRACT_SUBGRAPH -> EXPORT_RESULT + VERIFY_RESULT (selected original nodes only, boundary tensors promoted to graph I/O, verified the same way as EXPORT_MODIFIED)
Web Worker isolation: WASM model loading and inference are blocking operations. Isolating them in a worker keeps the UI at 60 fps regardless of model size. The useOnnxWorker hook exposes a clean async interface with typed status transitions.
No backend: The entire pipeline runs in the browser. Zero infrastructure, zero server latency, models never leave the user's machine.
COOP/COEP headers: SharedArrayBuffer requires a cross-origin isolated context. Both Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp are set via vercel.json on every response.
src/
components/
GraphCanvas.tsx React Flow canvas, dagre layout, MiniMap, JumpController, hover tooltip
LayerInspector.tsx Per-node detail, aggregate multi-select view, model summary histogram
HistoryPanel.tsx Timeline of applied and redoable edits with point-in-time navigation
ChangeLogPanel.tsx Copyable plain-text summary of the active edit-history prefix
ModelDropzone.tsx Drag-and-drop with progress indication
ModelComparePage.tsx Two-file model comparison view: independent baseline/candidate
drop slots, structural diff rendering, latency/output comparison
triggers, report and edit-recipe export
hooks/
useOnnxWorker.ts Typed React hook wrapping the ONNX Web Worker
lib/
onnxTypes.ts Graph interfaces plus aligned per-input and per-output tensor metadata
onnxProtoParser.ts Binary protobuf parser for ONNX ModelProto
onnxProtoWriter.ts Byte-preserving protobuf writer: attribute edits, node delete/insert
tfliteParser.ts Binary FlatBuffers parser for TFLite (read-only): FlatBufferReader,
BuiltinOperator name table, tensor-index-to-name translation
onnxParser.ts buildGraphFromParsed() -- generic ParsedGraph -> OnnxGraph builder
shared by both the ONNX and TFLite parsers
attrUtils.ts inferAttrType, parseAttrEdit -- attribute type inference and parsing
graphUtils.ts Pure graph transforms: selection, filter, exclusion, tracing, depth,
delete eligibility, delete-with-reconnect, passthrough insertion,
rewire validation (cycle, self-connect, tensor compatibility), edge
rewiring, addCustomNode, insertRecipeNode (chain-aware boundary
insertion for pipeline recipes), currentInputBoundaryTensor
and the curated op-type menu, structuralNodeIndex (unifies original,
custom-added, and recipe node addressing), OP_CATEGORIES (ONNX + TFLite
op names), and buildGraphDiff for the original-versus-current overlay
pipelineRecipes.ts Curated preprocessing/postprocessing recipe catalog (Cast, Resize,
Transpose, L2 Normalize, Softmax, Sigmoid, Top-K) and resolveRecipe,
which adapts a recipe to the loaded model's declared opset
shareLinks.ts Compact URL-hash codec, model fingerprinting, input validation,
and verified history reconstruction
subgraphExtractor.ts Minimal-repro extraction: selected-nodes-only GraphProto rebuild
with boundary tensors promoted to fresh graph inputs/outputs
modelComparison.ts Pure structural diff between two independently loaded OnnxGraphs:
node matching (by name or op-type position), attribute/initializer/
graph-I/O/metadata diffs, plain-text report formatting, and the
attribute-only edit-recipe check
quantize.ts INT8 size estimation and formatting
workers/
onnxWorker.ts Web Worker: LOAD_MODEL (format-sniffed), BENCHMARK, EXPORT, EXPORT_MODIFIED
__tests__/
graph.test.ts Graph utilities and selection model
onnx.test.ts Worker lifecycle and message contract
app.test.tsx App integration: load flow, selection, error states
v3.test.ts Filter, exclusion, INT8 estimation
v4.test.ts Export reliability, quantize formatting, download
v0.5.test.ts computeOpCounts, keyboard shortcuts, op histogram
v0.6.test.ts opCategoryColor, getAncestors/getDescendants, computeGraphDepth
v0.7.test.ts setMultiSelection, bulkExclude/bulkInclude, aggregate inspector
v0.8.test.ts layout toggle, search dropdown, clipboard copy, benchmark types
v0.9.test.ts attribute viewer, tensor name search, edge shape labels
v0.10.test.ts model metadata, node name, producer/opset/IR version parsing
v1.0.test.ts attribute type inference, value parsing, inline editing, MOD badge
v1.1.test.ts protobuf writer: int/float/string/array attribute edits, byte preservation
v1.2.test.ts structural editing: delete/insert eligibility, reconnection, topological order
v1.3.test.ts TFLite: format detection, FlatBuffers fixture round-trip, opcode fallback
v1.4.test.ts Manual rewiring: cycle/self-connect validation, writer topological
re-sort, bulk delete UI
v1.5.test.ts Add custom node: writer addNode round-trip, custom-node topological
placement in both wiring directions, structuralNodeIndex addressing,
Add Node picker UI (curated pick and free text)
v1.6.test.ts History labels and panel state, undo/redo, jumps, reset, and redo truncation
v1.7.test.ts Graph diff metadata, ghost rendering, change-log copy, and overlay state
v1.8.test.ts Tensor metadata alignment, rewire compatibility, and rejection feedback
v2.0.test.tsx Share codec, hashing, validation, verification, replay, and clipboard flow
v2.1.test.tsx NPY/NPZ parsing, output comparison math, validation panel UI
v2.2.test.tsx Subgraph extraction: boundary promotion, connectivity checks, writer round-trip
v2.3.test.tsx Deployment surgery: rename/retype/promote/replace writer ops and UI wiring
v2.4.test.tsx Pipeline recipes: writer insertRecipe (chaining, extra inputs/outputs,
opset adaptation), graphUtils insertRecipeNode, and recipe-picker UI
v2.5.test.tsx Model comparison: node matching, attribute/initializer/I-O/metadata
diffs, report formatting, edit-recipe eligibility, and the compare
page's dual-worker wiring (loading, latency, output comparison,
edit-recipe export, TFLite rejection)
npm run dev # Dev server with COOP/COEP headers
npm test # 406 tests across 26 files
npx tsc --noEmit # Type-check without building
npm run build # Production build
| Version | Scope |
|---|---|
| 2.5.0 | Model comparison: load a baseline and candidate ONNX file side by side, diff graph structure, attributes, initializers, and I/O, compare latency and outputs via two independent Web Workers, and export a report or (attribute-only diffs) an applicable edit-recipe share link |
| 2.4.0 | Pipeline recipes: guided, chainable insertion of preprocessing (Cast, Resize, Transpose, L2 Normalize) and postprocessing (Softmax, Sigmoid, Top-K, Transpose) ops at any graph boundary, opset-adaptive |
| 2.3.0 | Deployment surgery: rename nodes and tensors, edit graph I/O names/shapes/symbolic dims/data types, promote intermediate outputs, inspect and replace small constants |
| 2.2.0 | Minimal reproductions: extract a selected connected subgraph as a standalone, validated ONNX file with boundary tensors promoted to graph I/O |
| 2.1.0 | Behavioral validation: run the original and edited model against identical .npy/.npz or generated inputs and compare outputs |
| 2.0.0 | Shareable URL-hash edit sequences with SHA-256 original-model verification and automatic history replay |
| 1.8.0 | Rewire tensor compatibility validation for known types, ranks, and concrete dimensions |
| 1.7.0 | Original-versus-current graph diff overlay and copyable plain-text change log |
| 1.6.0 | Unified edit history with undo, redo, jump-to-any-point timeline, and revert-to-original controls |
| 1.5.0 | Add custom node: curated op list or free text, wired into the graph via drag-to-connect, writer support for inserting an arbitrary node with correct topological placement |
| 1.4.0 | Manual rewiring: drag-to-connect any output to a specific input handle, cycle/self-connect validation, bulk delete for multi-select |
| 1.3.0 | TFLite support (read-only): binary FlatBuffers parser, shared graph/canvas/inspector with ONNX |
| 1.2.0 | Structural editing: delete a node with reconnection, insert a passthrough node, both exportable |
| 1.1.0 | Protobuf writer, Export Modified button, byte-preserving attribute patching |
| 1.0.0 | Inline attribute editing, Ctrl+Z undo, MOD badge on edited nodes |
| 0.10.0 | Model metadata (producer, opset, IR version), node names, 3-color favicon |
| 0.9.0 | Attribute viewer, tensor name search, edge shape labels, intermediate tensor shapes |
| 0.8.0 | Layout toggle (TB/LR), search dropdown, clipboard copy, benchmark type fix |
| 0.7.0 | Multi-select, aggregate inspector, bulk exclude/include, hover tooltip |
| 0.6.0 | Op category coloring, ancestor/descendant trace, graph depth stat |
| 0.5.1 | Stacked layers favicon, README rewrite |
| 0.5.0 | MiniMap, jump-to-node, keyboard shortcuts, op type histogram |
| 0.4.0 | INT8 estimate in UI, Download button, export promise hardening |
| 0.3.0 | Graph filter, node exclusion, INT8 size estimate, model export |
| 0.2.1 | Icon update, session guide |
| 0.2.0 | Schema-aware protobuf parser, sensitivity coloring, inference benchmark |
| 0.1.0 | MVP: ONNX loading, graph visualization, Layer Inspector |
.pt, .safetensors, and other formats are not supported. Convert to ONNX first using torch.onnx.export for full editing support.onnxruntime-web does not expose a public API for reading graph node metadata. Forma uses a schema-aware binary parser as the primary path with a runtime-extraction fallback.Built for ML engineers who need to understand and optimize their models without leaving the browser.
If Forma is useful to you, consider supporting development.
141 commits
TypeScript
96.6%
CSS
3.3%
Browser-Native ONNX Model Visualizer & Editor
3
stars
141
commits
TypeScript
primary language
Sep 2, 2026
updated
Inspect, edit, and export neural network models entirely in the browser. No Python. No server. No installation.
Forma is a fully client-side web application for loading, visualizing, and analyzing ONNX and TFLite neural network models. Drop a .onnx or .tflite file onto the canvas and the complete computation graph renders immediately: nodes laid out automatically with dagre, every tensor edge routed, each operator inspectable with a single click. ONNX models are fully editable and exportable; TFLite support is read-only.
All computation runs in the browser via WebAssembly. Models never leave the user's machine. ONNX edit sequences can be shared through verified URL hashes without uploading model bytes.
The bundled sample model loaded locally with the Conv node selected and its editable attributes, tensor shapes, parameter count, and graph context visible.

A shared edit sequence requests the exact original model and displays its expected SHA-256 fingerprint before any edits are replayed.

.onnx or .tflite loading with real-time progress indication/ focuses the filter input, Escape clears and deselects, Ctrl/Cmd+Z undoes, Ctrl/Cmd+Shift+Z and Ctrl/Cmd+Y redo.npy file (single-input models) or a .npz archive (array names matched against graph input names); both the plain and DEFLATE-compressed .npz variants that numpy.savez produces are supported, decoded with the browser's native DecompressionStreambatch param) and dropping the shape entirely for a fully dynamic (unranked) declarationk-as-attribute encoding below it -- since onnxruntime resolves op schemas against the model's own opset declaration, not a fixed one. Resize has no such fallback (it didn't exist before opset 10), so it's hidden entirely on an older model rather than failing at exportmodel_export.onnx, never model.onnx_export.onnx)onnxruntime-web in a dedicated Web WorkerorigIndex), so it can be further attribute-edited, renamed, or deleted with no writer code beyond what custom nodes already needed; attribute overrides are now applied to the writer's final node set (after structural edits run, not before), which is what makes editing a freshly inserted node's attributes actually reach the export, not just the live canvasf/s, not the 4/6 this parser used): every float or string attribute in every model ever loaded silently failed to parse rather than erroring, so nothing surfaced it until v2.4 needed to write a fresh string attribute (Resize's mode) and the wrong field number produced bytes onnxruntime's strict protobuf decoder rejected outrightSharedArrayBuffer multi-threading via COOP/COEP headers.npy/.npz reader (no zip library dependency): a minimal central-directory ZIP walk plus the browser's native DecompressionStream for DEFLATE entriesuseOnnxWorker instances (two real Web Worker threads) rather than one, so the baseline and candidate load, benchmark, and infer with fully independent onnxruntime-web sessions; the worker gained one new message, RUN_GENERATED, a single-sided version of the existing VALIDATE handler's internal generated-input inference path, reused as-is rather than duplicatedInferenceSession.create() on the same worker thread with a "Session already started" error, found by driving the real UI end to end, not by unit tests alone.onnx model file onto the canvasgit clone https://github.com/Hussain004/Forma.git
cd Forma
npm install
npm run dev
Open http://localhost:5173.
Requirements: Node.js 18+. No Python, no CUDA, no native extensions.
Browser (main thread)
|
+-- App.tsx
| useOnnxWorker hook (status: idle -> loading -> ready -> benchmarking -> exporting)
| SelectableGraph state (pure immutable transforms: selectNode, filterGraph, excludeNode)
| |
| +-- GraphCanvas React Flow, dagre layout, OperatorNode + IONode, MiniMap, hover tooltip
| |
| +-- LayerInspector Per-node detail, multi-select aggregate, model summary histogram
| |
| +-- ModelDropzone Drag-and-drop with progress bar
| |
| +-- shareLinks.ts Compact edit codec, SHA-256 verification, safe history replay
|
| postMessage (ArrayBuffer transfer, zero-copy)
|
+-- onnxWorker.ts (Web Worker)
onnxruntime-web WASM (ONNX only)
isTfliteBuffer() -> format sniff, decides which parser + whether to create a session
parseOnnxGraph() / parseTfliteGraph() -> OnnxNode[], OnnxEdge[], graphInputs (shapes)
LOAD_MODEL -> MODEL_LOADED + QUANTIZE_ESTIMATE
BENCHMARK -> BENCHMARK_RESULT (ONNX only, no TFLite runtime exists)
EXPORT -> EXPORT_RESULT (ArrayBuffer transfer)
EXPORT_MODIFIED -> EXPORT_RESULT (attribute and structural edits patched into the original buffer, ONNX only)
VALIDATE -> VALIDATION_RESULT (two throwaway sessions -- original bytes and patched bytes -- run against identical inputs; comparison math runs back on the main thread)
EXTRACT_SUBGRAPH -> EXPORT_RESULT + VERIFY_RESULT (selected original nodes only, boundary tensors promoted to graph I/O, verified the same way as EXPORT_MODIFIED)
Web Worker isolation: WASM model loading and inference are blocking operations. Isolating them in a worker keeps the UI at 60 fps regardless of model size. The useOnnxWorker hook exposes a clean async interface with typed status transitions.
No backend: The entire pipeline runs in the browser. Zero infrastructure, zero server latency, models never leave the user's machine.
COOP/COEP headers: SharedArrayBuffer requires a cross-origin isolated context. Both Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp are set via vercel.json on every response.
src/
components/
GraphCanvas.tsx React Flow canvas, dagre layout, MiniMap, JumpController, hover tooltip
LayerInspector.tsx Per-node detail, aggregate multi-select view, model summary histogram
HistoryPanel.tsx Timeline of applied and redoable edits with point-in-time navigation
ChangeLogPanel.tsx Copyable plain-text summary of the active edit-history prefix
ModelDropzone.tsx Drag-and-drop with progress indication
ModelComparePage.tsx Two-file model comparison view: independent baseline/candidate
drop slots, structural diff rendering, latency/output comparison
triggers, report and edit-recipe export
hooks/
useOnnxWorker.ts Typed React hook wrapping the ONNX Web Worker
lib/
onnxTypes.ts Graph interfaces plus aligned per-input and per-output tensor metadata
onnxProtoParser.ts Binary protobuf parser for ONNX ModelProto
onnxProtoWriter.ts Byte-preserving protobuf writer: attribute edits, node delete/insert
tfliteParser.ts Binary FlatBuffers parser for TFLite (read-only): FlatBufferReader,
BuiltinOperator name table, tensor-index-to-name translation
onnxParser.ts buildGraphFromParsed() -- generic ParsedGraph -> OnnxGraph builder
shared by both the ONNX and TFLite parsers
attrUtils.ts inferAttrType, parseAttrEdit -- attribute type inference and parsing
graphUtils.ts Pure graph transforms: selection, filter, exclusion, tracing, depth,
delete eligibility, delete-with-reconnect, passthrough insertion,
rewire validation (cycle, self-connect, tensor compatibility), edge
rewiring, addCustomNode, insertRecipeNode (chain-aware boundary
insertion for pipeline recipes), currentInputBoundaryTensor
and the curated op-type menu, structuralNodeIndex (unifies original,
custom-added, and recipe node addressing), OP_CATEGORIES (ONNX + TFLite
op names), and buildGraphDiff for the original-versus-current overlay
pipelineRecipes.ts Curated preprocessing/postprocessing recipe catalog (Cast, Resize,
Transpose, L2 Normalize, Softmax, Sigmoid, Top-K) and resolveRecipe,
which adapts a recipe to the loaded model's declared opset
shareLinks.ts Compact URL-hash codec, model fingerprinting, input validation,
and verified history reconstruction
subgraphExtractor.ts Minimal-repro extraction: selected-nodes-only GraphProto rebuild
with boundary tensors promoted to fresh graph inputs/outputs
modelComparison.ts Pure structural diff between two independently loaded OnnxGraphs:
node matching (by name or op-type position), attribute/initializer/
graph-I/O/metadata diffs, plain-text report formatting, and the
attribute-only edit-recipe check
quantize.ts INT8 size estimation and formatting
workers/
onnxWorker.ts Web Worker: LOAD_MODEL (format-sniffed), BENCHMARK, EXPORT, EXPORT_MODIFIED
__tests__/
graph.test.ts Graph utilities and selection model
onnx.test.ts Worker lifecycle and message contract
app.test.tsx App integration: load flow, selection, error states
v3.test.ts Filter, exclusion, INT8 estimation
v4.test.ts Export reliability, quantize formatting, download
v0.5.test.ts computeOpCounts, keyboard shortcuts, op histogram
v0.6.test.ts opCategoryColor, getAncestors/getDescendants, computeGraphDepth
v0.7.test.ts setMultiSelection, bulkExclude/bulkInclude, aggregate inspector
v0.8.test.ts layout toggle, search dropdown, clipboard copy, benchmark types
v0.9.test.ts attribute viewer, tensor name search, edge shape labels
v0.10.test.ts model metadata, node name, producer/opset/IR version parsing
v1.0.test.ts attribute type inference, value parsing, inline editing, MOD badge
v1.1.test.ts protobuf writer: int/float/string/array attribute edits, byte preservation
v1.2.test.ts structural editing: delete/insert eligibility, reconnection, topological order
v1.3.test.ts TFLite: format detection, FlatBuffers fixture round-trip, opcode fallback
v1.4.test.ts Manual rewiring: cycle/self-connect validation, writer topological
re-sort, bulk delete UI
v1.5.test.ts Add custom node: writer addNode round-trip, custom-node topological
placement in both wiring directions, structuralNodeIndex addressing,
Add Node picker UI (curated pick and free text)
v1.6.test.ts History labels and panel state, undo/redo, jumps, reset, and redo truncation
v1.7.test.ts Graph diff metadata, ghost rendering, change-log copy, and overlay state
v1.8.test.ts Tensor metadata alignment, rewire compatibility, and rejection feedback
v2.0.test.tsx Share codec, hashing, validation, verification, replay, and clipboard flow
v2.1.test.tsx NPY/NPZ parsing, output comparison math, validation panel UI
v2.2.test.tsx Subgraph extraction: boundary promotion, connectivity checks, writer round-trip
v2.3.test.tsx Deployment surgery: rename/retype/promote/replace writer ops and UI wiring
v2.4.test.tsx Pipeline recipes: writer insertRecipe (chaining, extra inputs/outputs,
opset adaptation), graphUtils insertRecipeNode, and recipe-picker UI
v2.5.test.tsx Model comparison: node matching, attribute/initializer/I-O/metadata
diffs, report formatting, edit-recipe eligibility, and the compare
page's dual-worker wiring (loading, latency, output comparison,
edit-recipe export, TFLite rejection)
npm run dev # Dev server with COOP/COEP headers
npm test # 406 tests across 26 files
npx tsc --noEmit # Type-check without building
npm run build # Production build
| Version | Scope |
|---|---|
| 2.5.0 | Model comparison: load a baseline and candidate ONNX file side by side, diff graph structure, attributes, initializers, and I/O, compare latency and outputs via two independent Web Workers, and export a report or (attribute-only diffs) an applicable edit-recipe share link |
| 2.4.0 | Pipeline recipes: guided, chainable insertion of preprocessing (Cast, Resize, Transpose, L2 Normalize) and postprocessing (Softmax, Sigmoid, Top-K, Transpose) ops at any graph boundary, opset-adaptive |
| 2.3.0 | Deployment surgery: rename nodes and tensors, edit graph I/O names/shapes/symbolic dims/data types, promote intermediate outputs, inspect and replace small constants |
| 2.2.0 | Minimal reproductions: extract a selected connected subgraph as a standalone, validated ONNX file with boundary tensors promoted to graph I/O |
| 2.1.0 | Behavioral validation: run the original and edited model against identical .npy/.npz or generated inputs and compare outputs |
| 2.0.0 | Shareable URL-hash edit sequences with SHA-256 original-model verification and automatic history replay |
| 1.8.0 | Rewire tensor compatibility validation for known types, ranks, and concrete dimensions |
| 1.7.0 | Original-versus-current graph diff overlay and copyable plain-text change log |
| 1.6.0 | Unified edit history with undo, redo, jump-to-any-point timeline, and revert-to-original controls |
| 1.5.0 | Add custom node: curated op list or free text, wired into the graph via drag-to-connect, writer support for inserting an arbitrary node with correct topological placement |
| 1.4.0 | Manual rewiring: drag-to-connect any output to a specific input handle, cycle/self-connect validation, bulk delete for multi-select |
| 1.3.0 | TFLite support (read-only): binary FlatBuffers parser, shared graph/canvas/inspector with ONNX |
| 1.2.0 | Structural editing: delete a node with reconnection, insert a passthrough node, both exportable |
| 1.1.0 | Protobuf writer, Export Modified button, byte-preserving attribute patching |
| 1.0.0 | Inline attribute editing, Ctrl+Z undo, MOD badge on edited nodes |
| 0.10.0 | Model metadata (producer, opset, IR version), node names, 3-color favicon |
| 0.9.0 | Attribute viewer, tensor name search, edge shape labels, intermediate tensor shapes |
| 0.8.0 | Layout toggle (TB/LR), search dropdown, clipboard copy, benchmark type fix |
| 0.7.0 | Multi-select, aggregate inspector, bulk exclude/include, hover tooltip |
| 0.6.0 | Op category coloring, ancestor/descendant trace, graph depth stat |
| 0.5.1 | Stacked layers favicon, README rewrite |
| 0.5.0 | MiniMap, jump-to-node, keyboard shortcuts, op type histogram |
| 0.4.0 | INT8 estimate in UI, Download button, export promise hardening |
| 0.3.0 | Graph filter, node exclusion, INT8 size estimate, model export |
| 0.2.1 | Icon update, session guide |
| 0.2.0 | Schema-aware protobuf parser, sensitivity coloring, inference benchmark |
| 0.1.0 | MVP: ONNX loading, graph visualization, Layer Inspector |
.pt, .safetensors, and other formats are not supported. Convert to ONNX first using torch.onnx.export for full editing support.onnxruntime-web does not expose a public API for reading graph node metadata. Forma uses a schema-aware binary parser as the primary path with a runtime-extraction fallback.Built for ML engineers who need to understand and optimize their models without leaving the browser.
If Forma is useful to you, consider supporting development.
141 commits
TypeScript
96.6%
CSS
3.3%