New to Claude Skills? Learn how to install them →

metabase on GitHub

Serdes YAML Edit

Free

Edit Metabase YAML files with precision and validation.

by metabase48.7k stars on metabase/metabase
1 views
Updated Aug 10, 2026
Get this skill

Free · Opens the source repo

What Serdes YAML Edit does

The Serdes YAML Edit skill is designed specifically for developers and data analysts working with Metabase, allowing them to edit YAML files for cards, dashboards, and databases while adhering to the correct structural conventions and references. This skill emphasizes the importance of using portable references rather than integer IDs, which is crucial for maintaining the integrity of the YAML content. By following the guidelines provided, users can ensure that their edits are valid and compliant with Metabase's requirements.

Editing YAML files can be error-prone, especially when it comes to complex queries and references. This skill provides clear instructions on how to safely make edits, including which fields can be modified without breaking validation and which require careful attention to detail. The skill also includes a self-healing loop for addressing errors reported by the validation checkers, guiding users through the process of identifying and correcting issues in their YAML files.

For those who frequently work with Metabase exports, this skill is invaluable. It not only streamlines the editing process but also reduces the risk of errors that can arise from incorrect references or structural mistakes. The skill is particularly useful when changing source tables, adding filters, or updating visualization types, as it provides a structured approach to making these changes while ensuring that all necessary references are updated accordingly.

Overall, the Serdes YAML Edit skill is a vital tool for anyone looking to efficiently manage and edit Metabase YAML files, ensuring that all changes are validated and that the integrity of the data is maintained throughout the editing process.

When to use it

Use this skill when you need to modify exported Metabase YAML content, such as cards, dashboards, or databases, while maintaining validation.

When not to use it

This skill is not suitable for users unfamiliar with YAML or those who do not require strict adherence to Metabase's structural conventions.

What you can build with it

Editing a Dashboard Card

Update the display name and visualization type of a dashboard card while ensuring all references are correct.

Changing Source Tables

Modify the source table of a card and ensure all related references in the dataset query and result metadata are updated accordingly.

Adding Filters to Queries

Incorporate filters into structured queries while maintaining the integrity of the dataset query and its references.

How to install Serdes YAML Edit

View source

1. Install with the skills CLI

npx skills add metabase/metabase/serdes-yaml-edit --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by metabase

Serdes YAML Edit Skill

Golden Rule

Run both checkers after every edit. No exceptions. Do not batch multiple edits before validating.

clojure -M:run:ee --mode checker --checker structural --export /path/to/export-dir
clojure -M:run:ee --mode checker --checker cards --export /path/to/export-dir

If either checker fails, fix the issue before making further edits.

Portable References

Serdes YAML uses portable references instead of integer IDs. This is the most important concept for editing.

Database references

String name: "Sample Database"

Table references

Array of [database, schema, table]:

table_id:
- Sample Database
- PUBLIC
- ACCOUNTS

Field references

Array of [database, schema, table, field]:

id:
- Sample Database
- PUBLIC
- ACCOUNTS
- EMAIL

Field refs in queries

field_ref:
- field
- - Sample Database
  - PUBLIC
  - ACCOUNTS
  - EMAIL
- null

The outer array is [field, <field-path>, <options>]. The options are usually null.

Card references

Entity ID string (21 characters): "Qk5TgsNx4ubXIUtsQmT8G"

Source table in queries

dataset_query:
  database: Sample Database
  query:
    source-table:
    - Sample Database
    - PUBLIC
    - ACCOUNTS
  type: query

Safe Edits (low risk)

These rarely break validation:

  • name - card/dashboard display name
  • description - card/dashboard description
  • display - visualization type (table, bar, line, pie, etc.)
  • visualization_settings - chart configuration
  • archived - true/false
  • collection_id - move to a different collection (use entity_id of target collection, or null for root)

Structural Edits (must match schema)

These must use valid portable refs and will be caught by the cards checker if wrong:

  • dataset_query - the query definition
  • result_metadata - column metadata (must match the query's output columns)
  • table_id - must reference a table that exists in the export
  • database_id - must reference a database that exists in the export

Editing result_metadata

Each entry in result_metadata describes an output column. When changing a query's source table or fields, you must update result_metadata to match. Each field entry needs at minimum:

  • name - column name (e.g., EMAIL)
  • base_type - Metabase type (e.g., type/Text, type/Integer, type/DateTime)
  • display_name - human-readable name
  • field_ref - portable field reference
  • id - portable field path
  • table_id - portable table path
  • source - usually fields

Common Operations

Rename a card

Change name: at the top level. Safe, no ref changes needed.

Change a card's source table

Update all of these consistently:

  1. table_id - top-level
  2. dataset_query.query.source-table - in the query
  3. result_metadata - every field entry's id, field_ref, and table_id

Add a filter to a structured query

dataset_query:
  database: Sample Database
  query:
    source-table:
    - Sample Database
    - PUBLIC
    - ORDERS
    filter:
    - ">"
    - - field
      - - Sample Database
        - PUBLIC
        - ORDERS
        - TOTAL
      - null
    - 100
  type: query

Change visualization type

display: bar    # was: table

Valid types: table, bar, line, pie, scalar, row, area, combo, scatter, funnel, map, pivot, progress, gauge, waterfall

Looking Up Valid References

The export directory IS the reference catalog. When you need to find the correct name for a database, table, or field, look it up directly from the export.

List valid databases

ls databases/

Each entry is a database name (directory for serdes format, .yaml for concise format).

List valid tables for a database

ls databases/<db-name>/schemas/<schema>/tables/

Example: ls databases/Sample\ Database/schemas/PUBLIC/tables/ shows ACCOUNTS, ORDERS, PRODUCTS, etc.

List valid fields for a table

ls databases/<db-name>/schemas/<schema>/tables/<table>/fields/

Example: ls databases/Sample\ Database/schemas/PUBLIC/tables/PRODUCTS/fields/ shows CATEGORY.yaml, TITLE.yaml, PRICE.yaml, etc. The filename (minus .yaml) is the field name.

Find card entity IDs

Card filenames encode the entity ID: <entity-id>_<slug>.yaml. The entity ID is the part before the first underscore (21 characters).

Self-Healing Loop

When a checker reports errors, follow this loop:

  1. Read the error message - it tells you what's wrong and often suggests the fix
  2. Look up the correct value from the export directory (see "Looking Up Valid References" above)
  3. Fix the YAML
  4. Re-run both checkers
  5. Repeat until clean

Do not guess at fixes. Always look up the correct value from the export.

Understanding Checker Errors

Structural checker errors

The structural checker validates YAML shape against Malli schemas. Common errors:

Missing required key with typo suggestion:

Missing required key 'name' - found 'nameee' which may be a typo

Fix: rename the typo'd key back to the correct name. The checker tells you what it expected and what it found.

Wrong type:

'archived' should be a boolean, got: "yes"

Fix: use true/false, not strings.

Unknown key:

Unknown key 'foobar' in card

Fix: remove the key, or check if it's a typo of a known key.

Cards checker errors

The cards checker validates that queries resolve against exported metadata. Error types:

UNRESOLVED REFERENCES:

UNRESOLVED REFERENCES:
  - field: Sample Database.PUBLIC.PRODUCTS.CATEGORYYY

The dotted path tells you exactly which reference failed. Look up the correct value:

  • Last segment is the field name - check databases/.../tables/<table>/fields/
  • Third segment is the table name - check databases/.../schemas/<schema>/tables/
  • First segment is the database name - check databases/

ERROR (query construction failed):

ERROR: Error creating query from legacy query: Invalid output: ...

Usually means the query structure is malformed. This often follows unresolved references - fix the refs first, then re-check.

ERROR (nil name):

ERROR: Invalid output: {:name ["should be a string, got: nil"]}

The card is missing its name field (likely a structural issue that also affects the cards checker).

Exit codes

  • Exit 0: all checks passed
  • Exit 1: one or more failures

File Naming Convention

Card files: collections/<collection-path>/cards/<entity-id>_<slug>.yaml

The filename slug should match the card name (lowercase, underscored). If you rename a card, consider renaming the file to match, though import works on entity_id not filename.

What NOT to Edit

  • entity_id - this is the identity of the object, changing it creates a new object on import
  • serdes/meta - internal serdes metadata, leave it alone
  • created_at - timestamp, no reason to change
  • creator_id - email reference, leave it
  • metabase_version - informational, leave it

Frequently asked questions about Serdes YAML Edit

Similar skills