Skip to content

Documentation

CLI reference

Every command below comes straight from the titlebase command registry, the same one that feeds the MCP server and the app. Generated from tbase commands --json (commit 25618372).

Conventions

tbase <group> <verb> <file> [flags]
  • The plant file comes first. It can be a .titlebase file or a PropertySync .db export.
  • --json prints one JSON document on stdout and nothing else. Without it you get readable text.
  • Progress and timing go to stderr.
  • Errors exit with status 1. With --json they print {"error":{"code":...,"message":...}}.
  • No command prompts. Every command is safe to script.
  • List commands page by row id. Pass the previous result's next_after_id as --after-id. Sorted results page with next_cursor and --cursor.
  • Write commands never touch the plant file. Each is one journaled run beside it, and reports its run_id so it can be undone.
  • --no-window is accepted everywhere, so a script never opens the app window.

tbase file info

Read onlyMCP tool file_info

Show a plant file's size, page size, row counts per table and any extra tables.

tbase file info [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
--exactbooleanfalseCount every row instead of using the highest id (slow on big plants).
JSON output
FieldTypeDescription
filestring
bytesinteger
page_sizeinteger
rowsobject
rows_arestring`exact` (counted) or `highest_id` (instant estimate; ids are dense).
extra_tablesstring[]Tables that are not part of titlebase v1 (indexes, side tables).

tbase docs get

Read onlyMCP tool docs_get

Fetch one document by UUID or row id, with its full stored JSON.

tbase docs get [OPTIONS] <FILE> <ID>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
<ID>stringrequiredDocument UUID, or SQLite row id (all digits).
JSON output
FieldTypeDescription
idintegerSQLite row id.
uuidstring
shape"Envelope" | "EnvelopeEmpty" | "Flat" | "NotObject" | "InvalidJson"How a row's JSON is laid out.
bytesintegerStored size of the row.
found_by"rowid" | "uuid_order" | "uuid_scan" | "journal"How the document was found.
rowanyThe whole stored row as JSON (envelope or flat), unchanged.
rawstringThe stored text, only when it is not valid JSON.
journalobjectPresent when the row comes from the edit journal, not the plant.

tbase docs list

Read onlyMCP tool docs_list

List documents in row id order, or sorted by any indexed column, one summary line each, with keyset paging.

tbase docs list [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
--limitinteger50Documents per page, 1 to 1000.
--after-idintegerStart after this row id (the previous page's next_after_id).
--sortuuid | instrument_number | instrument_type | filed_date | instrument_date | book_type | book_number | page_number | consideration | market_source | case_number | loan_number | ucc_number | indexing_record_id | has_image | "id"Sort column (default id). Anything but id needs the sidecar index.
--directionasc | descSort direction (default asc).
--cursorstringContinue from a previous page's next_cursor (any sort).
JSON output
FieldTypeDescription
documentsobject[]
next_after_idintegerPass as after_id for the next page when sorting by id; null on the last page.
next_cursorstringPass as cursor for the next page (any sort); null on the last page.
indexedbooleanTrue when the sidecar index answered.
Read onlyMCP tool docs_search

Search documents by instrument number, type, filed dates, party, grantor, grantee, addition, lot, block, book and page, sorted by any column; all given filters must match. Uses the sidecar index when current, else scans.

tbase docs search [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
--instrument-numberstringInstrument number, for example 2026-001 (case-insensitive). End with * for a prefix match: 2026-*.
--typestringInstrument type code, for example WD (case-insensitive).
--partystringGrantor or grantee name: last name starts with this, or with party_match contains, the full name contains it (case-insensitive).
--additionstringSubdivision or acreage legal addition equals this (case-insensitive).
--limitinteger50Matches to return, 1 to 1000.
--after-idintegerStart after this row id (the previous page's next_after_id).
--grantorstringA grantor's name (same matching as party).
--granteestringA grantee's name (same matching as party).
--party-match"prefix" | "contains"How party, grantor and grantee match (default prefix).
--filed-fromstringFiled on or after this date: YYYY, YYYY-MM or YYYY-MM-DD.
--filed-tostringFiled on or before this date, inclusive: YYYY, YYYY-MM or YYYY-MM-DD.
--lotstringLot number or span (4, 3-5); matches overlapping lot ranges on the same legal as addition. Needs the sidecar index.
--blockstringBlock number or span, like lot. Needs the sidecar index.
--bookstringDocument book number.
--pagestringDocument page number.
--sortuuid | instrument_number | instrument_type | filed_date | instrument_date | book_type | book_number | page_number | consideration | market_source | case_number | loan_number | ucc_number | indexing_record_id | has_image | "id"Sort column (default id). Anything but id needs the sidecar index.
--directionasc | descSort direction (default asc).
--cursorstringContinue from a previous result's next_cursor (any sort).
--countbooleanfalseAlso return the total number of matches (needs the sidecar index).
JSON output
FieldTypeDescription
indexedbooleanTrue when the sidecar index answered.
engine"scan" | "index"How a search was answered.
notestringHow the search ran and what that costs.
documentsobject[]
next_after_idintegerPass as after_id for more matches when sorting by id; null when there are no more.
next_cursorstringPass as cursor for more matches (any sort); null when there are no more.
totalintegerEvery match, when count was asked for and the index answered.
secondsnumber

tbase ac list

Read onlyMCP tool ac_list

List autocomplete values (additions, surveys, instrument and book types), optionally of one type.

tbase ac list [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
--typestringOnly this autocomplete type, for example addition, survey, instrumentType or bookType.
--limitinteger500Entries per page, 1 to 10000.
--after-idintegerStart after this row id (the previous page's next_after_id).
JSON output
FieldTypeDescription
entriesobject[]
next_after_idintegerPass as after_id for the next page; null on the last page.

tbase lv list

Read onlyMCP tool lv_list

List land validations (plat validation records by addition), optionally for one addition.

tbase lv list [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
--additionstringOnly land validations for this exact addition.
--limitinteger200Entries per page, 1 to 5000.
--after-idintegerStart after this row id (the previous page's next_after_id).
JSON output
FieldTypeDescription
entriesobject[]
next_after_idintegerPass as after_id for the next page; null on the last page.

tbase check roundtrip

Read onlyMCP tool check_roundtrip

Prove titlebase can rewrite a plant byte for byte: re-emit every row with titlebase's JSON writers, and optionally write and compare a full copy to a new file.

tbase check roundtrip [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite). Never modified.
--tabledocuments | landvalidations | autocompletesOnly check one table.
--samplesinteger3Mismatch samples to show per table.
--copy-tostringAlso write a full copy to this new path and compare every row. Refuses to overwrite an existing file.
JSON output
FieldTypeDescription
filestring
okbooleanTrue when every valid row re-emits byte-identical and the copy, if made, is identical.
reemitobject[]
copyobject

tbase docs create

Writes, journaledMCP tool docs_create

Create a document with a new UUID, in the plant's row shape; journaled and undoable, the plant file is untouched until save.

tbase docs create [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
--fieldsobjectThe document's fields as a JSON object (the inner `json` of the envelope). A new UUID is generated; do not pass `id`.
--setstring[]`path=value` to set on the new document; value is JSON when it parses, otherwise text. Repeatable.
--labelstringLabel for the journal run (shown in changes list).
JSON output
FieldTypeDescription
changedbooleanFalse when the edit matched the row already (nothing journaled).
run_idintegerJournal run of this command; undo it with `tbase changes undo FILE --run N`.
opsobject[]
tablestring
uuidstringThe row's UUID.
rowidintegerPlant row id; for a created row, the id Save will give it.
rowanyThe whole row as it reads now (envelope or flat); null after a delete.
warningsstring[]
undostringThe command that undoes this write.

tbase docs update

Writes, journaledMCP tool docs_update

Edit a document's fields by UUID or row id (set or remove paths); keeps the row's shape and PropertySync style, journaled and undoable.

tbase docs update [OPTIONS] <FILE> <ID>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
<ID>stringrequiredDocument UUID, or row id (all digits).
--setstring[]`path=value` to set (JSON Pointer `/grantors/0/nameLast` or dotted `grantors.0.nameLast`); value is JSON when it parses, otherwise text. Repeatable.
--removestring[]Path to remove. Repeatable.
--patchobject | object[]Patch ops: `[{"op":"set","path":"/instrumentType","value":"WD"}, {"op":"remove","path":"/comment"}]`. Applied before set and remove.
--labelstringLabel for the journal run (shown in changes list).
--force-record-idbooleanfalseAllow changing or removing an existing indexingRecordId. It links the document to PropertySync; only set this when you mean to break or replace that link.
JSON output
FieldTypeDescription
changedbooleanFalse when the edit matched the row already (nothing journaled).
run_idintegerJournal run of this command; undo it with `tbase changes undo FILE --run N`.
opsobject[]
tablestring
uuidstringThe row's UUID.
rowidintegerPlant row id; for a created row, the id Save will give it.
rowanyThe whole row as it reads now (envelope or flat); null after a delete.
warningsstring[]
undostringThe command that undoes this write.

tbase docs delete

Writes, journaledMCP tool docs_delete

Delete a document by UUID or row id; journaled and undoable, the plant file is untouched until save.

tbase docs delete [OPTIONS] <FILE> <ID>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
<ID>stringrequiredDocument UUID, or row id (all digits).
--labelstringLabel for the journal run (shown in changes list).
JSON output
FieldTypeDescription
changedbooleanFalse when the edit matched the row already (nothing journaled).
run_idintegerJournal run of this command; undo it with `tbase changes undo FILE --run N`.
opsobject[]
tablestring
uuidstringThe row's UUID.
rowidintegerPlant row id; for a created row, the id Save will give it.
rowanyThe whole row as it reads now (envelope or flat); null after a delete.
warningsstring[]
undostringThe command that undoes this write.

tbase ac create

Writes, journaledMCP tool ac_create

Add an autocomplete value of a type; refuses a duplicate of the same type and value. Journaled and undoable.

tbase ac create [OPTIONS] --type <TYPE> --value <VALUE> <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
--typestringrequiredAutocomplete type, for example addition, survey, instrumentType, bookType, marketSource.
--valuestringrequiredThe value, for example SAMPLE ADDITION 5.
--labelstringLabel for the journal run (shown in changes list).
JSON output
FieldTypeDescription
changedbooleanFalse when the edit matched the row already (nothing journaled).
run_idintegerJournal run of this command; undo it with `tbase changes undo FILE --run N`.
opsobject[]
tablestring
uuidstringThe row's UUID.
rowidintegerPlant row id; for a created row, the id Save will give it.
rowanyThe whole row as it reads now (envelope or flat); null after a delete.
warningsstring[]
undostringThe command that undoes this write.

tbase ac update

Writes, journaledMCP tool ac_update

Edit an autocomplete value (type, value or any path) by UUID or row id; journaled and undoable.

tbase ac update [OPTIONS] <FILE> <ID>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
<ID>stringrequiredAutocomplete UUID, or row id (all digits).
--typestringNew type.
--valuestringNew value.
--setstring[]`path=value` to set; value is JSON when it parses, otherwise text. Repeatable.
--removestring[]Path to remove. Repeatable.
--patchobject | object[]Patch ops as a JSON array; applied first.
--labelstringLabel for the journal run (shown in changes list).
JSON output
FieldTypeDescription
changedbooleanFalse when the edit matched the row already (nothing journaled).
run_idintegerJournal run of this command; undo it with `tbase changes undo FILE --run N`.
opsobject[]
tablestring
uuidstringThe row's UUID.
rowidintegerPlant row id; for a created row, the id Save will give it.
rowanyThe whole row as it reads now (envelope or flat); null after a delete.
warningsstring[]
undostringThe command that undoes this write.

tbase ac delete

Writes, journaledMCP tool ac_delete

Delete an autocomplete value by UUID or row id; journaled and undoable.

tbase ac delete [OPTIONS] <FILE> <ID>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
<ID>stringrequiredAutocomplete UUID, or row id (all digits).
--labelstringLabel for the journal run (shown in changes list).
JSON output
FieldTypeDescription
changedbooleanFalse when the edit matched the row already (nothing journaled).
run_idintegerJournal run of this command; undo it with `tbase changes undo FILE --run N`.
opsobject[]
tablestring
uuidstringThe row's UUID.
rowidintegerPlant row id; for a created row, the id Save will give it.
rowanyThe whole row as it reads now (envelope or flat); null after a delete.
warningsstring[]
undostringThe command that undoes this write.

tbase lv create

Writes, journaledMCP tool lv_create

Create a land validation for an addition (empty platValidation unless given); journaled and undoable.

tbase lv create [OPTIONS] --addition <ADDITION> <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
--additionstringrequiredThe addition (subdivision) the land validation is for.
--fieldsobjectMore fields as a JSON object, for example `{"platValidation":[{"status":"0","lot":[...]}],"bookNumber":"5"}`.
--setstring[]`path=value` to set; value is JSON when it parses, otherwise text. Repeatable.
--labelstringLabel for the journal run (shown in changes list).
JSON output
FieldTypeDescription
changedbooleanFalse when the edit matched the row already (nothing journaled).
run_idintegerJournal run of this command; undo it with `tbase changes undo FILE --run N`.
opsobject[]
tablestring
uuidstringThe row's UUID.
rowidintegerPlant row id; for a created row, the id Save will give it.
rowanyThe whole row as it reads now (envelope or flat); null after a delete.
warningsstring[]
undostringThe command that undoes this write.

tbase lv update

Writes, journaledMCP tool lv_update

Edit a land validation (addition or any path) by UUID or row id; journaled and undoable.

tbase lv update [OPTIONS] <FILE> <ID>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
<ID>stringrequiredLand validation UUID, or row id (all digits).
--additionstringNew addition name.
--setstring[]`path=value` to set (for example `platValidation.0.status=1`); value is JSON when it parses, otherwise text. Repeatable.
--removestring[]Path to remove. Repeatable.
--patchobject | object[]Patch ops as a JSON array; applied first.
--labelstringLabel for the journal run (shown in changes list).
JSON output
FieldTypeDescription
changedbooleanFalse when the edit matched the row already (nothing journaled).
run_idintegerJournal run of this command; undo it with `tbase changes undo FILE --run N`.
opsobject[]
tablestring
uuidstringThe row's UUID.
rowidintegerPlant row id; for a created row, the id Save will give it.
rowanyThe whole row as it reads now (envelope or flat); null after a delete.
warningsstring[]
undostringThe command that undoes this write.

tbase lv delete

Writes, journaledMCP tool lv_delete

Delete a land validation by UUID or row id; journaled and undoable.

tbase lv delete [OPTIONS] <FILE> <ID>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
<ID>stringrequiredLand validation UUID, or row id (all digits).
--labelstringLabel for the journal run (shown in changes list).
JSON output
FieldTypeDescription
changedbooleanFalse when the edit matched the row already (nothing journaled).
run_idintegerJournal run of this command; undo it with `tbase changes undo FILE --run N`.
opsobject[]
tablestring
uuidstringThe row's UUID.
rowidintegerPlant row id; for a created row, the id Save will give it.
rowanyThe whole row as it reads now (envelope or flat); null after a delete.
warningsstring[]
undostringThe command that undoes this write.

tbase changes list

Read onlyMCP tool changes_list

List rows created, updated and deleted in the edit journal (per table, with UUIDs, row ids, ops and changed paths) and recent runs.

tbase changes list [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
--tabledocuments | landvalidations | autocompletesOnly this table.
--detailbooleanfalseInclude each row's JSON before and after.
--runsinteger20How many recent runs to list.
JSON output
FieldTypeDescription
journalstringThe journal file; null when the plant has never been edited.
countsobject
tablesobject[]
runsobject[]Recent runs, newest first.

tbase changes revert

Writes, journaledMCP tool changes_revert

Revert journaled changes by op, run or row back to how the row was before (undoable with changes_redo).

tbase changes revert [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
--opintegerRevert this op.
--runintegerRevert every active op in this run.
--rowstringRevert every change to this row (UUID or row id).
--tabledocuments | landvalidations | autocompletesTable of `row` (default documents).
JSON output
FieldTypeDescription
actionstring`undo` or `redo`.
opsobject[]The ops undone (newest first) or redone (oldest first).
runsinteger[]Runs those ops belong to.
reversestringThe command that reverses this.

tbase changes undo

Writes, journaledMCP tool changes_undo

Undo the newest run, or one op or run by id; an op can be undone only while it is the newest change to its row.

tbase changes undo [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
--opintegerUndo this op only.
--runintegerUndo every active op in this run.
JSON output
FieldTypeDescription
actionstring`undo` or `redo`.
opsobject[]The ops undone (newest first) or redone (oldest first).
runsinteger[]Runs those ops belong to.
reversestringThe command that reverses this.

tbase changes redo

Writes, journaledMCP tool changes_redo

Redo the run undone last, or one op or run by id; refused if the row changed since it was undone.

tbase changes redo [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
--opintegerRedo this op only.
--runintegerRedo every undone op in this run.
JSON output
FieldTypeDescription
actionstring`undo` or `redo`.
opsobject[]The ops undone (newest first) or redone (oldest first).
runsinteger[]Runs those ops belong to.
reversestringThe command that reverses this.

tbase changes export

Writes, journaledMCP tool changes_export

Write the journal's changes to a new batch folder: batch.json (PropertySync batch, updates with top-level id), autocompletes, land validations, deletions, changes.titlebase and a manifest.

tbase changes export [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
--outstringFolder to create the batch folder in (default: next to the plant).
JSON output
FieldTypeDescription
folderstringThe new folder, `<stem>-changes-<YYYYMMDD-HHMMSS>`.
filesstring[]
tablesobject[]
batch_documentsintegerDocuments in batch.json (updates carry a top-level id).
last_op_idintegerHighest journal op included.
warningsstring[]

tbase file save

Writes, journaledMCP tool file_save

Save: write a clean plant with every journaled edit applied (untouched rows byte-identical), verified by reopening; to --out or --in-place with a backup.

tbase file save [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
--outstringWrite a new file here (must not exist). Required unless --in-place.
--in-placebooleanfalseReplace the plant itself; the original is kept as `<file>.bak-<YYYYMMDD-HHMMSS>` first.
JSON output
FieldTypeDescription
outstringThe file written.
in_placeboolean
backupstringThe original plant, kept before an in-place save.
tablesobject[]
createdobject[]
extra_objectsstring[]Non-core tables, indexes, views and triggers copied over.
verifiedbooleanThe written file was reopened and every row compared.
ops_savedintegerJournal ops marked as saved.
secondsnumber

tbase index build

Writes the sidecar onlyMCP tool index_build

Build the plant's sidecar search index at <file>.tbase/index.db (the plant itself is never changed); skips the work when the index is current unless force is set.

tbase index build [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite). Opened read-only; never changed.
--forcebooleanfalseRebuild even when the index is current.
JSON output
FieldTypeDescription
filestring
indexstring
builtbooleanFalse when the index was already current and `force` was not set.
state"missing" | "old_format" | "stale" | "current"Index state, as reported by `index_status`.
documentsinteger
partiesinteger
legalsinteger
relatedinteger
tagsinteger
empty_stubsintegerDocuments that are `{"id":...,"json":[]}` stubs.
flaggedintegerDocuments with an unusual shape (stub, flat, invalid JSON, partly unreadable fields). They are still indexed.
bytesinteger
secondsnumber
rows_per_secondnumber

tbase index status

Read onlyMCP tool index_status

Show whether the plant's sidecar search index exists and is current, with its size, document count and build time.

tbase index status [OPTIONS] <FILE>
ArgumentTypeDefaultDescription
<FILE>stringrequiredPlant file (titlebase format SQLite).
JSON output
FieldTypeDescription
filestring
indexstringWhere the index lives: `<file>.tbase/index.db`.
existsboolean
state"missing" | "old_format" | "stale" | "current"Index state, as reported by `index_status`.
stalebooleanTrue when the index exists but cannot be used until rebuilt.
bytesintegerSize of the index file in bytes.
documentsintegerDocuments in the index.
built_atstringWhen the index was built (UTC).
build_secondsnumber

tbase commands

Lists every command with its description, access and the JSON Schema of its input and output. This is the source of this page.

tbase commands --json

tbase mcp

Serves MCP over stdio, one tool per command. --file sets a default plant so tools can be called without file. See MCP server.

tbase mcp
tbase mcp --file ~/plants/sample-county-tx.titlebase

Aliases

  • tbase info is tbase file info.
  • tbase undo and tbase redo are tbase changes undo and tbase changes redo.
  • tbase save is tbase file save.