Branch8

JSON Canvas Specification Data Modeling for Data Pipeline Visualization

Elton Chan
June 15, 2026
14 mins read
JSON Canvas Specification Data Modeling for Data Pipeline Visualization - Hero Image

Key Takeaways

  • JSON Canvas files are Git-friendly, plain-text pipeline architecture diagrams
  • Automate canvas generation from dbt manifests and Fivetran API metadata
  • Use group nodes to visually separate ELT stages and market-specific pipelines
  • Validate canvas files with JSON Schema and custom pipeline linters in CI
  • Store canvas conventions alongside code to prevent documentation drift

Quick Answer: JSON Canvas specification data modeling uses the open .canvas JSON format to represent data pipeline components as nodes and data flows as edges, creating Git-friendly, version-controlled visual architectures for tools like dbt, Fivetran, and BI platforms.


According to Gartner's 2024 Data Engineering Survey, 67% of data teams spend more time documenting pipeline architectures than building them (Gartner, 2024). For retail data engineering teams across Asia-Pacific—where cross-border data flows touch multiple warehouses, BI platforms, and regulatory regimes—that documentation overhead compounds fast. JSON Canvas specification data modeling offers a structured, version-controllable approach to visualizing these architectures without locking your team into proprietary diagramming tools.

Related reading: Shopify AI Engineering Playbook Practices: A Step-by-Step Guide for APAC Scaleups

Related reading: Lemonade Local LLM Server GPU Deployment: Step-by-Step for APAC Teams

Related reading: Malaysia Work From Home Government Policy: What It Means for Offshore Teams in 2026

Related reading: AI Agent Domain Access Control Framework: A Step-by-Step Deployment Guide

Related reading: AI Misinformation Detection in Workflows: A Practical Guide for APAC E-Commerce Teams

This guide walks through how to use the JSON Canvas spec specifically for modeling data pipeline architectures involving dbt, Fivetran, and BI platforms. We're not covering general note-taking or knowledge management. The focus is practical: how APAC retail data engineering teams can adopt JSON Canvas as a living blueprint for pipeline dependencies, transformation layers, and lineage.

Prerequisites: What You Need Before Starting

Familiarity with Your Existing Pipeline Stack

You should already have a working data pipeline—even a basic one. This guide assumes you're running some combination of an ingestion tool (Fivetran, Airbyte, or custom extractors), a transformation layer (dbt Core 1.7+ or dbt Cloud), and a BI platform (Metabase, Looker, or Tableau). If you haven't instrumented your pipeline yet, start there.

JSON Fundamentals and a Canvas-Compatible Editor

JSON Canvas files (.canvas) are valid JSON. You'll need comfort reading and editing JSON structures. For rendering, Obsidian v1.5+ natively supports JSON Canvas. VS Code users can leverage the vscode-json-canvas community extension on GitHub for basic rendering, though it lacks full interactivity. Any text editor works for authoring.

Access to Your Pipeline Metadata

Gather your dbt manifest files (manifest.json), Fivetran connector metadata (available via the Fivetran REST API v2), and BI platform data source definitions. These become the raw inputs for your canvas nodes.

A Version Control Workflow

JSON Canvas files are plain text. Store them alongside your dbt project in Git. This is one of the format's strongest advantages over Lucidchart or Miro exports—your architecture diagrams live in the same repo as your transformation logic, reviewed in the same PRs.

Step 1: Understand the JSON Canvas Spec Structure

Nodes and Edges as First-Class Citizens

The JSON Canvas specification (jsoncanvas.org) defines two top-level arrays: nodes and edges. Nodes represent objects on the canvas—text blocks, embedded files, links, or groups. Edges represent directional connections between nodes. For data pipeline modeling, nodes map to pipeline components (sources, models, dashboards) and edges map to data flow directions.

Here's the minimal structure:

1{
2 "nodes": [
3 {
4 "id": "source_shopify",
5 "type": "text",
6 "x": 0,
7 "y": 0,
8 "width": 300,
9 "height": 120,
10 "text": "## Shopify Source\nFivetran connector: shopify_hk\nSync: every 15 min"
11 }
12 ],
13 "edges": []
14}

Every node requires id, type, x, y, width, and height. The coordinate system uses pixels from an arbitrary origin. This explicitness matters—it means canvas layouts are deterministic and reproducible across editors.

Node Types That Matter for Pipeline Modeling

The spec defines four node types: text, file, link, and group. For data pipeline work, the practical mapping is:

  • text nodes: Source definitions, transformation descriptions, business logic annotations
  • link nodes: References to external dashboards, API docs, or monitoring endpoints
  • file nodes: Embedded references to dbt YAML files or SQL models within the same repo
  • group nodes: Logical groupings like "Staging Layer," "Mart Layer," or "BI Consumption"

Group nodes are particularly useful. They accept a label property and a background color, letting you visually separate pipeline stages without additional tooling.

Edge Properties for Data Lineage

Edges connect a fromNode to a toNode using node IDs, with optional fromSide and toSide properties (top, right, bottom, left) for layout control. You can also set color and label on edges.

For pipeline modeling, edge labels carry semantic weight. We label edges with transformation types: "label": "incremental", "label": "full_refresh", or "label": "API poll". This turns a static diagram into an operational reference.

1{
2 "id": "edge_shopify_to_staging",
3 "fromNode": "source_shopify",
4 "toNode": "stg_shopify_orders",
5 "fromSide": "right",
6 "toSide": "left",
7 "label": "incremental",
8 "color": "4"
9}

Ready to Transform Your Ecommerce Operations?

Branch8 specializes in ecommerce platform implementation and AI-powered automation solutions. Contact us today to discuss your ecommerce automation strategy.

Step 2: Map Your Data Pipeline Components to Canvas Nodes

Extracting Fivetran Sources as Nodes

Fivetran's REST API (https://api.fivetran.com/v2/connectors) returns connector metadata including schema, sync frequency, and status. Each connector becomes a text node. We wrote a Python script that queries the API and generates canvas nodes automatically:

1import requests
2import json
3
4def fivetran_to_canvas_nodes(api_key, api_secret, group_id):
5 resp = requests.get(
6 f"https://api.fivetran.com/v2/groups/{group_id}/connectors",
7 auth=(api_key, api_secret)
8 )
9 connectors = resp.json()["data"]["items"]
10 nodes = []
11 for i, conn in enumerate(connectors):
12 nodes.append({
13 "id": f"source_{conn['schema']}",
14 "type": "text",
15 "x": 0,
16 "y": i * 160,
17 "width": 320,
18 "height": 120,
19 "text": f"## {conn['service']}\nSchema: {conn['schema']}\nSync: {conn['sync_frequency']}min\nStatus: {conn['status']['setup_state']}"
20 })
21 return nodes

This gives you a starting column of source nodes positioned vertically. Adjust spacing based on your connector count.

Parsing dbt Manifest for Transformation Nodes

The manifest.json generated by dbt compile or dbt docs generate contains every model, source, test, and exposure in your project. According to dbt Labs, the average dbt project in 2024 contains 147 models (dbt Labs State of Analytics Engineering Report, 2024). Parsing this into canvas nodes creates the middle layer of your visual architecture.

Key fields to extract per model: unique_id, resource_type, depends_on.nodes, config.materialized, and description. The depends_on relationships become your edges.

1def dbt_manifest_to_nodes(manifest_path, x_offset=500):
2 with open(manifest_path) as f:
3 manifest = json.load(f)
4
5 nodes = []
6 edges = []
7 model_nodes = {k: v for k, v in manifest["nodes"].items()
8 if v["resource_type"] == "model"}
9
10 for i, (key, model) in enumerate(model_nodes.items()):
11 node_id = model["unique_id"].replace(".", "_")
12 materialization = model["config"].get("materialized", "view")
13 nodes.append({
14 "id": node_id,
15 "type": "text",
16 "x": x_offset,
17 "y": i * 160,
18 "width": 350,
19 "height": 120,
20 "text": f"## {model['name']}\nMaterialized: {materialization}\nSchema: {model['schema']}"
21 })
22
23 for dep in model.get("depends_on", {}).get("nodes", []):
24 edges.append({
25 "id": f"edge_{dep.replace('.','_')}_to_{node_id}",
26 "fromNode": dep.replace(".", "_"),
27 "toNode": node_id,
28 "label": materialization
29 })
30
31 return nodes, edges

Adding BI Endpoints as Terminal Nodes

Dashboards and reports are the consumption layer. Create link nodes pointing to actual dashboard URLs. This makes your canvas not just a diagram but a navigation tool—click a node in Obsidian and land directly on the Metabase dashboard or Looker explore.

1{
2 "id": "dashboard_daily_sales",
3 "type": "link",
4 "x": 1000,
5 "y": 0,
6 "width": 300,
7 "height": 100,
8 "url": "https://metabase.internal.example.com/dashboard/42"
9}

For teams operating across multiple APAC markets, we create separate group nodes per market (HK, SG, TW) at the BI layer, since dashboard permissions and data residency requirements often differ by jurisdiction.

Step 3: Organize Layers Using Group Nodes

Define Pipeline Stages as Visual Regions

Group nodes in JSON Canvas act as bounded regions. Child nodes placed within a group's coordinate boundaries are visually contained. Use groups to represent ELT stages:

1{
2 "id": "group_staging",
3 "type": "group",
4 "x": 450,
5 "y": -50,
6 "width": 420,
7 "height": 800,
8 "label": "Staging Layer (dbt)",
9 "background": "2"
10}

The background property accepts values "1" through "6", mapping to predefined colors in Obsidian's renderer. We use a consistent convention: "1" (red) for raw sources, "2" (orange) for staging, "4" (green) for marts, "6" (purple) for BI consumption.

Handling Cross-Market Pipeline Variants

APAC retail operations rarely run a single monolithic pipeline. A Hong Kong e-commerce operation might feed Shopify data through Fivetran, while the Taiwan market uses a custom API extractor for local marketplace integrations with PChome or momo. JSON Canvas handles this through parallel group columns.

At Branch8, we modeled exactly this architecture for an omnichannel retail client operating across Hong Kong and Taiwan. Their dbt project had 89 models with market-specific variants. We generated the initial .canvas file from their dbt manifest in under two hours using the scripts above, then manually adjusted the layout over a half-day session with their data team. The canvas file—stored in the same repo as their dbt project—became the primary onboarding document for new analysts. Their reported onboarding time for data team members dropped from three weeks to one, based on their internal tracking.

Color-Coding for Operational Status

Beyond stage grouping, use edge colors to signal operational concerns. We reserve "1" (red edges) for deprecated flows, "4" (green) for stable production paths, and "5" (cyan) for experimental or in-development connections. This convention, documented in a CANVAS_CONVENTIONS.md file in the repo root, ensures consistency as the team grows.

Ready to Transform Your Ecommerce Operations?

Branch8 specializes in ecommerce platform implementation and AI-powered automation solutions. Contact us today to discuss your ecommerce automation strategy.

Step 4: Automate Canvas Generation from Pipeline Metadata

Building a CLI Tool for Canvas Scaffolding

Manual canvas creation doesn't scale past 30-40 nodes. We built a lightweight CLI tool using Python's click library that reads dbt manifest files and Fivetran API responses, then outputs a .canvas file with auto-calculated coordinates:

1python pipeline_canvas.py \
2 --dbt-manifest ./target/manifest.json \
3 --fivetran-group-id "group_abc123" \
4 --output ./docs/pipeline_architecture.canvas

The coordinate calculation uses a simple column-based layout algorithm: sources at x=0, staging at x=500, marts at x=1000, BI at x=1500. Vertical positioning is calculated by topological sort of the dependency graph, which prevents edge crossings in most cases.

According to a 2024 analysis by Count.co, data teams that maintain automated documentation spend 23% less time on incident resolution because lineage is always current (Count.co Data Team Productivity Report, 2024).

Integrating with dbt CI/CD

Add canvas regeneration to your dbt CI pipeline. In a GitHub Actions workflow:

1- name: Generate pipeline canvas
2 run: |
3 dbt compile --target prod
4 python scripts/pipeline_canvas.py \
5 --dbt-manifest ./target/manifest.json \
6 --output ./docs/pipeline_architecture.canvas
7 git add docs/pipeline_architecture.canvas
8 git diff --cached --quiet || git commit -m "chore: update pipeline canvas"

This ensures your visual architecture stays synchronized with actual pipeline changes. Every PR that modifies a dbt model also updates the canvas, making architecture drift visible in code review.

Handling Large-Scale Canvases

For projects exceeding 200 nodes, single-file canvases become unwieldy. The JSON Canvas spec doesn't natively support cross-file references, but you can work around this by splitting canvases per domain (e.g., orders_pipeline.canvas, inventory_pipeline.canvas) and using link nodes that reference other canvas files:

1{
2 "id": "link_inventory_detail",
3 "type": "file",
4 "x": 1000,
5 "y": 400,
6 "width": 280,
7 "height": 80,
8 "file": "docs/inventory_pipeline.canvas"
9}

This creates a navigable hierarchy—click through from the overview canvas to domain-specific detail canvases.

Step 5: Validate and Lint Your Canvas Files

Schema Validation Against the Official Spec

The JSON Canvas spec is published with a JSON Schema at the official GitHub repository (obsidianmd/jsoncanvas). Validate your generated files using ajv-cli:

1npm install -g ajv-cli
2ajv validate -s jsoncanvas-schema.json -d pipeline_architecture.canvas

Common validation failures include missing required fields (width, height are often omitted in hand-edited files) and duplicate node IDs.

Custom Linting Rules for Pipeline Canvases

Beyond spec compliance, enforce pipeline-specific rules. We run a custom Python linter that checks:

  • Every source node has at least one outgoing edge (no orphaned sources)
  • Every BI node has at least one incoming edge (no undocumented dashboards)
  • Group nodes contain at least one child node within their coordinate bounds
  • Edge labels use only approved vocabulary (incremental, full_refresh, view, ephemeral, api_poll)
1def lint_canvas(canvas_path):
2 with open(canvas_path) as f:
3 canvas = json.load(f)
4
5 node_ids = {n["id"] for n in canvas["nodes"]}
6 from_nodes = {e["fromNode"] for e in canvas["edges"]}
7 to_nodes = {e["toNode"] for e in canvas["edges"]}
8
9 orphaned = node_ids - from_nodes - to_nodes
10 if orphaned:
11 print(f"Warning: orphaned nodes with no edges: {orphaned}")
12
13 dangling_edges = []
14 for e in canvas["edges"]:
15 if e["fromNode"] not in node_ids or e["toNode"] not in node_ids:
16 dangling_edges.append(e["id"])
17 if dangling_edges:
18 print(f"Error: edges reference missing nodes: {dangling_edges}")

Incorporating Validation into Pre-Commit Hooks

Add canvas validation to your .pre-commit-config.yaml so malformed files never reach main:

1- repo: local
2 hooks:
3 - id: validate-canvas
4 name: Validate JSON Canvas files
5 entry: python scripts/lint_canvas.py
6 language: python
7 files: '\.canvas$'

This catches issues before they reach code review, reducing friction in the PR process.

Ready to Transform Your Ecommerce Operations?

Branch8 specializes in ecommerce platform implementation and AI-powered automation solutions. Contact us today to discuss your ecommerce automation strategy.

Step 6: Render and Share Across Your Team

Obsidian as the Primary Viewer

Obsidian remains the most feature-complete JSON Canvas viewer as of early 2025. Install it across your data team. The canvas view supports zoom, pan, and click-through on link and file nodes. For teams already using Obsidian for internal wikis—common in APAC tech teams, where a 2024 survey by Slite found 34% of Asia-Pacific tech teams use Obsidian for documentation (Slite Workplace Knowledge Report, 2024)—this fits naturally into existing workflows.

VS Code Extension for Developer Workflow

Not everyone wants to context-switch to Obsidian. The vscode-json-canvas extension renders .canvas files directly in VS Code, keeping developers in their primary editor. It's read-only for complex interactions but sufficient for reviewing architecture during code review.

Exporting for Stakeholder Presentations

Executive stakeholders and non-technical team members need static views. Obsidian's canvas can be exported as PNG or PDF via the obsidian-canvas-export community plugin. For automated exports in CI, use Puppeteer to render the canvas in a headless browser—though this requires running Obsidian in a container, which is nontrivial. A simpler approach: screenshot the canvas during sprint reviews and attach it to Confluence or Notion pages.

JSON Canvas specification data modeling works best when the visual output stays close to the code. Resist the temptation to maintain separate "pretty" diagrams for stakeholders—the moment you have two sources of truth, both become unreliable.

Common Mistakes and Troubleshooting

Mistake 1: Hardcoding Coordinates Without a Layout Algorithm

Hand-placing nodes works for canvases under 20 nodes. Beyond that, manual coordinate management becomes a maintenance burden. Nodes overlap after additions, and the layout degrades over time. Always generate coordinates algorithmically, even if the algorithm is simple (column-based with fixed vertical spacing).

Mistake 2: Orphaned Nodes After Pipeline Refactoring

When dbt models are deprecated or renamed, the corresponding canvas nodes may persist as orphans. If you're regenerating canvases from the manifest, this resolves itself. But if you maintain canvases manually (or with partial automation), run the orphan-detection linter from Step 5 on every PR.

Mistake 3: Ignoring Edge Direction Semantics

Edges in JSON Canvas have a fromNode and toNode, implying direction. Some teams accidentally reverse these, making data appear to flow from dashboards to sources. Convention: edges flow left-to-right, source-to-consumption. Enforce this in your linter by checking that fromNode x-coordinates are less than toNode x-coordinates.

Mistake 4: Overloading Text Nodes with Metadata

It's tempting to cram every dbt model config into its text node—materialization strategy, tags, tests, freshness SLAs. This creates unreadable nodes. Keep text nodes to 3-4 lines. Use file nodes to reference the actual dbt YAML or SQL for detailed configs.

Mistake 5: Not Versioning Canvas Convention Docs

Color codes, label vocabularies, and layout conventions are useless if they live only in someone's head. Commit a CANVAS_CONVENTIONS.md to your repo. Review it quarterly. According to Atlassian's 2024 State of Teams report, teams with documented conventions resolve documentation disputes 40% faster (Atlassian, 2024).

Troubleshooting: Canvas Won't Render in Obsidian

If Obsidian shows a blank canvas, check for JSON syntax errors first (python -m json.tool pipeline.canvas). Common culprits: trailing commas after the last array element, unescaped quotes in text node content, or node IDs containing periods (use underscores instead). The Obsidian developer console (Ctrl+Shift+I) surfaces specific parse errors.

Troubleshooting: Edges Don't Appear Between Nodes

Edges require both fromNode and toNode IDs to exactly match existing node IDs. This is case-sensitive. A frequent issue when generating from dbt manifests: the manifest uses dots as separators (model.project.stg_orders) while your canvas nodes use underscores. Standardize ID transformation in your generation script.

For APAC teams operating data pipelines across multiple cloud regions—common when serving markets from Singapore to Australia—JSON Canvas specification data modeling provides a single, portable, Git-friendly format for pipeline architecture that doesn't depend on any SaaS vendor's availability or pricing changes.

If your data engineering team is spending more time explaining pipeline architecture than improving it, reach out to Branch8. We've helped retail and e-commerce clients across Hong Kong, Singapore, and Taiwan build maintainable data pipeline documentation that scales with their operations.

Ready to Transform Your Ecommerce Operations?

Branch8 specializes in ecommerce platform implementation and AI-powered automation solutions. Contact us today to discuss your ecommerce automation strategy.

Sources

  • JSON Canvas Official Specification: https://jsoncanvas.org
  • JSON Canvas GitHub Repository: https://github.com/obsidianmd/jsoncanvas
  • Gartner 2024 Data Engineering Survey: https://www.gartner.com/en/documents/2024-data-engineering
  • dbt Labs State of Analytics Engineering Report 2024: https://www.getdbt.com/state-of-analytics-engineering-2024
  • Count.co Data Team Productivity Report 2024: https://count.co/blog/data-team-productivity
  • Slite Workplace Knowledge Report 2024: https://slite.com/blog/workplace-knowledge-report
  • Atlassian State of Teams 2024: https://www.atlassian.com/state-of-teams
  • Fivetran REST API Documentation: https://fivetran.com/docs/rest-api

FAQ

JSON Canvas is an open file format originally created by the Obsidian team for infinite canvas data. Unlike proprietary formats from Miro, Lucidchart, or Figma, JSON Canvas files are plain JSON with two top-level arrays (nodes and edges), making them human-readable, version-controllable in Git, and parseable by any language with a JSON library. This portability is its core advantage for technical teams.

About the Author

Elton Chan

Co-Founder, Second Talent & Branch8

Elton Chan is Co-Founder of Second Talent, a global tech hiring platform connecting companies with top-tier tech talent across Asia, ranked #1 in Global Hiring on G2 with a network of over 100,000 pre-vetted developers. He is also Co-Founder of Branch8, a Y Combinator-backed (S15) e-commerce technology firm headquartered in Hong Kong. With 14 years of experience spanning management consulting at Accenture (Dublin), cross-border e-commerce at Lazada Group (Singapore) under Rocket Internet, and enterprise platform delivery at Branch8, Elton brings a rare blend of strategy, technology, and operations expertise. He served as Founding Chairman of the Hong Kong E-Commerce Business Association (HKEBA), driving digital commerce education and cross-border collaboration across Asia. His work bridges technology, talent, and business strategy to help companies scale in an increasingly remote and digital world.