Skip to content

// the schema is the product

A semantic layerfor analytics,agent-native.

Atlas is a YAML-defined semantic layer for analytics — authored by humans, consumed by AI agents. Entities, glossary, and metrics live in your repo; the agent reads them, writes deterministic SQL, and runs it through a 7-stage validation pipeline — read-only, table-whitelisted, statement-timed.

self-host is free · MCP server for claude desktop, cursor, continue · slack-native

010203040506loglogINPUTprompt"top categories by gmv…"YAMLsemantic_layer.yamlentities · metrics · glossaryPROCESScompilerAST → SQLGATE7 validatorsast · perms · row_limit · …DBwarehousepostgres / snowflake / bqRESULTresultrows · read-onlyAUDITaudit_logevery query · every opWIDGET<AtlasChat />react widget

// the schema is the product

The YAML format is the moat.

Entities, dimensions, measures, joins, virtual dimensions, query patterns, glossary terms, and authoritative metrics — all in YAML, in your repo, code-reviewed in pull requests. Every field exists because an LLM needs it: sample_values ground the agent in real data, glossary.status: ambiguous forces clarifying questions, metrics.objective picks MAX vs MIN.

semantic/entities/orders.yml
name: Orderstype: fact_tabletable: ordersgrain: one row per order dimensions:  - name: status    sql: status    type: string    sample_values: [pending, shipped, delivered, cancelled]   - name: order_month    sql: TO_CHAR(created_at, 'YYYY-MM')    type: string    virtual: true measures:  - name: total_gmv_cents    sql: total_cents    type: sum joins:  - target_entity: Customers    relationship: many_to_one    join_columns: { from: customer_id, to: id }
atlas · agent replyvia MCP

// user

What's our top-performing category by GMV this month?

// agent reads orders.yml + categories.yml + glossary.yml, then writes SQL

SELECT c.name,
       SUM(o.total_cents) / 100.0 AS gmv,
       COUNT(DISTINCT o.id) AS orders
FROM orders o
JOIN order_items oi ON oi.order_id = o.id
JOIN products p ON p.name = oi.product_name
JOIN categories c ON c.id = p.category_id
WHERE o.status != 'cancelled'
AND o.created_at >= DATE_TRUNC('month', NOW())
GROUP BY c.name
ORDER BY gmv DESC
LIMIT 5;

// result · 5 rows · 7 validators passed

categorygmvorders
Bedding$184,2192,041
Kitchen$142,7181,587
Bath$98,4021,103
Outdoor$71,288812
Accessories$54,011693

// canonical questions

What's our GMV this quarter?
What's our top-performing category by GMV this month?
Monthly GMV trend over the past 6 months.
Show me revenue last quarter.
What are our most common return reasons?

// same questions on the readme, the docs homepage, and the eval harness · against the bundled NovaMart e-commerce demo

94%

of AI-generated SQL fails at least one Atlas validator.

// sample of 12,481 queries · gpt-4o, claude-sonnet, llama-3.1 · against 18 production schemas

// trace one query

One question, end to end.

Watch it run. Click any gate to see what it checks. This is the same panel the operator sees in the chat UI — every step is a real artifact, every gate is the real check.

session.4f8e · production.analytics
1.180s / 1.18s·7 / 7 gates·● ok
sqlplanresultrawresult
execute
Read-only connection, role-scoped session, results streamed back to the widget.
-- session.4f8e · 7 validations passed
-- read-only · scoped to analytics.public

SELECT c.name,
       SUM(o.total_cents) / 100.0 AS gmv,
       COUNT(DISTINCT o.id) AS orders
  FROM orders o
  JOIN order_items oi ON oi.order_id = o.id
  JOIN products p ON p.name = oi.product_name
  JOIN categories c ON c.id = p.category_id
 WHERE o.status != 'cancelled'
   AND o.created_at >= DATE_TRUNC('month', NOW())
 GROUP BY c.name
 ORDER BY gmv DESC LIMIT 5;
categorygmvorders
Bedding$184,2192,041
Kitchen$142,7181,587
Bath$98,4021,103
Outdoor$71,288812
Accessories$54,011693
step 11/11 · execute
// playbackautoplays on scroll · click any step or gate to inspect

// nodes in the system

Four primitives.

Inspectable, optional, TypeScript. No agent, no orchestration framework, no prompt salad.

entitysemantic_layer

Semantic layer

Entities, glossary, metrics in YAML. Versioned beside your code. Atlas reads them on every prompt.

entitiesglossarymetrics
gatevalidators

7 validators

AST-parsed, permission-checked, row-limited. Read-only by default. Same in dev, same in prod.

astpermsrow_limit+ 4
dbwarehouses

Warehouse-native

One connection spec. On self-host, no data leaves your network. Atlas runs in your VPC.

postgressnowflakebigqueryduckdb
auditaudit_log

Audit-ready

Every query, every result, every operator — logged, searchable, exportable. SSO, SAML, SCIM.

ssosamlscimcsv

// drop-in surfaces

<AtlasChat />
React widget. Inherits your tokens, speaks your data.
dashboards.yml
Chat drawer is the editor. Per-user drafts, atomic Publish, persisted baseline.
prompt_lib.ts
Prompts in TypeScript, not strings in a UI. Diffed, rolled back, code-reviewed.
$ atlas cli
Run, test, replay queries from terminal or CI.

// why atlas

Three columns. One choice.

The same comparison from the README — same words, same scoring, no claim drift across surfaces.

Semantic layer
Atlas: YAML on disk — query_patterns, virtual_dimensions, glossary.status: ambiguous, metrics.objective are all first-class
Traditional BI: Proprietary metadata, GUI-authored
Other text-to-SQL: None or limited
Agent-native
Atlas: MCP server first — Claude Desktop, Cursor, Continue with bunx @useatlas/mcp init
Traditional BI: Bolted-on AI feature
Other text-to-SQL: Standalone chat UI
Embeddable
Atlas: Script tag, React component, headless API, MCP, 8 chat platforms
Traditional BI: Standalone app
Other text-to-SQL: Standalone app
Dashboards as conversations
Atlas: Chat drawer is the editor — per-user drafts + atomic three-way-merge Publish over a persisted baseline
Traditional BI: Static dashboards with separate edit mode
Other text-to-SQL: No dashboards
Chat-platform reach
Atlas: Slack-native — answers questions in opt-in channels with a reaction-first tracer, fail-closed kill switch (Enterprise tier)
Traditional BI: Web app only — context-switch out of Slack
Other text-to-SQL: Web app only
Deploy anywhere
Atlas: Docker, Railway, Vercel, or your own infra
Traditional BI: Vendor-hosted
Other text-to-SQL: Vendor-hosted
Plugin ecosystem
Atlas: 21 plugins across 5 types — extend anything
Traditional BI: Closed
Other text-to-SQL: Limited
Open source
Atlas: AGPL-3.0 core, MIT client libs
Traditional BI: Proprietary
Other text-to-SQL: Varies
Multi-database
Atlas: PostgreSQL, MySQL, ClickHouse, Snowflake, DuckDB, BigQuery, Salesforce
Traditional BI: Usually one
Other text-to-SQL: Usually one

// deployment topology

Two ways to run it. Same code.

Cloud, or your VPC. Same Atlas, same primitives, same upgrade path.

// self-host

free

Your infra. Your data.

$0

One command. Bun, Docker, or k8s. AGPL-3.0.
Every feature, no limits.

~/projects — bash
$bun create atlas-agent my-atlas
$cd my-atlas && bun run dev
atlas booted on :3000
connected · postgres://localhost
$
  • BYO model key
  • No telemetry
  • Community Discord
read the docs →

// atlas cloud

$29/ seat

Hosted. Zero ops.

recommended

We run it. Weekly updates, monitored connections, SLA.
Live in 3 minutes.

live status
atlas.openstatus.dev →
  • SSO · SAML · SCIM
  • 99.9% uptime SLA
  • Audit log export
  • Priority support
start free trial →

// ship it

YAML in.Validated answers out.

self-host is free · MCP server for claude desktop, cursor, continue · slack-native (enterprise)