Command line interface for Hotdata.
Homebrew
brew install hotdata-dev/tap/hotdata-cliBinary (macOS, Linux)
Download a binary from Releases.
Build from source (requires Rust)
cargo build --release
cp target/release/hotdata /usr/local/bin/hotdataRun the following command to authenticate:
hotdata authThis launches a browser window where you can authorize the CLI to access your Hotdata account.
Alternatively, authenticate with an API key using the --api-key flag:
hotdata <command> --api-key <api_key>Or set the HOTDATA_API_KEY environment variable (also loaded from .env files):
export HOTDATA_API_KEY=<api_key>
hotdata <command>API key priority (lowest to highest): config file → HOTDATA_API_KEY env var → --api-key flag.
| Command | Subcommands | Description |
|---|---|---|
auth |
status, logout |
Authenticate (run without subcommand to log in) |
workspaces |
list, set |
Manage workspaces |
connections |
list, create, refresh, new |
Manage connections |
tables |
list |
List tables and columns |
datasets |
list, create |
Manage uploaded datasets |
query |
Execute a SQL query | |
queries |
list, create, update, run |
Manage saved queries |
search |
Full-text search across a table column | |
indexes |
list, create |
Manage indexes on a table |
results |
list |
Retrieve stored query results |
jobs |
list |
Manage background jobs |
skills |
install, status |
Manage the hotdata-cli agent skill |
| Option | Description | Type | Default |
|---|---|---|---|
--api-key |
API key (overrides env var and config) | string | |
-v, --version |
Print version | boolean | |
-h, --help |
Print help | boolean |
hotdata workspaces list [--format table|json|yaml]
hotdata workspaces set [<workspace_id>]listshows all workspaces with a*marker on the active one.setswitches the active workspace. Omit the ID for interactive selection.- The active workspace is used as the default for all commands that accept
--workspace-id.
hotdata connections list [-w <id>] [-o table|json|yaml]
hotdata connections <connection_id> [-w <id>] [-o table|json|yaml]
hotdata connections refresh <connection_id> [-w <id>]
hotdata connections new [-w <id>]listreturnsid,name,source_typefor each connection.- Pass a connection ID to view details (id, name, source type, table counts).
refreshtriggers a schema refresh for a connection.newlaunches an interactive connection creation wizard.
# List available connection types
hotdata connections create list [--format table|json|yaml]
# Inspect schema for a connection type
hotdata connections create list <type_name> --format json
# Create a connection
hotdata connections create --name "my-conn" --type postgres --config '{"host":"...","port":5432,...}'hotdata tables list [--workspace-id <id>] [--connection-id <id>] [--schema <pattern>] [--table <pattern>] [--limit <n>] [--cursor <token>] [--format table|json|yaml]- Without
--connection-id: lists all tables withtable,synced,last_sync. - With
--connection-id: includes column details (column,data_type,nullable). --schemaand--tablesupport SQL%wildcard patterns.- Tables are displayed as
<connection>.<schema>.<table>— use this format in SQL queries.
hotdata datasets list [--workspace-id <id>] [--limit <n>] [--offset <n>] [--format table|json|yaml]
hotdata datasets <dataset_id> [--workspace-id <id>] [--format table|json|yaml]
hotdata datasets create --file data.csv [--label "My Dataset"] [--table-name my_dataset]
hotdata datasets create --sql "SELECT ..." --label "My Dataset"
hotdata datasets create --url "https://example.com/data.parquet" --label "My Dataset"- Datasets are queryable as
datasets.main.<table_name>. --file,--sql,--query-id, and--urlare mutually exclusive.--urlimports data directly from a URL (supports csv, json, parquet).- Format is auto-detected from file extension or content.
- Piped stdin is supported:
cat data.csv | hotdata datasets create --label "My Dataset"
hotdata query "<sql>" [-w <id>] [--connection <connection_id>] [-o table|json|csv]
hotdata query status <query_run_id> [-o table|json|csv]- Default output is
table, which prints results with row count and execution time. - Use
--connectionto scope the query to a specific connection. - Long-running queries automatically fall back to async execution and return a
query_run_id. - Use
hotdata query status <query_run_id>to poll for results. - Exit codes for
query status:0= succeeded,1= failed,2= still running (poll again).
hotdata queries list [--limit <n>] [--offset <n>] [--format table|json|yaml]
hotdata queries <query_id> [--format table|json|yaml]
hotdata queries create --name "My Query" --sql "SELECT ..." [--description "..."] [--tags "tag1,tag2"]
hotdata queries update <query_id> [--name "New Name"] [--sql "SELECT ..."] [--description "..."] [--tags "tag1,tag2"]
hotdata queries run <query_id> [--format table|json|csv]listshows saved queries with name, description, tags, and version.- View a query by ID to see its formatted and syntax-highlighted SQL.
createrequires--nameand--sql. Tags are comma-separated.updateaccepts any combination of fields to change.runexecutes a saved query and displays results like thequerycommand.
# BM25 full-text search
hotdata search "query text" --table <connection.schema.table> --column <column> [--select <columns>] [--limit <n>] [-o table|json|csv]
# Vector search with --model (calls OpenAI to embed the query)
hotdata search "query text" --table <table> --column <vector_column> --model text-embedding-3-small [--limit <n>]
# Vector search with piped embedding
echo '[0.1, -0.2, ...]' | hotdata search --table <table> --column <vector_column> [--limit <n>]- Without
--modeland with query text: BM25 full-text search. Requires a BM25 index on the target column. - With
--model: generates an embedding via OpenAI and performs vector search usingl2_distance. RequiresOPENAI_API_KEYenv var. - Without query text and with piped stdin: reads a vector (raw JSON array or OpenAI embedding response) and performs vector search.
- BM25 results are ordered by relevance score (descending). Vector results are ordered by distance (ascending).
--selectspecifies which columns to return (comma-separated, defaults to all).
hotdata indexes list --connection-id <id> --schema <schema> --table <table> [--workspace-id <id>] [--format table|json|yaml]
hotdata indexes create --connection-id <id> --schema <schema> --table <table> --name <name> --columns <cols> [--type sorted|bm25|vector] [--metric l2|cosine|dot] [--async]listshows indexes on a table with name, type, columns, status, and creation date.createcreates an index. Use--type bm25for full-text search,--type vectorfor vector search (requires--metric).--asyncsubmits index creation as a background job.
hotdata results <result_id> [--workspace-id <id>] [--format table|json|csv]
hotdata results list [--workspace-id <id>] [--limit <n>] [--offset <n>] [--format table|json|yaml]- Query results include a
result-idin the table footer — use it to retrieve past results without re-running queries.
hotdata jobs list [--workspace-id <id>] [--job-type <type>] [--status <status>] [--all] [--limit <n>] [--offset <n>] [--format table|json|yaml]
hotdata jobs <job_id> [--workspace-id <id>] [--format table|json|yaml]listshows only active jobs (pendingandrunning) by default. Use--allto see all jobs.--job-typeaccepts:data_refresh_table,data_refresh_connection,create_index.--statusaccepts:pending,running,succeeded,partially_succeeded,failed.
Config is stored at ~/.hotdata/config.yml keyed by profile (default: default).
| Variable | Description | Default |
|---|---|---|
HOTDATA_API_KEY |
API key (overrides config file) | |
HOTDATA_API_URL |
API base URL | https://api.hotdata.dev/v1 |
HOTDATA_APP_URL |
App URL for browser login | https://app.hotdata.dev |
Releases use a two-phase workflow wrapping cargo-release.
Phase 1 — prepare
scripts/release.sh prepare <version>Creates a release/<version> branch, bumps the version, updates CHANGELOG.md, pushes the branch, and opens a pull request.
Phase 2 — finish
scripts/release.sh finishSwitches to main, pulls latest, tags the release, and triggers the dist workflow.