Sift
An AI import studio. Model a messy spreadsheet once, then deliver it clean to wherever it belongs.
Sift is a rebuild of an older repo of mine, and I only found out how bad the original was by opening it to add a feature. The README promised more or less the product below. The app faked all of it. Progress bars ran on setTimeout, quality scores came out of Math.random(), the CSV parser was never finished, the multi-sheet reader always returned sheet one, and the AI calls could not have worked because nothing ever authenticated. I went in expecting some mess and found a movie set.
The rebuild has one rule, which is that nothing is allowed to be fake.
The thing people actually do
Somebody sends you a file. A vendor export, a bank statement, a product list from a supplier who uses Excel the way it was used in 2004. Two header rows, dates in three formats, forty duplicates.
So you fix it by hand. Then the importer on the other side rejects it anyway, because every system wants its own template with its own column names in its own order, so you reshape it a second time and upload it and hope nothing broke in the middle. Next month the same supplier sends the same file and you do all of it again.
That hand-cleaning is a trust ritual rather than inefficiency, which took me a while to see. People do it because they have been burned by something automatic and now they would rather spend the hour than find out in March that a column coerced without telling them. Any tool that frames itself as saving them the hour has misunderstood why they are spending it.
What it does
Drop in a CSV or an Excel workbook, however messy. Sift finds the real header row, matches each column to a field with a confidence score you can see and change, then types every value and flags the bad rows before anything is written anywhere.
You confirm, and the clean rows go where they belong. A Postgres table you own, a supplier invoice in Fortnox, a record in Attio. The mapping is saved, so when that supplier sends next month's file it imports itself.
What I was stubborn about
It proposes, you decide. An impossible date, a missing required field, a number that will not parse: Sift tells you what it would do and then waits. Nothing is written on the model's say-so. This is slower than the alternative and it is the entire reason anyone would let it near their data.
Your data stays somewhere you already own. The destination is a real table in your own database, or a document in the accounting system you already pay for. Delete Sift tomorrow and nothing of yours goes with it.
Every cell, not a sample. Numbers parse locale aware. Dates parse against an explicit format rather than letting the language guess at them. Accepted rows insert in one transaction, so a bad row never reaches your table.
It keeps working when the model does not. When the model is down or the day's budget is spent, it falls back to plain heuristics and carries on. An import tool that stops working because a third party is having an afternoon is not an import tool.
Every import ends with a report. Six quality dimensions scored, a grade per column. The script version of you shipped on hope.
Why I might be wrong
The accounting destinations are the interesting claim and the least proven one. Fortnox is live and routing real documents. Xero and QuickBooks are further behind than the landing page makes them sound, and I would rather show the seam than let it read as finished.
Live
Open SiftFree to start. Bring the worst file you have been sent this month and see what it makes of it.
