Every agent now speaks xlsx

Full Excel compatibility for agents and machines.

BETA
$

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

~/budget
# Create a workbook and see its sheets
nobie workbook new budget.xlsx
nobie sheet list budget.xlsx --format json | jq -r '.result[].name' # Sheet1
# Write a value and a formula
nobie cell set budget.xlsx Sheet1!A1 --value 'Revenue' --overwrite
nobie cell set budget.xlsx Sheet1!B1 --value 1000 --overwrite
nobie cell set budget.xlsx Sheet1!B2 --value '=B1*1.2' --overwrite
# Read the evaluated result - the formula is actually computed
nobie cell read budget.xlsx Sheet1!B2 --format tsv # 1200
nobie cell read budget.xlsx Sheet1!B2 --field input --format tsv # =B1*1.2
# Render a slice to PNG, or the whole book to PDF
nobie range render budget.xlsx Sheet1!A1:B2 --out preview.png
nobie workbook print budget.xlsx --out budget.pdf

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

TargetMeans
report.xlsxA file path. This is the default; no session needed.
@Report.xlsxA workbook you've held open with workbook open, for back-to-back edits.
file:@odd-nameEscape 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.

terminal
nobie cell set m.xlsx Sheet1!R1C1 --value '=2*21' --overwrite
nobie cell read m.xlsx Sheet1!R1C1 --format json
# {"schema":"nobie.read.v2","operation":"cells.observe",...}

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

common grammar
nobie <noun> <verb> <TARGET> [SELECTOR] [FLAGS]
NounVerbs / Actions
workbookopen, new, close, path, info, undo, print (PDF)
savesave in place, Save As, save a copy (no verb)
sheetadd, rename, delete, list, inputs
cellset, read
rangeread, clear, paste, copy, cut, render (PNG), sort
tablelist, get, create, update, delete, filter, sort
layoutinspect sizes, resize, auto-fit, freeze, unfreeze
styleset, read (effective styles), patterns
calcrecalc, mode (automatic / manual / …)
sessionstart, stop, list (workbooks open and close separately)
scriptrun, check, format, and discover spreadsheet programs
serveserve explicit cell mappings as HTTP APIs
versionversion & self-update (nobie update)

Sixteen things to do in a pipe

every recipe runs as written

01

CSV → formula-driven workbook

Pipe a CSV in, drop a live =SUM total under it, and bold the header row.

command

terminal
nobie workbook new sales.xlsx
nobie range paste sales.xlsx Sheet1!A1 --from - --overwrite <<<$'Region\tQ1\tQ2\tTotal'
tail -n +2 sales.csv | tr ',' '\t' \
| nobie range paste sales.xlsx Sheet1!A2 --from - --overwrite
nobie cell set sales.xlsx Sheet1!D5 --value '=SUM(D2:D4)' --overwrite
nobie style set sales.xlsx Sheet1!A1:D1 --bold --fill '#1F4E78' --font-color white --overwrite

stdout

stdout - recipe-01
$ nobie range read sales.xlsx Sheet1!A1:D5 --format tsv
Region Q1 Q2 Total
East 15000 18000 33000
West 12000 14500 26500
South 9000 11000 20000
79500

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

serve.sh
nobie serve ./pricing.xlsx \
--input quote.quantity=Model!B2 \
--input quote.unit_price=Model!B3 \
--output quote.total=Model!D2
# ...then from anywhere: discover the routes, POST inputs
curl -sS http://127.0.0.1:8000/apis
curl -sS http://127.0.0.1:8000/api/quote \
-H 'content-type: application/json' \
-d '{"quantity": 3, "unit_price": 19.95}'
stdout - serve
{"total":"59.85"}

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.

terminal
nobie workbook new budget.xlsx # create empty workbook (--force to overwrite)
nobie workbook info budget.xlsx --format json # path, dirty bit, calc mode
nobie workbook path budget.xlsx # print the on-disk path
nobie workbook undo budget.xlsx --overwrite # undo and replace this file
nobie workbook print budget.xlsx --out b.pdf # render the WHOLE workbook to PDF
nobie workbook open /data/Budget.xlsx # open as a background session (prints handle)
nobie workbook close @Budget.xlsx --save # close a session (--save | --discard if dirty)

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

Own Your Craft.