01 The four rules
Everything below obeys these. They are the reason the number can be argued with.
- Additive only. Every point comes from a named signal with a fixed weight. Nothing is weighed "overall".
- Baseline, positives, ceiling, then penalties. In that order, every time. The ceiling caps what a project can earn, never what it is charged: a penalty always costs its full weight.
- Absence of evidence produces no signal — never a negative one.
- Changing any weight is a versioned event. Two scans under the same version are comparable; across versions they are not.
The API is what ran. Both rubrics are served live at /rubric and /rubric/site, and every scan records the version that produced it.
02 Which rubric applies
A token is scored on whichever channels exist.
| Code | A public repository was found and is this project's. |
| Site | A website was found and is this project's. |
| Both | The two are combined: positives come from the stronger channel, problems count from either. |
A channel that doesn't exist is not a penalty. It just isn't scored — and the card says which channels were read.
03 Code rubric
Baseline 40. Deliberately below the midpoint: positives are earned up from there, so a repo with nothing going for it reads as "we found nothing" rather than "average".
Provenance
| Fork with no meaningful divergence | −30 |
| Fork with substantial own commits | −8 |
| Project domain and GitHub org agree | +10 |
| Repo first pushed after the token launched | −6 |
| Repo predates the token by 30+ days | +12 |
| Repo predates the token by years | −8 |
| Famous repo attached to a fresh token | −45 |
| Popular repo attached to a fresh token | −25 |
| Same repo claimed by many unrelated tokens | −30 |
| Same ticker relaunched under another address | −35 |
A well-known repository attached to a new token almost never belongs to it — real product coins have obscure repos. So someone else's famous code is treated as negative evidence for this token, not positive.
History
| Almost everything landed in one day | −20 |
| Under 5 commits total | −15 |
| 20+ commits | +6 |
| 100+ commits | +12 |
| Development spread over 30+ days | +10 |
| No commits in 90+ days | −8 |
| Archived | −15 |
People
| Solo contributor | −4 |
| Multiple contributors | +8 |
| Most contributors are accounts under 90 days old | −12 |
| Contributors with real history elsewhere | +8 |
Substance
| Has tests | +12 |
| Has CI | +8 |
| Has a lockfile | +4 |
| Has build config | +4 |
| Fewer than 3 source files | −25 |
| 25+ source files | +8 |
| No dependencies | −6 |
Stubs
| Explicit "not implemented" throws | −15 |
| Mock or hardcoded returns where logic should be | −12 |
| Heavy TODO density (scaled, capped) | −8 |
Documentation
| README under 500 characters | −8 |
| Substantial README | +5 |
| Repo never mentions the token | −5 |
| Has a licence | +3 |
| Published package resolving back to this repo | +15 |
That last one is the escape hatch for thin-but-real clients.
Squatting a package name is easy; publishing a package whose
repository field matches your repo is not something a scam
bothers with, and a real SDK legitimately has few files and few commits.
04 Site rubric
Baseline 40.
Substance
| Substantial content | +14 |
| Has a whitepaper (with actual content) | +10 |
| Has documentation (with actual content) | +8 |
| No docs, whitepaper or technical pages | −4 |
| Thin content | −12 |
| Almost empty | −30 |
| Unreachable | −40 |
A page named like documentation with nothing behind it earns nothing — but is not counted as absent either. Saying "no whitepaper" about a page we simply couldn't read would be the same overreach in reverse.
The shipped application
| Working application shipped | +26 |
| Real app behind a wallet gate | +22 |
| Backend the bundle calls actually answers | +8 |
| Interactive, but no backend calls found | −2 |
| Thin app behind a wallet gate | −4 |
| Brochure only | −20 |
| No frontend code at all | −14 |
| Backend the bundle calls answers nothing | −14 |
| Wallet gate with nothing behind it | −24 |
brep reads the JavaScript a site actually serves. It never connects a wallet and never signs anything, so whether the app runs stays unverifiable — this measures what was shipped, not what executes.
Integrity
| Publishes this token's contract address | +14 |
| Publishes a different token's address | −30 |
| Copy duplicated from another scanned site | −35 |
| Same ticker relaunched under another address | −35 |
| Same product and same name as an earlier launch | −30 |
| Same description, word for word, as an earlier launch under another name | −15 |
| Never mentions this token | −8 |
| Dead links in the sample | −10 |
| Placeholder text | −12 |
| Critical placeholder (lorem ipsum, unedited template) | −22 |
| Built on a site builder | −3 |
| Has socials | +4 |
Tokenomics arithmetic
| Allocation percentages add up | +6 |
| Allocation percentages don't add up | −18 |
| No tokenomics section found | −1 |
Claims vs the deployed contract
The site's published promises, checked against the chain.
| "Fixed supply" — but the mint authority is live | −25 |
"Ownership renounced" — but owner() answers | −25 |
| A transfer tax on a chain that cannot charge one | −18 |
| A published tax destination that has never held any | −12 |
| Every checkable claim held up | +6 |
Only contradictions score. A claim with nothing to check it against is reported as unverifiable and worth zero — see §12.
05 On-chain usage
Usage lifts a score and never lowers it. Maximum +15.
| Real holders, 80 → 20,000+, in tiers | 2 → 12 |
| Smart-money wallets holding (3 / 8 / 20+) | 1 / 2 / 3 |
| Swaps in the last 24h, 10 → 2,000+ | 1 → 5 |
Holder counts on a launchpad token are close to meaningless raw, so snipers and insiders are removed entirely and brand-new wallets counted at half — a farm makes thousands of fresh wallets, but so does genuine adoption, and brep cannot tell those apart from here. Halving is an admission of that, not a measurement.
Holding is only evidence once it has had time to stop, so a token under two weeks old is counted at a fraction of its tier. If most volume is bots, the whole usage figure is held to a floor of 4.
Swap counts are transactions, not unique wallets — the data does not separate those — so nothing here is ever called "active users". And none of it can subtract: a token with no holders, or on a chain we can't measure, gets nothing rather than a penalty.
06 Ceilings
| Code score | 97 |
| Site score | 97 |
| Site score where we had to abstain on content | 92 |
| With usage applied | 100 |
| With usage applied, but a claim was refuted | 97 |
| Same name and product as an earlier launch: usage lifts nothing | +0 |
| No product to score: under 150 words, no docs, and the app only buys the token | — |
100 means nothing we could check came back wrong. It is not "the best token we saw", and it is not a recommendation.
Static evidence — a repository, a website, a bundle, bytecode — can establish a great deal and cannot establish that a product works. So reading tops out at 97, and the last three points are reserved for something different in kind: other people demonstrably using the thing. Nobody has to take our word for that part.
A refuted claim withdraws those three points. The reason is narrow: 100 is the claim that nothing we could check came back wrong, and a refuted claim is precisely us checking something and it coming back wrong. Adoption says people are using it. It does not say the project told the truth, and it was never meant to stand in for that.
+ Creator record
Applied last, after usage. A bonus fills up to 97 at most; a penalty always counts in full.
| Creator wallet launched 1–9 other tokens | −3 |
| Creator wallet launched 10–29 other tokens | −6 |
| Creator wallet launched 30 or more other tokens | −10 |
| X account renamed | −6 |
| X account renamed across chains — only the chain in the name changed | −20 |
| Best previous launch peaked above $500K / $1M / $5M / $10M | +1 / +2 / +4 / +6 |
Tiers never stack: only the worst launch row and the best peak row count, and the cross-chain rename replaces the plain one. A reported peak over $1M is believed only when the coin had 500 or more holders, or when it sits within 10,000× of that coin’s own pool or market cap — the data source reports some peaks no market ever produced. The median peak of the creator’s launches is shown and never scored; it covers their newest launches only, and the card says so.
These points are the creator’s record, not a check of what this project published. They are stored with every scan so brep can measure whether they track outcomes before giving them more weight.
07 Bands
| substantial | 70+ |
| moderate | 45–69 |
| thin | 25–44 |
| minimal | < 25 |
A band is a reading of how much was found, not a verdict on the project. "Minimal" means brep found little — see §15.
08 Context that never scores
These appear on a card and are deliberately outside the number. Each is a different question from "did this team build what they said", and blending them would destroy both meanings.
| Contract powers | Mint authority, freeze authority, ownership, and the privileged functions present in the bytecode. A token can be immutable and worthless, or owner-controlled and entirely legitimate. |
| On-chain risk | Serial-launcher creators, sniper wallets, bot volume, holder concentration. |
| Trader outcomes | Exit multiples, market cap at sale, wallet PnL. |
| Novelty | The closest prior projects brep has read, compared after removing the direction every description shares. The bands — same idea, unusually close, same area — are percentiles of brep's own corpus, not chosen thresholds. See §13. |
| Specificity | Whether the page explains a mechanism or pitches a category — see §14. |
| Reads as | What kind of product the description reads as — game, exchange, launchpad and eleven more — sorted by a language model from a fixed list. It is the pitch's own claim put on a shelf, never a verdict, and it abstains when the description is unclear. |
| Built before? | Well-known products that already do the same thing, named from a language model's general knowledge. The one block on a card that is not established by reading the project, and the card says so. |
| Who launched it | The creator record: launches before this one, their best previous token, whether the creator still holds or sold, community takeovers, and the linked X account's rename history. |
09 Receipts, not verdicts
Every finding names the thing it is about: a file and a line, a URL, a contract address, a count. This is not a presentation choice. A finding you cannot check is an opinion, and brep has no standing to have opinions about other people's projects.
It follows that brep would rather say nothing than say something unverifiable. Several checks below exist mainly to decide when to shut up.
10 Absence of evidence is never a penalty
The rule the whole rubric rests on.
A project with no repository has not failed a check — there was no check. Same for a site that refused our crawler, a chain whose RPC didn't answer, a claim with nothing to test it against. All of these produce zero.
This matters more than it sounds, because the alternative is a scanner that punishes projects for our reach. A site behind bot management and a site with nothing on it look identical from outside unless you are careful, and one of those is a fact about the project while the other is a fact about us.
So refusals are recorded and shown. A scan that could only read one page says so, and abstains rather than scoring the emptiness.
11 Whose website is this?
A token with no site of its own often links the launchpad it was minted on. Crawl that and you find a real product with real documentation — belonging to someone else. Five tokens, one website, five inflated scores.
Before a site is scored at all it has to pass an ownership gate:
- Some hosts are never a project's site — social networks, explorers, aggregators, link shorteners, code hosts. (GitHub Pages subdomains are deliberately not on that list.)
- A domain that names the token is that token's.
- The site publishing the token's contract address counts as ownership — but only on a host no other token claims. A launchpad listing publishes the listed token's address too; that was a real hole and it stayed open for a while.
- A URL with the mint in its path, or a subpath on a host several tokens share, is a listing, not a home page.
A site that fails the gate is dropped as a channel — not counted against the token. The score then stands on whatever is left, and the card says which channel was dropped and why.
12 Claims vs the contract
The site says what the token does. The chain says what it does. brep compares them.
Three claims are extracted, chosen because each has a definite on-chain answer and no judgement in between:
| Fixed supply / no mint function | A live mint authority, or a mint function with a live owner |
| Ownership renounced | owner() returning a real address |
| N% transfer tax | A chain that cannot charge one, or a published destination that has never held any |
What is deliberately not extracted: staking, reflections, buybacks, revenue share. Those live in contracts brep does not read, so guessing would be worse than silence.
The four places it abstains
- A protocol fee is not a token tax. "0.3% swap fee" is a true statement about an exchange whose token contract has nothing to do with it. The rate must attach, in the same clause, to transferring the token.
- A mint function nobody can call is not a broken promise. Mint selector present but ownership renounced → reported as unverifiable, scored zero.
- An empty treasury on an untraded token says nothing. There is a holder floor before that finding can fire.
- A balance we couldn't read is never a balance of zero. One is a fact about the treasury; the other is a fact about us.
On EVM the fee logic lives inside an internal _transfer
override, which has no selector and cannot be seen in bytecode. So "no
fee function found" would be a statement about our reach, not about the
contract — and brep does not make it.
13 Novelty: a negative result
brep embeds each project's description and searches every project it has read, to answer "has this already launched?"
It cannot answer that question, and it says so.
Calibration over 105 real nearest-neighbour pairs:
min 0.641 p50 0.730 p90 0.777 p99 0.816 max 0.817
The closest pair in the entire index — 0.817 — is a ve(3,3) exchange and a leveraged index product. Both DeFi, plainly two different things. At 0.777 sit an AI-agent battle platform and a browser shooter that have nothing in common but the word Arena in their names.
The embedding separates sector reliably and product not at all. No threshold on that distribution supports "someone already launched this", and picking one anyway would manufacture exactly the confident-wrong finding everything else here is built to avoid.
So the claim was withdrawn rather than the number tuned. The block reports the closest things brep has read, how close, and what happened to them — and carries a standing caveat that proximity is not duplication.
It means nothing similar is in the index — and the card names how many projects that index holds, so you can weigh it yourself.
14 Specificity: the honest half of "is it clever"
Cleverness is a judgement and brep does not make judgements. But there is a checkable fact underneath the instinct: a team that built something specific describes something specific. They name the primitive. They give the parameter. They publish what their thing does not do.
Marketing pages never write down what their product can't do. That turns out to be the strongest single marker on the list.
This is not a quality score and never touches the number. Jargon is free — anyone can paste curve names onto a landing page, and brep reads that as specific, correctly, because the page is specific. Whether the thing described was built is what the rest of the scanner is for.
Nor is a pitch page a defect. Plenty of real products market themselves in category language and keep the mechanism in their docs. So a low reading is reported as what it is — this page markets rather than explains — and never as evidence that nothing exists behind it.
15 Things brep is not
- Not a price prediction. Nothing in the rubric knows or cares what a token is worth.
- Not financial advice. The output is a reading of artifacts.
- Not a fraud determination. A low score means little was found, which is not the same as something being wrong. A refuted claim means one specific published statement doesn't survive contact with the chain — and is reported that narrowly.
- Not a measure of whether an idea is good. An idea having been tried before is not a defect; most working products are someone's third attempt.
16 Known limitations
Stated plainly, because a methodology page that only lists strengths is marketing.
- The corpus is small. brep has seen thousands of tokens and has actually read a few hundred websites. Every novelty reading names the number it searched for exactly this reason.
- The app is never executed. brep reads shipped JavaScript, never connects a wallet and never signs. Whether an application runs is unverifiable this way, and cards say so.
- Bytecode selector matching is probabilistic. A selector present in compiled code is a function the contract exposes — but a constant elsewhere in the bytecode could in principle collide. Rare enough to report, common enough not to describe as proof.
- Copies are caught only against what brep has read. A copy is charged when the original is already in the index and both launch dates are known; a copy scanned before its original stays uncharged until it is scanned again. The same idea under another name is never charged — that is a competitor, not a copy.
- Contract flags read signatures, not permissions. A selector says a function exists, never who may call it.
burnFromspends the caller's allowance and is reported as a capability rather than a warning; the severe flag is reserved forburn(address,uint256), the two-argument burn that names another wallet. A contract that gates that one on an allowance would still be flagged, and we would rather be wrong in that direction. - Some data is someone else's summary. Holder counts and wallet tags come from a third party. They inform context, never the score.
Request a re-scan from the bot and we'll look at it. A finding that names the wrong file or the wrong address is a bug, and it gets fixed like one.