Build1 distinct publisher3 min readUpdated
Log2-bucketed gap entropy on live Nostr data separates two humans from a clockwork poster by 4x. Against a burst spammer, the same metric lands almost inside human range.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
A developer publishing as zekebuilds pulled about 45 recent kind-1 notes from each of four Nostr pubkeys, discarded everything the accounts actually said, and scored only when they posted: inter-event gaps in seconds, bucketed by log2, then Shannon entropy over the bucket distribution [1][2]. Two human accounts came in at 4.13 and 3.60 bits, a scheduled bot at 1.000 bits flat, and a burst spammer at 2.036 bits, which is the number that matters [5][7][9].
The log2 step is the whole trick. Without it, according to the author, you are measuring jitter noise; with it, a 20-second gap and a 25-second gap collapse into the same bucket and what you are counting is how many orders of magnitude of timing behaviour an account uses [3]. All of it ran through nak against wss://nos.lol on real pubkeys, no synthetic data [4].
Bot A is the clean case. It posts a "Random Bitcoin Podcast Spotlight" template, all 45 notes pulled shared an identical prefix, median gap around 16 hours across a 528-hour span, entropy 1.000 bits over exactly two log2 buckets [6][7]. Two things follow from that arithmetically. A flat 1.000 bits is the maximum entropy available to two buckets, so the two are equally populated: 22 of the 44 gaps in each [3]. And 528 hours across 44 intervals is a mean gap of 12 hours, well under the 16-hour median [2]. This is not a metronome. It is a timer that alternates between two adjacent scales, and the metric still buries it, because 1.000 bits against a 3.60-bit human floor is a 3.6x separation [8].
Bot B is where the author is honest. It rotates product-ad templates, dumped 45 notes in roughly half an hour at a 21-second median gap, and scored 2.036 bits [9]. Against the two humans that is 1.77x and 2.03x, straddling the 2x line the author predicted going in [8][10]. Worse than that framing suggests: a 2x rule with a human floor of 3.60 bits implies a bot ceiling of 1.80 bits, and Bot B sits about 13 percent above it [5]. And 2.036 bits cannot come from "a couple" of buckets. Four buckets cap out at 2.000 bits, so Bot B occupied at least five [4]. Twenty-second jitter, compounded over 44 intervals, genuinely spans that much.
The aggregate reads well: mean bot 1.52 bits against mean human 3.87, a 2.55x ratio [11]. The means check out against the four figures, and that is the problem, because each mean is an average of two accounts [6][1]. Four accounts on one relay is a demonstration, not a calibration set.
The author's conclusion is the useful part: both bots were trivially obvious on content, Bot A through 45 identical prefixes and Bot B through a small rotating ad pool, so template similarity catches exactly the archetype timing misses, and vice versa [13]. Timing entropy is strong against fixed-schedule posters and weak against a burst spammer that randomises cadence [12]. The cost of evading the timing half is visibly low, since Bot B was not even trying.
Watch whether the 2x threshold survives contact with a real sample, and whether it needs to be conditioned on posting volume, since a 30-minute burst and a 528-hour span are being scored on the same scale. The author says gap-entropy is one candidate input to depth-of-identity scoring at identity.powforge.dev [14]; the number to ask for next is a false-positive rate on low-volume human accounts.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
A developer publishing as zekebuilds on dev.to tested whether a bot can be distinguished from a human purely by when it posts, ignoring content.
Method: pull a pubkey's recent kind-1 notes (about 45 events each), compute the gap in seconds between each consecutive pair, bucket each gap by its log2, then compute Shannon entropy over the bucket distribution in bits.
The author states that without log2 bucketing you are measuring jitter noise, and with it you are measuring how many orders of magnitude of timing behaviour an account uses; a 20-second gap and a 25-second gap land in the same bucket.
The measurements ran through nak against the relay wss://nos.lol, using real pubkeys and real notes, with no synthetic or simulated data.
Two active human pubkeys measured 4.13 bits and 3.60 bits of gap-entropy.
Bot A (pubkey prefix 253baa88) runs a "Random Bitcoin Podcast Spotlight" template, and all 45 of its notes pulled shared an identical template prefix.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Real live-relay measurements, but a four-account sample from one self-interested author
Strengths: the measurement ran on live Nostr data through nak against a named relay with no synthetic accounts, every number is published (4.13/3.60 bits human, 1.000 bits Bot A, 2.036 bits Bot B, 2.55x aggregate), the method is specified tightly enough to reproduce, and the reported aggregates reconcile with the individual readings. Weaknesses that cap the score: n=4, one relay, one author, no independent replication, no stated ground-truth labelling procedure beyond inspecting content templates, and no false-positive testing against sporadic humans.
No adoption evidence beyond the author's own prototype disclosure
The cluster reports one self-run measurement and a self-disclosed intention to test gap-entropy as an input to the author's own identity-scoring project. There is no release, integration, user count, relay or client deployment, or third-party usage anywhere in the supplied source, so adoption cannot be scored without inferring facts the source does not provide.
Mild overreach from a four-account sample, largely self-corrected in the same post
Positive but small. The framing ('you can tell a bot from a human by when they post, mostly'; a suggested 3.5-4 bits human vs ~1 bit machine rule of thumb) generalises further than four accounts on one relay can support, and the headline 4x separation rests on a single scheduled bot. Offsetting that, the author publishes the counter-case prominently: Bot B's 2.036 bits fails the 2x rule against the 3.60-bit human, and he states plainly that timing alone will not catch jittered bursters and must be paired with template similarity. That candour keeps the gap near alignment rather than large.
Author is validating a signal for his own identity-scoring product, disclosed in-line
The post's closing section discloses that the author is building depth-of-identity scoring at identity.powforge.dev and is testing gap-entropy as an input, so a favourable result promotes his own project, and the piece is self-published on a developer platform with no editorial review or independent verification in the cluster. The disclosure is voluntary and prominent, and the author publishes the result that undercuts his own threshold, which moderates the score rather than eliminating the conflict.
Method and numbers are checkable; the generalisation is not yet trustworthy
Confidence is moderate-low. What can be trusted is narrow and specific: the recipe as described, the four reported readings, and their internal arithmetic consistency. What cannot yet be trusted is the inference from those readings to any operating threshold, because the cluster has one publisher, one author, one relay, four accounts, no replication, and a disclosed incentive. Adoption is entirely unmeasured.
build
Force the tool call, then hand Lightsail a long-lived key1 distinct publisher
build
AI-written code fails the same four ways, and every gate you own reports green1 distinct publisher
build
CSA's 2026 threat list is a flat line, so ask which threats a config snapshot can prove1 distinct publisher
build
An empty array is a claim about your query: verify identifiers before you trust the metric1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 15, 2026