Ask me anything about your own Instagram archive — a retrieval layer, not a chatbot
Twelve things LMKFR is willing to answer, a ranker that reads your own words, and why the honest outcome — an answer with its working, or a plain "I cannot tell from what you have online" — is the whole point.
The most dangerous way to describe a search box is as a chatbot. A chatbot that answers
questions about your own archive would have to generate the answer, and a number
generated from theme and guess is not a number from your messages. LMKFR's Ask Me
Anything room does the opposite: it routes your question to one of twelve things it
actually knows how to compute, runs that exact computation over your records, and hands
back the number with its working — or, where there is no such computation, a sentence
that says so plainly. This post is the whole agreement the room has with its questions.
LMKFR does not have a model, and it never tries to invent one answer out of
plausible-sounding text. Your question is matched against twelve registered intents;
the best match runs; the result is a count that cites its records. If the question is
outside those twelve, the room says unknown stays unknown and does not dress up a guess
in arithmetic. Every answer shows its working, and the working is the part that is
supposed to satisfy you.
- 30sthere are exactly twelve questions the room is wired to answer.
- 4minwhich of those it is, and what it counts when you ask it.
- afterwards — why the absence of a thirteenth answer is the feature, not a roadmap
- promise.
The twelve questions it knows
The room matches a question to one of these and computes it. Nothing else has an answer:
| Intent | What it counts |
|---|---|
| `people.mostActive` | Who you interacted with most |
| `relation.count` | How many are in each relationship list |
| `relation.list` | Who, by name |
| `rhythm.when` | When, day-shaped |
| `rhythm.atHour` | What you were doing at a given hour |
| `self.overview` | The headline about yourself |
| `search.content` | Find the thing you meant in your own words |
| `person.about` | A profile for one person |
| `content.hashtags` | The hashtags you actually used |
| `content.rhythm` | Your posting rhythm |
| `people.unfollow` | Who is no longer following you |
| `compare.months` | Two months side by side |
The twelve are not a list of products. They are the exact set of queries the underlying
evaluators implement; the question you type only ever hires one of them. Anything else
is the answer that it does not know.
The engine is a scorer and a ranker, not a reasoner
Ask a question and it is normalised, scored for each of the twelve slots, and the best
scorer runs. If the highest scoring slot is too weak to be confident, the room returns
the "I cannot tell from what you have online" shape, rather than hand you the second-best
guess in a larger font. That is the honesty contract in code: the threshold for a known
answer is real, and on the wrong side of it there is only the plain sentence.
Where the question gives the room enough to compare and the underlying data is wide
enough, the full-text ranking over messages, captions, hashtags, searches and links uses
BM25 the same way a careful index would. The difference is that the result is not an
answer to a question; it is the set of records whose relevance the arithmetic can defend,
and the page points at them.
"Unknown stays unknown" is not a disclaimer; it is a class of output
A product that searches your messages, your searches and your reactions can only produce
three shapes of answer, and we have a specific page for each:
- The exact match — the answer is a count of the rows that match your condition.
- The weak match — the question is close enough that we will tell you it is close, and
what it is short of.
- The non-answer — nothing in the archive supports the question. There is no fourth
shape, and the room never implies one.
The honest limit, stated once
This tool is unusually narrow on purpose. A large language model over your own DMs could
feel like it "just knows" who you were close to. It could also write something plausible
that no record supports, and it would look the same on the page. The room is designed so
that everything on it can be traced to a file, an ID and a row — which is the whole of
the honesty claim, and the only reason the room is allowed to exist at all.
Questions this comes up
Does LMKFR use an AI model to answer my questions?
No. There is no model in the room, and no network call leaves your device. The protocol
is a score over twelve known kinds of question, and that is the entire intelligence
available to it.
Why does it answer 'I do not know' rather than guess?
Because guessing is the one answer a chatbot can produce for anything, and the one
answer that cannot be verified. An answer you can audit is the only one worth having.
Can I ask it something it has not listed?
The twelve listed intents are the ones that are implemented, and they are the only ones
it will attempt as written. You can always search a content field directly — the search
intent exists precisely for that. What you cannot do is ask for a general opinion, a
synopsis, or a summary of a feeling; those are not things the record holds, and the
room will say so.
Is the text of my messages ever sent anywhere?
No. The full-text index is built on your device, stored on your device, and every result
rendered is rendered for the page that holds the records. There is no upload path, and
the point of the room is that it is built that way.
Where this was checked
The twelve intents are the exact registrations in packages/shared/src/ama/intents.ts,
and the scorer that picks one of them sits in the same folder's engine.ts. The ranking
use is in bm25.ts, and the honesty wording is the separate tone layer: tone.ts.
When the room answers, the arithmetic is at that module; when it refuses, that is code,
not a disclaimer we wrote for effect.