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.
// free
Free to use
Nobie is free forever for everyone using it for their own work. We believe the world's best XLSX experience should be free. Large companies only need to pay when they use Nobie to power products or models for their customers. We'll also introduce optional paid features and services that go beyond what spreadsheets can do today.
Read the license// 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. |
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). Structured reads return the stable nobie.read.v2 semantic envelope.
// the shape
One grammar for everything
Most workbook operations use a noun, a verb, the workbook, and what to act on. Top-level commands such as save, serve, and version expose their exact shape in --help.
| Noun | Verbs / Actions |
|---|---|
workbook | open, new, close, path, info, undo, print (PDF) |
save | save in place, Save As, save a copy (no verb) |
sheet | add, rename, delete, list, inputs |
cell | set, read |
range | read, clear, paste, copy, cut, render (PNG), sort |
table | list, get, create, update, delete, filter, sort |
layout | inspect sizes, resize, auto-fit, freeze, unfreeze |
style | set, read (effective styles), patterns |
calc | recalc, mode (automatic / manual / …) |
session | start, stop, list (workbooks open and close separately) |
script | run, check, format, and discover spreadsheet programs |
serve | serve explicit cell mappings as 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
Calculation microservice
Wrap a spreadsheet model in a shell function that takes arguments and prints the answer.
command
stdout
Live API data straight into cells
curl the prices, reshape them with jq, paste them into cells, recalc.
command
stdout
SQL → spreadsheet in one pipe
Run a SQL query, get TSV, paste it. There's no export step in the middle.
command
stdout
Nightly PDF report by cron
Cron recalcs the book, prints a PDF, and mails it. The report just shows up every morning.
command
stdout
Render dashboard tile to Slack
Render a cell range to a PNG and post it to a Slack channel.
command
stdout
Bulk-process a whole tree
Find every .xlsx under a directory tree and recalc them all, eight at a time.
command
stdout
git diff for spreadsheets
Diff two workbooks by value, not by zip bytes. Wire it into git as a textconv.
command
stdout
Live-reload renders
Edit the file anywhere; entr re-renders the preview PNG on every save.
command
stdout
Pick a sheet with fzf
Fuzzy-find a sheet with a live preview, then dump it as an aligned table.
command
stdout
Monte-Carlo a model
Roll a thousand random inputs through a live model and read back p50 and p95. The workbook never touches disk.
command
stdout
Generate a grid from a script
One awk line prints a 144-cell times table; nobie writes the whole grid.
command
stdout
CI spec gate
CI goes red when the model's own sanity checks don't hold.
command
stdout
xlsx → CSV without a GUI
Read a tight range and swap tabs for commas.
command
stdout
Pretty-print in the terminal
Pipe a range through column and less for a scrollable, aligned table.
command
stdout
Pre-commit hook: block broken formulas
Reject a commit if any staged workbook still has a #REF! or #DIV/0! cell.
command
stdout
// over http
Serve a sheet as an API
nobie serve turns explicit API.FIELD=SHEET!CELL mappings into an HTTP service: inputs go in with a POST and recalculated outputs come back. The workbook needs no defined names.
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
Pick a common command family to see its verbs and flags. The nobie skill output and the complete docs command tree cover every configured command.
Workbook Commands
Create, inspect, print, undo, and open workbooks as background sessions.
Save Commands
Decide where edits land: in place, save-as, or a detached copy.
Sheet Commands
Add, rename, and delete tabs, or list them NUL-safe for xargs.
Cell Commands
Set a cell to a literal or a =formula, or read back the value or the formula.
Range Commands
Work on rectangles: read, clear, copy, cut, paste grids, or render to PNG.
Table Commands
Inspect structured tables, or update their filters and ordered sort state.
Layout Commands
Inspect dimensions and frozen panes, then change sizes or restore the view.
Style Commands
Set fonts, fills, borders, alignment, and number formats, or read back the style a cell actually resolves to.
Styling Flag Catalog
Colors accept: name (red), hex (#RRGGBB), rgb(31,78,120), theme:accent1/0.4, or auto.
Number formats support presets (general, integer, currency, percent, date) or raw OOXML patterns.
Calculation Commands
Force a recalc, or read and set the workbook's calc mode.
Session & Daemon Commands
Hold a workbook open behind an @ handle, so back-to-back commands skip the load-and-save round-trip. nobie session start runs the local daemon in the foreground; nobie session stop stops it and refuses dirty workbooks unless told --save-all or --discard-all.
Spreadsheet scripts
When several reads and edits belong together, write them as one flat, reviewable program. Source comes from stdin or a file, and the complete run is one atomic transaction.
A deliberately small language: let binds values, ranges, and grids; there are no loops, conditions, or functions; errors stop the program instead of changing its meaning. script check validates, script fmt canonicalizes, and script schema prints the sentence catalog as JSON.
Serve as an HTTP API
nobie serve <WORKBOOK> turns explicit cell mappings into JSON routes. --input quote.quantity=Model!B2 maps a request field and--output quote.total=Model!D2 maps a response field. Discovery lives at GET /apis.
Each request leases an isolated workbook replica, applies inputs, recalcs, reads outputs, and restores the replica before responding - one caller can never see another's temporary state, and the file on disk is never modified. Loopback by default; put a real proxy in front for anything else.
Persistence
Path writes must name exactly where the complete successful mutation lands. Resident workbook writes stay dirty until an explicit save or close decision.
| Flag | Effect |
|---|---|
--save-to PATH | Write a changed copy and leave the input file unchanged. |
--overwrite | Replace the input file only after the command succeeds. |
@name without either flag | Keep the accepted mutation dirty in the resident workbook. |

// 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.
