Tabalyst
Tools for unfamiliar data.
Tabalyst is an open-source, local-first toolkit for understanding and working with structured data.
Its first tool is Tabalyst Report. The current CSV implementation, Tabalyst CSV Report, analyzes a CSV file and produces both a structured JSON profile and a self-contained interactive HTML report.
Tabalyst is in active alpha development. Its interfaces may still change while the shared toolkit architecture is being established.
Install
Tabalyst supports Python 3.11, 3.12, 3.13, and 3.14.
pip install tabalyst
Tabalyst Report
| Use case | Command | Destination |
|---|---|---|
| One file, automatic name | tabalyst report data.csv |
data.html beside the source |
| One file, custom name | tabalyst report data.csv -o report.html |
The file report.html |
| Several files, automatic names | tabalyst report *.csv |
Beside each source |
| Several files, one directory | tabalyst report *.csv -d reports/ |
The directory reports/ |
The simplest command keeps the source filename:
tabalyst report customers.csv
It creates these files beside the source:
customers.csv
customers.html
customers.json
executions.json
Use -o to choose a different HTML filename for one source:
tabalyst report customers.csv -o customer-analysis.html
Multiple files
Report several CSV files at once:
tabalyst report *.csv
Each report is created beside its source and keeps the source stem:
customers.csv → customers.html
orders.csv → orders.html
products.csv → products.html
Use -d to place all reports in one directory:
tabalyst report *.csv -d reports/
This produces:
reports/
├── customers.html
├── customers.json
├── orders.html
├── orders.json
├── products.html
├── products.json
└── executions.json
Both -d reports/ and -d reports are accepted. Quotes are only needed when a
path contains spaces.
-o always names one output file and therefore accepts only one input. -d
always names an output directory and accepts one or many inputs.
This is invalid because several inputs cannot share one output file:
tabalyst report *.csv -o report.html
Tabalyst rejects the command before processing any file. Use -d reports/
instead.
Safe batch behavior
Before processing begins, Tabalyst resolves every input and planned output. It
stops the entire batch if output names collide or if an output already exists.
Use --force only when replacing all matching report artifacts is intentional:
tabalyst report *.csv -d reports/ --force
If one CSV is malformed during analysis, Tabalyst reports that error, continues with the remaining files, and returns a non-zero exit code at the end.
Interactive terminals show accurate file and phase progress:
[2/8] orders.csv - Analyzing
Progress and diagnostics use standard error. Progress is disabled automatically
outside a terminal and can be disabled explicitly with --no-progress or
--quiet.
Useful options
tabalyst report data.csv --delimiter ";"
tabalyst report data.csv --encoding cp1252
tabalyst report data.csv --config tabalyst.json
tabalyst report data.csv --verbose
tabalyst report --help
tabalyst --version
python -m tabalyst accepts the same commands.
What the report analyzes
- Dataset dimensions, missing cells, duplicates, and quality observations.
- Physical and semantic types with confidence and error rates.
- Numeric, date, string-length, normalization, and value distributions.
- Distinct values, representative examples, enum candidates, and date formats.
- CSV record widths, quoting, encoding, and delimiter configuration.
- A bounded raw-data preview while every record is analyzed.
The HTML report is self-contained and works without a CDN or network connection. The JSON profile contains the same canonical analysis result for scripts and future Tabalyst tools.
Python API
The same operations are available without the CLI:
import tabalyst
result = tabalyst.analyze(
"customers.csv",
"customers.html",
separator=";",
)
batch = tabalyst.generate_reports(
["*.csv"],
output_dir="reports",
)
analyze() returns the JSON-serializable profile for one report.
generate_reports() returns the complete batch plan, successes, and failures.
Expected failures derive from tabalyst.TabalystError.
Existing artifacts are never replaced silently. Pass force=True when
replacement is intentional.
Configuration
Configuration files are strict JSON. A minimal file is:
{
"csv": {
"delimiter": ";",
"encoding": "cp1252"
}
}
Explicit CLI or Python arguments override the configuration file, which overrides Tabalyst defaults. See the configuration reference for all analysis settings.
Local-first behavior and current limits
Tabalyst performs analysis locally and adds no telemetry or remote processing. Generated JSON and HTML may contain source values and should be shared accordingly.
The complete CSV is currently loaded into memory. File and phase progress is available now; row percentages, throughput estimates, recursive directory input, and parallel batch execution will require later ingestion work.
Examples and development
The repository includes small and synthetic public examples under examples/.
See the examples README
for regeneration commands.
python -m pytest
python -m ruff check .
python -m build
Additional documentation:
Please report defects and feature requests through the GitHub issue tracker.
License
Tabalyst is released under the MIT License.
Created by Gregory Borelli — Catalyseur Numérique.
Metadata
Release files for tabalyst 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tabalyst-0.2.1.tar.gz | 413.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tabalyst-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 597.7 kB
Release files / tabalyst-0.2.1.tar.gz
| Download URL | tabalyst-0.2.1.tar.gz |
|---|---|
| Size | 413.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
53d2dbaf1dcf62ffad39e274d3d7da796aa9cfb3327a14c5a2ca6d25cfe3e106
|
|
BLAKE2b-256 checksum How to use checksums |
55da602970bd15418c1c35b0e58d820a1c22313428ba407e6330d2cf3c923bb4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 24, 2026.
Transparency logRelease files / tabalyst-0.2.1-py3-none-any.whl
| Download URL | tabalyst-0.2.1-py3-none-any.whl |
|---|---|
| Size | 183.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4163f6851aca919fb19fd84e233f3471eb616a4c4fbee5588d7091755ad82d32
|
|
BLAKE2b-256 checksum How to use checksums |
f133026da028fd567ce9b55ecddf322c388dd67aa129d398b8761502a89f809c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 24, 2026.
Transparency log