# Base File Fixer > Check an Obsidian Bases .base file before you open it. Free in the browser: a strict YAML reader, > Bases schema checks, an expression parser with a type pass over every filter and formula, and a > preview of each view over sample notes you paste. Two metered lanes add judgement: a fix that > answers every finding and returns a corrected file, or a new base built from a description. Any > file in a reply is checked and previewed again in the browser. URL: https://basefile-fixer.skillsafe.ai/ API: https://basefile-fixer.skillsafe.ai/api.html Tokens: https://basefile-fixer.skillsafe.ai/tokens.html Model: gpt-terra (the balanced GPT tier alias on SkillSafe) Source skill: @kepano/obsidian-bases (kepano/obsidian-skills, MIT) - Obsidian Bases: .base files with filters, formulas, properties, summaries and views. Independent tool: not affiliated with or endorsed by Obsidian or Dynalist Inc. "Obsidian" names the app the file is for. ## What runs free, in the browser - Strict YAML reader: line-accurate errors, including the quoting mistakes .base files most often hit - a double-quoted formula with double quotes inside, a value containing ": ", a regular expression in double quotes, an unquoted " #" that YAML reads as a comment and cuts the value. - Bases schema checks, from the official help pages: only filters, formulas, properties, summaries and views at the top level; one and/or/not key per filter group; core view types (table, cards, list, map, kanban); groupBy with direction ASC or DESC; order and property ids; exact built-in summary names; whole-number limits. - Expression parse and type pass over every filter and formula: unknown functions and methods, wrong argument counts, a Duration rounded or divided before reading .days, date() on a property some notes lack, comparing a date with bare text, file.name compared without its extension, formula.X used but never defined, circular formulas. - Preview over pasted sample notes: each view's matching rows, sort, groups, limit and summaries, cell and filter errors per note, and every property name looked up in the notes to catch typos. - Exports: the check as Markdown, findings as CSV, each previewed view as CSV, the .base file. ## The paid lanes Input: {"task": "fix"|"build", "facts": "", "base" (fix; optional for build: a file 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), preview_clock, base_path, findings (id F1.., severity error | warning | info, source yaml | schema | expr | data, code, where, line, text, quote; at most 60), findings_total, formula_types, notes (summary of the sample notes: files, folders, tags, properties with note counts, types and examples; or null), preview (per view: matched, shown, columns, filter and cell errors, first rows; or null), base_sent (lines, lines_cut). facts, build lane: preview_clock, base_path, notes (or null), and current_base (status, errors, warnings) when a file is in the editor. An API caller that has not run the browser checker may send "{}" or a minimal JSON string; the model then works from the file or the request alone. - 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, in id order -, changes [{where, before (copied exactly from the file), after, why}], fixed_yaml (the complete corrected file, or "" when nothing needs to change), to_check}. - build -> {task, headline, base_yaml (the complete file), explanation [{part filters | formulas | properties | summaries | views, text}], properties_used (note properties only, exact names), assumptions (every guessed property, folder or tag), to_check}. The page reconciles every reply: unanswered or duplicate findings, a deterministic error waved away, a "before" that is not in the file, a finding marked fixed that the checker still finds in fixed_yaml, and build properties that are in neither the sample notes nor the assumptions. ## Limits of the preview The preview is an approximation of Obsidian Bases, not Obsidian: - No plugins: views of a type added by a community plugin are not previewed, and Map views are checked but need the official Maps plugin in Obsidian. - Dates carry no time zone (floating): a note's 2026-10-15 is midnight of that day, and now() and today() are the preview clock you set. - Subtracting two dates gives a Duration; .days, .hours, .minutes and .seconds are whole units, truncated toward zero. - Documented assumptions where the help pages are silent: an empty list or object counts as false in a filter; arithmetic on a missing property is an error (guard it with if()); frontmatter text shaped like YYYY-MM-DD is read as a date and "[[Note]]" as a link; file.tags holds tags without the leading #, from frontmatter and from #tags in the body; random() is seeded so the preview is repeatable. - The page never reads your vault: it sees only the file and the notes you paste.