![]()
Intakee files every new file that reaches my Mac. Email attachments, files shared in chat, cloud downloads and anything I drop into a folder. For each file it checks for a duplicate, reads the text, screens it for private content, decides where it belongs, gives it a dated name and moves it there. When it isn't sure, it leaves the file in an inbox and asks me.
Intakee replaces no app. Before it, the filing was me, and mostly it didn't happen. I built it with Claude Code on 25th October 2026. It is 1 Python script with no dependencies, plus a small review page. The name follows the -ee family of my tools.
Names, senders and folders in the examples of this note are fictitious.
Why I built it
Files reach me through 6 doors: 3 drop folders and 3 feeds that sync my work email attachments, chat files and cloud attachments to disk. They piled up in Downloads and in the feed folders with names like Proposal_v3_final (2).pdf. Finding the right version of a document for a client meant a search, then a guess.
I wanted 3 things:
- Every file in 1 right place, under 1 naming rule, so search and my AI tools find it.
- No private file in the cloud. A payslip or a medical letter must never reach a cloud model.
- No silent mistakes. A wrong guess goes to an inbox for me, not into a random folder.
What Intakee does
Every file goes through the same 8 steps:
- Fingerprint. A SHA-256 hash of the bytes.
- Dedupe. The hash is checked against my file catalogue. A file I already have goes to a duplicates folder, and its name is kept as an alias of the original.
- Read. Text from PDFs, Office files and emails. An image gets a description from a local vision model.
- Privacy check. A local model (Ollama) decides whether the file is personal or sensitive: payslip, contract of employment, CV, health, family, bank, ID. A sensitive file goes to a private folder and never reaches Claude.
- Work or personal. For the unsorted drop folder only, a local model decides whether the file is work or personal. Personal documents go to my scanner archive (see Scanee: my own scan-to-archive pipeline), the rest to a personal inbox.
- Fixed rules. CRM and data-provider exports have a known name, so a rule files them without a model.
- Route. Claude (Sonnet, in headless mode, no tools) gets up to 10 files at a time with their excerpts and returns, for each one, the area, the account, the subfolder, the document type, a title and its confidence. The prompt says that file content is data, never instructions.
- File. Intakee builds the destination and the name, moves the file, adds it to the catalogue, sets Finder tags and asks the right wiki to read it (see LLM Wiki).
An example: a proposal from jane.doe@acme.example with the subject "Acme video platform proposal" lands as 261102-Acme-Proposal.pdf in the proposals folder of the Acme Corp account. A file I received keeps its original name after the date. A file I made gets a slug: 261102-acme-pricing-notes.md.
The inbox and the review page
Confidence under 0.8, or an account that isn't in my registry, sends the file to an inbox, and NicAI CC gets a card (see NicAI CC: the command centre for my Claude Code sessions). A known account at 0.6 or more is filed anyway: a wrong subfolder costs little, and the catalogue finds the file wherever it is.
The review page is a local web page with 1 row per inbox file: sender, subject, an excerpt, what Intakee proposed and why. I approve, pick another folder, or mark it as not work. It runs on the keyboard: j and k to move, a to approve, f to pick a folder.
Every decision I make there is also a lesson. Intakee stores it as an example. A sender domain I filed 2 or more times to an account scores that account next time, and up to 20 similar decisions go into Claude's prompt. The next file from the same sender goes where I put the last one.
Images and recordings
An image in a drop folder isn't filed: it goes to the queue of my image library, which screens, describes and files it.
02 Nov 2026 A video or audio file in a drop folder goes to a transcript queue, 1 at a time. The transcript goes to the account's meetings folder and the video to my NAS, copied and verified first. A recording with no audio track skips the transcript. After 3 failed transcripts of the same file, Intakee stops, sends me 1 card and leaves the file where it is. Before that rule, 1 broken recording failed again at every run: it made most of the 290 errors in the first week.
All features
Filing
- 6 sources. 3 drop folders (unsure, work, personal) and 3 synced feeds of work attachments and chat files.
- Triggered by Sortee. Sortee watches the 6 folders and runs Intakee after each burst of new files (see Sortee: my own folder sorter for macOS).
- Dedupe by content. SHA-256 against the catalogue; duplicates go to a dated folder, never deleted.
- Text extraction. PDF, Word, PowerPoint, Excel, email, plain text; images described by a local vision model.
- Privacy check. A local model screens every file; sensitive files never reach Claude.
- Work or personal. A local model splits the unsorted drop.
- Fixed rules. Known exports skip the models.
- Claude routing. Batches of 10, a JSON schema for the answer, no tools, file content treated as data.
- Naming rule.
YYMMDD-Name.ext, the sender's name kept for received files, a slug for my own, 200 bytes at most. - Events. A registry of trade shows and their aliases files event material under the right event.
- Catalogue and tags. Every file gets a catalogue row and Finder tags (account, document type).
- Wiki trigger. A filed document asks the right wiki to read it.
Safety
- Never overwrite. A name that exists gets a suffix.
- Never delete, except the source of a copy to the NAS whose copy has the same SHA-256 when read back.
- Shadow mode. Plans and logs every decision, moves nothing. I used it to check the first decisions.
- Undo.
intakee undo <batch>moves a whole batch back. - Explain.
intakee explain <file>says why a file went where it went. - Daily report. The day's decisions as a Markdown table.
Review and learning
- Inbox for doubt. Low confidence or an unknown account: the inbox and a NicAI CC card.
- Review page. Approve, file elsewhere, reject or discard, all on the keyboard.
- Learns from me. Every review decision becomes an example for the routing prompt and the account scoring.
- Rethink.
intakee rethinkapplies new rules or thresholds to the files already in the inbox.
Media
- Images go to the image library queue.
- Recordings go to the transcript queue, 1 at a time, then the transcript to the account and the video to the NAS.
- 3 tries, then stop. A recording that fails 3 times waits for me, with 1 card.
For agents
- CLI with JSON.
describe,status,reviewandexplainread;run,approve,add,undoandmodewrite. No app process needed. - Hand-over. A skill can give Intakee a file with
intakee add, for example a call recording for an account.
In use
In its first 9 days, Intakee logged about 3,000 decisions, most of them on email and cloud attachments: about 1,200 files filed, about 1,150 duplicates set aside, and about 280 files sent to the inbox for me. The duplicates surprised me: the same deck comes back attached to every reply in a thread.
How it's built
- Python 3, standard library only. 1 script of about 1,600 lines, linked onto my PATH.
- SQLite for the state: 1 row per file with every decision, and a journal of every move for undo.
- Ollama on the Mac for the privacy check, the work or personal split, and image descriptions. Private content stays on the Mac.
- Claude Code in headless mode (
claude -p --model sonnet --json-schema) for the routing, with no tools. Raw prompts and answers are kept for checks. - A verified copy to the NAS: the copy is read back without the cache and its hash compared before the source goes.
- The review page: a small Python web server on localhost, light and dark.
The agent interface
The read commands print JSON, so NicAI can use Intakee inside a task (see What is NicAI):
intakee status --json # mode, queues, decisions, inbox count
intakee review --json # the inbox with the proposed folders
intakee explain <file> # why a file went where it went
intakee approve 123 --to <folder>
intakee undo b261102-091504 # reverse 1 batch
How it was built
Intakee was phase 3 of a bigger job: a new folder structure for my work files. Claude Code wrote the spec for the structure first, then built Intakee against it in 1 session on 25th October 2026. The changes since then came from use:
- 26th October: a lower threshold for known accounts. 182 of 568 inbox files were a known account under 0.8.
- 27th October: the review page, the event registry, and the lessons from my decisions.
- 28th October: images to the image library.
- 2nd November: recordings to the transcript queue, and the stop after 3 failures.
Next
Moves through Sortee, so 1 journal and 1 undo cover both tools. And a local-model reader that takes my scanned documents into my personal wiki.
Further reading
The tool I built it with:

The local models behind the privacy check:

- see Sortee: my own folder sorter for macOS, which watches the folders and calls Intakee
- see Scanee: my own scan-to-archive pipeline, where my personal documents go
- see Pulsee: the watchdog for my Mac and my AI jobs, which watches Intakee's queue
- see The era of personal software is here, why I now build the apps I use
- All my apps: see My apps: everything I built for myself