Lakeleto v0.4.1 Download

Open any table.
Query it on the spot.

Parquet, CSV, JSON, Iceberg, Delta, a bucket or a database: point Lakeleto at it and get a grid, a profile and SQL in your browser. Nothing is imported, nothing is uploaded.

Download lakeleto-0.4.1-x64.msi → double-click → Start Menu › Lakeleto

Windows .msi · macOS .dmg (universal) · Linux x86_64 / arm64 static · Apache-2.0 · no account

Lakeleto 0.4.0 in dark mode: a SQL tab over orders.parquet grouping 5,000 orders by city, ten result rows, four saved connections in the sidebar, a saved query, a variable min_amt = 100, and a run history of seven queries.

Ask the file. It answers.

Pick a question. The command and the answer below are exactly what Lakeleto 0.4.0 printed for orders.parquet, the 5,000-row sample in the repo.

~/dataread-only · local
$ lakeleto query "SELECT city, count(*) AS orders, round(sum(amount_usd), 2) AS revenue FROM t GROUP BY city ORDER BY revenue DESC LIMIT 5" --file orders.parquet
| city      | orders | revenue  |
|-----------|--------|----------|
| Sydney    | 503    | 66834.05 |
| Toronto   | 517    | 66242.49 |
| Mumbai    | 515    | 65590.18 |
| Singapore | 550    | 64419.91 |
| London    | 493    | 62170.92 |

5 row(s)

The open file is the table t. Name more with --table name=path. Add -o json, csv, parquet or arrows to pipe it on. The same SQL runs in the browser's SQL tab.

Every view, running.

Screenshots of v0.4.0 on the same sample data, taken for this page.

Reads what you already have.

ParquetCSV / TSVJSON / NDJSON Arrow / FeatherApache IcebergDelta Lake Hive partitions.gz .zst .bz2 .xz s3:// gs:// az://Iceberg REST catalogs SQLitePostgreSQLMySQL

Stays on your machine

No account, no server in the path. Buckets are read with your own credentials, straight to your laptop.

Read-only

SQL is SELECT only and database connections can't write. Exports are new files.

Works offline

The UI is inside the binary. No CDN, no fonts to fetch. Runs on a plane or an air-gapped box.

Agents too

lakeleto mcp lets Claude, Cursor or any MCP client read your tables, capped and confined to a folder.

How it compares.

Lakeleto is a viewer first. The engines below are excellent, and Lakeleto's SQL runs on one of their peers (Apache DataFusion). What differs is what you get without writing code.

Lakeleto 0.4DuckDB CLIPolars / pandasVisiData
What it isTable viewer + read-only SQLSQL database enginePython DataFrame librariesTerminal spreadsheet
Point-and-click UIYes, in the browser, bundledWeb UI via duckdb -uifront end loaded from ui.duckdb.orgNo (notebooks)Keyboard TUI
Fully offline UIYesCLI yes, web UI no—Yes
Grid with sort, filter, row detailYes, over the whole fileNoNoYes
Per-column profileYes, plus a Parquet-footer fast pathSUMMARIZEdescribe()Describe sheet
SQLRead-only (DataFusion)Full, read-writePolars SQLContext; pandas noNo
Iceberg / DeltaBuilt in, current snapshotExtensionsPolars with pyiceberg / deltalake; pandas via those librariesNo
Saved queries, variables, history, run-acrossYesNo (UI: notebooks)Your own scriptsNo
MCP server for AI agentsBuilt inSeparate projectsNoNo
InstallOne binary or installerOne binaryPython + packagesPython package
Can change your dataNo, by designYesYesCan save edits
LicenceApache-2.0MITMIT / BSD-3GPL-3.0

From each project's own documentation as of November 2026. Tell us if a row is out of date.

Measured, one command at a time.

Each bar is one command typed in a terminal, start to exit, median of five runs on a warm file cache. Lakeleto answers "what is this file?" fastest and on a CSV it leads. On a full scan of a 20-million-row Parquet file, DuckDB is about twice as fast. Lakeleto and DuckDB finish every task in under 0.3 s, using a fraction of the memory of loading a DataFrame.

Schema + row count · 20M-row Parquet

Lakeleto19 ms · 11 MiB
DuckDB40 ms · 21 MiB
Polars772 ms · 44 MiB
pandas262 ms · 40 MiB

First 10 rows · 20M-row Parquet

Lakeleto31 ms · 18 MiB
DuckDB44 ms · 27 MiB
Polars339 ms · 48 MiB
pandas799 ms · 91 MiB

GROUP BY city · all 20M rows (Parquet)

Lakeleto154 ms · 56 MiB
DuckDB87 ms · 54 MiB
Polars733 ms · 1.5 GiB
pandas2.2 s · 1.1 GiB

Filter + sort, top 10 · 20M rows (Parquet)

Lakeleto263 ms · 100 MiB
DuckDB128 ms · 50 MiB
Polars878 ms · 1.0 GiB
pandas3.1 s · 1.8 GiB

GROUP BY city · 2M-row CSV (145 MiB)

Lakeleto110 ms · 48 MiB
DuckDB185 ms · 182 MiB
Polars426 ms · 270 MiB
pandas1.6 s · 139 MiB

Reading the bars

Bars are time, scaled to the slowest tool in each task. The label is the median time, then the process's peak working set. Shorter is better on both.

Polars and pandas are timed as Python one-liners, so roughly 0.2–0.3 s of each is starting Python and importing the library. In a notebook that's paid once. From a terminal it's paid every time.

Method, versions and exact commands

Run 2026-11-04 on one laptop: AMD Ryzen 9 8945HS (8 cores, 16 threads), 93 GiB RAM, NVMe SSD, Windows 11. Lakeleto 0.4.0 (release build, release feature set), DuckDB CLI 1.4.1, Polars 1.34.0, pandas 2.3.3 with pyarrow 21.0.0, Python 3.12. Each command ran once to warm the cache, then five times; the median is shown. Memory is the peak working set Windows records for the process. All four tools returned the same counts and sums.

Data: 20,000,000 orders-shaped rows (10 columns: ids, strings, doubles, a boolean, a timestamp) generated by DuckDB with a fixed seed and written as Snappy Parquet (463 MiB), and 2,000,000 of the same as CSV (145 MiB). One machine and one data shape. Your numbers will differ, so run it yourself: gen.py, bench.py, raw results.

lakeleto schema orders_20m.parquet
lakeleto head orders_20m.parquet -n 10
lakeleto query "SELECT city, count(*) AS n, round(sum(amount_usd), 2) AS revenue
  FROM t GROUP BY city ORDER BY revenue DESC" --file orders_20m.parquet
lakeleto query "SELECT order_id, city, amount_usd FROM t WHERE tier = 'enterprise'
  AND NOT is_refunded ORDER BY amount_usd DESC LIMIT 10" --file orders_20m.parquet

duckdb -c "DESCRIBE SELECT * FROM 'orders_20m.parquet'; SELECT count(*) FROM 'orders_20m.parquet';"
duckdb -c "SELECT * FROM 'orders_20m.parquet' LIMIT 10"        # and the same two queries

python -c "import polars as pl; pl.scan_parquet(f).group_by('city').agg(...).collect()"
python -c "import pandas as pd; pd.read_parquet(f, columns=['city','amount_usd']).groupby('city')..."
python -c "import pyarrow.parquet as pq; pq.ParquetFile(f).schema_arrow / .metadata.num_rows"   # pandas column

Who it's for.

Lakeleto is an early release, v0.4.1. It's built for these three cases.

Data engineers

You live in a terminal and want to see a table before you build on it. lakeleto schema, head and profile --fast answer in one line, in CI too.

Analysts who don't code

You have a Parquet file and no Python. Install, click the file, scroll, filter, export to CSV. SQL is there when you want it.

Teams that can't upload

Customer records, regulated data, air-gapped boxes. Nothing leaves the machine, and --root keeps it to one folder.

Need to transform, join across warehouses or write results back? Use DuckDB or Polars. Lakeleto hands you Parquet or Arrow (-o parquet, -o arrows) to pass along.

Before you download.

How finished is it?

It's v0.4.1, an early release. The grid, schema, profile, SQL, export, every reader above and the database connectors work today, and the maintainers use it daily. Expect rough edges, and file them.

What does it cost?

Nothing. The tool is Apache-2.0 and stays that way. A hosted team edition is on the roadmap. It isn't available, and nothing on this page depends on it.

Files bigger than my memory?

Yes. The grid reads a window at a time and Parquet by row group. Sorts and filters run in the SQL engine over the whole file. Iceberg and Delta tables are loaded into memory for that.

Why does my OS warn me on first launch?

No Authenticode certificate or Apple notarization yet. On Windows: More info → Run anyway. On macOS: right-click → Open once. Every release carries a cosign signature, a SHA-256 and SLSA provenance you can check instead.

Point it at a table.