# Board File Fixer > Check a .canvas board file (JSON Canvas 1.0, the format Obsidian saves canvases in) before you open it. Free in the browser: > a strict JSON reader with line-accurate errors, spec and skill checks for every node and edge, > layout checks, an SVG preview and a Markdown outline. Two metered lanes add judgement: a fix that > answers every finding and returns a corrected canvas, or a new canvas built from an outline. Any > canvas in a reply is checked and drawn again in the browser. URL: https://boardfile-fixer.skillsafe.ai/ API: https://boardfile-fixer.skillsafe.ai/api.html Tokens: https://boardfile-fixer.skillsafe.ai/tokens.html Model: gpt-terra (the balanced GPT tier alias on SkillSafe) Source skill: @kepano/json-canvas (kepano/obsidian-skills, MIT) - create and edit JSON Canvas files with nodes, edges, groups and connections. Spec: https://jsoncanvas.org/spec/1.0/ Independent tool, not affiliated with or endorsed by Obsidian (Dynalist Inc.). ## What runs free, in the browser - Strict JSON reader: the first error with line, column and a hint - trailing commas, a real line break typed inside a string, single quotes, comments, unclosed strings, extra content after the object - plus duplicate keys, which JSON.parse silently drops. - JSON Canvas 1.0 checks: nodes and edges are lists of objects; every node has a string id, one of the four types (text, file, link, group), numeric x, y, width, height (integers per the spec); text nodes have text, file nodes a file path and a subpath starting with #, link nodes a url, groups a valid backgroundStyle; edges have ids and fromNode/toNode that name real nodes, sides top/right/bottom/left, ends none/arrow; colours are strings - preset "1"-"6" or "#RRGGBB". - Skill checklist: ids unique across nodes and edges; a literal backslash-n in text (Obsidian shows it as two characters); 16-character hex ids (a convention, reported as a note). - Layout: overlapping cards, cards half inside a group, groups listed after the cards they contain (later nodes draw on top). - Shape: counts by type, edges that resolve, connected parts, unconnected cards, bounds. - SVG preview with fit, zoom and pan; flagged cards drawn with a dashed outline; downloadable .svg. - Exports: the check as Markdown, findings as CSV, the outline as Markdown, the .canvas file. ## The paid lanes Input: {"task": "fix"|"build", "facts": "", "canvas" (fix: the file as text; optional for build: a canvas to extend), "request" (build), "symptom"? (fix)}. Every field is a string; the body is the input object itself, with no {"input": ...} wrapper. facts, fix lane: checker, status (broken | fix_first | ok), file_name, findings (id F1.., severity error | warning | info, source json | spec | skill | layout, code, where, line, text, quote, refs = node/edge ids; at most 60), findings_total, stats (nodes, edges, edges_resolving, by_type, groups, isolated_nodes, connected_parts, bounds), canvas_sent (mode verbatim | compact | shortened, original_chars, note). A file over 36,000 characters is sent without whitespace, and if still too large its long text nodes are shortened with a "[...Board File Fixer cut" marker; the page puts the full text back into any canvas the model returns. facts, build lane: file_name, request_items (the list lines and headings found in the request), and current_canvas when extending. An API caller that has not run the browser checker may send "{}". - fix -> {task, headline, verdict (broken | fix_first | ok, about the ORIGINAL file), finding_responses [{ref, stance fixed | not_a_problem | needs_you, note}] - every finding once -, changes [{where ("node " | "edge " | "file"), what, why}], fixed_canvas (the complete corrected canvas as a JSON object, or null), to_check}. - build -> {task, headline, canvas (JSON object), explanation [{part groups | nodes | edges | layout | colors, text}], assumptions, to_check}. The page reconciles every reply: unanswered or duplicate findings, a json/spec error waved away, a finding marked fixed that the checker still finds, nodes or edges dropped or changed without a change naming them; for builds, errors, overlapping cards, outline items missing from the canvas, and file paths or URLs the request never gave unless declared as assumptions. ## Limits - The preview is drawn by this page, not Obsidian: preset colours use the page's palette, an edge without sides uses the side facing the other card, file and link cards show the path or URL only. - The page never reads your vault; whether a file path exists is for you to check.