forked from ChelseaKR/queer-the-stacks
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdashboard.html
More file actions
208 lines (208 loc) · 36.5 KB
/
Copy pathdashboard.html
File metadata and controls
208 lines (208 loc) · 36.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Queer the Stacks — your reading dashboard</title><style>
:root {
color-scheme: light dark;
--paper: #fdf6fb;
--wash: #f2e5f0;
--plum: #7a2e63;
--plum-dark: #542044;
--ink: #241c22;
--muted: #665660;
--line: #d8bfd1;
--white: #fffafd;
--display: Georgia, "Times New Roman", serif;
--body: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
--utility: ui-monospace, "SFMono-Regular", Consolas, monospace;
}
* { box-sizing: border-box; }
html { color: var(--ink); background: var(--paper); scroll-behavior: smooth; }
body {
position: relative;
margin: 0;
color: var(--ink);
background-color: var(--paper);
font-family: var(--body);
font-size: 1rem;
line-height: 1.6;
}
body::before {
position: fixed;
z-index: 8;
inset: 0 auto 0 0;
width: .35rem;
background: var(--plum);
content: "";
pointer-events: none;
}
body > header, body > nav, main { width: min(72rem, calc(100% - 2rem)); margin-inline: auto; }
body > header { padding: clamp(2.5rem, 7vw, 6rem) 0 1.75rem; }
.kicker, .eyebrow, .shelfmark, summary, caption {
font-family: var(--utility);
font-size: .78rem;
letter-spacing: .08em;
text-transform: uppercase;
}
.kicker { color: var(--plum); font-weight: 750; margin: 0 0 .75rem; }
h1, h2, h3, h4, p { margin-top: 0; }
h1 {
max-width: 12ch;
margin-bottom: .75rem;
font: 700 clamp(2.7rem, 9vw, 6.6rem)/.92 var(--display);
letter-spacing: -.055em;
color: var(--plum-dark);
}
h2 { font: 700 clamp(1.65rem, 4vw, 2.5rem)/1.08 var(--display); color: var(--plum-dark); }
h3 { font: 700 1.22rem/1.25 var(--display); margin-bottom: .3rem; }
h4 { margin-bottom: .25rem; }
.intro { max-width: 62ch; font-size: 1.08rem; color: var(--muted); }
a { color: var(--plum-dark); text-underline-offset: .18em; }
a:hover { text-decoration-thickness: .16em; }
a:focus-visible, input:focus-visible, button:focus-visible, summary:focus-visible {
outline: .2rem solid var(--plum);
outline-offset: .2rem;
}
.skip { position: fixed; z-index: 10; left: 1rem; top: -6rem; padding: .75rem 1rem;
background: var(--ink); color: var(--white); }
.skip:focus { top: 1rem; }
.section-nav {
position: sticky;
z-index: 5;
top: 0;
padding: .5rem 0;
background-color: var(--paper);
border-block: 1px solid var(--line);
}
.section-nav ul {
display: flex; gap: .35rem; margin: 0; padding: 0; list-style: none; overflow-x: auto;
}
.section-nav a {
display: inline-flex; align-items: center; min-height: 44px; padding: .45rem .8rem;
border-radius: 999px; white-space: nowrap; font-weight: 700; text-decoration: none;
}
.section-nav a:hover { background: var(--wash); }
main { padding: 2.5rem 0 5rem; }
.home-section { padding: clamp(2.5rem, 7vw, 5.5rem) 0; border-bottom: 1px solid var(--line); }
.section-heading { display: grid; grid-template-columns: minmax(0, 1fr) minmax(14rem, 28rem);
gap: 1rem 3rem; align-items: end; margin-bottom: 1.5rem; }
.section-heading > * { margin-bottom: 0; }
.section-heading p { color: var(--muted); }
ul.books { display: grid; gap: 1rem; padding: 0; list-style: none; }
.reading {
display: grid;
grid-template-columns: 3.25rem minmax(0, 1fr);
min-height: 10rem;
overflow: hidden;
border: 1px solid var(--line);
border-radius: .7rem;
background: var(--white);
box-shadow: 0 .3rem 1.2rem rgb(84 32 68 / .07);
}
.shelfmark {
display: flex; justify-content: center; padding: 1rem .3rem;
color: var(--white); background: var(--plum);
}
.shelfmark span { writing-mode: vertical-rl; transform: rotate(180deg); }
.reading-copy { min-width: 0; padding: 1.15rem clamp(1rem, 3vw, 1.6rem); }
.byline, .progress-label, .themes, .summary { color: var(--muted); }
.byline, .progress-label { margin-bottom: .45rem; }
progress {
display: block; width: 100%; height: .55rem; margin: .85rem 0 1rem;
border: 0; border-radius: 999px; overflow: hidden; background: var(--wash);
}
progress::-webkit-progress-bar { background: var(--wash); }
progress::-webkit-progress-value { background: var(--plum); }
progress::-moz-progress-bar { background: var(--plum); }
.tag { display: inline-block; margin: .2rem .15rem .2rem 0; padding: .08rem .5rem;
border: 1px solid var(--line); border-radius: 999px; color: var(--plum-dark);
background: var(--paper); white-space: nowrap; }
.tag::before { content: "# "; }
.recommendation-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; }
.card {
min-width: 0;
padding: clamp(1.2rem, 3vw, 1.8rem);
border: 1px solid var(--line);
border-radius: .7rem;
background: var(--white);
}
.card a, .card li, .local-citation { overflow-wrap: anywhere; }
.card h3 { padding-right: 2rem; }
.score { display: inline-block; padding: .15rem .55rem; border-radius: .25rem;
color: var(--white); background: var(--plum); font-family: var(--utility); font-size: .82rem; }
.card ul { padding-left: 1.2rem; }
.next-shelves { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-top: 1.5rem; }
.shelf-block { min-width: 0; padding: 1rem; overflow-x: auto; border: 1px solid var(--line);
border-radius: .7rem; }
.disclosures { display: grid; gap: .75rem; }
details { border: 1px solid var(--line); border-radius: .7rem; background: var(--white); }
summary {
min-height: 44px; padding: 1rem 1.2rem; color: var(--plum-dark);
cursor: pointer; font-weight: 750;
}
.details-inner { padding: .4rem 1.2rem 1.5rem; overflow-x: auto; }
.details-inner > :first-child { margin-top: .5rem; }
.browse-form {
display: flex; align-items: end; gap: .65rem; max-width: 45rem; margin-bottom: 1.5rem;
padding: 1rem; border-radius: .7rem; background: var(--wash);
}
.browse-form label { display: grid; flex: 1; gap: .25rem; font-weight: 700; }
input, button {
min-height: 44px; border: 1px solid var(--plum); border-radius: .4rem;
font: inherit;
}
input { width: 100%; padding: .55rem .7rem; color: var(--ink); background: var(--white); }
button { padding: .55rem 1rem; color: var(--white); background: var(--plum); font-weight: 750; }
.table-wrap { width: 100%; overflow-x: auto; margin: .75rem 0 1.5rem; }
table {
width: 100%; max-width: 100%; border-collapse: collapse; color: var(--ink);
background-color: var(--white);
}
caption {
padding: .5rem 0; color: var(--muted); text-align: left;
text-transform: none; letter-spacing: 0;
}
th, td {
padding: .65rem .75rem; border-bottom: 1px solid var(--line);
text-align: left; vertical-align: top; overflow-wrap: anywhere;
}
thead th { color: var(--plum-dark); background: var(--wash); }
/* `.absence-note` marks "nothing measured this", distinct from `.status-note`'s
"this is stale" — same visual weight, because both are the page declining to
let a reader believe something it cannot support. */
.lens-warning, .status-note, .fixture-note, .absence-note { padding: .75rem 1rem;
border-left: .3rem solid var(--plum); background: var(--wash); }
@media (max-width: 48rem) {
.section-heading, .recommendation-grid, .next-shelves {
grid-template-columns: minmax(0, 1fr);
}
.section-nav ul { flex-wrap: wrap; overflow-x: visible; }
.browse-form { align-items: stretch; flex-direction: column; }
.browse-form button { width: 100%; }
}
@media (max-width: 24rem) {
body > header, body > nav, main { width: min(100% - 1rem, 72rem); }
.reading { grid-template-columns: 2.5rem minmax(0, 1fr); }
.reading-copy, .card, .details-inner { padding-inline: .8rem; }
th, td { padding: .55rem; }
}
@media (prefers-color-scheme: dark) {
:root {
--paper: #18121a;
--wash: #2b1d29;
--plum: #dfa0c8;
--plum-dark: #f4cce5;
--ink: #fff7fc;
--muted: #dfcbd8;
--line: #69475f;
--white: #211821;
}
}
@media (forced-colors: active) {
body::before { background: Highlight; }
a:focus-visible, input:focus-visible, button:focus-visible, summary:focus-visible {
outline-color: Highlight;
}
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
*, *::before, *::after { animation: none !important; transition: none !important; }
}
</style></head><body><a class="skip" href="#main">Skip to your reading dashboard</a><header><p class="kicker">Private circulation desk · demo</p><h1>Queer the Stacks</h1><p class="intro">Your private reading dashboard, demo — unified read-only from Calibre and KOReader, with recommendations from ethical, non-gatekept catalogs. Reading data never leaves this instance.</p><p class="fixture-note" role="alert">These are fixture books from the built-in demo world, not your library. Everything below — the shelves, stats, Wrapped, and diversity report — describes the demo world. Run stacks refresh without STACKS_DEMO=1 to ingest your own libraries.</p></header><nav class="section-nav" aria-label="Dashboard sections"><ul><li><a href="#continue">Continue</a></li><li><a href="#next">Next</a></li><li><a href="#finished">Finished</a></li><li><a href="#browse">Browse</a></li><li><a href="#record">Reading record</a></li></ul></nav><main id="main"><section id="continue" class="home-section"><div class="section-heading"><h2>Continue reading</h2><p>Books checked out to you now, joined across Calibre and KOReader.</p></div><p class="eyebrow">Currently reading</p><ul class="books"><li class="reading"><div class="shelfmark" aria-hidden="true"><span>IN CIRCULATION</span></div><div class="reading-copy"><h3>Stone Butch Blues</h3><p class="byline">by Leslie Feinberg</p><p class="progress-label"><strong>47% complete</strong> · last on Kobo</p><progress max="100" value="47" aria-label="Reading progress for Stone Butch Blues">47%</progress><p class="themes">Themes: <span class="tag">historical</span> <span class="tag">literary</span> <span class="tag">queer</span> <span class="tag">trans</span></p></div></li></ul><h3>Time to finish</h3><div class="table-wrap"><table><caption>Time to finish, at your recent reading pace — a range, never a single number, computed locally from your own page timing</caption><thead><tr><th scope="col">Title</th><th scope="col">Author</th><th scope="col">Estimate</th><th scope="col">Based on</th></tr></thead><tbody><tr><th scope="row">Stone Butch Blues</th><td>Leslie Feinberg</td><td>2.8–2.8 hours</td><td>from your last 16 reading days</td></tr></tbody></table></div></section><section id="next" class="home-section"><div class="section-heading"><h2>What next</h2><p>Explained possibilities for the next open slot on your reading shelf.</p></div><h3>Recommended for you</h3><p>Every pick shows why it surfaced and the source it came from. A citation that links out is a page you can open yourself; following one is a request your browser makes to that catalog, never one this instance makes on your behalf, and it carries no referrer.</p><p class="fixture-note" role="alert">These picks are fixture titles from the built-in demo world, not candidates sourced from your configured catalogs. They are shown because demo mode is on and no public catalog pool is stored.</p><div class="recommendation-grid"><article class="card" aria-labelledby="rec-ol-unkindness-ghosts"><h3 id="rec-ol-unkindness-ghosts">1. An Unkindness of Ghosts</h3><p class="byline">by Rivers Solomon</p><p class="score">Fit score: 1.053</p><h4>Why recommended</h4><ul><li>theme: shares your themes: queer, science fiction, speculative</li><li>collaborative: listed alongside Octavia E. Butler, whom you've finished, on “Speculative Feminist Classics”</li><li>list: on the curated list “Trans & Spec-Fic Canon”</li><li>list: on the curated list “Speculative Feminist Classics”</li></ul><h4>Sources</h4><ul><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/speculative" rel="noopener noreferrer external">https://openlibrary.org/subjects/speculative</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/science_fiction" rel="noopener noreferrer external">https://openlibrary.org/subjects/science_fiction</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/queer" rel="noopener noreferrer external">https://openlibrary.org/subjects/queer</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>curated-list: <span class="local-citation">curated-list:speculative-feminist-classics</span> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>curated-list: <span class="local-citation">curated-list:trans-spec-fic-canon</span> <span class="retrieved">(retrieved 2026-06-05)</span></li></ul><p class="summary">Recommended because it shares your themes: queer, science fiction, speculative.</p></article><article class="card" aria-labelledby="rec-ol-fifth-season"><h3 id="rec-ol-fifth-season">2. The Fifth Season</h3><p class="byline">by N. K. Jemisin</p><p class="score">Fit score: 0.972</p><h4>Why recommended</h4><ul><li>theme: shares your themes: dystopia, science fiction, speculative</li><li>collaborative: listed alongside Octavia E. Butler, whom you've finished, on “Speculative Feminist Classics”</li><li>list: on the curated list “Speculative Feminist Classics”</li></ul><h4>Sources</h4><ul><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/speculative" rel="noopener noreferrer external">https://openlibrary.org/subjects/speculative</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/science_fiction" rel="noopener noreferrer external">https://openlibrary.org/subjects/science_fiction</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/dystopia" rel="noopener noreferrer external">https://openlibrary.org/subjects/dystopia</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>curated-list: <span class="local-citation">curated-list:speculative-feminist-classics</span> <span class="retrieved">(retrieved 2026-06-05)</span></li></ul><p class="summary">Recommended because it shares your themes: dystopia, science fiction, speculative.</p></article><article class="card" aria-labelledby="rec-ol-dawn-butler"><h3 id="rec-ol-dawn-butler">3. Dawn</h3><p class="byline">by Octavia E. Butler</p><p class="score">Fit score: 0.843</p><h4>Why recommended</h4><ul><li>theme: shares your themes: science fiction, speculative</li><li>author: by Octavia E. Butler, whom you've finished</li><li>list: on the curated list “Speculative Feminist Classics”</li></ul><h4>Sources</h4><ul><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/speculative" rel="noopener noreferrer external">https://openlibrary.org/subjects/speculative</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/science_fiction" rel="noopener noreferrer external">https://openlibrary.org/subjects/science_fiction</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>curated-list: <span class="local-citation">curated-list:speculative-feminist-classics</span> <span class="retrieved">(retrieved 2026-06-05)</span></li></ul><p class="summary">Recommended because it shares your themes: science fiction, speculative.</p></article><article class="card" aria-labelledby="rec-ol-confessions-fox"><h3 id="rec-ol-confessions-fox">4. Confessions of the Fox</h3><p class="byline">by Jordy Rosenberg</p><p class="score">Fit score: 0.755</p><h4>Why recommended</h4><ul><li>theme: shares your themes: historical, queer, speculative, trans</li><li>list: on the curated list “Trans & Spec-Fic Canon”</li></ul><h4>Sources</h4><ul><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/trans" rel="noopener noreferrer external">https://openlibrary.org/subjects/trans</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/speculative" rel="noopener noreferrer external">https://openlibrary.org/subjects/speculative</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/queer" rel="noopener noreferrer external">https://openlibrary.org/subjects/queer</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/historical" rel="noopener noreferrer external">https://openlibrary.org/subjects/historical</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>curated-list: <span class="local-citation">curated-list:trans-spec-fic-canon</span> <span class="retrieved">(retrieved 2026-06-05)</span></li></ul><p class="summary">Recommended because it shares your themes: historical, queer, speculative, trans.</p></article><article class="card" aria-labelledby="rec-ol-nevada"><h3 id="rec-ol-nevada">5. Nevada</h3><p class="byline">by Imogen Binnie</p><p class="score">Fit score: 0.668</p><h4>Why recommended</h4><ul><li>theme: shares your themes: literary, queer, trans</li><li>list: on the curated list “Trans & Spec-Fic Canon”</li></ul><h4>Sources</h4><ul><li>curated-list: <span class="local-citation">curated-list:trans-spec-fic-canon</span> <span class="retrieved">(retrieved 2026-06-05)</span></li></ul><p class="summary">Recommended because it shares your themes: literary, queer, trans.</p></article></div><details class="near-misses"><summary>Why not others?</summary><div class="details-inner"><p>Close candidates that didn't make the shelf, ranked and explained — the same sourced accounting the picks above get, applied to what fell short.</p><div class="recommendation-grid"><article class="card" aria-labelledby="miss-ol-fantasy-doorstop"><h3 id="miss-ol-fantasy-doorstop">The Doorstop Saga, Book 9</h3><p class="byline">by G. Epic</p><h4>Why not</h4><ul><li>theme: no sourced tags overlap your taste</li><li>author: no finished-author match</li><li>list: would rise if on a cited list</li></ul><h4>Sources</h4><ul><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/epic_fantasy" rel="noopener noreferrer external">https://openlibrary.org/subjects/epic_fantasy</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/bestseller" rel="noopener noreferrer external">https://openlibrary.org/subjects/bestseller</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/dragons" rel="noopener noreferrer external">https://openlibrary.org/subjects/dragons</a> <span class="retrieved">(retrieved 2026-06-05)</span></li></ul><p class="summary">Ranked as it did because it no sourced tags overlap your taste.</p></article><article class="card" aria-labelledby="miss-ol-memoir"><h3 id="miss-ol-memoir">Celebrity: A Memoir</h3><p class="byline">by V. Famous</p><h4>Why not</h4><ul><li>theme: no sourced tags overlap your taste</li><li>author: no finished-author match</li><li>list: would rise if on a cited list</li></ul><h4>Sources</h4><ul><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/memoir" rel="noopener noreferrer external">https://openlibrary.org/subjects/memoir</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/bestseller" rel="noopener noreferrer external">https://openlibrary.org/subjects/bestseller</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/celebrity" rel="noopener noreferrer external">https://openlibrary.org/subjects/celebrity</a> <span class="retrieved">(retrieved 2026-06-05)</span></li></ul><p class="summary">Ranked as it did because it no sourced tags overlap your taste.</p></article><article class="card" aria-labelledby="miss-ol-thriller"><h3 id="miss-ol-thriller">The Airport Thriller</h3><p class="byline">by A. Bestseller</p><h4>Why not</h4><ul><li>theme: no sourced tags overlap your taste</li><li>author: no finished-author match</li><li>list: would rise if on a cited list</li></ul><h4>Sources</h4><ul><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/thriller" rel="noopener noreferrer external">https://openlibrary.org/subjects/thriller</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/bestseller" rel="noopener noreferrer external">https://openlibrary.org/subjects/bestseller</a> <span class="retrieved">(retrieved 2026-06-05)</span></li><li>openlibrary-subject: <a href="https://openlibrary.org/subjects/crime" rel="noopener noreferrer external">https://openlibrary.org/subjects/crime</a> <span class="retrieved">(retrieved 2026-06-05)</span></li></ul><p class="summary">Ranked as it did because it no sourced tags overlap your taste.</p></article></div></div></details><div class="next-shelves"><div class="shelf-block"><h3>Up next in your series</h3><table><caption>Unread books in series you've started</caption><thead><tr><th scope="col">Title</th><th scope="col">Series</th><th scope="col">Author</th></tr></thead><tbody><tr><th scope="row">Parable of the Talents</th><td>Earthseed</td><td>Octavia E. Butler</td></tr></tbody></table></div><div class="shelf-block"><h3>To-read shelf</h3><p>Unread books you own, ranked by fit to your sourced themes, with series continuations floated to the top.</p><ul class="books"><li class="reading"><div class="shelfmark" aria-hidden="true"><span>IN CIRCULATION</span></div><div class="reading-copy"><h3>Parable of the Talents</h3><p class="byline">by Octavia E. Butler</p><p class="progress-label"><strong>0% complete</strong> · last on Calibre</p><progress max="100" value="0" aria-label="Reading progress for Parable of the Talents">0%</progress><p class="themes">Themes: <span class="tag">dystopia</span> <span class="tag">science fiction</span> <span class="tag">speculative</span></p></div></li></ul></div></div></section><section id="finished" class="home-section"><div class="section-heading"><h2>Recently finished</h2><p>Your latest returns, kept close enough to revisit.</p></div><ul class="books"><li class="reading"><div class="shelfmark" aria-hidden="true"><span>IN CIRCULATION</span></div><div class="reading-copy"><h3>A Safe Girl to Love</h3><p class="byline">by Casey Plett</p><p class="progress-label"><strong>100% complete</strong> · last on Kobo</p><progress max="100" value="100" aria-label="Reading progress for A Safe Girl to Love">100%</progress><p class="themes">Themes: <span class="tag">literary</span> <span class="tag">queer</span> <span class="tag">short stories</span> <span class="tag">trans</span></p></div></li><li class="reading"><div class="shelfmark" aria-hidden="true"><span>IN CIRCULATION</span></div><div class="reading-copy"><h3>Detransition, Baby</h3><p class="byline">by Torrey Peters</p><p class="progress-label"><strong>100% complete</strong> · last on Kobo</p><progress max="100" value="100" aria-label="Reading progress for Detransition, Baby">100%</progress><p class="themes">Themes: <span class="tag">literary</span> <span class="tag">queer</span> <span class="tag">trans</span></p></div></li><li class="reading"><div class="shelfmark" aria-hidden="true"><span>IN CIRCULATION</span></div><div class="reading-copy"><h3>Fierce Femmes and Notorious Liars</h3><p class="byline">by Kai Cheng Thom</p><p class="progress-label"><strong>100% complete</strong> · last on Readest</p><progress max="100" value="100" aria-label="Reading progress for Fierce Femmes and Notorious Liars">100%</progress><p class="themes">Themes: <span class="tag">fabulist</span> <span class="tag">queer</span> <span class="tag">speculative</span> <span class="tag">trans</span></p></div></li><li class="reading"><div class="shelfmark" aria-hidden="true"><span>IN CIRCULATION</span></div><div class="reading-copy"><h3>Kindred</h3><p class="byline">by Octavia E. Butler</p><p class="progress-label"><strong>100% complete</strong> · last on Kobo</p><progress max="100" value="100" aria-label="Reading progress for Kindred">100%</progress><p class="themes">Themes: <span class="tag">science fiction</span> <span class="tag">speculative</span> <span class="tag">time travel</span></p></div></li><li class="reading"><div class="shelfmark" aria-hidden="true"><span>IN CIRCULATION</span></div><div class="reading-copy"><h3>Parable of the Sower</h3><p class="byline">by Octavia E. Butler</p><p class="progress-label"><strong>100% complete</strong> · last on Kobo</p><progress max="100" value="100" aria-label="Reading progress for Parable of the Sower">100%</progress><p class="themes">Themes: <span class="tag">dystopia</span> <span class="tag">science fiction</span> <span class="tag">speculative</span></p></div></li><li class="reading"><div class="shelfmark" aria-hidden="true"><span>IN CIRCULATION</span></div><div class="reading-copy"><h3>The Handmaid's Tale</h3><p class="byline">by Margaret Atwood</p><p class="progress-label"><strong>100% complete</strong> · last on Calibre-Web</p><progress max="100" value="100" aria-label="Reading progress for The Handmaid's Tale">100%</progress><p class="themes">Themes: <span class="tag">dystopia</span> <span class="tag">feminist</span> <span class="tag">speculative</span></p></div></li><li class="reading"><div class="shelfmark" aria-hidden="true"><span>IN CIRCULATION</span></div><div class="reading-copy"><h3>Oryx and Crake</h3><p class="byline">by Margaret Atwood</p><p class="progress-label"><strong>100% complete</strong> · last on Kobo</p><progress max="100" value="100" aria-label="Reading progress for Oryx and Crake">100%</progress><p class="themes">Themes: <span class="tag">dystopia</span> <span class="tag">science fiction</span> <span class="tag">speculative</span></p></div></li></ul></section><section id="browse" class="home-section"><div class="section-heading"><h2>Browse your library</h2><p>Search the full catalogue by title, author, status, or sourced theme.</p></div><form class="browse-form" action="/browse" method="get" role="search"><label for="lib-filter">Find a book<input id="lib-filter" name="q" type="search" autocomplete="off" placeholder="Title, author, status, or theme" value=""></label><button type="submit">Search library</button></form><p id="lib-filter-status" role="status" aria-live="polite" data-complete="true">Showing 9 books.</p><div class="table-wrap"><table id="lib-table"><caption>Your library — browse by reading the rows, or filter with the form above</caption><thead><tr><th scope="col">Title</th><th scope="col">Author</th><th scope="col">Status</th><th scope="col">Themes (sourced)</th></tr></thead><tbody><tr><th scope="row">A Safe Girl to Love</th><td>Casey Plett</td><td>finished</td><td>literary, queer, short stories, trans</td></tr><tr><th scope="row">Detransition, Baby</th><td>Torrey Peters</td><td>finished</td><td>literary, queer, trans</td></tr><tr><th scope="row">Fierce Femmes and Notorious Liars</th><td>Kai Cheng Thom</td><td>finished</td><td>fabulist, queer, speculative, trans</td></tr><tr><th scope="row">Kindred</th><td>Octavia E. Butler</td><td>finished</td><td>science fiction, speculative, time travel</td></tr><tr><th scope="row">Oryx and Crake</th><td>Margaret Atwood</td><td>finished</td><td>dystopia, science fiction, speculative</td></tr><tr><th scope="row">Parable of the Sower</th><td>Octavia E. Butler</td><td>finished</td><td>dystopia, science fiction, speculative</td></tr><tr><th scope="row">Parable of the Talents</th><td>Octavia E. Butler</td><td>unread</td><td>dystopia, science fiction, speculative</td></tr><tr><th scope="row">Stone Butch Blues</th><td>Leslie Feinberg</td><td>reading</td><td>historical, literary, queer, trans</td></tr><tr><th scope="row">The Handmaid's Tale</th><td>Margaret Atwood</td><td>finished</td><td>dystopia, feminist, speculative</td></tr></tbody></table></div><script>(function(){var i=document.getElementById('lib-filter');var t=document.getElementById('lib-table');var s=document.getElementById('lib-filter-status');if(!i||!t||!s||!t.tBodies.length){return;}if(s.dataset.complete!=='true'){return;}i.addEventListener('input',function(){var q=i.value.toLowerCase();var rows=t.tBodies[0].rows;var shown=0;for(var r=0;r!==rows.length;r++){var hay=rows[r].textContent.toLowerCase();rows[r].hidden=(q!==''&&hay.indexOf(q)===-1);if(!rows[r].hidden){shown++;}}s.textContent='Showing '+shown+' of '+rows.length+' books.';});})();</script></section><section id="record" class="home-section"><div class="section-heading"><h2>Reading record</h2><p>Your patterns, provenance, lists, and data health—available when you need them.</p></div><div class="disclosures"><details><summary>Stats, goals & yearly history</summary><div class="details-inner"><h3>Reading stats</h3><table><caption>Reading totals (data-table equivalent of the stats panel)</caption><thead><tr><th scope="col">Metric</th><th scope="col">Value</th></tr></thead><tbody><tr><th scope="row">Books finished</th><td>7</td></tr><tr><th scope="row">Currently reading</th><td>1</td></tr><tr><th scope="row">Pages read</th><td>2281</td></tr><tr><th scope="row">Time read (hours)</th><td>105.8</td></tr><tr><th scope="row">Current streak (days)</th><td>1</td></tr><tr><th scope="row">Longest streak (days)</th><td>3</td></tr><tr><th scope="row">Active reading days</th><td>16</td></tr><tr><th scope="row">Highlights</th><td>130</td></tr></tbody></table><table><caption>Theme & genre mix, from sourced tags only</caption><thead><tr><th scope="col">Theme</th><th scope="col">Books</th></tr></thead><tbody><tr><th scope="row">speculative</th><td>5</td></tr><tr><th scope="row">queer</th><td>4</td></tr><tr><th scope="row">trans</th><td>4</td></tr><tr><th scope="row">literary</th><td>3</td></tr><tr><th scope="row">science fiction</th><td>3</td></tr><tr><th scope="row">dystopia</th><td>3</td></tr><tr><th scope="row">short stories</th><td>1</td></tr><tr><th scope="row">fabulist</th><td>1</td></tr><tr><th scope="row">time travel</th><td>1</td></tr><tr><th scope="row">historical</th><td>1</td></tr><tr><th scope="row">feminist</th><td>1</td></tr></tbody></table><h3>Reading Wrapped 2024</h3><p>7 books finished · 37.6 hours read in 2024 · 16 reading days — computed locally, shared with no one.</p><table><caption>Standout reads of 2024 — the books you finished in 2024, ranked by their all-time read time. KOReader keeps one cumulative total per book and no per-year breakdown, so these hours count every session ever, not only 2024. These add up to more than the 37.6 hours above because at least one of them was started before 2024; the two figures measure different things.</caption><thead><tr><th scope="col">Title</th><th scope="col">Author</th><th scope="col">Hours (all time)</th></tr></thead><tbody><tr><th scope="row">Oryx and Crake</th><td>Margaret Atwood</td><td>16.9</td></tr><tr><th scope="row">Detransition, Baby</th><td>Torrey Peters</td><td>16.7</td></tr><tr><th scope="row">Parable of the Sower</th><td>Octavia E. Butler</td><td>16.1</td></tr><tr><th scope="row">Kindred</th><td>Octavia E. Butler</td><td>14.4</td></tr><tr><th scope="row">The Handmaid's Tale</th><td>Margaret Atwood</td><td>13.9</td></tr></tbody></table><table><caption>Monthly reading in 2024 (pace: 141.1 pages per reading day)</caption><thead><tr><th scope="col">Month</th><th scope="col">Pages</th><th scope="col">Hours</th><th scope="col">Days</th></tr></thead><tbody><tr><th scope="row">Mar</th><td>374</td><td>6.2</td><td>3</td></tr><tr><th scope="row">Apr</th><td>926</td><td>15.4</td><td>7</td></tr><tr><th scope="row">May</th><td>808</td><td>13.5</td><td>5</td></tr><tr><th scope="row">Jun</th><td>150</td><td>2.5</td><td>1</td></tr></tbody></table><p><a href="/share">Make a share card for Bookwyrm or Mastodon</a> — composed locally; nothing is posted until you copy and share it yourself.</p></div></details><details><summary>Diversity & descriptor provenance</summary><div class="details-inner"><h3>Reading diversity</h3><p>Built <strong>only</strong> from sourced descriptors of the books themselves — Calibre tags, OpenLibrary subjects, and curated lists. We never infer an author's identity and never auto-label a person; a book with no sourced descriptor is reported as unknown, not as “not diverse”.</p><p>Every sourced descriptor is shown individually below. To aggregate the identity-adjacent ones (handy when screen-sharing a queer/trans reading history), set <code>STACKS_HIDE_SENSITIVE=1</code> or load <code>?hide_sensitive=1</code>.</p><table><caption>Coverage — how much of the shelf carries a sourced descriptor</caption><thead><tr><th scope="col">Measure</th><th scope="col">Value</th></tr></thead><tbody><tr><th scope="row">Books considered (reading + finished)</th><td>8</td></tr><tr><th scope="row">With a sourced descriptor</th><td>8</td></tr><tr><th scope="row">No sourced descriptor (unknown — not 'none')</th><td>0</td></tr><tr><th scope="row">Descriptor coverage</th><td>100%</td></tr></tbody></table><p>Lens grouping: <strong>built-in defaults</strong>.</p><table><caption>Representation lenses, as a share of your described books (a grouping of sourced descriptors — never an author's identity)</caption><thead><tr><th scope="col">Lens</th><th scope="col">Books</th><th scope="col">% of described</th><th scope="col">Sourced descriptors seen</th></tr></thead><tbody><tr><th scope="row">Trans & nonbinary</th><td>4</td><td>50%</td><td>trans</td></tr><tr><th scope="row">Queer / LGBTQ+</th><td>4</td><td>50%</td><td>queer</td></tr><tr><th scope="row">Speculative / SFF</th><td>5</td><td>62%</td><td>dystopia, fabulist, science fiction, speculative, time travel</td></tr><tr><th scope="row">Feminist</th><td>1</td><td>12%</td><td>feminist</td></tr><tr><th scope="row">Literary</th><td>3</td><td>38%</td><td>literary, short stories</td></tr><tr><th scope="row">Historical</th><td>1</td><td>12%</td><td>historical</td></tr></tbody></table><table><caption>Where these descriptors came from (count of sourced tags by source)</caption><thead><tr><th scope="col">Source</th><th scope="col">Descriptors</th></tr></thead><tbody><tr><th scope="row">calibre-tag</th><td>27</td></tr></tbody></table><table><caption>Per-descriptor provenance — every diverse-shelf tag, the source that asserted it, and when it was fetched (sourced, never inferred)</caption><thead><tr><th scope="col">Descriptor</th><th scope="col">Books</th><th scope="col">Source(s)</th><th scope="col">Retrieved</th></tr></thead><tbody><tr><th scope="row">speculative</th><td>5</td><td>calibre-tag</td><td>2026-06-05</td></tr><tr><th scope="row">queer (sensitive)</th><td>4</td><td>calibre-tag</td><td>2026-06-05</td></tr><tr><th scope="row">trans (sensitive)</th><td>4</td><td>calibre-tag</td><td>2026-06-05</td></tr><tr><th scope="row">dystopia</th><td>3</td><td>calibre-tag</td><td>2026-06-05</td></tr><tr><th scope="row">literary</th><td>3</td><td>calibre-tag</td><td>2026-06-05</td></tr><tr><th scope="row">science fiction</th><td>3</td><td>calibre-tag</td><td>2026-06-05</td></tr><tr><th scope="row">fabulist</th><td>1</td><td>calibre-tag</td><td>2026-06-05</td></tr><tr><th scope="row">feminist</th><td>1</td><td>calibre-tag</td><td>2026-06-05</td></tr><tr><th scope="row">historical</th><td>1</td><td>calibre-tag</td><td>2026-06-05</td></tr><tr><th scope="row">short stories</th><td>1</td><td>calibre-tag</td><td>2026-06-05</td></tr><tr><th scope="row">time travel</th><td>1</td><td>calibre-tag</td><td>2026-06-05</td></tr></tbody></table></div></details><details><summary>Your curated lists</summary><div class="details-inner"><h3>Your lists</h3><p>No authored lists yet — create one with <code>stacks lists new</code> and it will show up here.</p></div></details><details class="source-status"><summary>Data & source status</summary><div class="details-inner"><h3>Data status</h3><table><caption>How current the data on this page is</caption><thead><tr><th scope="col">Measure</th><th scope="col">Value</th></tr></thead><tbody><tr><th scope="row">Data as of</th><td>never refreshed — run `stacks refresh`</td></tr><tr><th scope="row">Library & stats source</th><td>built-in demo world (fixture books)</td></tr><tr><th scope="row">Recommendation candidates</th><td>built-in demo fixtures</td></tr><tr><th scope="row">Reading-data sources</th><td>reading records present (KOReader statistics)</td></tr></tbody></table><h3>Recommendation sources</h3><p>Catalog requests use only broad subjects or explicit public lists. They are never generated from reading history, authors, or taste weights.</p><table><caption>Catalog networking and candidate-pool status</caption><thead><tr><th scope="col">Measure</th><th scope="col">Value</th></tr></thead><tbody><tr><th scope="row">Outbound mode</th><td>Off — this instance makes no public catalog requests</td></tr><tr><th scope="row">Pool state</th><td>Networking off; any candidates shown are already stored locally.</td></tr><tr><th scope="row">Candidates stored locally</th><td>0</td></tr><tr><th scope="row">Last attempted</th><td>never</td></tr></tbody></table></div></details></div></section></main></body></html>