SQL on the files on your Mac.

Drop in CSV, Parquet, JSON or Excel files and query them with DuckDB, right where they are. No server to run, nothing to upload, no account.

Free and open source. macOS 12 or later on Apple silicon.

SELECT channel,
       round(sum(revenue), 2) AS revenue
FROM sales
GROUP BY channel
ORDER BY revenue DESC;
channelrevenue
Mobile app290,549.76
Web289,544.80
Store240,067.60
Phone82,511.20

4 rows

From a file to an answer

No connection to set up and no schema to write first.

  1. Drop in a file

    Drag a file or a whole folder onto the window, pick it from the file dialog, or name it on the command line.

  2. It shows up as a table

    The table is named after the file — sales.csv becomes sales — and its columns appear in the sidebar. The file stays where it is.

  3. Query it with SQL

    Write SQL, press ⌘↵, then chart the answer or export it as CSV or Parquet.

Opens what you already have

Open a folder and every data file inside it opens too, subfolders included. Patterns like *.csv work. Files you open are still there next time.

  • CSV
  • TSV
  • Parquet
  • JSON and NDJSON
  • Excel xlsx, xls, ods
  • DuckDB databases
  • S3 and compatible storage

Ready for AI agents

From a terminal, ducklocal answers one SQL statement as JSON, without opening a window. Scripts can rely on the format, and agents can reason over it. The official agent skill teaches them to read the schema before they query.

CLI and agent skill

$ ducklocal query --format md --sql "
    SELECT channel, round(sum(revenue), 2) AS revenue
    FROM 'sales.csv' GROUP BY channel
    ORDER BY revenue DESC"

| channel | revenue |
| --- | --- |
| Mobile app | 290549.76 |
| Web | 289544.8 |
| Store | 240067.6 |
| Phone | 82511.2 |

Dashboards as plain files

Write queries and plots in a .dash file and it opens as a dashboard tab. Because it is plain text, it diffs, reviews and validates: ducklocal check catches a missing column before anyone opens it.

Dashboards (.dash)

query "by_channel" {
  sql = <<SQL
    SELECT channel, sum(revenue) AS revenue
    FROM sales GROUP BY channel
  SQL
}

plot "revenue" {
  type  = "bar"
  query = query.by_channel
  x     = channel
  y     = revenue
}

Your data stays yours

DuckLocal runs DuckDB inside the app, on your Mac. There is nothing to sign up for and nowhere for your files to go.

  • Files are read where they are — never copied, never uploaded.
  • No account, no telemetry, no cloud service.
  • Dashboards can only read, so opening one someone sent you cannot change your data.
  • Open source under Apache-2.0: every line is there to read.

Try it on your own files

Download DuckLocal, drop in a file and press ⌘↵. The 10-minute tutorial walks through it with a sample file.