/airtable/. Writes go
through the airtable CLI, which takes the same config.
For token setup, see Airtable Setup.
Config
Unknown keys are refused, so a misspelled
base_ids fails loudly instead of
widening the mount to every base.
Filesystem Layout
Ops / Finance becomes Ops_Finance); the id after the
last __ is exact. List a directory to discover names rather than building
them.
base.jsonholds the base id, name, the token’s permission level, and the table list.table.jsonholds the typed field schema, with each field’s options (select choices, number precision, link targets), and the saved views.records.jsonlholds one record per line:{"record_id", "created_time", "fields"}, withfieldskeyed by field name and valued exactly as Airtable returns them.views/<view>.jsonlholds the records the view shows, filtered and ordered by the view.
Reading Records
head -n Nfetches N records. The line count is pushed into Airtable’smaxRecords, so the first lines of a large table cost one request.- A full read is bounded. A file holding more than
max_read_recordsrecords is refused with GNU’sFile too large(cat: <path>: File too large), rather than paged for minutes at 5 requests per second. Every command reports it per file and moves on, sogrep -l x a bstill answers for the files under the cap. Usehead, a view, or raise the cap. - Order.
records.jsonlfollows the API’s own order, which Airtable calls arbitrary but keeps stable; a view file applies the view’s sort. - Empty cells are absent. Airtable omits empty values from a record,
including a
falsecheckbox, so a missing key means empty. - Links and attachments. A linked-record field is a list of record ids. An attachment URL expires two hours after it was read, so re-read the record before downloading.
- Sizes.
base.jsonandtable.jsonreport their exact size. Record files are size-unknown until read, which is whatls -landstatshow. - Freshness. Records are never served from the file cache; the listings of bases, tables, and views are cached for the index TTL.
Rate Limits
Requests are spaced torequests_per_second per base. A 429 that says
RATE_LIMIT_REACHED is retried after Airtable’s 30 second penalty; a 429
for an exhausted monthly quota is reported at once, because waiting cannot fix
it.
Writing Records
A record write is not a file write, so the mount refuses one and the airtable CLI makes it. The CLI names a base, a table and a record by id: take them from the mount’s directory names, after the last__ (Product_Roadmap__appRoadmapBase001 is appRoadmapBase001), and a
record’s from its record_id. A records.jsonl line is the CLI’s stdin
shape, so an edit pipes straight back:
airtable record list --formula or --view), one record by id (airtable record get), and
comments (airtable comment list, airtable comment add).