Every agent now speaks xlsx
Full Excel compatibility for agents and machines.
// what it does
The whole spreadsheet, headless and pipeable

compute
Every formula calculated correctly
Set a cell to =PMT(…) or =XLOOKUP(…) and read the answer back. It's the same engine the app runs, so if Excel can compute it, so can a shell script.
pipe
Text in, text out
Every command reads stdin and writes stdout, so a workbook works with jq, awk, curl, sqlite, and everything else you already use.
render
Pixel perfect rendering
Render any range to a PNG, or a whole workbook to a PDF, drawn the way the app would draw it. Post a chart to Slack, or mail a report from cron.
// getting started
Your first sheet, start to finish
tip: nobie --help, nobie <noun> --help, and nobie <noun> <verb> --help never go stale.
// naming things
Point at a cell
Every command takes a target (which workbook) and usually a selector (which cells).
| Target | Means |
|---|---|
report.xlsx | A file path. This is the default; no session needed. |
@Report.xlsx | A workbook you've held open with workbook open, for back-to-back edits. |
file:@odd-name | Escape hatch: force a literal to be treated as a path. |
--path P | Force P to be a path regardless of how it looks. |
A selector is a sheet-qualified cell or rectangle: Sheet1!A1, Sheet1!A1:C9, or a bare A1 with --sheet Sheet1. Quote sheets with spaces for your shell: 'Q1 Sales'!A1.
Input accepts A1 or absolute R1C1 anywhere (auto-detected). Output is A1 by default; the global --ref-style r1c1 flag flips it.
// the shape
One grammar for everything
Learn it once and the whole tool falls out of it. A noun, a verb, the workbook, and what to act on:
| Noun | Verbs / Actions |
|---|---|
workbook | open, new, close, path, info, undo, print (PDF) |
save | save in place, Save As, save a copy |
sheet | add, rename, delete, list |
cell | set, read |
range | read, clear, paste, copy, cut, render (PNG) |
style | set, read (effective styles), compact |
calc | recalc, mode (automatic / manual / …) |
session | start, stop, list, open, close (the local daemon) |
script | run a readable spreadsheet program (replaces batch) |
serve | serve a workbook's defined-name HTTP APIs |
version | version & self-update (nobie update) |

Sixteen things to do in a pipe
every recipe runs as written
CSV → formula-driven workbook
Pipe a CSV in, drop a live =SUM total under it, and bold the header row.
command
stdout
// over http
Serve a sheet as an API
Name a cell NOBIE_API__quote__INPUT__quantity and nobie serve turns the workbook into an HTTP service: defined names become JSON routes, inputs go in with a POST, and recalculated outputs come back. The spreadsheet is the backend.
The formula behind the total cell does the work; there's no handler to write. Each request leases an isolated replica of the workbook, applies the inputs, recalculates, reads the outputs, and restores the replica before responding — so callers never see each other's state and the file on disk is never modified. It binds to 127.0.0.1:8000 by default (--bind, --replicas to change), and caps request bodies at 1 MiB.
// the whole toolbox
Command reference
Every command is nobie <noun> <verb> <target>. Pick a noun to see its verbs and flags.
Workbook Commands
Create, inspect, print, undo, and open workbooks as background sessions.

// good to know
Tricks worth stealing
Generate sheets from code
Any program can build a spreadsheet. Have it print nobie script sentences and pipe them in — a thousand cells land in one transaction.
Keep workbooks in git
It's just an .xlsx, and nobie can diff it by value. Wire it up as a git textconv and review spreadsheet changes in a pull request, like any other code.
Preview without opening anything
range render … --out p.png && open p.png gets you a styled snapshot in about a second, without launching the app.
Quote your sheet names
Sheet names with spaces need quotes for your shell: 'Q1 Sales'!A1. Same for any selector you build by hand and pipe in.
