A tool from Excelano

SlipQL

Query a folder of Slipcase containers.

Point SlipQL at a directory of .slpc containers and ask questions in select, from, and where — each container a row, each flyleaf key a column. It reads every flyleaf in place through the same library the slipcase command uses, keeps no index, and changes nothing.

See it in action

A prompt bound to a directory, so a query can leave out from. Each row is a container; the columns are flyleaf keys, dotted into nested tables.

$ slipql ./contracts --recursive
Connected to: ./contracts (recursive). Type "help" for commands, "quit" to exit.

slipql> select @path, title, governance.owner where status = "draft" or tags contains "legal"
| @path                  | title                     | governance.owner |
| ---------------------- | ------------------------- | ---------------- |
| 2026/renewal.docx.slpc | Renewal, 2026             |                  |
| msa.pdf.slpc           | Master services agreement | Kim              |
| q3.xlsx.slpc           | Q3 report                 | Lee              |
(3 rows)

Output is a table at a terminal and tab-separated in a pipe; --mode picks table, tsv, csv, or json explicitly. CSV is meant as a feed for the rest of the tabular family, xled among them. A container that cannot be read is skipped and reported after the rows, as is any comparison that crossed types, so a pipe stays clean and nothing is silently ignored.

Which files say this

A Slipcase container carries a TOML flyleaf describing its content file, and that description travels with the file. Once a directory holds a few hundred of them, the question stops being “what is in this file” and becomes “which files say this.” Unpacking every container to find out, or keeping an index that goes stale the moment someone copies a file in, both defeat the point of a description that lives with the file it describes.

SlipQL reads each container's flyleaf in place and never unpacks a content file. It keeps no index and no state: every query is a fresh scan, so the answer is what is on disk now. It changes nothing. Rows come back as the scan reaches them, so a query over a large tree starts answering at once, and limit stops it early.

The language borrows SQL's clause shape and TOML's literals, so anyone who can write a flyleaf can write a query against one — without learning a second date syntax or a second way to quote a string. Filebase is the same engine with a window around it, for reading a folder by hand; SlipQL is the command line, for a script or a pipe.

The language

A query is select columns from a directory, optionally recursive, with an optional where and limit. Columns are flyleaf keys, with dots into nested tables and [n] into arrays: governance.privacy_flag, tags[0]. @path is the container's path under the from directory. select * gives @path and then every leaf value across the rows returned. A column a row does not have renders empty rather than failing the query, because flyleaf keys are ad hoc by design.

Conditions compare a column with a literal using =, !=, <, >, <=, and >=, test membership with in, match strings with like and ilike, look inside arrays with contains, and test for a key with exists. Literals are TOML's: quoted strings, numbers, true, and datetimes as TOML writes them. There is no coercion between strings and numbers, on purpose — a "3" where a 3 was meant is a mistake worth seeing rather than one worth hiding. Comparing a column that is absent, or one whose type does not match the literal, is neither true nor false and does not select the row.

The exact grammar and the semantics of every operator are in GRAMMAR.md.

Install

On Debian or Ubuntu

Install from the Excelano apt repository so apt upgrade keeps it current:

curl -fsSL https://excelano.com/apt/setup.sh | sudo sh
sudo apt install slipql

With Homebrew

On macOS or Linux, so brew upgrade keeps it current:

brew tap excelano/tap
brew trust excelano/tap   # one-time: Homebrew gates third-party taps behind explicit trust
brew install slipql

With Cargo

From crates.io, with a Rust toolchain:

cargo install slipql

Prebuilt binaries

Release archives are on the GitHub releases page. See the README for version pinning and custom install directories.

Behind the tool

SlipQL is one corner of Slipcase, a container format I designed so that a file's description travels inside the file rather than in a database on someone else's computer. That problem — description separated from the thing it describes — is the one under most of the information work I do for clients: migrations, handovers, the application-portfolio and records engagements where “which files say what” is the daily question and the answer usually lives in a spreadsheet nobody trusts.

If your team is carrying that kind of problem, I'd be glad to help you put it on a footing you can query instead.

Get in touch

For technical users

SlipQL is open source under the MIT license, written in Rust. The crate is the query engine and the command is a thin shell over it, so a program can embed it with default-features = false and take the rows off an iterator directly. The source and the grammar reference live at github.com/excelano/slipql, and the library's own page is docs.rs/slipql.