AI Projects

Alice

Objective: replace a spreadsheet that held data but not decisions with a system that prioritizes a high-volume relationship problem for me.

A spreadsheet holds data. It doesn't hold decisions. I replaced mine with a system that prioritizes for me instead of asking me to re-derive priority from a wall of rows.

Built for the relationship load of an active executive search: a phone-editable tool backed by a real database, with a scoring engine underneath instead of a sort order.

The problem

What the spreadsheet couldn't do

01
Hold context
Why a relationship matters, not just contact details.
02
Enforce cadence
When the next touch is actually due.
03
Surface priority
Which five of several hundred matter this week.
04
Close the loop
Nothing goes stale silently.
05
Travel
Editable from a phone, not just a laptop.
How it works

A nightly sweep, then five minutes on the phone

Every night it pulls new Gmail activity, calendar matches, and new Granola meeting summaries, then rescoring runs against the full list. What's left for me is a short review: open the phone, see who moved, act on what matters.

1 Sweep 2 Rescore 3 Review 4 Act 5 Log
Closes on itself. Log feeds the next Sweep, so the record starts each night from what actually happened.
01
Sweep
Gmail, Calendar, and Granola checked for anything new since the last pass.
02
Rescore
Every contact recalculated against the five-dimension engine, not just the ones that changed.
03
Review
A phone-first list, ranked, with a suggested next message already drafted.
04
Act
One tap drafts the message in Gmail, in my voice, threaded onto the real conversation, resume attached when it's relevant.
05
Log
The action and the reasoning both get written back, so the next sweep starts from what actually happened, not what I remember happening.
What it looks like

A phone-first review, and one record underneath

Two views of the same system: the nightly review list, ranked and ready, and one contact record showing what the system actually holds. Names and identifying details are redacted for this page.

Alice review list, contact names redacted
The nightly review list, ranked by priority score. Names redacted.
Alice contact record, identifying details redacted
A single contact record: context, cadence, and log. Name, email, and narrative redacted.
The stack

Five tools, one system

Nothing here is a platform I bought. Each piece does one job well, and the system is the way they're wired together.

Claude
Builds and maintains the system, runs the nightly sweep, drafts messages in my voice.
Supabase
The database of record: real contacts, real history, row-level security.
GitHub Pages
Hosts the interface. The only one of four hosting attempts that actually worked.
Gmail & Calendar
Where the real signal lives: replies, meetings, follow-ups actually taken.
Granola
Meeting transcripts feed straight into the record. No manual note-taking.
The engine

Five weighted dimensions, one priority score

Each contact is scored on real signal in the record, not self-reported. The weighted result classifies every contact into one of six states, and a second layer ranks it against the full population. Every number recalculates from current state, so a stale score can't quietly persist after the facts change. Click a row for what it measures.

Influence
30%
Does this person have a real lever: hiring authority, a live desk, a credited referral.
Engagement
25%
Positive versus negative signal density in the actual conversation history.
Momentum
20%
Recency of last contact, weighted by how fast that category typically goes cold.
Fit
15%
Explicit stage or sector mismatch, when one is on record.
Confidence
10%
Freshly verified via a live sweep, or carried over unverified.

This is the same layered scoring architecture behind a separate venture I'm building, applied to my own problem as a live test of whether it holds outside its original domain. It did, with no structural change, only a change in what the inputs represent.

Two kinds of AI

Scoring is a decision. The drafted email is a convenience.

It would be easy to let the two blur together. They aren't the same kind of AI, and they don't deserve the same trust.

The scoring engine

Deterministic

Five weighted dimensions, computed the same way every time, auditable back to the signal that produced the number. Nothing about it is generated. It's a formula, not a guess, and it doesn't change its mind between runs.

The drafted email

Generative

A starting point, written in my voice from the real thread. Useful, and it saves real time. But it's a suggestion I read, edit, and approve before anything sends, not a decision the system is trusted to make on its own.

The architecture I didn't build

The standard company-brain toolkit, refused on three different grounds

Vector embeddings, a knowledge graph, an agent-memory framework: the usual answer to "how do you build a company brain." None are in Alice. Each was refused for its own reason, not dismissed as a group.

Getting signals
Working
Remembering
Strong
Dreaming and pruning
Absent
Speaking and searching
Working

Audited against Slite's four-pillar company-brain model. The sharper finding underneath: the sweep was a detector wired to a human, not to the store. It couldn't read what was already recorded, so it re-reported things I'd already logged. It couldn't write, so every finding cost a manual re-entry. That diagnosis, not a feature wish, produced the review-queue design.

01
Vector search and embeddings
Scale. Semantic recall earns its cost when a corpus can't be scanned directly. A few hundred filtered rows can be.
02
Knowledge graph
Structure, not scale. Graphs pay off across many entity types and relationship kinds. Alice has one entity and one relationship. Nothing for a graph to traverse.
03
Agent-memory frameworks
Wrong quadrant. Built to manage memory for an agent acting semi-autonomously. Alice serves one person who reviews every write.
04
Autonomous writes
Governance, and not revisitable. Every write stays human-gated by design.

I ran the same four-pillar test against an outside package, a CFO chief-of-staff skill built by a vendor, specifically to check whether I was rationalizing. Its ledger was four flat markdown files with no versioning, a downgrade from what Alice already had. Its stated principle, broad read access, narrow write authority, human approval before anything consequential, was already what the review queue enforces. One piece was genuinely better: an explicit ranking rule, attention value as consequence times urgency times decision leverage times confidence, with four escalation bands separating what interrupts now from what waits. Adopted the same day, minus the confidence term, which the schema couldn't support honestly.

Their own demo was worth noting too. It configures a scheduled job to skip all approvals while granting it write and delete access to the user's email. That's the exact failure mode the review queue exists to prevent, shipped as the recommended setup in the material teaching people how to build one.

01
Vector search / embeddings reverses on
Free-text volume, not row count. When notes and log entries carry enough prose that scanning stops working.
02
Knowledge graph reverses on
A second entity type creating real traversal. Companies as records, or contact-to-contact relationships. Neither exists today.
03
Agent-memory framework reverses on
A second person using Alice, or writes ceasing to be human-gated. Neither is planned.
04
Autonomous writes
No condition. A standing position, not a deferral.

What makes a brain durable, not just built

Three findings a working group of company-brain builders converged on independently. Each one is a constraint Alice was already built around, not a feature added after reading them.

Maintenance is permanent, not a build phase
A company brain is never "done." The nightly sweep is the maintenance model, running by default rather than depending on a rebuild someone remembers to schedule.
Nothing writes without a human
No builder in the field trusts an AI to write to the record unsupervised yet. Alice's review queue is that same conclusion, reached independently and enforced by design, not by policy.
Capture rides along with real work
A brain that depends on someone remembering to feed it starves on schedule. Gmail, Calendar, and Granola feed Alice as a byproduct of work already happening, not a separate logging habit.
The method

Four hosting attempts, three dead ends

Each failure produced a specific, falsifiable finding rather than a shrug: does the code run, is the data correct, is the header wrong at the origin or a cache layer. That discipline is what made it possible to recognize the third failure as a deliberate platform decision, not a bug worth fighting, and change approach instead of trying a fourth variation on the same one.

Failed
Sandboxed hosting
Client-side calls to an external API were silently blocked by the viewer's own security sandbox.
Failed
Static file storage
Confirmed three separate ways: the platform would not serve a stored object as renderable HTML.
Failed
Serverless proxy
Ran correctly, but the gateway force-overrode the content type and security policy on every response.
Resolved
Static host, direct
Correct headers by default, no gateway restriction. Confirmed end to end, including the original failing case.

Three real architectural dead ends in one day, each abandoned cleanly once the evidence was conclusive, rather than sunk-cost escalation into a fourth attempt at the same broken approach.

After launch

A mistake I caught, and a list put back in order

941340
Contacts before and after three rounds of validated deletion
9
Pulled back out, flagged for a real past interaction
7
Notes caught truncated at exactly 500 characters
1
Category value caught outside the approved list

A schema change moved one table to a more flexible shape. Every server-side function that touched the old structure was checked and updated. The code that loads that table into the browser was not, and every record rendered as undefined on the next real load. I caught it from a screenshot, not from my own review.

The fix took minutes. The useful part was the test: the existing one would have passed with the bug in place, because it fed one function's output straight into the other and skipped the step where the database wraps a record before returning it. Rewritten to simulate that step, so the same class of mistake gets caught automatically going forward.

What it changes

Less time managing the list, more time on the calls that matter

01
No more re-deriving priority
The list already knows what matters this week, so I don't scan hundreds of rows to find it.
02
Nothing goes stale silently
The sweep catches what I'd otherwise forget to check.
03
One tap from decision to action
Review, draft, send, without opening a spreadsheet first.
Check against ground truth before you write, not against the last thing you remember being true.
Matt Boone AI Projects