Every "smart spreadsheet" tool I've tried makes the same trade: you upload your file to someone else's server, a closed model you can't inspect does the work, and you pay per call. For a customer export, a medical log, or anything with a whiff of PII, that's a non-starter.
So for the Hacktoberfest 2026 Open-Source AI Challenge, I built TabulaSage — a data profiler where open-source AI is the entire engine, and your file never leaves your machine.
What it does
Point it at any CSV and it tells you, in plain English:
- a profile of every column (type, missingness, distribution, top categories)
- which rows look wrong — anomaly detection for data-entry errors and rare cases
- what actually drives a target column — an interpretable model, not a black box
pip install -r requirements.txt
python tabulasage.py examples/sample_customers.csv --target churned
Here's the real output on a 15-row sample with a planted bad row:
================================================================
TabulaSage — offline AI profile | scikit-learn v1.9.1
15 rows x 6 columns
================================================================
ANOMALY DETECTION (IsolationForest)
flagged 1 of 15 rows as anomalous
[ANOMALY] row 9: age=999, income=15, city=Beijing, tenure_months=1
[normal ] row 6: age=61, income=91000, city=Shenzhen, tenure_months=48
[normal ] row 13: age=58, income=84000, city=Shenzhen, tenure_months=40
INTERPRETABLE MODEL (target = churned)
test accuracy: 100.0% (classes: ['no', 'yes'])
top drivers:
- age 0.571
- monthly_spend 0.429
PLAIN-ENGLISH INSIGHTS
→ IsolationForest flagged 1 row(s) (6.7%) as anomalous — likely data-entry errors or rare cases worth a human look.
→ Predicting the target: a shallow decision tree reaches 100% test accuracy; the strongest driver is 'age' (importance 0.57).
The garbage row (age=999, income=15) is caught instantly, while genuine high-value customers are correctly left alone — and the model explains why (age, then monthly_spend), not just what.
Why open-source AI is the whole point
This is the part the challenge prompt asks about, and it's the reason the project exists.
Your data stays yours — as an architectural fact, not a promise. There is no network call anywhere in the code path. You can prove it by reading ~200 lines of Python. For anyone handling sensitive CSVs, "open source at the core" isn't ideology; it's the only way to get AI insights and keep the data on your own disk.
It costs nothing to run. The brain is scikit-learn's IsolationForest and a shallow decision tree — open weights you can audit, and reproducible output. No per-call billing, no surprise invoice because your file got big.
You can swap the brain. Because the intelligence is an open framework rather than a hosted endpoint, you can drop in a local open-weight LLM (Gemma via Ollama) for richer prose, or TabPFN for forecasting, without rewriting the app — or sending anything anywhere.
The closed-API approach is easier to demo and harder to trust. For a tool that touches real data, I'd rather be trusted.
How it works (all offline)
- Parsing & profiling: Python stdlib + NumPy. No network, ever.
-
Anomaly detection:
IsolationForeston standardized numeric + one-hot features. I flag a row only when its anomaly score falls more than 2σ below the mean — a parameter-free threshold that avoids the "flag 40% of everything" trap I hit withcontamination="auto"on small data. -
Interpretable model: a depth-limited
DecisionTreeClassifier, so you can read the exact rule behind each prediction. (I explicitly exclude the--targetcolumn from the features — the first version leaked it and reported a fake 100% accuracy, which was a good reminder that "explainable" has to be enforced, not assumed.) - Insights: deterministic templates turn statistics into sentences — no LLM needed, though a local open-weight model can plug in for richer wording.
What I learned
Building this reinforced something the open-source AI community keeps saying: the interesting engineering isn't calling a model, it's making the model accountable — standardizing features so units don't lie, choosing a threshold that doesn't cry wolf, and refusing to let the label leak into the features. None of that is glamorous, and all of it is why I'd rather run an open model I can debug than a closed one I can't.
Try it
The code, sample data, and a copy-paste demo are all in the repo:
🔗 https://github.com/Zhiyilang/tabulasage
Built for the Hacktoberfest 2026 Open-Source AI Challenge. Feedback and PRs very welcome — especially if you've wired TabulaSage up to a local Gemma or TabPFN and want to share the pattern.
Top comments (1)
Excluding the target closes the direct leakage path. I'd also make the small-sample report show the held-out row count and class counts next to that 100% accuracy, and check that numeric scaling and one-hot fitting happen only on the training partition. A fixture with duplicated customer records split across train/test would test a less obvious leakage path. For the anomaly output, keeping the original CSV row number through missing-value filtering would let someone find row 9 without guessing whether the header or dropped rows changed the numbering. The rare-but-valid rows are useful counterexamples to keep in that fixture.