Methodology
Borrowed in Brooklyn watches public catalog availability across 12 selected Brooklyn Public Library branches and infers demand pressure from changes between snapshots — and, when BPL exposes them, from public aggregate hold counts. We do not access patron records, checkout logs, or private hold queues. Where the interface uses “popular” as shorthand, the underlying metric is demand pressure.
Scope
1. What Borrowed in Brooklyn measures
- Public catalog availability — how many copies are on the shelf at each tracked branch.
- Public aggregate hold counts when BPL exposes them on the catalog record.
- Adult physical books, across a representative 12-branch panel.
- Inferred demand pressure — a bounded 0–100 index per branch and a panel-wide aggregate.
2. What it does not measure
- Direct checkout popularity.
- The full BPL catalog or all 60+ BPL branches.
- Private hold queues or patron data.
- Reader demographics or patron behavior.
3. Why availability and holds are still useful
Books with few or no available copies across many branches are likely experiencing demand pressure. Recent drops indicate movement. Public aggregate holds, when consistently exposed, are a strong demand signal: a title with 1,036 patrons waiting is plainly more in demand than one with 0. Cross-branch breadth helps separate local shortages from broader patterns.
Adult-only scope
We track adult physical books only. Children’s, middle-grade, YA, picture, and early-reader books are excluded so the project can focus on adult reading demand and neighborhood-level taste differences. Non-book formats (ebooks, audiobooks, DVDs, CDs, magazines, streaming, games) are also excluded. Records that don’t cleanly classify as adult are handled conservatively — better to drop a borderline case than admit a YA title into an adult-only panel.
Sample & tracked pool
4. The 12-branch panel
The panel groups 12 branches across 4 Brooklyn regions:
- Central / Downtown — Central Library, Brooklyn Heights
- North Brooklyn — Bushwick, Williamsburgh, Greenpoint
- Central Brooklyn — Bedford, Crown Heights, Flatbush
- South Brooklyn — Bay Ridge, Sunset Park, Kings Highway, Coney Island
This is a sample, not the entire BPL system. Other BPL locations exist and are intentionally not part of the tracked pool.
5. How books enter the tracked pool
Borrowed in Brooklyn does not use a fixed seed list and does not crawl the entire BPL catalog. The tracked pool is refreshed regularly. Most candidates come from BPL’s public popularity sort across 14 themed adult categories — literary fiction, mystery / thriller, romance, translated fiction, graphic novels, memoir, nonfiction, cookbook, fantasy & sci-fi, wellness, business, Spanish-language adult, poetry, and art & design.
A small watchlist lets the site check likely emerging titles — anticipated releases, prize-list books, book-club picks, and major-author releases — without crawling the whole catalog. The watchlist has two sources: a hand-curated set of titles that editors care about, and a weekly pull from the New York Times Best Sellers covering seven adult fiction, nonfiction, hardcover, and paperback lists. The NYT pull is the editorial corrective for BPL’s bestseller-tilted intake: titles popular nationally don’t always surface in BPL’s per-category popularity sort yet, and the NYT lists catch them before they would otherwise enter the panel.
Watchlist entries only decide what the system looks up in BPL — they do not directly boost rankings. Once a watchlist title resolves to a BPL record at one or more tracked branches, it competes on the same scoring axis as everything else (scarcity, breadth, holds, movement). NYT seeds carry an ISBN, so the BPL lookup pins to the right edition rather than guessing on title and author alone.
All candidates pass the same adult-physical eligibility filters and are deduplicated before activation, so the same title surfacing through multiple discovery sources doesn’t double-count. The site remains a bounded, high-signal demand tracker, not a complete ranking of every adult book in BPL.
Discovery is branch-first
Each of the 12 branches has its own tracked pool. Discovery isn’t run once borough-wide and then assigned to branches — it runs per branch. For each branch, BPL’s popularity sort is queried inside each of the 14 themed adult categories, scoped to that branch’s holdings. A title becomes a candidate at a branch only if all three are true:
- It surfaces in that branch’s popularity-sorted results (or arrives via the watchlist).
- It passes the adult-physical eligibility filters described above.
- That branch has at least one physical copy of it on the shelf at discovery time.
Because intake is branch-first, the same title can be tracked at one branch and not another — Bushwick’s pool legitimately differs from Bay Ridge’s pool when the two branches’ popularity-sorted catalogs differ. That’s the whole point: it’s how the site can say “this book is unusually in demand at this neighborhood” meaningfully. The borough-wide tracked pool is the union of all 12 branches’ pools, deduplicated.
From branch pools to borough-wide rankings
Even though intake is branch-first, the homepage shows a single borough-wide ranking. The bridge between the two is record matching: across branches, the same physical book maps to a single canonical record. We match by BPL record ID first, then ISBN, then normalized title plus author. So when All Fours shows up in Bushwick’s pool and Bay Ridge’s pool, both branches’ tracked rows point at the same book.
For each book, the site computes:
- a branch pressure score at every branch that carries it (its scarcity, recent movement, and holds at that specific branch), and
- a panel pressure score that averages those per-branch scores across only the carrying branches and adds bounded bonuses for breadth across branches, cross-branch shortages, and regional spread.
Branches that don’t carry a title are excluded from its panel score — non-coverage at one branch never looks like low demand at the borough level. A book carried at three branches and squeezed at all three can outrank a book carried at twelve and squeezed at six, depending on how the breadth multiplier and bonuses balance. The homepage’s Hardest to Get ranks every book in the borough-wide pool by panel pressure.
The branch-first intake is what makes Neighborhood Favoritespossible at all. The over-index score for a book at a branch is its branch pressure minus the average pressure across the other carrying branches — that comparison only makes sense because the same book has independent branch pressure scores at each branch that carries it.
Why discovery is bounded
We tested deeper pagination in BPL’s public search results, but the endpoint currently returns the same first-page results for those follow-on requests. Rather than pretend to sample pages BPL doesn’t expose, Borrowed in Brooklyn keeps discovery bounded to the high-signal head of each themed category and supplements it with the small watchlist described above.
Each category has a per-branch activation target (a handful of titles for big categories, fewer for smaller ones), with most branches sitting in the 20–30 range of active tracked titles at any moment. The panel is intentionally bounded so every branch is measured against the same shape of pool — that’s what makes “Bushwick has more standouts in poetry than Bay Ridge” mean something.
Refresh and retirement
Discovery and availability both refresh once a day on a rotating schedule — every tracked title gets a fresh snapshot daily. Scores are recomputed immediately after new snapshots land. Titles that go quiet — no movement, no reappearance in popularity results, no holds activity for an extended period — get retired. Retired titles preserve their history but stop counting as currently tracked, and they can re-enter the pool if BPL surfaces them again.
“Tracked here right now” counts at a branch only include adult titles with an active tracked record, a recent successful snapshot showing physical copies present, and that snapshot taken within a 14-day freshness window. Without this gate, retired books could keep counting forever just because we have a stale snapshot for them.
Scoring
6. How demand pressure works
An honest framing of the formulas below: all the component weights, caps, and thresholds are intuition-anchored — chosen to produce rankings that match how a thoughtful librarian or reader might prioritize titles, then iterated when something obvious felt off. They are not regression-fit against an external popularity oracle (NYT, Goodreads, BookScan, BPL circulation records) because none of those is a clean ground truth for “hardest to get at BPL right now.” The formulas are tested for arithmetic correctness; whether the weights produce theright ranking is a judgment call we’re explicit about.
Branch demand pressure (0–100)
Site tooltips and tables shorten this to “branch pressure” (and panel demand pressure to “panel pressure”) — same 0–100 indices.
For every (book, branch) pair we compute a single bounded score from three signals:
- Scarcity — how many copies are on the shelf relative to how many exist at that branch. Scarcity dominates the score.
- Recent movement — drops in availability over the last day and week. Movement is capped so a few recent drops can’t override the underlying availability picture.
- Public aggregate holds — folded in only when holds are exposed widely enough across comparable titles to compare books fairly. Below that threshold, the ranking falls back to availability-derived scoring.
Public aggregate holds: a fragile signal handled carefully
Public aggregate holds are one of the strongest demand signals available, but they come with caveats:
- System-wide, not branch-level. The holds number is one count for the entire BPL system. We never sum it across branches.
- Inconsistently exposed. BPL surfaces holds on some catalog records and not others. We mark each title’s holds state as available, not exposed, or unknown, and the most recently observed value is carried forward briefly so a single missing observation doesn’t flip a title in and out of holds-adjusted mode. After about 72 hours without a fresh observation, the title reverts to not exposed.
- Missing holds are never treated as zero. A missing number is missing data, not a signal. Each ranking section is labeled availability-derived or holds-adjusted so you can tell at a glance which mode is in effect.
- Capped and log-scaled. Holds enter the score as a bounded component so a single very-popular title can’t dominate the ranking.
Why we don’t lead with raw holds. A pure most-waitlisted leaderboard would be coverage-fragile, system-wide rather than branch-level (a 1,000-hold title may queue mostly at branches we don’t track), and skewed to already-famous titles whose queues grew over months. Holds inform the panel score when coverage is sufficient, but they don’t headline the rankings on their own.
Panel demand pressure
For each book we aggregate per-branch pressure into a single panel score. The shape is intensity × breadth, plus bounded bonuses for cross-branch shortages and regional spread, and (when coverage is sufficient) a bounded holds component. Branches that don’t carry a title are excluded from the average — non-coverage never looks like low demand.
Panel pressure is an index, not a 0–100 score. Branch-level pressure is bounded 0–100. Panel-level pressure is intentionally not capped at 100 because the breadth multiplier (~1 → ~2) and the bounded bonuses can lift a borough-wide stockout meaningfully above any single branch’s ceiling. Observed range is roughly 0–180. Compare panel scores against other panel scores; do not read them on the branch-level 0–100 scale.
BPL popularity is not a scoring component. v2.3 briefly folded each book’s average position in BPL’s public popularity sort into the panel score as a bounded contribution. v2.4 removed it. The discovery lane that admits books to the panel is itself BPL’s popularity sort, so feeding that same signal back into the score the user sees was circular: the rankings effectively answered “what does BPL think is popular?” rather than the question we want to answer (“what’s hard to get and moving across the 12 tracked branches right now?”). It also systematically penalised watchlist-seeded titles that hadn’t yet shown up in popularity intake. Cleaner separation: BPL popularity decides what we look at; observed availability, holds, movement, and breadth decide how we rank what we find.
To keep one-branch / one-copy anomalies out of the lead story, panel rankings require a minimum number of carrying branches or total tracked copies. Items below those thresholds can still appear with a low-confidence label.
Local over-indexing
Over-index = a branch’s pressure on a title minus the average pressure across the other tracked branches that carry the same title. We compare only against branches that actually stock the book, so a title not carried elsewhere doesn’t artificially inflate local distinctiveness.
Confidence labels
Every ranking row carries a confidence label so low-copy or sparse-history records aren’t over-read:
- High — multi-copy footprint, multiple branches, repeat snapshots, clean metadata.
- Medium — at least one copy and one snapshot.
- Low — one copy / one branch, sparse snapshots, or ambiguous matching. Missing public holds alone never demote a title to low confidence.
The badge surfaces only on low-confidence rows so it reads as a flag-when-needed signal; the label is computed for every row regardless.
On the Rise
7. On the Rise (Breakout Watch)
On the Rise is a separate, rule-based layer for surfacing adult titles that show early signs of demand — before they become obvious panel-wide hits. It does not feed into the demand-pressure ranking and does not change any other score on the site. It is rule-based, not a prediction model, and not LLM-generated.
- The main demand-pressure ranking answers: what is most in demand right now?
- On the Rise answers: what appears to be gaining demand early?
A title only qualifies if it shows multiple early-demand signals, including some combination of:
- recent first-tracking by Borrowed in Brooklyn
- public aggregate holds exposed and meaningful
- carried by several tracked branches
- availability tightening across the panel
- recent cross-branch drops
- watchlist context (anticipated release, prize list, book-club pick)
“Newly discovered” means new to Borrowed in Brooklyn tracking, not necessarily newly published. Newness alone is never enough — at least one additional BPL-derived signal must be present.
Honest framing of the newness signal: in practice, most active books have been tracked for more than 30 days, since BPL’s daily popularity sort tends to re-surface the same titles and retirement is conservative. The newness signal therefore fires mostly on weekly NYT seed refreshes (Monday) and the occasional new BPL-popularity entrant. It’s functionally an “NYT-bump” and “new-on-BPL” signal in disguise — not a general “just-released” or “just-discovered” tracker.
Watchlist context is small by design: it can surface anticipated titles but cannot, on its own, push a book to the top of On the Rise. The dominant source of these seeds is the weekly NYT bestseller pull, with curator picks and prize-list selections making up the rest — so this 0–5 pt component is effectively where the NYT API touches the scoring side of the system. A book still has to earn its rank with availability, holds, breadth, or movement.
Missing public holds are never treated as zero. When holds aren’t exposed, the breakout score is normalized over the non-holds components and the row is labeled accordingly, so it stays comparable to holds-exposed titles.
Overlap with the main demand list is capped. Any title that also appears in Hardest to Get must show a fresh emerging signal to keep its slot in On the Rise; otherwise it’s excluded so the surface doesn’t just echo the main ranking.
Reading the rankings
8. How to read each ranking
Every ranked list on the site is described here in terms of what it ranks by, what it filters out, and what to read into it. Names match the in-product labels exactly.
Homepage
Hardest to Get
Borough-wide ranking by panel demand pressure (see §6). Includes only books carried by at least 2 branches OR with at least 3 total tracked copies, so single-branch / single-copy anomalies don’t lead the page. Sorted highest pressure first. Read it as: which adult titles are most squeezed right now — not raw popularity. A widely-read title that’s well-stocked everywhere won’t appear here; a less-read title that’s gone all-out across many branches will. Scarcity is what the formula measures.
Neighborhood Favorites
Ranks (book, branch) pairs by over-index score: a book’s branch pressure at one branch minus the average pressure at the other tracked branches that carry the same book. Each entry shows up at most once per branch. Read it as: “these books are unusually in demand at this neighborhood compared to where else they’re carried.”
On the Rise
Rule-based watch list; see §7 for the full qualification rules. Separate from the main demand ranking, doesn’t feed into Hardest to Get. Read it as: “what appears to be gaining demand early.”
Branch pages
Most in-demand here
Per-branch ranking by branch demand pressure at this specific branch. Includes only adult titles tracked at this branch. Sorted highest branch pressure first. Read it as: “what is hardest to get at this branch right now.” Note that a book’s position here is independent of how it ranks at other branches — branch-first intake means each branch has its own scores.
Unusually popular here
Per-branch ranking by over-index score at this branch — the same metric as Neighborhood Favorites on the homepage, but scoped to one branch. Sorted highest over-index first. A book on this list is more squeezed at this branch than at the average of the other branches that carry it; that doesn’t mean it’s squeezed everywhere, just that this neighborhood is treating it as a local standout.
Shared with other branches
Books that are tracked at this branch and carried at three or more tracked branches across the panel. Sorted by how many branches carry the book (most-shared first), then by branch pressure here. Read it as: “reading tastes this branch shares with the rest of the panel.” The complement — books carried only here, or here-plus-one — sits in Unusually popular here instead.
How {branch} compares (Most similar / Most different)
Two cards at the top of every branch page. Shows the most-similar and most-different other tracked branch by weighted overlap on adult demand pressure (see Overlap in §9 and the technical appendix). Read it as: “which branch’s reading taste is closest to this one’s, and which is furthest.”
Compare page
Branch similarity matrix
A 12×12 grid; each cell is the weighted overlap between two branches’ demand pressure across all adult titles tracked at either branch. Books with strong demand at both branches count more; books strong at only one branch lower the overlap. Recomputed live on every page load against the current scores; no cached snapshot. Brighter = more overlap.
Side-by-side comparison (when two branches are picked)
Splits adult titles into three buckets: tracked at both, tracked only at A, and tracked only at B. The headline weighted overlap percentage matches that pair’s cell in the matrix. The shared-titles list orders by the smaller of each book’s two pressure values (so books with strong demand at both branches surface first).
A few worked examples
Branch scarcity. A book with 0 copies available out of many at a branch saturates scarcity. The same book at 0 of a few lands lower. All are unavailable, but footprint weighting prevents single-copy titles from dominating the headline ranking.
Holds-adjusted ranking. When most ranked titles have a numeric holds value, a title with many holds gets a bounded boost. Titles without exposed holds aren’t treated as zero — they fall back to availability-derived scoring.
Panel-wide demand. A book unavailable at most carrying branches ranks high panel-wide — intense and broad.
Local over-indexing. A cookbook scarce at Sunset Park but available elsewhere may appear as a Sunset Park standout even if it’s not a top panel-wide title.
Confidence. A 0-of-1 title is scored lower (footprint-weighted scarcity) and labeled low confidence; a 0-of-many title across several branches earns full scarcity and high confidence.
Reading the labels
9. What the labels mean
The site uses a small, consistent vocabulary across the homepage, branch pages, the map, and tooltips. Every term defined here is also explained in the matching tooltip wherever it appears.
- Tracked here
- The number of adult titles currently being followed at this specific branch. Discovery is branch-first (see §5), so each branch has its own pool — a title counts in this branch’s number only when (1) BPL’s popularity-sorted results for this branch surfaced it, (2) the branch has at least one physical copy, (3) the branch’s tracked record for it is still active, and (4) the latest successful snapshot is within the 14-day freshness window. Branch panels typically sit in the 20–30 range — this is a high-signal sample, not the branch’s full inventory.
- Hard to find
- The count of titles tracked at this branch where the latest snapshot (within the 14-day freshness window) shows zero copies on the shelf. These are the books that are out at this particular branch right now. A high count signals a branch that’s currently squeezed; a low count means most of its tracked titles are still findable. Snapshots older than 14 days don’t count toward this — same gate as “tracked here.”
- Branch pressure (branch demand pressure)
- The 0–100 score for a single (book, branch) pair. Combines scarcity and recent movement, and folds in public holds when coverage is sufficient. Higher means the title is harder to get at that branch.
- Panel pressure (panel demand pressure)
- The 0–100 borough-wide score for a book. Aggregates branch pressure across only the branches that carry the title, multiplied by a breadth factor and topped with bounded bonuses for cross-branch shortages and regional spread. Discovery is branch-first; record matching links the same book across branches so a single panel score can be computed (see §5). Hardest to Get on the homepage ranks by this score.
- Over-index
- A branch’s pressure on a title minus the average pressure across the other tracked branches that carry the same title. Positive numbers mean the title is unusually in demand here. Neighborhood Favorites ranks by this signal.
- Overlap (between two branches)
- Weighted overlap compares branches by demand pressure across the books tracked by either branch. For each book, we take the lower and higher branch demand-pressure values across the two branches, then compute sum of shared pressure ÷ sum of combined pressure. A book under strong pressure at both branches increases overlap; a book under pressure at only one branch lowers it. If a book isn’t in one branch’s tracked pool, that side counts as no observed signal — not proof of zero real-world demand. The result reads as a percentage on the Compare matrix and the “How {branch} compares” cards.
- What this actually measures: two branches discover different books because BPL’s per-branch popularity sort surfaces different titles per branch. So branches with overlapping stocking and demand patterns— both carrying and squeezing the same titles — score high overlap. Branches with similar reader taste but different intake (one branch’s popularity sort surfaced a title, the other’s didn’t) will score lower. The metric is honest about operational similarity; it’s a proxy for taste similarity rather than a direct measurement of it.
- Public holds
- BPL’s system-wide aggregate hold count for a title — one number per work for the entire 60+ branch BPL system, not branch-level. We surface it when BPL exposes it; we never substitute zero for missing data.
- Holds-adjusted vs. availability-derived
- Each ranking section is labeled one or the other. Holds-adjusted means public holds were exposed for enough comparable titles in that ranking that they were folded in as a bounded component. Availability-derived means holds coverage was too thin, so the score uses shelf availability and movement only.
- Confidence: High / Medium / Low
- A weighting flag on every ranking row. High = multi-copy footprint, multiple branches, repeat snapshots. Low = single copy, single branch, or sparse history. Only Low is shown as a badge so it reads as a flag-when-needed signal. Missing public holds alone never demote a title to Low.
- On the Rise / Breakout Watch
- A separate, rule-based watch list of titles showing early demand signals. Does not feed into Hardest to Get or any other ranking. See §7 for what makes a title qualify.
Caveats
10. Limitations
- Availability changes can reflect checkouts, holds, transfers, reshelving, catalog syncs, item status changes, or other circulation events. We label them availability movement, not checkouts.
- Catalog metadata is occasionally inconsistent.
- Edition matching is imperfect; we use BPL record IDs first, then ISBN, then title plus author.
- Some public hold counts may be unavailable on a given snapshot. Holds are record-level (system-wide), not branch-level — we never sum them across branches.
- The sample is intentionally limited to 12 branches.
- No patron records are accessed.
Sources
- Brooklyn Public Library public discovery catalog — availability, copy counts, and (when exposed) public aggregate holds. The site does not access patron records or private hold queues.
- The New York Times Best Sellers API — pulled weekly for the watchlist lane (see §5). Used to widen what the site checks in BPL beyond BPL’s own popularity sort. Inclusion on a NYT list does not, by itself, lift a book in any ranking.
Inspired by Library Spy’s public-availability methodology, adapted for Brooklyn Public Library and branch-first cross-branch comparison.
Technical details
11. Technical details
The site’s public methodology above is the primary explainer. The collapsed sections below give the formula shapes, component caps, and confidence rules for readers who want them. Operational details (refresh schedules, internal data structures, admin surfaces) are not included.
Show branch demand pressure formulas
Availability-derived mode (default)
Used when fewer than 70% of comparable books in the ranking context have an exposed numeric holds value (or, once we’re in holds-adjusted mode, when coverage slips below 60% — the 60/70 hysteresis prevents oscillation between modes when coverage hovers near the threshold):
availability_ratio = available_copies / total_copies footprint_factor = 0.5 + 0.5 × log(1 + total_copies) / log(13) (1 copy → ~0.64, 4 copies → ~0.81, 12 copies → 1.00) scarcity_component = 80 × footprint_factor if available_copies = 0 round(80 × (1 − availability_ratio) × footprint_factor) otherwise (clamped 0–80) movement_component = min(20, 8 × drops_24h + 4 × max(0, drops_7d − drops_24h)) (clamped 0–20) branch_demand_pressure = scarcity_component + movement_component (0–100)
The footprint factor separates 0/12 from 0/1: both are unavailable, but a single-copy stockout is a noisier signal than a many-copy title with no shelf-ready copies anywhere.
About the movement component: this is a 2-bucket exponential decay — drops in the last 24 hours weighted at 8, drops 1–6 days ago weighted at 4. Under the once-a-day scrape schedule, “drops_24h” resolves to 0 or 1 on most days because there’s only one snapshot per day. A finer per-day decay would only add real signal if the panel scraped multiple times per day; the current 2:1 weight ratio is approximately a 3-day half-life — close enough to a continuous decay that the score difference is negligible.
Holds-adjusted mode
Used when at least 70% of comparable books have an exposed holds value. Scarcity drops to a 65 cap, movement to 15, and a 0–20 holds component is added:
scarcity_component = same shape (footprint-weighted), capped at 65 movement_component = min(15, 6 × drops_24h + 3 × max(0, drops_7d − drops_24h)) holds_component = min(20, 20 × log(1 + holds) / log(1 + 2000)) branch_demand_pressure = scarcity_component + movement_component + holds_component (0–100)
A title counts as “high demand” at a branch when its branch pressure is at least 60. This threshold powers the broadest-demand ranking and several editorial signals. (The Compare-page similarity matrix uses weighted overlap over the continuous pressure values directly — no threshold involved. See §9.)
Show panel demand pressure formula
average_branch_pressure = average(branch_demand_pressure across branches that carry the title) breadth_multiplier = 1 + log(1 + branches_carrying) / log(13) (~1 → ~2) all_out_bonus = min(20, 2 × branches_with_zero_available) regional_spread_bonus = min(12, 3 × regions_represented) panel_holds_component_when_applicable = min(20, 20 × log(1 + holds) / log(1 + 2000)) (only in holds-adjusted mode) panel_demand_pressure = average_branch_pressure × breadth_multiplier + all_out_bonus + regional_spread_bonus + panel_holds_component_when_applicable # v2.3 included a bpl_popularity_component term here. v2.4 removed it # — the popularity signal is the discovery lane, not a ranking weight. # See the prose above for the rationale.
Panel rankings require a minimum number of carrying branches and total tracked copies; sparser items can still appear with a low-confidence label.
Show On the Rise score shape
On the Rise is rescaled to 0–100 from the sum of bounded components below. A title must satisfy at least two early-demand signals to qualify, and watchlist context alone cannot float a book to the top.
breakout_score (0–100, rescaled from raw component sum) =
newness_component (0–15)
+ public_holds_component (0–25, log-scaled, 0 when not exposed)
+ branch_adoption_component (0–20)
+ availability_pressure_component (0–10)
+ recent_movement_component (0–15)
+ watchlist_context_component (0–5, watchlist titles only)When holds aren’t exposed, the score is normalized over the non-holds components so it stays comparable. Overlap with the main demand list is capped per day, and overlapping titles must show a fresh emerging signal.
Show branch similarity formula
The Compare-page matrix and the “Most similar / Most different” cards use weighted Jaccard over the continuous branch_demand_pressure values (no threshold, no top-K cutoff).
weighted_overlap(A, B) =
sum_{book in A ∪ B} min(pressure_A[book], pressure_B[book])
/ sum_{book in A ∪ B} max(pressure_A[book], pressure_B[book])
where pressure_X[book] = 0 if book is not in branch X's tracked pool.A book in only one branch’s pool contributes 0 to the numerator and that branch’s pressure to the denominator — so asymmetric tracking lowers the score, but the magnitude penalty is proportional to how strong that one-sided pressure is. Result is in [0, 1] and renders as a percentage.
Show confidence rules
- High — multi-copy footprint, multiple branches, repeat snapshots, clean metadata.
- Medium — at least one copy and one snapshot.
- Low — one copy / one branch, sparse snapshots, or ambiguous matching. Missing public holds alone never demote a title to low confidence.
The badge surfaces only on low-confidence rows; the label is computed and stored for every row regardless.
Why scores may change
- New snapshots, new candidates, or new movement events.
- Record-matching corrections from a re-discovery pass.
- Scoring model updates.
- Changes in holds coverage that flip a ranking between availability-derived and holds-adjusted modes.