Skip to content
Rascals
Work
Own product 2026 — now

Pam

Reads the post, and says what every message is.

Incoming mail read over IMAP, grouped into conversations and labelled for what it is — a tender, a request for a price, a customer with a problem — without a copy of it leaving the building.

kinds — RFI, tender, price request, customer question, information, marketing, spam
7kinds RFI, tender, price request, customer question, information, marketing, spam
runs — fetching and judging, scheduled apart
2runs fetching and judging, scheduled apart
copies — of the post leave the building
0copies of the post leave the building
Role
Product, architecture, build
Period
2026 — now
Stack
Laravel Blade Tailwind CSS IMAP SMTP SQLite

The problem

An inbox is a queue nobody sorted. A tender closing on Friday, a customer whose checkout is broken and a newsletter all arrive in one list, in the order they were sent, and the only thing ranking them is whoever opens them next. The usual answer is a folder rule per sender, which holds until the sender changes or somebody forwards a thread — and a rule can never say why it fired. Pam reads the post first and says what each message is, so the list is sorted before anybody looks at it.

How it works

One scheduled run fetches what is new and stores the headers, the plain text and the names of the attachments. A second judges whatever has not been judged, so a classifier that breaks cannot also stop the post coming in. Messages are grouped into conversations by their own threading headers where a sender bothers to set them, and by a stripped subject within a month either way where nobody did. Every verdict is written down next to the evidence for it, and anybody can overrule one.

What is in it

01

A mailbox is a row, not a deploy

Host, port, encryption and credentials live in the database, so a second address goes in through a form rather than by editing a file on a server. Type the address and the server settings fill themselves in from what the domain publishes in its own DNS; only the password is typed by hand, and it is stored encrypted and never shown again.

02

The connection test logs in and hangs up

Checking a mailbox lists the folders, and starts and stops the very transport a real send would use. Nothing is read, nothing is sent, and on the add form nothing is stored either — the check runs before the mailbox exists. A wrong password is worth discovering before the first reply is due rather than after.

03

Reading changes nothing

Messages are fetched without marking them read, so the mailbox looks to its owner exactly as it would have. Attachments stay on the server: downloading an eighteen-megabyte archive to conclude that it is a tender is the wrong order. Formatting is flattened to text on the way in, which leaves no markup to render by accident later.

04

Who wrote it is a separate question from what it is about

Machines send tender notices, invoices and monitoring reports, and what those are about differs every time — so it cannot be one label. Whether a person wrote it is its own field with its own evidence, decided per message rather than per sender: the same colleague sends a real reply on Monday and an out-of-office on Friday.

05

Only the sender's own words

A reply carries the whole thread beneath it, so one message about a tender used to turn every later message in that conversation into one too. Everything from the first attribution line down is cut away before anything is judged. Direction counts as well: a price somebody sends Rascals is not a request for one, and mail from Rascals' own domain can never be.

06

A correction outranks the rules

Anybody can say what a message really is, and that verdict stands — running the classifier again skips it rather than overruling the person who actually looked. What Pam takes from a correction is a readable sentence about a sender rather than a weight inside a model, so it can be argued with and undone.

The trade-off

The classifier is a set of keyword rules, and it stays that way until a question is answered rather than assumed: what may read a client's mail, where that happens, and what is kept afterwards. So Pam is deliberately worse at judging than she could be today. Every correction made in the meantime is kept, because those corrections are the thing a replacement will have to beat before it is allowed anywhere near the post.

Something like this on your list?

The projects differ, the way of working does not. Tell me what you are trying to solve.

Taking on new work