Quickstart
This page takes you from nothing to a validated .uwx.md record, then shows a complete deal being recomputed and verified. You need Node.js 18 or later. You don't need to clone anything or create an account.
Every command below uses the published @uwmd/cli package through npx.
1. Create a record
npx @uwmd/cli init --output deal.uwx.mdThis writes a UWX record with every standard section stubbed out: property, rent roll, operating statement, debt structure, valuation, and the rest. Pass the file name with --output. Without it the file is named new-deal.uwx.md.
Useful options:
| Option | Effect |
|---|---|
--asset-class office | Start from another asset class (default multifamily) |
--tier analyst | Mark the record for full underwriting rather than screening |
--name "Parkview Apartments" | Fill in the deal name |
2. Validate it
npx @uwmd/cli validate deal.uwx.mdYou'll get a stage-readiness checklist and a list of issues. A fresh record reports one primary-size warning and two stage-gap info notes:
Issues (3):
[WARN] [property.total_units] CC-13: the property section does not state
multifamily's primary size field "total_units" (Protocol §XIII.1)
[INFO] [debt_structure] DQ-06: screening requires debt_structure; section is missing.
[INFO] [validation] DQ-06: screening requires validation; section is missing.Warnings and info notes leave the exit code at 0. Any error exits 1, so the same command works as a CI gate. Each code links to a remediation in the validator code taxonomy.
3. Open a complete deal
Download the multifamily example, Parkview-Apts-Glendale-AZ.uwx.md, into the same folder, then print its summary:
npx @uwmd/cli summary Parkview-Apts-Glendale-AZ.uwx.md Parkview Apartments — Glendale, AZ
multifamily · full_underwrite
Purchase Price: $7,200,000
UW NOI: $396,635
DSCR: 1.109x
LTV: 70.00%
Debt Yield: 7.87%To look through the rent roll, operating statement, and narrative without a terminal, open the same file in the viewer or the reference editor.
4. Verify the arithmetic
A verification receipt lets someone who did not build the model check that its numbers follow from the record.
npx @uwmd/cli receipt issue Parkview-Apts-Glendale-AZ.uwx.md
npx @uwmd/cli receipt verify Parkview-Apts-Glendale-AZ.uwx.md Parkview-Apts-Glendale-AZ.receipt.jsonReceipt issued for Parkview-Apts-Glendale-AZ.uwx.md → Parkview-Apts-Glendale-AZ.receipt.json (org.uwmd.pack.multifamily@…)
Metric completeness: complete
Computed: 8/8
Uncomputed: none
…
A receipt attests that these outputs follow from this record. It does not attest that the inputs are true.
Receipt verification verdict: VERIFIEDThe multifamily calculation pack recomputed all eight metrics from the record's inputs and matched them. If you change an input after issuing, verification fails with RCP-01: the record's financial content no longer matches the receipt. receipt verify exits 0 for verified, 1 for failed, and 3 for unverifiable.
A receipt says nothing about whether the rent roll or T-12 is accurate. It covers the arithmetic only. Receipts are issued when you ask for one; editing a record never creates one automatically.
5. Convert it
The same record converts to the machine representations and to a compact UW Lite summary:
npx @uwmd/cli convert Parkview-Apts-Glendale-AZ.uwx.md --to uw-json
npx @uwmd/cli convert Parkview-Apts-Glendale-AZ.uwx.md --to lite --projection-report lite-omissions.jsonThe Lite conversion warns that it omitted advanced paths. That is deliberate: UW Lite is a smaller summary profile, and lite-omissions.json lists every path it left out. Keep the .uwx.md file as the complete record. Other targets are uw-xml and uw-csv-bundle. Run npx @uwmd/cli formats to list them.
Install instead of npx
npm install --save-dev @uwmd/cliAfter a local install, the command is npx uwmd <command>. With a global install (npm install -g @uwmd/cli) it is uwmd <command>. Run it with no arguments for the full command list.
To work with records from code, install the library:
npm install @uwmd/coreimport { readFileSync } from 'node:fs';
import { parseUWFile, validateUWFile } from '@uwmd/core';
const deal = parseUWFile(readFileSync('Parkview-Apts-Glendale-AZ.uwx.md', 'utf8'));
const result = validateUWFile(deal);
console.log(deal.frontmatter.deal_name); // Parkview Apartments — Glendale, AZ
console.log(result.overall_status); // "clean"
console.log(result.deal_flags); // financial warning-band flags
for (const issue of result.issues) console.log(issue.severity, issue.code, issue.message);Next
- Your first record, by hand: build a small record line by line to see what each piece is for.
- Tools and packages: the CLI command catalog, the library, batch indexing, Excel export, and editors.
- Building with AI: instruction files and the rules an agent must follow.
- Format specification, protocol and metric dictionary: the normative contract, which defines how any party verifies a record. The tools above are starter products built on it.