Skip to content

Releases

qqq 1.0.0

Choose a tag to compare

@KofTwentyTwo KofTwentyTwo released this 01 Nov 18:50
Immutable release. Only release title and notes can be modified.
cli-v1.0.0
79ba68e

[1.0.0] - 2026-11-01

qqq 1.0: the command-line client and the full-screen terminal UI (qqq ui), shipped together as one
binary per platform. Packages: @qrun-io/qqq-cli 1.0.0, @qrun-io/qqq-core 1.0.0 (new),
@qrun-io/qqq-ui-api-client 1.8.0, @qrun-io/qqq-ui-api-conformance 1.6.0. Servers: UI API 1.6.0 up
to 2.0 (QQQ 4.1.0-RC.15 or later). Released as 1.0.0-rc.1 first (tags v1.8.0-rc.2,
cli-v1.0.0-rc.1); this entry is that candidate's plus everything that landed after it. Short commit ids
in parentheses mark the changes made after the candidate.

Added

Command line

  • The grammar is qqq <noun> <verb> (table query, process run, ...); the 0.1 flat commands
    (apps, tables, query, get, run, jobs, tail) still work as aliases.
  • Sign-in: session sign-in for MOCK and anonymous servers; OAuth2 device flow and browser sign-in with
    PKCE on a loopback redirect; TABLE_BASED qqq login --username (password asked, or QQQ_PASSWORD; only
    the server session is kept, a refused password stores nothing); refresh before expiry; logout --provider-logout revokes (RFC 7009) and opens the end-session page; refused refreshes exit 3. Sign-ins
    live in the macOS Keychain, Linux Secret Service, Windows DPAPI or a 0600 file.
  • Profiles (--profile, QQQ_PROFILE) with a short name (2 to 6 characters, for the footer and
    Home), a description, a sign-in mode for OAuth2 servers (auto asks, browser, device) and
    the last use and user; all additive in config.json, so files written by 1.0.0-rc.1 load unchanged and
    keep their note (shown when there is no description). qqq profile list|add|edit|use|remove (also
    under qqq config profile): add and edit take --short, --description, --auth-mode and
    --check (refuse unless the server answers), edit takes --server and --rename, an empty value
    removes a field, list --probe adds each server's status (d9317f5).
  • Tables: list, describe, query (filters, sort, paging, --search, --join and table.field
    columns, --count, --print-filter, saved views with --view), count, stats (server columnStats, else
    computed from the matching records with a note on stderr; --local forces it, --no-local restores the
    error, --max-records caps the read at 10,000 by default; 7c66b16), get (sections, adornments, --associations, --links, --follow, --key, --copy),
    create, copy, update (-e edits HTML and code fields in $EDITOR), delete, children,
    export (csv, tsv, xlsx, json), download and --upload for file fields, variants and --variant
    everywhere (the chosen variant is remembered per server), columns, actions (what you can do to a
    table, with the command for each), api-call and widget-form.
  • Forms: contingent fields (country, state, city) with narrowing possible values, labels or unique
    partial labels for ids (also in --where), local validation with the server's codes, form adjusters,
    interactive -i, CHIP values in their colours.
  • Filters: the grammar (shorthand operators, quoting, AND/OR groups, expression values such as
    now(-7d), thisPeriod(month), me()). Text filters ask for case-insensitive matching (CONTAINS,
    STARTS_WITH, ENDS_WITH, quick search); ~=, OPERATOR:CS or --case-sensitive ask for a
    case-sensitive match. The server does not read the option over the UI API yet (finding 27), so matching
    stays case-sensitive until it does.
  • Processes: list, describe, run with every step component (help, HTML as text, view pairs,
    process records, the validation review, summary lines, downloads, widgets), asynchronous jobs with
    progress, --file for BLOB fields, back steps, min/max input records, and Ctrl-C that cancels the run on
    the server (exit 130).
  • Bulk load and bulk changes: table bulk-insert from a CSV or Excel file (the upload template, the
    server's column suggestion, a mapping document, flags or -i, value mapping, the validation review,
    --dry-run), table bulk-edit of chosen records or by key rows from a file, table bulk-delete with
    review and confirmation, and bulk-profile list | save | rename | delete for saved mappings.
  • Dates: DATE_TIME typed and shown in the local zone (TZ), sent as UTC instants; --utc for raw.
  • More nouns: apps show (app homes with counts, --widgets), home (counts, quick actions, recent
    records), find (the command palette: an app, table, process or report by label), tail, saved-view,
    audit list, report run and saved-report list | show | preview | run | set | pivot | schedules | schedule, share (records of shareable tables), widget (charts and tables as text, --record,
    --run), job, prefs, help show, help-search, and api <operationId> for any of the 219
    operations.
  • Search: qqq search shows the matched field and snippet (match), takes --table repeated or as a
    comma list, --limit per table, names the tables and the total in the footer, searches field:value
    with a note, lists the quick search syntax in --help and prints the whole response with --json
    (0e07f8a).
  • Developer mode and scripts: table apis, table api-doc, table developer, and script list | show | store | test | logs.
  • Extensions: a noun per extension the client document knows (14: esb, collab, health, alerts,
    assistant, sql-workbench, ...), gated on the server's installed extensions and documented minimum
    versions; first-class verbs for esb and collab (presence, comments, favorites, follow, my work, tags
    by id or label). Results print scalars as aligned key/value rows (nested objects as dotted keys) and each
    list of objects as a sub-table fitted to the terminal width, with default columns for the inbox,
    notebooks, SQL history, comments, tasks, favorites and recents and --columns a,b (or --fields) to
    choose; --json, yaml, csv and text are unchanged (5e34433).
  • Printing (the printing extension, qbit-printing 2.x): qqq print <table> <id...> renders each record
    as a record sheet through the table's Print process, queues one job per record and follows the jobs until
    they have printed (--printer, --copies, --no-wait, --timeout; exit 1 when a job failed, 4 when
    jobs are still running at the timeout); qqq print list <table> prints a table list (criteria, order,
    columns, --page, paper and orientation; up to 10,000 rows); qqq print text [file|-] prints text as a
    monospace PDF; qqq print job list|status [--watch]|cancel; qqq printer list|use|show|forget|devices.
    The printer chosen is remembered per profile (printing.printers in config.json). Without the extension
    the commands exit 5 with the installed list (c1e7bf9, 4bd62b7, d632987, d81c053).
  • Disabled tables and processes are listed with the reason, and queries, writes, copies, bulk commands
    and runs on them are refused before any request, as the web explains the denial.
  • Shell completion for bash, zsh, fish and PowerShell from the local metadata cache; cache show | refresh | clear; config set theme and download-dir.
  • Diagnostics and conventions: qqq doctor, qqq --version (the build and the supported UI API
    range), build lines in qqq doctor and qqq ui --check, consistent exit codes (2 usage, 3 auth, 4
    unreachable or 502/503/504, 5 not found, 6 validation, 70 server error), downloads that never overwrite a
    file or leave --out-dir.
  • History: qqq history lists everything you did with the CLI and the TUI on the profile in use,
    like a shell history (number, relative or --absolute time, client, kind, summary; --limit, --since 2h|2026-11-01, --grep, --kind, --all-profiles, --commands, --format); qqq history rerun <n>
    runs a line again (asking first for commands that change data), qqq history clear empties it. The
    activity log is one JSONL file per profile in ~/.local/state/qqq/activity/, rotated once at 5 MB;
    secrets (token, password and PIN flags, secret pairs and filter values, Authorization headers) are
    written as ***; QQQ_HISTORY=off turns it off (0bcc735).
  • Uploading an attachment to a server without the Object Storage QBit says "This server cannot store
    attachments: the Object Storage QBit is not installed."; any server failure naming a missing QBit gets one
    such line (437ed3c).
  • Assistant (assistant extension, qbit-assistant): qqq assistant ask "<question>" streams the
    answer as the model writes it, then prints its numbers (counts, metrics) and the records and tables it
    refers to as a table with the command that opens each; --table <t> [--record <id>] sends that page as
    context the way the Next UI's panel does, -c <id> continues a conversation, --json prints the whole
    answer. qqq assistant config shows whether it answers and with which model, or the reason
    (NOT_CONFIGURED: no model provider, with what to configure). The generated operation subcommands stay
    (a5e0cf4).

Terminal UI (qqq ui)

  • A classic full-screen UI in the same binary and on the same profiles and sign-ins as the CLI:
    function-key bar (F1 Help to F10 Quit, with Esc+digit for terminals that take the F-keys), PgUp/PgDn
    everywhere, Esc back with the screen below keeping its place, a : command line that speaks the CLI
    grammar (history, Ctrl+R, Tab completion listing every command with a description, then its arguments),
    and a live footer (server and profile, sign-in, UI API version, ping, realtime stream, jobs, clock).
    qqq ui table query person -w ... opens a screen directly.
  • Home: greeting and connection, counts, recently viewed records, quick actions, favorites,
    application cards (each with the app's icon as a glyph, an ASCII stand-in under the ASCII-glyphs
    setting), work (jobs, alerts, my work, release notes) and the instance's...
Read more