lulumelon measures what language models say about you.
a recording. typing there calls nothing and costs nothing.
±ask the same question ten times and count, or read a number somebody asked once.
one round, 4 august 2026
every tool in this category reports one number. it asked once.
language models are not deterministic. ask the same question twice and you get different companies, in a different order. so “your visibility is 18.5%” is not a measurement, it is one draw from a distribution nobody characterised. this asks n times, writes every answer into a hash-chained file, and reports what the sample can actually support.
what does it cost to use?
nothing. the library is free, mit licensed, and it stays that way. bring your own key, pay the provider for your own tokens, and the software takes nothing on top. no account, no seat, no invoice from here.
the round above cost $2.46, paid straight to the model provider, and that was the whole bill.
how do you run it?
python 3.11 and two dependencies, both of them arithmetic. everything on the network path is standard library, because an http client is not worth a supply chain for one post. the suite runs offline and spends no key.
pip install -e .lulu setup ± your key, into the OS keychainlulu draft --site example.com ± writes the question set from a sitelulu collect --subject FILE ± asks each question k timeslulu report --snapshot ROUND ± the number, with what it withholdslulu verify ± re-derive every chain on disk
fifteen commands in all. `lulu screened` turns a round into a pdf, `lulu rivals` reads the names off it, `lulu publish` writes the pages under measured questions, and `lulu usage` prices what was spent from the provider’s own figures.
the library is the product. `mirror` is pure arithmetic and reaches no network, so an interval can be recomputed from a file without a key. `collect` is the only part allowed to reach a provider and it computes nothing. that wall is why a number here is checkable rather than quotable.
a round lands in an append-only file, hash-chained, each line carrying the hash of the one before it, and the round states its own length so a file somebody cut lines off the end of stops verifying.
mit licensed, on github, with the key setup written out in docs/keys.md.
is 0 of 10 zero?
never being named in five draws is compatible with being named up to 43.4% of the time, and ten draws only bring that down to 27.8%. the textbook interval collapses to nothing here and lets a tool claim certainty of absence after five samples. wilson keeps the real bound, so the report says what it does not know.
when is a competitor ahead?
a competitor at 6 of 10 against your 4 of 10 is not ahead of you. those ranges overlap almost entirely. this refuses to print a ranking the sample cannot support, which is the one thing every dashboard in the category does anyway.
does the model that searches answer with the same companies?
it does not. the same questions, asked with the search tool on and with it off, come back naming different markets. a rival list read off one arm and measured against the other reports an empty category, which is a fact about the list, and this says so on the screen before the money moves.
did the content work, or did the dice move?
publish something, measure again. if the two intervals overlap, the honest verdict is inconclusive and the report says how many draws it would take to settle it. going from 2 of 10 to 4 of 10 looks like a doubling and means nothing. that round’s own noise floor was 12.6 points, read off the draws that were already bought.
or did the model move?
providers ship new versions without telling anyone, and everybody’s numbers shift at once. the same fixed question set, run on a schedule, separates “you dropped” from “the model changed underneath you”, and a round whose model moved is refused rather than compared.
what is the most this can cost?
every command prints that figure before it spends anything, and the guard stops the round rather than discovering the overrun afterwards. the first version of that guard printed $0.0440 and paid $0.0467, because it priced a call nobody was making. it is priced from the request now.
what does it measure?
- appearance rate
- of the n times this question was asked, in how many were you named. a property of you alone, so it does not move when a competitor moves. reported with an interval.
- rank, separately
- average position across the draws where you appeared, with its spread, and withheld entirely when the leader does not repeat often enough for a position to describe anything but the sampling.
- who else got named
- counted off the same answers, with no list supplied. a name counts when the round wrote it inside a sentence, or spelled it the way no ordinary word is spelled, and never when the same round also wrote it in lower case.
- which questions discriminate
- before the paid round, each candidate question is drawn against the rivals and kept only if the lower bound of its interval clears the floor. undecided is not a pass.
- what the answers cited
- the pages the provider itself reported, never scraped out of the prose, with whether your name travels with them stated as an association rather than an effect.
what does it refuse?
- a round it cannot re-derive
- every answer is hash-chained to the one before it and the round states its own length. a file somebody cut lines off the end of no longer verifies, and nothing is computed from it.
- a question set screened on your own name
- keeping the questions you scored well on and dropping the rest raises the published number by deleting the evidence against it. rivals are what the gate measures, and with none declared the paid round does not run.
- a comparison across a model change
- two rounds collected on different model versions are two experiments, so the verdict is withheld rather than printed with a caveat under it.
- an answer that stopped early
- a reply cut off mid sentence, by a paused search or by its own token cap, is a fragment. recorded as a failure, never as a draw where your name happened not to come up.
- a retry until it works
- a failed call is written down with the provider's own reason and never repeated. asking again until the answer is good is a filter over model output, which is the thing this exists to refuse.
can you check any of it?
yes, and that is the design. the measurement core is pure arithmetic and reaches no network, the collector reaches the network and computes nothing, and the wall between them is why a number here can be reproduced from the file it came from. the suite runs offline with every socket closed and spends no key.
python tests, offline, on the measurement core and the collector
node tests on the sampling maths behind the demo above
answers rewritten, retried, or dropped from any round