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
205 lines (205 loc) · 31.4 KB
/
Copy pathdashboard.html
File metadata and controls
205 lines (205 loc) · 31.4 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
<!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); }
.lens-warning, .status-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></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.</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><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><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 · 37.6 hours · 16 reading days — computed locally, shared with no one.</p><table><caption>Standout reads of 2024 by time spent</caption><thead><tr><th scope="col">Title</th><th scope="col">Author</th><th scope="col">Hours</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></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 — no public catalog requests are permitted</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>