Rolls up the dev work since the last main merge (#88).
Tagging flow
Focus returns to the tag input after accepting an auto-suggested tag (Suggestions panel + inline dropdown), mobile keyboard guard preserved. (4958e8f)
Tag-input dropdown searches the full prediction set — SuggestionService.for_image(threshold_override=) + GET /images/<id>/suggestions?min=<f> surface every stored prediction (down to the 0.05 store floor), alias-resolved, so low-confidence actions/features can be accepted in canonical formatting instead of hand-typed. The Suggestions panel stays curated at the configured threshold. (c999c64)
Series browse
Search field (instant name/artist filter) + per-card kebab with Rename (reuses the tag-rename collision-merge flow) and Delete (confirm; removes the series + chapter/page ordering, keeps the images). (e4cebf7)
Tags / fandom
Character chips show their fandom name (truncated to 15 chars, full name on hover) on both modal-open paths, resolved via a Tag self-join. (978f49a)
Navigation
Settings pinned to the right edge as a gear, separated from the content nav (was stranded mid-row). Mobile unchanged. (a509020)
Rolls up the dev work since the last main merge (#88).
## Tagging flow
- **Focus returns to the tag input** after accepting an auto-suggested tag (Suggestions panel + inline dropdown), mobile keyboard guard preserved. (`4958e8f`)
- **Tag-input dropdown searches the full prediction set** — `SuggestionService.for_image(threshold_override=)` + `GET /images/<id>/suggestions?min=<f>` surface every stored prediction (down to the 0.05 store floor), alias-resolved, so low-confidence actions/features can be accepted in canonical formatting instead of hand-typed. The Suggestions panel stays curated at the configured threshold. (`c999c64`)
## Series browse
- **Search field** (instant name/artist filter) + **per-card kebab** with Rename (reuses the tag-rename collision-merge flow) and Delete (confirm; removes the series + chapter/page ordering, keeps the images). (`e4cebf7`)
## Tags / fandom
- **Character chips show their fandom name** (truncated to 15 chars, full name on hover) on both modal-open paths, resolved via a Tag self-join. (`978f49a`)
## Navigation
- **Settings pinned to the right edge** as a gear, separated from the content nav (was stranded mid-row). Mobile unchanged. (`a509020`)
All commits CI-green on their dev head SHA.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Accepting an auto-suggested tag (Suggestions panel or the autocomplete
dropdown) left focus on <body>, so the operator had to re-click the tag field
to add the next one. Expose TagAutocomplete.focus (the existing mobile-aware
focusInput) and call it after accept from both paths; SuggestionsPanel emits
'accepted' for the parent to refocus. Operator-asked 2026-06-08.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The Series browse tab had no way to find a series in a long grid and no
per-series actions. Add a search field (instant client-side name/artist filter
over the already-loaded list) and a kebab on each card with Rename (reuses
TagRenameDialog → PATCH /api/tags/<id>, with its collision-merge flow) and
Delete (confirm dialog → DELETE /api/admin/tags/<id>; series_page/chapter/
suggestion cascade, images kept). Gap badge moved to the cover's top-left so the
kebab can sit top-right. Operator-asked 2026-06-09.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A character chip with a fandom only rendered a bare arrow. Surface the fandom
NAME inline, truncated to 15 chars (full name in the tooltip). Resolve the name
via a Tag self-join in both tag paths the modal uses — list_for_image
(/api/images/<id>/tags) and gallery get_image_with_tags
(/api/gallery/image/<id>) — so chips show the fandom on first open and after any
reload. Falls back to the bare arrow when only fandom_id is known. Operator-asked
2026-06-09.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The typed dropdown sourced the threshold-filtered panel list (>= 0.70 general),
so low-confidence actions/features the model DID predict never appeared — forcing
hand-typed custom tags instead of accepting the model's canonical formatting.
Add a threshold override: SuggestionService.for_image(threshold_override=) and
GET /images/<id>/suggestions?min=<f> surface EVERY stored prediction (down to the
0.05 store floor), alias-resolved and normalized, still excluding applied/rejected
and unsurfaced categories. The suggestions store gains allByCategory + loadAll
(min=0); the dropdown searches that full set (cap 20), while the Suggestions panel
stays curated at the configured threshold. Accept/dismiss drop from both lists.
Operator-asked 2026-06-09. Test: a 0.30 general prediction is hidden by default
but surfaced with threshold_override=0.0; unsurfaced categories still excluded.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Settings is configuration, not content, but sat mid-row (between Series and
Posts). Pull it out of the centered content links and pin it to the right as a
gear+label, matching the convention that config lives at the right edge. Mobile
is unchanged — Settings stays in the hamburger menu (navRoutes still includes
it). Operator-asked 2026-06-09.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Rolls up the dev work since the last main merge (#88).
Tagging flow
4958e8f)SuggestionService.for_image(threshold_override=)+GET /images/<id>/suggestions?min=<f>surface every stored prediction (down to the 0.05 store floor), alias-resolved, so low-confidence actions/features can be accepted in canonical formatting instead of hand-typed. The Suggestions panel stays curated at the configured threshold. (c999c64)Series browse
e4cebf7)Tags / fandom
978f49a)Navigation
a509020)All commits CI-green on their dev head SHA.
🤖 Generated with Claude Code