OmniScript_
A typed, agent-native document format: one plain-text file for documents, slides, spreadsheets and the findings and decisions behind them.
One osf binary checks, queries and renders it to PDF, DOCX, PPTX, XLSX, HTML and Markdown, and serves it to agents over MCP and A2A.
Why OmniScript?
Office formats describe layout. Markdown is flat. OmniScript keeps the meaning: typed blocks, references and formulas, in text a person can read and an agent can address.
Typed knowledge
Findings, decisions, requirements, actions and hypotheses are blocks with ids, statuses and confidence, not just headings.
A document graph
@ref links blocks together; selectors like #D-1 -> criteria query the graph from the CLI, JavaScript, MCP and A2A.
Agent-native
osf serve mcp gives MCP clients tools to read, query, edit and render documents, with an MCP App view. osf serve a2a runs a document as an A2A agent.
Every format, one binary
PDF (typeset by an embedded Typst, no browser), DOCX, PPTX, XLSX, HTML, Markdown and JSON from a single osf binary.
Live formulas
Sheet formulas are evaluated with IronCalc: computed values in every output, live formulas in XLSX. A1 cells work.
Rust core, runs in the browser
The same parser, linter and HTML renderer compile to WebAssembly as omniscript-core. The playground runs on it.
Git-native plain text
Readable diffs, a lossless formatter (osf fmt) and a semantic diff (osf diff) that matches blocks by id.
Teach your agent OSF
osf skill install adds the OmniScript Agent Skill (SKILL.md) for Claude Code and other agents that read skills. osf serve mcp gives any MCP client tools to query, edit and render your documents.
See It In Action
A sheet with formulas, a finding that cites it, and a decision that depends on the finding.
@meta {
osf: "2.0";
title: "Q4 Business Review";
author: "Your Team";
theme: corporate;
}
@doc {
# Executive summary
Revenue grew **20%**, driven by Europe. See [F-1](#F-1).
}
@sheet {
id: "revenue";
name: "Revenue";
A1 = "Region"; B1 = "Q3"; C1 = "Q4";
A2 = "Europe"; B2 = 748; C2 = 880;
A3 = "Asia"; B3 = 477; C3 = 592;
A4 = "Total"; B4 = =SUM(B2:B3); C4 = =SUM(C2:C3);
}
@finding {
id: "F-1";
claim: "Europe contributed most of the Q4 growth.";
confidence: 0.85;
evidence: [@ref("revenue")];
}
@decision {
id: "D-1";
question: "Where do we hire in Q1?";
options: ["Europe", "Asia"];
criteria: [@ref("F-1")];
}Quick Start
Get up and running in under a minute.
@meta { osf: "2.0"; title: "My First Doc"; }
@doc {
# Hello OmniScript
This is my first document!
}