Warning
These personas and interviews are synthetic. They were generated as a
structured brainstorming device — not conducted with real people. No real
reader, contributor, data steward, or author said any of this. The panel exists
to pressure-test the product from many angles at once; it is not evidence of
demand and does not substitute for real discovery. Treat every "quote" as a
hypothesis to validate, not a finding. (Consistent with how this project labels
its synthetic eval fixtures — see audits/source-ethics.md.)
The honest next step is real conversations with people in ≥5 of these roles —
especially the data stewards (Open Library / Bookwyrm) whose terms this tool
depends on, and the review-gated sign-offs (privacy, representation, screen
reader) the audits list as pending first release.
A consent-based, task-oriented protocol is now recruitment-ready in
research/real-user-study-plan.md.
It remains explicitly planned, not completed, until real participants take
part and the de-identified findings are synthesized.
Last assembled: 2026-06-30.
Queer the Stacks is a single-user, self-hosted app, so the "user" is mostly one person (Chelsea). But the stakeholders are not: the tool reads from other people's catalogs (Open Library, Bookwyrm, Hardcover), surfaces other people's books (small-press and indie authors), and would be deployed and audited by people who are not Chelsea. Role-playing the full cast surfaces obligations a single author misses — especially the ones that are ethical or legal, not just features. Findings at the end are tagged so this doesn't become a wishlist:
- [shipped] — already exists in the M0–M6 + N1–N6 build.
- [pending] — a review-gated sign-off the audits already name but haven't signed.
- [roadmap] — already in
ROADMAP.md/ROADMAP-FUTURE.md. - [NET-NEW] — genuinely surfaced here.
Each card is the simulated interview compressed to five lines — Goal · What they'd value today (mapped to real, shipped features) · Where they'd get stuck · What they'd want next · The one thing that makes them adopt (or walk).
- Sampling frame. Not "users" but stakeholders around a private reading tool: people who read & discover (the owner; a queer/trans reader; an assistive-tech user), people who self-host & operate (a privacy-conscious self-hoster; a homelab tinkerer who'd deploy it; the maintainer), people whose catalogs the tool sources from and whose terms it must respect (an Open Library / open-data steward; a Bookwyrm instance admin; a small-press author whose book gets surfaced), people who assure & audit (an ML/recommender-fairness reviewer; a responsible-tech reviewer doing the human sign-offs), and people who'd extend or share it (an OSS contributor; a Fediverse/Bookwyrm mutual on the receiving end of a share card).
- Protocol. For each: a goal, a walkthrough of the surfaces or guarantees they'd
touch, what holds up against the current build, where they'd stall, and an open
"what would make this a 10/10" prompt. Frictions become Remediations; wishes
become Expansions in
RESEARCH-ROADMAP.md. - Effort scale (used in the roadmap). S ≈ an afternoon · M ≈ a day or two · L ≈ a week+.
The panel is grounded in the public record on the ebook self-hosting ecosystem, the Goodreads-alternative landscape, book-data licensing, recommender bias, and reading privacy. High-stakes claims are cross-checked against ≥2 sources. Accessed 2026-06-30.
- Goodreads' enclosure is real, not rhetoric. Goodreads (Amazon-owned since 2013) stopped issuing new API keys on 2020-12-08 and disabled many existing ones, retiring developer access entirely and breaking open-source apps built on it — corroborated by Slashdot, Goodreads' own help article, and a developer post-mortem. This is the factual backbone of the project's "no Goodreads" guardrail.
- The ethical-alternative landscape exists and is values-aligned. The StoryGraph (independent, Black-owned, Amazon-free), Hardcover (small team, no venture capital, ad-free, reader-funded), and Bookwyrm (federated, community-run) are the recognized non-gatekept options; see also a survey of ethical trackers. This tool sources from Open Library / Hardcover / Bookwyrm — not from these as competitors, but as the same values commitment.
- Licensing differs by source and must be honored per source. Open Library data is dedicated to the public domain under CC0 (attribution appreciated, not required) per Creative Commons; Hardcover's API is a free GraphQL endpoint that is "heavily in flux," gated by a personal token, and restricted to localhost/server use; Bookwyrm is ActivityPub-federated with per-instance terms. A single "ethical sources" line under-describes three different obligations.
- The self-hosting stack is real and read-only-friendly. Calibre-Web (GPL-3.0, OPDS) is the established self-hosted Calibre frontend; the KOReader sync server is self-hostable and keys progress by a per-document MD5 — matching ADR-2's md5 progress key. Server-side statistics sync is still a developing upstream feature, which bounds what cross-device stats can promise today.
- Mainstream book recommenders are measurably biased against the long tail. Naghiaei et al. find most state-of-the-art algorithms "suffer from popularity bias in the book domain, and fail to meet users' expectations with Niche and Diverse tastes" while "Bestseller-focused users… receive high-quality recommendations" (arXiv 2202.13446); a 2025 survey reaches the same conclusion about long-tail fairness (MDPI Information); and a RecSys-2025 study shows thematic/genre bias specifically disadvantages "users with niche and long-tail interests" (arXiv 2508.15643). This is exactly the gap the content-beats-popularity eval targets.
- Algorithmic systems under-surface and mis-handle LGBTQ+ cultural content. GLAAD documents recommendation/moderation harms to LGBTQ+ content (2026 AI report); scholarship on discoverability finds algorithms privilege "English-language… content produced by large global corporations" (Paquette, 2025).
- Identity labels on books can harm the people behind them. We Need Diverse Books retired #OwnVoices in June 2021 because it was "vague and has been misused to gate-keep identities and invade authors' privacy," and now uses "the specific descriptions that authors use for themselves" (Book Riot); the label was warped into pressure to out authors (Bitch Media). This is the evidence behind "describe books via sourced tags; never auto-label authors."
- A queer/trans reading history is genuinely sensitive. In 2025 the ALA logged 4,235 unique titles challenged (its second-highest ever), ~40% representing the lived experiences of LGBTQIA+ people and people of color, with 92% of challenges driven by pressure groups and officials — Gender Queer and Last Night at the Telegraph Club among the most targeted (ALA, 2026; ALA data; NYPL). This is why local-only, no-egress, behind-auth isn't paranoia — it's the threat model.
- Charts must ship table equivalents to be accessible. Complex visualizations
need a text summary plus a structured data table; color must never be the only
channel (TPGi;
USWDS) —
exactly the contract
make a11yalready enforces.
| # | Persona | Group | Primary goal | Top friction |
|---|---|---|---|---|
| A1 | Chelsea — primary reader & owner | Read & Discover | See all my reading in one private place; get recs that fit my canon | Build is demo-driven; not yet pointed at her real library |
| A2 | River — queer/trans reader, anti-essentialist | Read & Discover | Representation analytics that describe books, never label me or authors | Wants to see where each descriptor came from, and hide sensitive ones |
| A3 | Mara — low-vision dashboard user (magnifier + screen reader) | Read & Discover | Read the dashboard, stats, and Wrapped non-visually | Automated a11y passes, but no human SR walkthrough is signed off |
| B1 | Sam — privacy-conscious self-hoster | Self-Host & Operate | Prove reading data never leaves the box | Wants the no-egress claim demonstrable, not just asserted |
| B2 | Devon — homelab tinkerer / would-be deployer | Self-Host & Operate | Stand it up next to Calibre-Web on a seedbox in an evening | First-run is demo-shaped; real-library config path is new (N1) |
| B3 | Chelsea (ops hat) — owner / maintainer | Self-Host & Operate | Keep it running, backed up, and resilient to schema drift | Perf/reliability gates are deferred, not yet merge-blocking |
| C1 | Lior — Open Library / open-data steward | Source Ethically | See the project honor CC0 + rate limits + provenance | One "ethical sources" line flattens three different obligations |
| C2 | Petra — Bookwyrm instance admin | Source Ethically | Confirm federation etiquette: robots, rate limits, per-instance ToS | No public statement of how the tool treats her instance's terms |
| C3 | Tomás — small-press / indie author | Source Ethically | Be surfaced fairly, with no misattributed identity label | No path to confirm provenance or correct/opt-out |
| D1 | Dr. Ada — recommender / ML-fairness reviewer | Assure & Audit | Verify it beats popularity fairly, not just on one metric | Eval is Precision/Recall@5 only; no nDCG/diversity/temporal split |
| D2 | Noor — responsible-tech reviewer (human sign-off) | Assure & Audit | Sign the privacy + representation + SR reviews honestly | Those sign-offs are listed "pending," with no committed artifact |
| E1 | Robin — OSS contributor | Community / Expand | Add a new ethical catalog adapter and get it merged | No documented adapter contract / conformance test |
| E2 | Jules — Fediverse / Bookwyrm mutual | Community / Expand | Enjoy Chelsea's shared Wrapped/finish cards without surveillance | Share cards may lack alt text; wants the "no auto-egress" guarantee visible |
- Goal: one private place that shows what she's reading across Calibre, KOReader, Calibre-Web, and Readest — plus recs that fit Plett/Peters/Thom/Butler/Atwood.
- Values today: the unified cross-device "currently reading" + history; reading stats, streaks, and the self-hosted Wrapped; the hybrid recommender with why + source on every card; diverse-shelf analytics built only from sourced descriptors; local goals; locally-composed share cards that egress nothing until she copies them. (this is the whole product thesis)
- Gets stuck: the shipped build is demo-driven — it proves the gates but isn't
yet pointed at her real
metadata.db/statistics.sqlite;stacks doctor/refresh(N1) exist but the real-library first run hasn't happened. - Wants next: point it at the real library with a "data as of …" freshness stamp; a real (still-local) embedding model behind the existing flag; more read-only sources (Readest, Kobo, Calibre-Web read-state); series/TBR depth.
- Adopts if: the real library lights up the dashboard without touching the sources. Walks if: it stays a demo she has to babysit.
- Goal: understand the shape of their reading ("how queer/trans/spec-fic is my shelf?") without the tool putting an identity label on them or on any author.
- Values today: diverse-shelf analytics that are, by construction, sourced:
ThemeTagcannot be built without aSource(a Calibre tag, OL subject, or curated list), andAuthorhas no gender/sexuality/identity field — so there is literally nowhere to auto-assign one. Chart + table equivalents; tags shown as text, never color-only. (directly answers the #OwnVoices outing harm) - Gets stuck: can see that a book is tagged "trans" but not where the tag came from or how confident it is; worries a sensitive descriptor could be visible on a shared card.
- Wants next: provenance on every descriptor ("from Open Library subject / curated list X, retrieved 2026-…"); the option to aggregate or hide sensitive descriptors; an aperture lens that boosts (never penalizes) underread/own-voices/translated work with "unknown" staying first-class.
- Adopts if: the analytics describe books, cite sources, and never essentialize. Walks if: it ever infers a person's identity from a name, cover, or model.
- Goal: read the dashboard, stats, and Wrapped entirely non-visually / at 200% zoom.
- Values today: the mechanically verified a11y contract — one
<h1>, landmarks- skip link, every chart shipped with a real
<table>equivalent, theme/progress conveyed as text (a#glyph + label) not color,prefers-reduced-motionrespected, 0 axe violations viamake a11y. (matches WCAG complex-image guidance)
- skip link, every chart shipped with a real
- Gets stuck: the audit itself flags that the manual passes are not yet signed off — no real VoiceOver/NVDA walkthrough, no human 200%-zoom or forced-colors walkthrough, and streamed/interactive updates aren't SR-audited.
- Wants next: a committed, dated SR-walkthrough artifact; a published live a11y report; and — when share cards exist — alt text baked into the card image so it's accessible after it leaves the app.
- Adopts if: a human like her has actually driven it end-to-end and signed it. Walks if: "0 violations" is the only evidence and the lived path breaks.
- Goal: be convinced a queer/trans reading history can't leak off the box.
- Values today: auth fails closed (401 without a valid token; even demo needs one); network is confined to two clients (the user's own kosync server + GET-only public catalog metadata) and never POSTs reading history; no analytics/telemetry SDK in core; a log-safety lint keeps reading content out of logs — all merge-blocking tests, not promises. (the threat model the book-ban data justifies)
- Gets stuck: wants the guarantee legible from outside the test suite — a plain data-flow he can read, and assurance the catalog lookups can't fingerprint him.
- Wants next: a committed dated privacy review sign-off (the audit lists it
"pending"); a one-page egress diagram; per-source notes on what each catalog call
reveals;
security.txt+ auth rate-limiting. - Adopts if: "nothing sensitive leaves" is demonstrable. Walks if: any reading data, even derived, touches a third party.
- Goal: run it next to Calibre-Web on a seedbox in one evening, read-only against the real libraries.
- Values today: the container +
docker-compose.ymlthat mounts the real libraries:ro(kernel-level belt-and-braces over the in-code snapshot);stacks doctorto validate paths and confirm read-only access; config via env orstacks.toml; the documented quickstart. (mirrors the established Calibre-Web/ KOReader-sync self-hosting pattern) - Gets stuck: the build is demo-shaped, so the real first run (paths, kosync key from env, storage dir, detected schema versions) is the newest, least-trodden path; reverse-proxy/auth wiring is documented but unverified by a stranger.
- Wants next: a one-command compose + reverse-proxy/auth recipe; OIDC/forward-auth upgrade path; backups/restore drill; a schema-drift CI matrix so a different Calibre/KOReader version still ingests.
- Adopts if: a clean box reaches a working, authed dashboard in <30 min. Walks if: first-run requires reverse-engineering env vars.
- Goal: keep it running, backed up, and resilient as Calibre/KOReader schemas drift.
- Values today: persisted derived state with
stacks refresh(ingest only if source mtime changed) + freshness stamp;stacks backup/restore; restart-recovery and "kosync down → degrade to KOReader-only" reliability tests; versioned, fixture-tested parsers;pip-audit= 0 vulns on the Python 3.14 floor. - Gets stuck: performance (k6/Lighthouse p95) and some reliability gates are
deferred, not yet merge-blocking; live-path clients (
KosyncClient,OpenLibraryClient) arepragma: no cover, so real response-shape drift isn't caught in CI. - Wants next: promote perf + reliability to merge-blocking; recorded-cassette contract tests for the live clients; TestClient route coverage; a dated schema-drift matrix.
- Adopts if: an unattended seedbox stays correct across restarts and upgrades. Walks if: a silent schema change corrupts ingest.
- Goal: see a downstream project use Open Library data respectfully — within CC0, with rate-limit discipline and provenance.
- Values today: Open Library is on the hard allowlist;
assert_allowed()is default-deny; the recommender's single network choke point only GETs public metadata;docs/ethical-book-data-sources.mdis generated fromrecommender/sources.py(one source of truth) and documents why each catalog is used. (CC0 = public-domain dedication, attribution appreciated) - Gets stuck: the sources doc is terse — it doesn't spell out CC0 vs ODbL nuance, caching/rate-limit behavior, or robots respect, so a steward can't tell at a glance that the project is a good consumer.
- Wants next: a per-source compliance card: license (CC0 here), attribution
posture, cache + rate-limit policy,
retrieved_atprovenance on every field, and a contact. Credit Open Library/Internet Archive even though CC0 doesn't require it. - Adopts (endorses) if: the project is visibly a careful, low-impact consumer. Walks if: it hammers the API or strips provenance.
- Goal: make sure federated reads honor her instance's terms, robots, and rate limits — Bookwyrm terms are per-instance, not global.
- Values today: Bookwyrm is allowlisted as federated with "per-instance terms; honor robots + rate limits" already written into the sources table; the tool is read-only and posts nothing back; share cards are composed locally and only posted when Chelsea manually copies them (no auto-federation). (matches ActivityPub federation norms)
- Gets stuck: there's no explicit, public statement of how the tool decides an instance is fair game, how it backs off, or how it caches — so an admin has to take it on faith.
- Wants next: documented federation etiquette (User-Agent, robots, backoff, per-instance opt-out); pull only public list/metadata, never private activity; cache aggressively to minimize hits.
- Adopts if: her instance is treated as a guest treats a host. Walks if: it scrapes federated data as if it were a central API.
- Goal: have his work discovered fairly, with no identity label pinned on him that he didn't choose.
- Values today: the whole design is built so recommendations widen past
bestseller bias toward small-press/own-voices/translated work (the eval deliberately
hides on-canon picks among more-popular distractors and recovers them); books are
described by sourced tags, and
Authorcarries only a name + sort key — so the tool cannot auto-assign him a gender/sexuality. (directly answers the #OwnVoices outing harm and long-tail under-surfacing) - Gets stuck: he has no way to see what provenance/tags attach to his book, or to correct a wrong tag or ask not to be surfaced.
- Wants next: a lightweight author feedback/correction path; visible provenance per book; a guarantee that any descriptor traces to a source he or a catalog set, never an inference.
- Adopts if: he's surfaced accurately and never mislabeled. Walks if: a model ever guesses his identity from his name or cover.
- Goal: confirm the recommender beats the popularity baseline fairly, not by cherry-picked metrics or leakage.
- Values today: a deterministic, seeded recommender; an eval that shows the content
model (themes + authors + curated lists) at Precision@5 / Recall@5 / MAP@5 = 1.00 vs
a popularity baseline at 0.40 / 0.40 / 0.13, regenerated into
eval-report.json; 100% of recs carry why + source; the aperture lens is boost-only and "unknown" is never penalized. (targets the documented popularity/thematic bias) - Gets stuck: the eval is small and Precision/Recall/MAP@5-only — no nDCG, catalog coverage, intra-list diversity, or temporal hold-out on real finishes; a perfect 1.00 on a tiny fixture invites "it's a toy benchmark."
- Wants next: richer ranking + diversity metrics, a temporal split on actual reads, metric-drift tracking across runs, and a published fairness/diversity card so the "beats popularity fairly" claim is legible.
- Adopts if: the win survives diversity-aware, temporally honest evaluation. Walks if: the headline is one inflated number on synthetic data.
- Goal: honestly sign the privacy, representation, and screen-reader reviews that the audits gate the first release on.
- Values today: the auto-gated half is genuinely strong — no-egress, sourced-tags, auth, and axe checks are all merge-blocking with named tests; the responsible-tech framework cleanly separates auto-gated from review-gated.
- Gets stuck: all three human sign-offs are explicitly "pending first release" with no committed artifact — so right now there's a gate with nothing behind it.
- Wants next: dated, committed sign-off artifacts under
docs/audits/for the privacy review, the representation review, and the SR walkthrough; a short "what wasn't reviewed" note in each. - Adopts if: every review-gated claim has a signed, dated artifact. Walks if: "pending" silently becomes "done" at release without the walkthroughs.
- Goal: add a new ethical catalog adapter (or a curated-list importer) and get it merged without weakening the guardrails.
- Values today: clear architecture (
ingest/·recommender/·app/); a single network choke point with a default-deny allowlist; a generated sources doc; greenmake verify(lint,mypy --strict, ~167 tests @ ~96%, a11y, eval) as a contract. - Gets stuck: there's no documented adapter contract or conformance test, so a new source could drift from the provenance/allowlist/sourced-tags invariants; unsure how to add a source without tripping the no-egress test.
- Wants next: a published adapter/plugin contract + conformance suite (allowlist
honored, provenance attached,
ThemeTagsourced, no egress of reading data); a "add an ethical source" guide; good-first-issues. - Adopts if: their first adapter PR is mergeable in a day and can't violate an invariant. Walks if: contributing risks silently breaking a guardrail.
- Goal: enjoy Chelsea's shared "year in books" / finished-book cards on Bookwyrm or Mastodon — without being surveilled or fed an ad.
- Values today: share cards are composed locally and posted only when Chelsea copies and shares them — no auto-egress, no tracking pixel, no follower-graph scraping; nothing about Jules is ingested. (values-aligned with federated, no-ad Bookwyrm norms)
- Gets stuck: a card posted as an image may lack alt text (excludes blind mutuals); and the "this didn't phone home" guarantee isn't visible to the recipient.
- Wants next: alt text + a text equivalent baked into every generated card; an optional plain-text version; a one-line "composed locally, shared manually" footer so the no-surveillance property is legible to followers.
- Adopts (engages) if: the cards are accessible and demonstrably egress-free. Walks if: a "share" quietly turns into auto-posting or tracking.
- The guardrails are the product, and they hold — but the human sign-offs are empty. Sam (privacy), Mara (SR), Noor (all three), and River (representation) all independently land on the same thing: the auto-gated tests are excellent, yet the three review-gated sign-offs the audits themselves name are still "pending." That's the single highest-trust, lowest-effort gap. [pending]
- "Demo works" ≠ "runs on the real library." Chelsea, Devon, and Chelsea-ops all
hit the demo→real gap. N1 (
stacks doctor/refresh, freshness stamp) is built but the first real run, and a stranger's first deploy, are the least-trodden paths. [roadmap N1] - Provenance wants to be visible, not just enforced. River, Tomás, Lior, and
Petra each ask the same question from a different seat: where did this come from?
The invariant exists in code (
ThemeTagneeds aSource;assert_allowedis default-deny) — but it isn't surfaced in the UI or to the catalogs/authors involved. Surfacing provenance is cheap and serves four personas at once. [NET-NEW UI; corroborates source-ethics] - Sources are three obligations, not one. Lior (CC0, attribution-appreciated), Petra (per-instance ToS + federation etiquette), and the Hardcover constraint (token-gated, localhost-only, "in flux") mean the single "ethical sources" line under-serves the stewards the tool depends on. A per-source compliance card fixes it. [NET-NEW; corroborates ROADMAP-FUTURE C2]
- The fairness claim is real but thinly evidenced. Ada wants the popularity-beating result shown fairly — nDCG, diversity, a temporal split — which is exactly the "richer eval" already on the future roadmap. The research backs the need: book recommenders measurably under-serve niche/diverse/thematic tastes. [roadmap B5]
- Accessibility has to survive leaving the app. Mara and Jules note the dashboard's a11y contract is strong inside the app, but a shared card is an image that escapes it — alt text must travel with the card. [NET-NEW]
This is simulated. It can generate plausible obligations and obvious gaps, but it cannot tell you which matter most to the real people behind the catalogs, which self-hosters would actually deploy it, or how an Open Library / Bookwyrm steward would really feel about being consumed. Because the product is single-user, the panel leans heavily on the author's own mental model and on stakeholders who would never file an issue — so it over-weights what is legible from the repo and under-weights what only a real steward, author, or assistive-tech user would surprise you with. Do not prioritize off this alone. Use it to design the questions for — and lower the cost of — real conversations, especially with the data stewards and the review-gated sign-offs.
The triaged remediation/expansion backlog, sequencing, first sprint, and traceability
matrix live in RESEARCH-ROADMAP.md.