.it — IntentText · v1.x · open formatIntentText (.it) is an open format for business documents. Write contracts, invoices, and reports as readable text — query them like a database, print them to enterprise-grade PDF, and seal them with a tamper-evident hash. In English or Arabic, by people or AI agents.
$ npm install -g @dotit/coreEvery line is one intent: keyword: content | prop: value. The source on the left is the single artifact — the invoice on the right is dotit invoice.it --html --theme corporate.
page: | size: A4 | margin: 20mmheader: Horizon Consultingfooter: INV-2026-042 · Page {{page}} of {{pages}}title: Invoice INV-2026-042 | end: 2026-06-01summary: Horizon Consulting → Acme Corpmeta: | theme: corporate | status: Unpaidsection: Bill Tocontact: Acme Corp | email: accounts@acme.com | vat: VAT-300214section: Line Items| Description | Qty | Unit | Total || Consulting — May 2026 | 40 | 150.00 | 6,000.00 || Systems integration | 12 | 175.00 | 2,100.00 |metric: Subtotal | value: 8,100.00 USDmetric: Tax (5%) | value: 405.00 USDmetric: Total Due | value: [8,505.00 USD]{ weight: bold }deadline: Payment due | date: 2026-06-30 | consequence: 2% monthly late feesign: Layla Hassan | role: Finance Director | at: 2026-06-01T09:30:00Zfreeze: | status: locked
Horizon Consulting → Acme Corp
| Description | Qty | Unit | Total |
|---|---|---|---|
| Consulting — May 2026 | 40 | 150.00 | 6,000.00 |
| Systems integration | 12 | 175.00 | 2,100.00 |
end:Inline styled spans — [text]{…}Running header / footer with page countersTyped blocks — metric:, deadline:, contact:Not translated — native. Write the keywords themselves in Arabic: عنوان: قسم: جهة: مهلة: توقيع:. The document below is a complete, sealable services contract.
عنوان: عقد خدمات استشاريةملخص: بين شركة الأفق للاستشارات ومؤسسة النور التجاريةبيانات: | التاريخ: 2026-06-01 | الحالة: ساريقسم: الأطرافجهة: شركة الأفق للاستشارات | البريد: info@alufuq.qa | السجل: CR-10442جهة: مؤسسة النور التجارية | البريد: contact@alnoor.qa | السجل: CR-22871قسم: نطاق العملنص: يقدّم الطرف الأول خدمات استشارية إدارية خلال الربع الثالث من عام 2026.مؤشر: قيمة العقد | value: 45,000 ر.قمهلة: سداد الدفعة الأولى | date: 2026-07-15 | consequence: غرامة تأخير 2%قسم: الجدول الزمنيأعمدة: المرحلة | التسليم | الموعدصف: الأولى | دراسة الوضع الراهن | 2026-07-01صف: الثانية | التقرير النهائي | 2026-09-30اعتماد: روجع من الإدارة القانونية | by: سارة المنصوري | role: مستشارة قانونيةتوقيع: أحمد الجابر | role: المدير التنفيذي | at: 2026-06-01T10:00:00Zتجميد: | status: locked
بين شركة الأفق للاستشارات ومؤسسة النور التجارية
يقدّم الطرف الأول خدمات استشارية إدارية خلال الربع الثالث من عام 2026.
| المرحلة | التسليم | الموعد |
|---|---|---|
| الأولى | دراسة الوضع الراهن | 2026-07-01 |
| الثانية | التقرير النهائي | 2026-09-30 |
--type deadline finds مهلة: tooThe page is part of the document. Paper size, margins, running headers and footers, watermarks, and house typography are all declared in the same .it file — no CSS, no Word template drift.
Word-like pages at editor.uts.qa — what you see on the canvas is what prints.
header: / footer: render in the print margins with {{page}} / {{pages}} resolved per page. watermark: DRAFT overlays every page.
corporate, legal, editorial, technical, minimal, warm, dark, print — plus leading:, space-before:, space-after: per block or document-wide via style: rules.
Browser printing needs zero dependencies. For invoicing pipelines and archives, @dotit/pdf merges, seals, and returns real PDF bytes in one call.
page: | size: A4 | margin: 20mmheader: ACME Holdings — Confidentialfooter: Page {{page}} of {{pages}}watermark: DRAFT | opacity: 0.1style: text | leading: 1.6 | space-after: 12pxstyle: section | color: #1e3a5f | weight: 600
import { issuePDF } from "@dotit/pdf";
const { source, hash, pdf } = await issuePDF(template, data, {
signer: "Layla Hassan",
role: "Finance Director",
theme: "corporate",
});
// source — the sealed .it: the queryable, verifiable record
// pdf — real PDF bytes, ready to email or archiveThe trust lifecycle lives inside the file: track → approve → sign → freeze → verify → amendment. No platform, no account, no vendor.
The seal is a SHA-256 hash over the canonical source. Anyone with the file can recompute it — twenty years from now, with any SHA-256 implementation.
approve: lines are part of what gets sealed. The append-only audit log below the history: boundary never disturbs the hash.
Sealed documents change only through amendment: — was: / now: records the change while the original seal stays intact.
dotit seal contract.it --signer "Ahmed Al-Jaber" --role "CEO"✅ Document sealedSigner: Ahmed Al-Jaber (CEO)Hash: sha256:9f1c2ab87d…Frozen: 2026-06-12T10:02:11Zdotit verify contract.it✅ Document intactSealed: 2026-06-12T10:02:11ZSigners: Ahmed Al-Jaber (CEO) ✅// a payment term is edited after sealing…dotit verify contract.it❌ Document has been modified since sealingExpected: sha256:9f1c2ab87d…Current: sha256:3e8d41c09a…
Every block is typed and every property is queryable — so a directory of contracts answers questions without a database, an importer, or a server.
Filter by type, author, status, section, or content; output as table, JSON, or CSV. Date ranges work because dates are ISO 8601.
Each folder owns a shallow .it-index that refreshes lazily on query. The .it files stay the source of truth — greppable and git-diffable.
queryBlocks(doc, "type:task owner:Ahmed sort:due:asc limit:5") — one function, no schema migration, works offline.
dotit query ./contracts --type deadlineFILE TYPE CONTENT PROPERTIES-------------- -------- ------------------ --------------------------acme-2026.it deadline Payment due date: 2026-06-30 | consequence: 2% monthly late feealnoor-svc.it deadline سداد الدفعة الأولى date: 2026-07-15 | consequence: غرامة تأخير 2%orbit-nda.it deadline Renewal notice date: 2026-09-01// build per-folder indexes once — queries self-heal them afterwardsdotit index ./contracts --recursive// or ask in natural languagedotit ask ./contracts "which contracts renew this quarter?"
IntentText is designed to be authored by models as much as by people — deterministic grammar, no layout ambiguity, and trust operations an agent can run.
The complete machine reference: line grammar, all 38 canonical keywords, styling layers, templates and merge, the trust model, and generation rules. Point any LLM at it and it writes valid .it — documents, templates, and workflows — immediately.
{
"mcpServers": {
"intenttext": {
"command": "npx",
"args": ["-y", "-p", "@dotit/mcp", "intenttext-mcp"]
}
}
}And agents don't just read .it — they run on it: step:, decision:, gate:, trigger:, result:, policy:, audit: define executable workflows with human checkpoints. Read the agent guide →
A zero-dependency core, opt-in companions, and tooling for every surface you work on.
dotit CLI. Zero dependencies.@dotit/pdfServer-side PDF bytes: merge → seal → render in one issuePDF() call.@dotit/mcpMCP server with 12 tools — parse, render, query, seal, verify from any AI agent.VS Code extensionSyntax highlighting from the same keyword registry the parser uses.EditorWord-like WYSIWYG pages, template mode, trust chips, print preview — in the browser.GitHubThe spec, the source, the issues. The format is open — the file is yours.Author → merge → print → sign → seal → query → verify. Open format, no lock-in.
$ npm install -g @dotit/core