Replace spreadsheets and wikis with a single source of truth for source-to-target data mappings. Clear enough for product owners to review, and precise enough for tools and AI assistants to build from.
// Legacy Customer Migration
schema legacy_customers {
CUST_ID INT (pk)
CUST_TYPE CHAR(1) (enum {R, B, G})
EMAIL_ADDR VARCHAR(255) (pii) //! not validated
PHONE_NBR VARCHAR(50) //! mixed formats
COUNTRY_CD CHAR(2)
}
schema customers {
customer_id UUID (pk, required)
display_name VARCHAR(200) (required)
email VARCHAR(255) (format email, pii)
phone VARCHAR(20) (format E.164)
}
mapping `customer migration` {
source { `legacy_customers` }
target { `customers` }
CUST_ID -> customer_id { uuid_v5("6ba7b...", CUST_ID) }
EMAIL_ADDR -> email { trim | lowercase | validate_email }
-> display_name {
"If @CUST_TYPE is R or null, concat @FIRST_NM + @LAST_NM.
Otherwise use @COMPANY_NM. Trim and title-case."
}
PHONE_NBR -> phone {
"Extract digits. If 10 digits assume US +1.
For other patterns, determine country from @COUNTRY_CD."
| warn_if_invalid
}
}
The VS Code extension gives you a live, interactive overview of your entire mapping workspace — schemas, mappings, and data flow — right alongside your code.
In most enterprises, source-to-target mapping logic lives in spreadsheets, wiki pages, Confluence docs, YAML files, and tribal knowledge. Nobody trusts the docs and nobody can trace lineage.
Satsuma is a concise, beautiful, parseable format that becomes the single source of truth. Like DBML for database schemas, but for data mappings. Keep it in Git, check it with the parser, and write it by hand or with an AI assistant.
Satsuma's ( ) metadata accepts any tag you invent, so you can describe what your organisation needs without waiting for a new version of the language:
Write down once what your tags mean. Everyone who reads the spec — analysts, engineers, and the tools and AI assistants they use — then works from the same definitions.
schema payments (
owner "payments-team",
data_domain "finance",
cost_center "CC-4200",
audit_level high,
compliance {PCI-DSS, SOX}
) {
card_number STRING (pii, encrypt AES-256,
mask last_four)
amount DECIMAL (required)
}
Designed for real enterprise data mapping: legacy databases, EDI, COBOL and nested APIs.
Product owners, analysts, and non-technical stakeholders can read and review mappings without learning a programming language. Natural language is first-class.
Tree-sitter grammar with 330 corpus tests. The CLI, the editor and the visualisations all work from the same parse tree.
Plain text that diffs, merges and goes through pull-request review like any other code. Every change to a mapping has an author and a reason.
The structure is regular, so AI assistants can read and write it too. satsuma validate checks what they produce.
From legacy database migrations to enterprise platform modelling. Every construct serves a purpose.
// Legacy Customer Migration
import { `address fields` } from "../lib/common.stm"
note {
"""
# Legacy Customer Migration
Part of **Project Phoenix** — decommissioning the legacy SQL Server
2008 instance by Q2 2026.
## Constraints
- Runs in **batches of 10,000** to prevent memory issues
- Target enforces referential integrity — addresses before customers
- Estimated total: **2.4M records**, ~180 batches
"""
}
schema legacy_sqlserver (note "CUSTOMER table — SQL Server 2008") {
CUST_ID INT (pk)
CUST_TYPE CHAR(1) (enum {R, B, G}) //! some records have NULL
EMAIL_ADDR VARCHAR(255) (pii) //! not validated
PHONE_NBR VARCHAR(50) //! mixed formats
COUNTRY_CD CHAR(2) (default US)
CREDIT_LIMIT DECIMAL(12,2)
TAX_ID VARCHAR(20) (pii, encrypt) //! plaintext in legacy
}
schema postgres_db (note "Normalized — PostgreSQL 16") {
customer_id UUID (pk, required)
customer_type VARCHAR(20) (enum {retail, business, government})
display_name VARCHAR(200) (required)
email VARCHAR(255) (format email, pii)
phone VARCHAR(20) (format E.164)
address_id UUID (ref @addresses.id)
credit_limit_cents BIGINT (default 0)
tax_encrypted TEXT (pii, encrypt AES-256-GCM)
...`address fields`
}
mapping `customer migration` {
source { `legacy_sqlserver` }
target { `postgres_db` }
CUST_ID -> customer_id { uuid_v5("6ba7b...", CUST_ID) }
CUST_TYPE -> customer_type {
map { R: "retail", B: "business", G: "government", null: "retail" }
}
-> display_name {
"If @CUST_TYPE is R or null, concat @FIRST_NM + ' ' + @LAST_NM.
Otherwise use @COMPANY_NM. Trim and title-case."
}
EMAIL_ADDR -> email { trim | lowercase | validate_email | null_if_invalid }
PHONE_NBR -> phone {
"Extract all digits. If 10 digits, assume US country code +1.
Format as E.164. For other patterns, determine country from @COUNTRY_CD."
| warn_if_invalid
}
-> address_id {
"Create record in @addresses from @ADDR_LINE_1, @CITY, @STATE_PROV,
@ZIP_POSTAL, @COUNTRY_CD. Normalize state to 2-char code.
Deduplicate by normalized street + zip. Return UUID."
}
CREDIT_LIMIT -> credit_limit_cents { coalesce(0) | * 100 | round }
TAX_ID -> tax_encrypted {
error_if_null | encrypt(AES-256-GCM, secrets.tax_encryption_key)
}
}
Satsuma serves the entire data team, from architects to product owners.
Product managers, business analysts, and non-technical stakeholders can read and review mappings without learning code. Natural language descriptions are built right into the syntax.
Start the tutorial →Define mapping contracts for your platform and tech stack, then build pipelines from them by hand or with AI tools. Write data quality tests, create sample data and record governance metadata. Simple metadata conventions cover Kimball and Data Vault modelling.
Explore the CLI →Portable, version-controlled mapping specs. REST APIs, EDI, XML, COBOL, ESBs, database tables — all supported.
See examples →Trace every field from source to target. PII tags, field descriptions, encryption markers, and lineage are structural — not comments.
Learn about lineage →A regular, validated format for AI tools to read and write. Start with the agent reference guide.
Agent reference →One mapping language across the entire platform. Namespaces, imports, and workspace graphs for multi-team modelling.
Platform modelling →Every tool works from the real parse tree, so results are exact and repeatable.
23 commands · 1203 tests
Full LSP · 378 tests
The tools help, but a .stm file is useful on its own. Locked-down laptop? Working through a web chat assistant? You still get the core benefits.
.stm file makes sense in any text editor or on GitHub, with nothing installed.
.stm files diff cleanly and merge naturally in any Git workflow.
Draft specs from requirements
Upload a spreadsheet or requirements doc to any LLM and ask it to produce a .stm file.
Review and explain specs
Paste a .stm file and ask for a walkthrough, risk assessment, or onboarding summary.
Generate implementation scaffolds
Ask the LLM to produce dbt, PySpark, SQL, or pandas code from your mapping spec.
Use Agent Skills
Drop-in Agent Skills for Excel ↔ Satsuma, dbt ↔ Satsuma, OpenLineage export, synthetic test data, and plain-English spec explainers.
Everything you need to know about adopting Satsuma.
That's the primary design goal. The syntax reads like a structured document, not a programming language. Product owners, business analysts, and other non-technical stakeholders can follow the arrows (source_field -> target_field), understand metadata like (pii, required), and read natural-language transform descriptions directly. No programming experience required — there's a dedicated tutorial for non-technical readers to get started in minutes.
No. Satsuma is not a pipeline engine or a schema modelling tool. It is a specification language that sits upstream of your implementation stack. You write your mapping intent in Satsuma, then use that spec to generate or validate implementations in dbt, PySpark, pandas, SQL, DuckDB, or whatever your team runs. Think of it as the blueprint, not the building.
Spreadsheets are easy to start and hard to keep right: layouts differ from team to team, changes don't diff cleanly, and meaning hides in cell colour and comments. YAML and JSON fix the diffs, but they are hard to read at a glance and every team invents its own shape.
Satsuma has one shape, fixed by a grammar, and it reads like a document. A mapping looks the same whoever wrote it, and satsuma validate and satsuma lint tell you whether a spec is structurally right.
AI coding assistants such as GitHub Copilot, Claude Code and Cursor can read and write .stm files, and can use them to draft implementations for dbt, Databricks, pandas, PySpark, DuckDB and similar stacks. Satsuma keeps exact field mappings, types and value maps apart from plain-English business rules, so it is clear which parts can be implemented directly and which need a person's judgement. Review what an assistant produces as you would any other code.
Satsuma also ships Agent Skills (following the agentskills.io standard) for Claude Code and Claude Desktop: convert Excel ↔ Satsuma, reverse-engineer specs from dbt, scaffold dbt projects, generate synthetic test data, export OpenLineage events, and produce plain-English spec explanations for stakeholders.
You can still get real value. Satsuma files are plain text — write them in any editor and version them in Git. For AI assistance, paste the compact grammar reference into any web LLM like ChatGPT, Gemini, or Claude.ai. That's enough for the model to generate, review, and explain Satsuma specs. No CLI, no VS Code, no agent required. Read the full guide for workflows and tips.
Satsuma does not depend on any stack. The same .stm file can guide implementations in dbt (Snowflake, BigQuery, Redshift), Databricks Lakehouse Declarative Pipelines, PySpark, pandas, DuckDB, dltHub, SQL stored procedures, Apache Beam and more. Integration teams use the same specs for flows in webMethods, MuleSoft, Azure Logic Apps, cloud microservices and other middleware. The mapping spec is the contract; the implementation target is your choice.
Satsuma is in an early experimental stage. The language spec, parser, CLI, and VS Code extension are functional and well-tested, but the project is young and evolving. We're actively looking for feedback from data engineers, integration teams, and anyone who works with mapping specs. If you try it, we'd love to hear what works and what doesn't — open an issue or start a discussion on GitHub.
Satsuma is open source and free. Start mapping in minutes.