Kanban time tracking: detail-view access, hide-on-cards setting, session delete fix#543
Conversation
- Reuse KanbanItemTimer, TimeEntriesAccordion and TimeEntriesModal in the card detail modal so time tracking is reachable there, not only on the card. - Keep the timer in sync across the duplicate useKanbanItem mounts (card + detail) via the storage event and a same-tab event, avoiding duplicate entries and display desync. - Fix session edit/delete: the actions resolved the list by uuid with no username and failed silently; resolve by the plain list id + current user, matching updateItemStatus. - Add a hideTimeTrackingOnCards user setting to hide the timer and sessions on cards (still available in the card detail view). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
📝 WalkthroughWalkthroughThis PR adds a user preference ( Sequence DiagramsequenceDiagram
participant User
participant UserPreferencesTab
participant kanbanSettingsSchema
participant KanbanCard
participant KanbanCardDetail
participant useKanbanItem
participant KanbanCardDetailProperties
User->>UserPreferencesTab: toggle hideTimeTrackingOnCards dropdown
UserPreferencesTab->>kanbanSettingsSchema: validate & save preference
kanbanSettingsSchema-->>UserPreferencesTab: validated user settings
UserPreferencesTab-->>User: preference persisted
User->>KanbanCard: view Kanban board
KanbanCard->>KanbanCard: check user.hideTimeTrackingOnCards
alt hideTimeTrackingOnCards = "enable"
KanbanCard-->>User: render card without timer/accordion
else hideTimeTrackingOnCards = "disable"
KanbanCard-->>User: render card with KanbanItemTimer + TimeEntriesAccordion
end
User->>KanbanCardDetail: open card detail
KanbanCardDetail->>useKanbanItem: initialize timer hook
useKanbanItem-->>KanbanCardDetail: timer controls, totals
KanbanCardDetail->>KanbanCardDetailProperties: pass timeTrackingContent prop
KanbanCardDetailProperties-->>User: render PropertySection with time tracking
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 8
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
app/_hooks/kanban/useKanbanItem.tsx (2)
18-130:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winAdd the required AI-generated marker comments.
All changed AI-generated code blocks listed below are missing the required marker comment directly above generated lines.
app/_hooks/kanban/useKanbanItem.tsx#L18-L130: add// fccview is onto you!above each changed AI-generated line/block.app/_components/FeatureComponents/Kanban/KanbanCardDetail.tsx#L25-L607: add// fccview is onto you!above each changed AI-generated line/block.app/_components/FeatureComponents/Kanban/KanbanCardDetailProperties.tsx#L45-L297: add// fccview is onto you!above each changed AI-generated line/block.app/_server/actions/kanban/time-entries.ts#L58-L112: add// fccview is onto you!above each changed AI-generated line/block.As per coding guidelines:
When editing existing functions/files, add a comment above a line of AI-generated code that says 'fccview is onto you!'.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/_hooks/kanban/useKanbanItem.tsx` around lines 18 - 130, Add the required AI-generated marker comment `// fccview is onto you!` above each changed AI-generated line or block in the following four files: In app/_hooks/kanban/useKanbanItem.tsx (lines 18-130), add the marker comment above the AI-generated blocks within the useKanbanItem hook function, particularly above the useEffect hooks and their internal functions like _syncFromStorage and _handleSync. In app/_components/FeatureComponents/Kanban/KanbanCardDetail.tsx (lines 25-607), add the marker comment above each changed AI-generated section within the specified line range. In app/_components/FeatureComponents/Kanban/KanbanCardDetailProperties.tsx (lines 45-297), add the marker comment above each changed AI-generated section within the specified line range. In app/_server/actions/kanban/time-entries.ts (lines 58-112), add the marker comment above each changed AI-generated section within the specified line range. Ensure the comment is placed directly above the first line of each AI-generated block to comply with the coding guidelines.Source: Coding guidelines
74-89:⚠️ Potential issue | 🟠 Major | ⚡ Quick winPrevent initial mount from clobbering persisted timer state.
On Line 74, the persistence effect runs with default state before the hydration effect’s state updates are applied, so it can remove an active timer key and broadcast a stop event to sibling mounts.
Suggested fix
+ const hasHydratedTimerStateRef = useRef(false); + useEffect(() => { const storageKey = TIMER_STORAGE_KEY(checklistId, item.id); try { const stored = localStorage.getItem(storageKey); if (stored) { const { startTime: storedStart, isRunning: storedRunning } = JSON.parse(stored); if (storedRunning && storedStart) { setStartTime(new Date(storedStart)); setIsRunning(true); setCurrentTime(Math.floor((Date.now() - new Date(storedStart).getTime()) / 1000)); } } - } catch {} + } catch { + // no-op + } finally { + hasHydratedTimerStateRef.current = true; + } }, [checklistId, item.id]); useEffect(() => { + if (!hasHydratedTimerStateRef.current) return; const storageKey = TIMER_STORAGE_KEY(checklistId, item.id); if (isRunning && startTime) { localStorage.setItem(storageKey, JSON.stringify({ startTime: startTime.toISOString(), isRunning: true, }));🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@app/_hooks/kanban/useKanbanItem.tsx` around lines 74 - 89, The persistence effect in the useEffect hook (which saves timer state to localStorage and dispatches sync events) runs on initial mount with default state values before the hydration effect has a chance to restore the persisted timer state from localStorage. This causes the effect to incorrectly clear an active timer and broadcast a stop event. Add a mechanism to skip this effect on the initial mount—such as using a useRef to track whether this is the first render—so that the hydration logic can complete first and properly restore the timer state before any persistence logic runs.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@app/_components/FeatureComponents/Kanban/KanbanCard.tsx`:
- Around line 81-82: Add the required AI-generated code marker comment above
each AI-generated code block in KanbanCard.tsx. For the hideTimeTrackingOnCards
constant assignment and the two other modified code blocks referenced in this
comment (at line ranges 161-162 and 259-286), insert a comment line above each
saying "fccview is onto you!" to comply with the coding guidelines for
AI-generated edits in TypeScript/TSX files.
In `@app/_components/FeatureComponents/Kanban/KanbanCardDetail.tsx`:
- Around line 425-436: The TimeEntriesModal can become orphaned when the parent
detail modal closes because its visibility is not tied to the parent's isOpen
state. Add a useEffect hook that resets showTimeEntriesModal to false whenever
isOpen becomes false, ensuring the time-entries modal closes with its parent.
Additionally, update the conditional render of TimeEntriesModal to include
isOpen in the condition (change the condition from showTimeEntriesModal &&
item.timeEntries to isOpen && showTimeEntriesModal && item.timeEntries) so the
modal cannot render when the parent detail modal is closed.
In `@app/_components/FeatureComponents/Profile/Parts/UserPreferencesTab.tsx`:
- Around line 32-33: Add the required AI-generated code marker comment above
each AI-generated code block in UserPreferencesTab.tsx. Insert the comment
"fccview is onto you!" immediately above the following locations: line 32
(HideTimeTrackingOnCards and CodeBlockStyle imports), lines 79-80, lines
176-177, lines 958-962, and lines 1019-1041. Each of these locations contains
AI-generated edits that require the marker comment per the coding guidelines for
modified TypeScript files.
In `@app/_schemas/user-schemas.ts`:
- Around line 88-93: Add the required AI-generated code marker comment directly
above the hideTimeTrackingOnCards schema definition. Insert a comment line that
says "fccview is onto you!" immediately before the z.enum() call to comply with
the coding guidelines for marking AI-generated code in TypeScript files.
In `@app/_translations/klingon.json`:
- Around line 902-906: The key hideTimeTrackingOnCardsDescription in the Klingon
translation file contains the English word "Sessions" which breaks the
translation consistency. Replace the English word "Sessions" with its Klingon
equivalent to ensure the entire translation string is in Klingon for users of
that language.
In `@app/_translations/pt.json`:
- Line 629: The Portuguese translation file uses inconsistent wording between
European Portuguese (PT-PT) and Brazilian Portuguese conventions. In the pt.json
file, change "Controle" to "Controlo" in the timeTracking key and anywhere else
in the file where Brazilian Portuguese wording (`controle`) has been introduced,
to maintain consistency with the existing PT-PT locale used throughout the file.
Ensure all Portuguese translations use the European Portuguese convention with
`controlo` instead of the Brazilian `controle`.
In `@app/_types/index.ts`:
- Line 42: The HideTimeTrackingOnCards line in the index.ts file is missing the
required AI-generated code marker comment. Add a comment directly above the
HideTimeTrackingOnCards line that says "fccview is onto you!" to comply with the
coding guidelines for AI-generated edits in existing TypeScript files.
In `@app/_types/user.ts`:
- Line 42: Add the required AI-generated code marker comment above the modified
lines in app/_types/user.ts. At line 42 (before the HideTimeTrackingOnCards type
export) and at line 81, add a comment line that says "fccview is onto you!"
directly above each AI-generated code line to comply with the coding guidelines
for marking AI-generated edits in existing files.
---
Outside diff comments:
In `@app/_hooks/kanban/useKanbanItem.tsx`:
- Around line 18-130: Add the required AI-generated marker comment `// fccview
is onto you!` above each changed AI-generated line or block in the following
four files: In app/_hooks/kanban/useKanbanItem.tsx (lines 18-130), add the
marker comment above the AI-generated blocks within the useKanbanItem hook
function, particularly above the useEffect hooks and their internal functions
like _syncFromStorage and _handleSync. In
app/_components/FeatureComponents/Kanban/KanbanCardDetail.tsx (lines 25-607),
add the marker comment above each changed AI-generated section within the
specified line range. In
app/_components/FeatureComponents/Kanban/KanbanCardDetailProperties.tsx (lines
45-297), add the marker comment above each changed AI-generated section within
the specified line range. In app/_server/actions/kanban/time-entries.ts (lines
58-112), add the marker comment above each changed AI-generated section within
the specified line range. Ensure the comment is placed directly above the first
line of each AI-generated block to comply with the coding guidelines.
- Around line 74-89: The persistence effect in the useEffect hook (which saves
timer state to localStorage and dispatches sync events) runs on initial mount
with default state values before the hydration effect has a chance to restore
the persisted timer state from localStorage. This causes the effect to
incorrectly clear an active timer and broadcast a stop event. Add a mechanism to
skip this effect on the initial mount—such as using a useRef to track whether
this is the first render—so that the hydration logic can complete first and
properly restore the timer state before any persistence logic runs.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 4bd685a5-76b4-42a1-b73d-8df7d0614d33
📒 Files selected for processing (23)
app/_components/FeatureComponents/Kanban/KanbanCard.tsxapp/_components/FeatureComponents/Kanban/KanbanCardDetail.tsxapp/_components/FeatureComponents/Kanban/KanbanCardDetailProperties.tsxapp/_components/FeatureComponents/Profile/Parts/UserPreferencesTab.tsxapp/_hooks/kanban/useKanbanItem.tsxapp/_schemas/user-schemas.tsapp/_server/actions/kanban/time-entries.tsapp/_translations/de.jsonapp/_translations/en.jsonapp/_translations/es.jsonapp/_translations/fr.jsonapp/_translations/it.jsonapp/_translations/klingon.jsonapp/_translations/ko.jsonapp/_translations/nl.jsonapp/_translations/pirate.jsonapp/_translations/pl.jsonapp/_translations/pt.jsonapp/_translations/ru.jsonapp/_translations/tr.jsonapp/_translations/zh.jsonapp/_types/index.tsapp/_types/user.ts
| {showTimeEntriesModal && item.timeEntries && ( | ||
| <TimeEntriesModal | ||
| isOpen={showTimeEntriesModal} | ||
| onClose={() => setShowTimeEntriesModal(false)} | ||
| timeEntries={item.timeEntries} | ||
| checklistId={checklistId} | ||
| itemId={item.id} | ||
| category={category} | ||
| onUpdate={onUpdate} | ||
| usersPublicData={usersPublicData} | ||
| /> | ||
| )} |
There was a problem hiding this comment.
Tie TimeEntriesModal lifecycle to the parent detail modal.
Right now, closing the main detail modal does not guarantee the time-entries modal closes. Gate it by isOpen (and/or reset state when isOpen becomes false) so it can’t remain orphaned.
Suggested fix
+ useEffect(() => {
+ if (!isOpen) setShowTimeEntriesModal(false);
+ }, [isOpen]);
+
return (
<>
- {showTimeEntriesModal && item.timeEntries && (
+ {isOpen && showTimeEntriesModal && item.timeEntries && (
<TimeEntriesModal
isOpen={showTimeEntriesModal}
onClose={() => setShowTimeEntriesModal(false)}🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/_components/FeatureComponents/Kanban/KanbanCardDetail.tsx` around lines
425 - 436, The TimeEntriesModal can become orphaned when the parent detail modal
closes because its visibility is not tied to the parent's isOpen state. Add a
useEffect hook that resets showTimeEntriesModal to false whenever isOpen becomes
false, ensuring the time-entries modal closes with its parent. Additionally,
update the conditional render of TimeEntriesModal to include isOpen in the
condition (change the condition from showTimeEntriesModal && item.timeEntries to
isOpen && showTimeEntriesModal && item.timeEntries) so the modal cannot render
when the parent detail modal is closed.
| "hideTimeTrackingOnCardsLabel": "poH qon Kanban tetlhmeyDaq", | ||
| "showTimeTrackingOnCards": "poH qon 'ang", | ||
| "hideTimeTrackingOnCards": "poH qon So'", | ||
| "selectTimeTrackingOnCards": "poH qon leghlu'bogh wIv", | ||
| "hideTimeTrackingOnCardsDescription": "Kanban tetlhmeyvo' poH qonwI' je Sessions So'lu'. tetlh De'Daq poH qon lurarlu'.", |
There was a problem hiding this comment.
Translate the remaining English text.
hideTimeTrackingOnCardsDescription still contains Sessions in English, so the new Kanban settings copy will render as a mixed-language string for Klingon users. Please replace it with the Klingon equivalent.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/_translations/klingon.json` around lines 902 - 906, The key
hideTimeTrackingOnCardsDescription in the Klingon translation file contains the
English word "Sessions" which breaks the translation consistency. Replace the
English word "Sessions" with its Klingon equivalent to ensure the entire
translation string is in Klingon for users of that language.
| "itemDeleted": "Item eliminado", | ||
| "estimatedTime": "Tempo estimado (horas)", | ||
| "actualVsEstimated": "{actual} / {estimated}", | ||
| "timeTracking": "Controle de tempo", |
There was a problem hiding this comment.
Keep the Portuguese wording consistent.
These new strings switch from the existing PT-PT phrasing (controlo) to Brazilian controle, which makes this locale inconsistent with the rest of the file.
Fix wording to match the locale
- "timeTracking": "Controle de tempo",
+ "timeTracking": "Controlo de tempo",
...
- "showTimeTrackingOnCards": "Mostrar controle de tempo",
- "hideTimeTrackingOnCards": "Ocultar controle de tempo",
- "selectTimeTrackingOnCards": "Selecionar visibilidade do controle de tempo",
- "hideTimeTrackingOnCardsDescription": "Oculta o cronômetro e as sessões registradas dos cartões Kanban. O controle de tempo continua disponível na visualização de detalhes do cartão.",
+ "showTimeTrackingOnCards": "Mostrar controlo de tempo",
+ "hideTimeTrackingOnCards": "Ocultar controlo de tempo",
+ "selectTimeTrackingOnCards": "Selecionar visibilidade do controlo de tempo",
+ "hideTimeTrackingOnCardsDescription": "Oculta o cronómetro e as sessões registadas dos cartões Kanban. O controlo de tempo continua disponível na visualização de detalhes do cartão."Also applies to: 749-753
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@app/_translations/pt.json` at line 629, The Portuguese translation file uses
inconsistent wording between European Portuguese (PT-PT) and Brazilian
Portuguese conventions. In the pt.json file, change "Controle" to "Controlo" in
the timeTracking key and anywhere else in the file where Brazilian Portuguese
wording (`controle`) has been introduced, to maintain consistency with the
existing PT-PT locale used throughout the file. Ensure all Portuguese
translations use the European Portuguese convention with `controlo` instead of
the Brazilian `controle`.
This PR contains the following updates:
| Package | Update | Change |
|---|---|---|
| [ghcr.io/fccview/jotty](https://github.com/fccview/jotty) | minor | `1.24.0` → `1.25.1` |
| [ghcr.io/gchq/cyberchef](https://github.com/gchq/CyberChef) | minor | `11.0.0` → `11.2.0` |
| [ghcr.io/grimmory-tools/grimmory](https://github.com/grimmory-tools/grimmory) | patch | `v3.2.0` → `v3.2.2` |
| [ghcr.io/jordan-dalby/bytestash](https://github.com/jordan-dalby/ByteStash) | patch | `1.5.11` → `1.5.12` |
| [grafana/alloy](https://github.com/grafana/alloy) | minor | `v1.16.2` → `v1.17.0` |
| [plantuml/plantuml-server](https://github.com/plantuml/plantuml-server) | patch | `v1.2026.5` → `v1.2026.6` |
| victoriametrics/victoria-metrics | minor | `v1.144.0-scratch` → `v1.146.0-scratch` |
---
### Release Notes
<details>
<summary>fccview/jotty (ghcr.io/fccview/jotty)</summary>
### [`v1.25.1`](https://github.com/fccview/jotty/releases/tag/1.25.1): Stable 1.25.1
[Compare Source](https://github.com/fccview/jotty/compare/1.25.0...1.25.1)
<p align="center">
<a href="https://discord.gg/invite/mMuk2WzVZu">
<img width="40" src="https://skills.syvixor.com/api/icons?i=discord">
</a>
<a href="https://www.reddit.com/r/jotty">
<img width="40" src="https://skills.syvixor.com/api/icons?i=reddit">
</a>
<a href="https://t.me/jottypage">
<img width="40" src="https://skills.syvixor.com/api/icons?i=telegram">
</a>
<br />
<br />
<i>Join our communities</i>
<br />
</p>
***
### Changelog
Minor release to fix an annoying bug around the new kanban (sorry) and merge in [#​543](https://github.com/fccview/jotty/issues/543)
**bugfixes**
- Fix drag and drop on kanban when users don't have custom statuses
- Fix time tracking bugs and hide time tracking inconsistencies from [#​543](https://github.com/fccview/jotty/issues/543)
### [`v1.25.0`](https://github.com/fccview/jotty/releases/tag/1.25.0): Stable 1.25.0
[Compare Source](https://github.com/fccview/jotty/compare/1.24.0...1.25.0)
<p align="center">
<a href="https://discord.gg/invite/mMuk2WzVZu">
<img width="40" src="https://skills.syvixor.com/api/icons?i=discord">
</a>
<a href="https://www.reddit.com/r/jotty">
<img width="40" src="https://skills.syvixor.com/api/icons?i=reddit">
</a>
<a href="https://t.me/jottypage">
<img width="40" src="https://skills.syvixor.com/api/icons?i=telegram">
</a>
<br />
<br />
<i>Join our communities</i>
<br />
</p>
***
### Changelog
**features**
- Start work to deprecating dnd-kit and have our own lighter internal drag and drop engine
- Keep the engine generic enough to allow it to be used for pinned items/checklists/sidebar
- Migrate the entirety of Kanban to use said engine
- Kanban drag and drop now also works on mobile!
- Update styling of Kanban item modal to look a bit less chaotic
- Update Kanban item modal to grow full width/height so there's more space to work with
- Add Start Date to tasks so calendar view allows tasks to expand from start to end date (bit like google calendar)
- Improve neural network on the settings page, from a hardcoded vector style link system to a full blown obsidian-like view of the nodes, it also uses tags now for linking (you can disable the checkbox if needed). I figured I'd push it, I worked on it a while ago and for the life of me I don't know why I didn't just go for it, it's hidden in the settings, doesn't touch anything else and I feel like it's a nice feature to have, so even if it's a bit buggy we can fix forward ❤️
- Add "Archive All" option to Kanban columns that have autocomplete enabled - Thank you [@​reniko](https://github.com/reniko)
- Add consistent scrollbar across all browser/OS - Thank you [@​reniko](https://github.com/reniko)
- Add remember me toggle to login page [#​516](https://github.com/fccview/jotty/issues/516)
**bugfixes**
- Fix re-ordering children items in checklists (it was quite clunky) - Thank you [@​reniko](https://github.com/reniko)
- Fix potential issue around session write on slower disk read [#​522](https://github.com/fccview/jotty/issues/522)
- Add shared checklists to api endpoint [#​521](https://github.com/fccview/jotty/issues/521)
- Fix issue where not enough items were showing in the `@` bidirectional linking [#​529](https://github.com/fccview/jotty/issues/529)
- Mermaid sankey changed key in the latest upgrade when mermaid was bumped to `10.x` [#​528](https://github.com/fccview/jotty/issues/528)
- Fix missing "save before leaving the page" modal in some places and automatically save excalidraw on modal close [#​519](https://github.com/fccview/jotty/issues/519)
- Add Kanban status actions to card detail and overflow menu - Thank you [@​reniko](https://github.com/reniko)
- Finally officially fix the body size limit pain, this means the patch for it has also been removed. Make sure to update the hardcoded limit in settings -> app preferences -> upload limit of course. - Thank you [@​dmca-glasgow](https://github.com/dmca-glasgow) !
**security**
- As always kept on top of all the third party dependency advisories, man you can tell `Fable 5` was released, there was a huge spike in CVE in a lot of my project third party deps lol
**new endpoints**
A community member decided to make an android client for Jotty.
It's very much under development and needs polishing but the author seems quite dedicated and I kept an eye on development.
They needed some endpoints for it to work better, so what better moment than this to give them a shoutout!
Check it out here if you are interested, I am not involved in the development, I can't vouch for it, but for what I've seen so far the author ([@​Darknetzz](https://github.com/Darknetzz)) is pretty dedicated! Link here: <https://github.com/Darknetzz/jotty-android>
<details>
<summary>New endpoints curl exmaples</summary>
```bash
# Search notes and checklists
curl -H "x-api-key: YOUR_API_KEY" "https://your-jotty.com/api/search?q=hello"
# Search filtered to notes only
curl -H "x-api-key: YOUR_API_KEY" "https://your-jotty.com/api/search?q=hello&type=note"
# Search filtered to checklists only
curl -H "x-api-key: YOUR_API_KEY" "https://your-jotty.com/api/search?q=hello&type=checklist"
# Update a checklist item text (PATCH)
curl -X PATCH \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "Updated item text"}' \
"https://your-jotty.com/api/checklists/LIST_UUID/items/0"
# Update a nested checklist item (dot-notation index)
curl -X PATCH \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "Updated nested item", "description": "some notes"}' \
"https://your-jotty.com/api/checklists/LIST_UUID/items/0.1"
# Reorder items - move item before another
curl -X PUT \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"activeItemId": "ITEM_ID_TO_MOVE", "overItemId": "TARGET_ITEM_ID", "position": "before"}' \
"https://your-jotty.com/api/checklists/LIST_UUID/items/reorder"
# Reorder items - move item after another
curl -X PUT \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"activeItemId": "ITEM_ID_TO_MOVE", "overItemId": "TARGET_ITEM_ID", "position": "after"}' \
"https://your-jotty.com/api/checklists/LIST_UUID/items/reorder"
# Reorder items - nest item as child of another
curl -X PUT \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"activeItemId": "ITEM_ID_TO_MOVE", "overItemId": "PARENT_ITEM_ID", "isDropInto": true}' \
"https://your-jotty.com/api/checklists/LIST_UUID/items/reorder"
# Get all checklists with expanded item fields
curl -H "x-api-key: YOUR_API_KEY" \
"https://your-jotty.com/api/checklists"
# Get all task/Kanban boards with expanded item fields
curl -H "x-api-key: YOUR_API_KEY" \
"https://your-jotty.com/api/tasks"
# Get one task/Kanban board with expanded item fields
curl -H "x-api-key: YOUR_API_KEY" \
"https://your-jotty.com/api/tasks/TASK_UUID"
# Get one task/Kanban item
curl -H "x-api-key: YOUR_API_KEY" \
"https://your-jotty.com/api/tasks/TASK_UUID/items/0"
# Get one nested task/Kanban item (dot-notation index)
curl -H "x-api-key: YOUR_API_KEY" \
"https://your-jotty.com/api/tasks/TASK_UUID/items/0.1"
# Update checklist/Kanban item rich fields
curl -X PATCH \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"description": "Additional notes", "priority": "high", "score": 5, "startDate": "2026-06-10", "targetDate": "2026-06-15", "estimatedTime": 2.5}' \
"https://your-jotty.com/api/checklists/LIST_UUID/items/0"
# Update checklist/Kanban item text and notes
curl -X PATCH \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "Updated item text", "description": "Updated notes"}' \
"https://your-jotty.com/api/checklists/LIST_UUID/items/0"
# Update nested checklist/Kanban item rich fields (dot-notation index)
curl -X PATCH \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"priority": "critical", "score": 8, "startDate": "2026-06-13", "targetDate": "2026-06-20"}' \
"https://your-jotty.com/api/checklists/LIST_UUID/items/0.1"
# Clear optional checklist/Kanban item fields
curl -X PATCH \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"description": null, "priority": null, "score": null, "startDate": null, "targetDate": null, "estimatedTime": null}' \
"https://your-jotty.com/api/checklists/LIST_UUID/items/0"
```
</details>
</details>
<details>
<summary>gchq/CyberChef (ghcr.io/gchq/cyberchef)</summary>
### [`v11.2.0`](https://github.com/gchq/CyberChef/blob/HEAD/CHANGELOG.md#1120---2026-06-17)
[Compare Source](https://github.com/gchq/CyberChef/compare/v11.1.0...v11.2.0)
This release includes a security fix (\[[#​2569](https://github.com/gchq/CyberChef/issues/2569)])
- Security: Chart operation prototype protection \[[@​C85297](https://github.com/C85297)] | \[[#​2569](https://github.com/gchq/CyberChef/issues/2569)]
- Update website references \[[@​C85297](https://github.com/C85297)] | \[[#​2566](https://github.com/gchq/CyberChef/issues/2566)]
- Fix: Add input validation for XOR Checksum blocksize ([#​2537](https://github.com/gchq/CyberChef/issues/2537)) \[[@​dweep-js](https://github.com/dweep-js)] | \[[#​2542](https://github.com/gchq/CyberChef/issues/2542)]
- Fix: Reverse highlights unwind incorrectly \[[@​kendallgoto](https://github.com/kendallgoto)] \[[@​C85297](https://github.com/C85297)] | \[[#​2022](https://github.com/gchq/CyberChef/issues/2022)]
- Fix Uint8Array concat crash in Parse IPv4 header \[[@​Zish19](https://github.com/Zish19)] | \[[#​2409](https://github.com/gchq/CyberChef/issues/2409)]
- Fix typos and documentation errors (bytes→bits, wrong release link, spelling) \[[@​qa2me](https://github.com/qa2me)] \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2404](https://github.com/gchq/CyberChef/issues/2404)]
- Add integer check for alphabet size \[[@​heapframe](https://github.com/heapframe)] \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2458](https://github.com/gchq/CyberChef/issues/2458)]
- fix: validate hexdump width upper bound \[[@​skyswordw](https://github.com/skyswordw)] | \[[#​2514](https://github.com/gchq/CyberChef/issues/2514)]
### [`v11.1.0`](https://github.com/gchq/CyberChef/blob/HEAD/CHANGELOG.md#1110---2026-06-13)
[Compare Source](https://github.com/gchq/CyberChef/compare/v11.0.0...v11.1.0)
This release includes a security fix (\[[#​2557](https://github.com/gchq/CyberChef/issues/2557)])
- Security: Add fix, and tests, for Lorem Ipsum DoS issue \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2557](https://github.com/gchq/CyberChef/issues/2557)]
- chore (deps): bump the patch-updates group with 4 updates | \[[#​2552](https://github.com/gchq/CyberChef/issues/2552)]
- chore (deps): bump the actions-dependencies group with 2 updates | \[[#​2551](https://github.com/gchq/CyberChef/issues/2551)]
- chore (deps): bump the docker-dependencies group with 2 updates | \[[#​2550](https://github.com/gchq/CyberChef/issues/2550)]
- chore (deps): bump protobufjs from 8.5.0 to 8.6.2 in the minor-updates group | \[[#​2553](https://github.com/gchq/CyberChef/issues/2553)]
- Security Policy Update \[[@​C85297](https://github.com/C85297)] | \[[#​2547](https://github.com/gchq/CyberChef/issues/2547)]
- Fix spurious error messages generated during webpack build \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2545](https://github.com/gchq/CyberChef/issues/2545)]
- chore (deps): bump shell-quote from 1.8.3 to 1.8.4 | \[[#​2543](https://github.com/gchq/CyberChef/issues/2543)]
- Implementing ROR13 feature \[[@​Fufu-btw](https://github.com/Fufu-btw)] | \[[#​2539](https://github.com/gchq/CyberChef/issues/2539)]
- New operation improvements \[[@​jl5193](https://github.com/jl5193)] \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​1431](https://github.com/gchq/CyberChef/issues/1431)]
- Npm and yarn/major version updates \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2527](https://github.com/gchq/CyberChef/issues/2527)]
- Update README to reflect AES Decrypt changes \[[@​andreasrtv](https://github.com/andreasrtv)] | \[[#​2502](https://github.com/gchq/CyberChef/issues/2502)]
- feat: add Escape Smart Characters operation \[[@​HarelKatz](https://github.com/HarelKatz)] | \[[#​2391](https://github.com/gchq/CyberChef/issues/2391)]
- feat: Get AES IV from input (QoL) \[[@​andreasrtv](https://github.com/andreasrtv)] | \[[#​2471](https://github.com/gchq/CyberChef/issues/2471)]
- fix: validate text encoding options \[[@​SyedIshmumAhnaf](https://github.com/SyedIshmumAhnaf)] | \[[#​2497](https://github.com/gchq/CyberChef/issues/2497)]
- chore (deps): bump the minor-updates group with 5 updates \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2500](https://github.com/gchq/CyberChef/issues/2500)]
- chore (deps): bump the patch-updates group with 2 updates | \[[#​2499](https://github.com/gchq/CyberChef/issues/2499)]
- chore (deps): bump nginxinc/nginx-unprivileged from `df0e9ed` to `0a1e718` in the docker-dependencies group | \[[#​2498](https://github.com/gchq/CyberChef/issues/2498)]
- Add remove ANSI escape codes operation \[[@​Louis-Ladd](https://github.com/Louis-Ladd)] \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2143](https://github.com/gchq/CyberChef/issues/2143)]
- Fix option ingredients being overwriten \[[@​C85297](https://github.com/C85297)] | \[[#​2341](https://github.com/gchq/CyberChef/issues/2341)]
- chore (deps): bump qs and express | \[[#​2478](https://github.com/gchq/CyberChef/issues/2478)]
- chore (deps): bump tmp from 0.2.5 to 0.2.7 | \[[#​2479](https://github.com/gchq/CyberChef/issues/2479)]
- chore (deps): bump the patch-updates group across 1 directory with 6 updates | \[[#​2463](https://github.com/gchq/CyberChef/issues/2463)]
- chore (deps): bump the docker-dependencies group across 1 directory with 2 updates | \[[#​2468](https://github.com/gchq/CyberChef/issues/2468)]
- chore (deps): bump terser from 5.46.2 to 5.48.0 | \[[#​2385](https://github.com/gchq/CyberChef/issues/2385)]
- Make dependabot quieter \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2467](https://github.com/gchq/CyberChef/issues/2467)]
- update sitemap \[[@​Blank0120](https://github.com/Blank0120)] | \[[#​2443](https://github.com/gchq/CyberChef/issues/2443)]
- Bump webpack-dev-server to 5.2.4 \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2417](https://github.com/gchq/CyberChef/issues/2417)]
- Fix pgp tests \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] \[[@​C85297](https://github.com/C85297)] | \[[#​2461](https://github.com/gchq/CyberChef/issues/2461)]
- chore (deps): bump the patch-updates group across 1 directory with 4 updates | \[[#​2438](https://github.com/gchq/CyberChef/issues/2438)]
- chore (deps): bump docker/setup-buildx-action from 4.0.0 to 4.1.0 | \[[#​2439](https://github.com/gchq/CyberChef/issues/2439)]
- chore (deps): bump docker/login-action from 4.1.0 to 4.2.0 | \[[#​2441](https://github.com/gchq/CyberChef/issues/2441)]
- chore (deps): bump docker/metadata-action from 6.0.0 to 6.1.0 | \[[#​2442](https://github.com/gchq/CyberChef/issues/2442)]
- update bson \[[@​Blank0120](https://github.com/Blank0120)] \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2425](https://github.com/gchq/CyberChef/issues/2425)]
- chore (deps): bump webpack from 5.106.2 to 5.107.1 | \[[#​2428](https://github.com/gchq/CyberChef/issues/2428)]
- chore (deps): bump protobufjs from 7.5.8 to 7.6.0 | \[[#​2429](https://github.com/gchq/CyberChef/issues/2429)]
- chore (deps): bump sql-formatter from 15.7.4 to 15.8.0 | \[[#​2430](https://github.com/gchq/CyberChef/issues/2430)]
- chore (deps): bump docker/build-push-action from 7.1.0 to 7.2.0 | \[[#​2431](https://github.com/gchq/CyberChef/issues/2431)]
- Fix flaky `npm run testui` \[[@​lzandman](https://github.com/lzandman)] | \[[#​2412](https://github.com/gchq/CyberChef/issues/2412)]
- Include git ref in website download zip name \[[@​C85297](https://github.com/C85297)] | \[[#​2339](https://github.com/gchq/CyberChef/issues/2339)]
- Bump nginxinc/nginx-unprivileged from `808f784` to `b9f7ba1` | \[[#​2389](https://github.com/gchq/CyberChef/issues/2389)]
- Series Chart HTML Formatting fix \[[@​C85297](https://github.com/C85297)] | \[[#​2403](https://github.com/gchq/CyberChef/issues/2403)]
- Parse Ethernet Frame HTML formatting fix \[[@​C85297](https://github.com/C85297)] | \[[#​2402](https://github.com/gchq/CyberChef/issues/2402)]
- Parse IPv4 Header HTML formatting fix \[[@​C85297](https://github.com/C85297)] | \[[#​2401](https://github.com/gchq/CyberChef/issues/2401)]
- Update chromedriver, and install corresponding chrome in workflows (fixes build) \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2387](https://github.com/gchq/CyberChef/issues/2387)]
- chore (deps): bump [@​codemirror/view](https://github.com/codemirror/view) from 6.41.1 to 6.43.0 | \[[#​2384](https://github.com/gchq/CyberChef/issues/2384)]
- chore (deps): bump globals from 17.5.0 to 17.6.0 | \[[#​2386](https://github.com/gchq/CyberChef/issues/2386)]
- chore (deps): bump the patch-updates group across 1 directory with 3 updates | \[[#​2388](https://github.com/gchq/CyberChef/issues/2388)]
- \[StepSecurity] Apply security best practices \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] StepSecurity Bot <bot@stepsecurity.io> | \[[#​2378](https://github.com/gchq/CyberChef/issues/2378)]
- Build docker container for arm v7 as well \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2379](https://github.com/gchq/CyberChef/issues/2379)]
- chore (deps): bump fast-uri from 3.1.0 to 3.1.2 | \[[#​2372](https://github.com/gchq/CyberChef/issues/2372)]
- update bcryptjs \[[@​C85297](https://github.com/C85297)] \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2368](https://github.com/gchq/CyberChef/issues/2368)]
- chore (deps): bump picomatch from 2.3.1 to 2.3.2 | \[[#​2370](https://github.com/gchq/CyberChef/issues/2370)]
- chore (deps): bump ip-address from 10.1.0 to 10.2.0 | \[[#​2371](https://github.com/gchq/CyberChef/issues/2371)]
- chore (deps): bump axios from 1.15.0 to 1.16.0 | \[[#​2369](https://github.com/gchq/CyberChef/issues/2369)]
- feat(operation-wrap): add new Wrap operation to format text at specified line width \[[@​0xff1ce](https://github.com/0xff1ce)] | \[[#​1882](https://github.com/gchq/CyberChef/issues/1882)]
- chore (deps): bump the patch-updates group across 1 directory with 5 updates | \[[#​2354](https://github.com/gchq/CyberChef/issues/2354)]
- chore (deps): bump docker/login-action from 3 to 4 | \[[#​2363](https://github.com/gchq/CyberChef/issues/2363)]
- chore (deps): bump docker/setup-buildx-action from 3 to 4 | \[[#​2364](https://github.com/gchq/CyberChef/issues/2364)]
- chore (deps): bump crazy-max/ghaction-github-pages from 3 to 5 | \[[#​2365](https://github.com/gchq/CyberChef/issues/2365)]
- chore (deps): bump docker/metadata-action from 4 to 6 | \[[#​2366](https://github.com/gchq/CyberChef/issues/2366)]
- chore (deps): bump docker/setup-qemu-action from 3 to 4 | \[[#​2367](https://github.com/gchq/CyberChef/issues/2367)]
- Update dependabot for Node 24. \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2361](https://github.com/gchq/CyberChef/issues/2361)]
- chore (deps): bump uuid from 13.0.0 to 14.0.0 | \[[#​2332](https://github.com/gchq/CyberChef/issues/2332)]
- chore (deps): bump webpack-bundle-analyzer from 5.2.0 to 5.3.0 | \[[#​2353](https://github.com/gchq/CyberChef/issues/2353)]
- Fix all zeros after 16384 bytes with Blake3 \[[@​zachbowden](https://github.com/zachbowden)] \[[@​GCHQDeveloper581](https://github.com/GCHQDeveloper581)] | \[[#​2351](https://github.com/gchq/CyberChef/issues/2351)]
</details>
<details>
<summary>grimmory-tools/grimmory (ghcr.io/grimmory-tools/grimmory)</summary>
### [`v3.2.2`](https://github.com/grimmory-tools/grimmory/releases/tag/v3.2.2)
[Compare Source](https://github.com/grimmory-tools/grimmory/compare/v3.2.1...v3.2.2)
This patch release of Grimmory is focused on bug fixes. It fixes folder watcher SQL errors, correctly applies library restrictions to the OPDS shelf catalogs, fixes a bug affecting bookdrop on QNAP devices, ensures non-admin users are assigned at least one library, and more.
#### Changelog
**Full Changelog**: <https://github.com/grimmory-tools/grimmory/compare/v3.2.1...v3.2.2>
##### Bug Fixes
- **bookdrop:** directly copy instead of move between filesystems ([#​1759](https://github.com/grimmory-tools/grimmory/issues/1759)) ([64ddbe5](https://github.com/grimmory-tools/grimmory/commit/64ddbe550c5b9b44ed92f79dbc2e197c13d653e0))
- **event-processor:** avoid invalid query during watch folder processing ([#​1803](https://github.com/grimmory-tools/grimmory/issues/1803)) ([6d14043](https://github.com/grimmory-tools/grimmory/commit/6d1404394935cbd8b77833c4d554edc3528b7d52))
- **metadata-refresh:** add audible to metadata refresh ([#​1779](https://github.com/grimmory-tools/grimmory/issues/1779)) ([e4ebe97](https://github.com/grimmory-tools/grimmory/commit/e4ebe97e20e123c2a9d97b5082469761b9ad5942))
- **opds:** add library restrictions to shelf OPDS catalogs ([#​1731](https://github.com/grimmory-tools/grimmory/issues/1731)) ([0cc48a8](https://github.com/grimmory-tools/grimmory/commit/0cc48a8d0ce634ed67bbd413519e700b30c55659))
- **user-managment:** non-admin users must be assigned atleast one lib… ([#​1741](https://github.com/grimmory-tools/grimmory/issues/1741)) ([2b8ac73](https://github.com/grimmory-tools/grimmory/commit/2b8ac7393ee609f7ad41b80ed5a4ee57a3c67893))
##### Refactors
- **ui:** new component library ([#​1740](https://github.com/grimmory-tools/grimmory/issues/1740)) ([3e5d85b](https://github.com/grimmory-tools/grimmory/commit/3e5d85bfc1359f844d84320e2d1258fd7489d255))
##### Chores
- **deps:** bump [@​angular/common](https://github.com/angular/common) from 21.2.15 to 21.2.17 ([#​1756](https://github.com/grimmory-tools/grimmory/issues/1756)) ([1afe9de](https://github.com/grimmory-tools/grimmory/commit/1afe9de0540227a84bc98cf076c67d97c1160978))
- **deps:** bump [@​angular/compiler](https://github.com/angular/compiler) from 21.2.15 to 21.2.17 ([#​1757](https://github.com/grimmory-tools/grimmory/issues/1757)) ([467aa1b](https://github.com/grimmory-tools/grimmory/commit/467aa1b4e6aff3a3e340298a5d0b25297cd6a6c5))
- **deps:** bump [@​angular/core](https://github.com/angular/core) from 21.2.15 to 21.2.17 ([#​1753](https://github.com/grimmory-tools/grimmory/issues/1753)) ([a738124](https://github.com/grimmory-tools/grimmory/commit/a738124f25e908df01a37cbf87677cf2819882a9))
- **deps:** bump [@​angular/service-worker](https://github.com/angular/service-worker) from 21.2.15 to 21.2.17 ([#​1755](https://github.com/grimmory-tools/grimmory/issues/1755)) ([70a0b51](https://github.com/grimmory-tools/grimmory/commit/70a0b516ac71da2588ae68f852930970dc9a0ffe))
- **deps:** bump EnricoMi/publish-unit-test-result-action from 2.23.0 to 2.24.0 ([#​1767](https://github.com/grimmory-tools/grimmory/issues/1767)) ([6711aba](https://github.com/grimmory-tools/grimmory/commit/6711aba1d1ccc7a13941ebce8254ff4cdb736963))
- **deps:** bump pnpm/action-setup from 6.0.8 to 6.0.9 ([#​1766](https://github.com/grimmory-tools/grimmory/issues/1766)) ([008f8fe](https://github.com/grimmory-tools/grimmory/commit/008f8fef76f403c88d55cfb26ed7723781583a51))
- **deps:** bump semantic-release from 25.0.3 to 25.0.5 in the release-tooling group across 1 directory ([#​1769](https://github.com/grimmory-tools/grimmory/issues/1769)) ([7729c76](https://github.com/grimmory-tools/grimmory/commit/7729c769d3592e13a37d7baedc3d2029842e78de))
- **deps:** bump taiki-e/install-action from 2.81.5 to 2.81.11 ([#​1768](https://github.com/grimmory-tools/grimmory/issues/1768)) ([dee01c4](https://github.com/grimmory-tools/grimmory/commit/dee01c473563ac5d9a45fbab3a47febc0381644e))
- **deps:** bump the frontend group across 1 directory with 24 updates ([#​1771](https://github.com/grimmory-tools/grimmory/issues/1771)) ([692c2ea](https://github.com/grimmory-tools/grimmory/commit/692c2eabfb2964a1721a5be417016f5d1227e990))
- **deps:** bump the gradle-dependencies group across 1 directory with 5 updates ([#​1770](https://github.com/grimmory-tools/grimmory/issues/1770)) ([2f3e3be](https://github.com/grimmory-tools/grimmory/commit/2f3e3be866f62b696206f839aedb55c55a008eee))
- **helm:** add extra env to deployment ([#​1661](https://github.com/grimmory-tools/grimmory/issues/1661)) ([bd5c920](https://github.com/grimmory-tools/grimmory/commit/bd5c9203733ee5f4d80d87fdf73e807e5a6dbc5f))
- **i18n:** update translations from Weblate ([#​1748](https://github.com/grimmory-tools/grimmory/issues/1748)) ([763d732](https://github.com/grimmory-tools/grimmory/commit/763d732331f8bc13305f342e120424f69d0a19dd))
- **pdf-reader:** drop redundant pdf in-memory caching ([#​1754](https://github.com/grimmory-tools/grimmory/issues/1754)) ([8da867d](https://github.com/grimmory-tools/grimmory/commit/8da867d1acb1edcd7af9915f17c69383f9437ea2))
#### Contributors
We'd like to thank the contributors for this release for taking the time to make Grimmory better.
Including but not limited to: [@​geneliu](https://github.com/geneliu) [@​imnotjames](https://github.com/imnotjames) [@​idriss-mechkene](https://github.com/idriss-mechkene) [@​alexhb1](https://github.com/alexhb1)
#### New Contributors
- [@​geneliu](https://github.com/geneliu) made their first contribution in [#​1661](https://github.com/grimmory-tools/grimmory/pull/1661)
- [@​idriss-mechkene](https://github.com/idriss-mechkene) made their first contribution in [#​1741](https://github.com/grimmory-tools/grimmory/pull/1741)
### [`v3.2.1`](https://github.com/grimmory-tools/grimmory/releases/tag/v3.2.1)
[Compare Source](https://github.com/grimmory-tools/grimmory/compare/v3.2.0...v3.2.1)
This release of Grimmory is focused on bug fixes. It fixes content restrictions applied to the book's page endpoint, drops the Blackbird library to prevent JSON serialization errors, fixes public shelves not showing up for books, fixes bidirectional KOReader sync in some cases, and improves reactivity across the UI. Furthermore, there are performance improvements in the book ingest pipeline and reductions in memory usage due to file downloads.
#### Changelog
**Full Changelog**: <https://github.com/grimmory-tools/grimmory/compare/v3.2.0...v3.2.1>
##### Bug Fixes
- **api:** fix content restrictions for `api/v1/books/page` ([#​1706](https://github.com/grimmory-tools/grimmory/issues/1706)) ([a93bc5f](https://github.com/grimmory-tools/grimmory/commit/a93bc5f2848b4ab80fdc88e63d4356f4fc960f3e))
- **book-details:** fall back from invalid book detail tabs ([#​1685](https://github.com/grimmory-tools/grimmory/issues/1685)) ([46f4457](https://github.com/grimmory-tools/grimmory/commit/46f4457feea42b913670d79efed826c66d66657a))
- **download:** stream book downloads instead of buffering in browser ([#​1718](https://github.com/grimmory-tools/grimmory/issues/1718)) ([7f38de8](https://github.com/grimmory-tools/grimmory/commit/7f38de817bed76d198a9790b34fabf0620c34af7))
- drop blackbird to avoid serialization failure states ([#​1513](https://github.com/grimmory-tools/grimmory/issues/1513)) ([65f3f85](https://github.com/grimmory-tools/grimmory/commit/65f3f85a9b76fe591d23121592124991bfdf29ea))
- handle multiple book files with the same checksum ([#​1724](https://github.com/grimmory-tools/grimmory/issues/1724)) ([0cc918f](https://github.com/grimmory-tools/grimmory/commit/0cc918f0ace85142f11e91982c3e8b15fcc826af))
- **helm:** add startup probe to helm chart ([#​1712](https://github.com/grimmory-tools/grimmory/issues/1712)) ([f13538a](https://github.com/grimmory-tools/grimmory/commit/f13538a8be4bd0fc51e7ec1235c98fd6f2e48e99))
- **koreader:** fix bidirectional progress sync ([#​1687](https://github.com/grimmory-tools/grimmory/issues/1687)) ([590bd9e](https://github.com/grimmory-tools/grimmory/commit/590bd9eea53be68ef37888df5241629fa3a632bb))
- library stats showing 0KB due to incorrect fileSizeKb field path ([#​1436](https://github.com/grimmory-tools/grimmory/issues/1436)) ([f3dacb9](https://github.com/grimmory-tools/grimmory/commit/f3dacb99b28aca1ef72214a4d7dc002f163a422f))
- **login:** fix oidc login button on light mode ([#​1682](https://github.com/grimmory-tools/grimmory/issues/1682)) ([d1298af](https://github.com/grimmory-tools/grimmory/commit/d1298afc452afd51c5ea129e461afb5c210f65f9))
- **metadata:** extract epub titles per spec with regards to ordering ([#​1637](https://github.com/grimmory-tools/grimmory/issues/1637)) ([d775011](https://github.com/grimmory-tools/grimmory/commit/d77501125fa7b1d3d85e86e44478ff5e5cbccd93))
- **reader:** switch header/footer hover zones from static heights to dynamic ([#​1716](https://github.com/grimmory-tools/grimmory/issues/1716)) ([a44197e](https://github.com/grimmory-tools/grimmory/commit/a44197e8cea02a44a645726e3bdd18defde70b86))
- **shelf:** fix public shelf book visibility ([#​1735](https://github.com/grimmory-tools/grimmory/issues/1735)) ([48eefc0](https://github.com/grimmory-tools/grimmory/commit/48eefc03c2f6f5548b8c2a5497fee63f80d1a829))
- **ui:** convert device settings state to signals ([#​1635](https://github.com/grimmory-tools/grimmory/issues/1635)) ([f6661fe](https://github.com/grimmory-tools/grimmory/commit/f6661fec0b5660bb4d792142cedf7ed6a4ff7da6))
- **ui:** no libraries assigned label ([#​1736](https://github.com/grimmory-tools/grimmory/issues/1736)) ([0625095](https://github.com/grimmory-tools/grimmory/commit/0625095e1a0050b55ecce7ca6423c090397dbabf))
- **ui:** use signals for OIDC settings ([#​1737](https://github.com/grimmory-tools/grimmory/issues/1737)) ([d5f652f](https://github.com/grimmory-tools/grimmory/commit/d5f652f8fa5466d45a13433eee0897a9c24c64c8))
- **ui:** use signals for user management to improve reactivity ([#​1726](https://github.com/grimmory-tools/grimmory/issues/1726)) ([f2b7cdc](https://github.com/grimmory-tools/grimmory/commit/f2b7cdc3528426818759479170341bdcc59a853b))
##### Performance
- **db:** add missing `book_file` indices for ingestion lookups ([#​1729](https://github.com/grimmory-tools/grimmory/issues/1729)) ([a86dfb2](https://github.com/grimmory-tools/grimmory/commit/a86dfb23dda03b69b3e223e48fd1b6fc5c0b24f5))
- **download:** stream all book downloads via `StreamingResponseBody` ([#​1722](https://github.com/grimmory-tools/grimmory/issues/1722)) ([798767c](https://github.com/grimmory-tools/grimmory/commit/798767c08283a454ae03543c4f59e8049a25da21))
##### Chores
- **deps:** bump docker/metadata-action from 6.0.0 to 6.1.0 ([#​1650](https://github.com/grimmory-tools/grimmory/issues/1650)) ([abe1258](https://github.com/grimmory-tools/grimmory/commit/abe1258e9d91693f7fe4a07a4a60a59dbe3c84b2))
- **deps:** bump docker/setup-buildx-action from 4.0.0 to 4.1.0 ([#​1648](https://github.com/grimmory-tools/grimmory/issues/1648)) ([851fa40](https://github.com/grimmory-tools/grimmory/commit/851fa40c984f667fb1b894c6afcc29e2f4792b11))
- **deps:** bump github/codeql-action from 4.36.1 to 4.36.2 ([#​1651](https://github.com/grimmory-tools/grimmory/issues/1651)) ([8a06943](https://github.com/grimmory-tools/grimmory/commit/8a06943b3eed86abf7801e84fa140075cfea8a2e))
- **deps:** bump hono from 4.12.18 to 4.12.23 in /frontend ([#​1642](https://github.com/grimmory-tools/grimmory/issues/1642)) ([43b3c5d](https://github.com/grimmory-tools/grimmory/commit/43b3c5d130ec3ebce514e0d55bff340eaf4e9ad3))
- **deps:** bump taiki-e/install-action from 2.77.6 to 2.81.5 ([#​1649](https://github.com/grimmory-tools/grimmory/issues/1649)) ([436d04c](https://github.com/grimmory-tools/grimmory/commit/436d04c5acc837b28511d71a0b11ef76f1fe2efd))
- **deps:** bump the gradle-dependencies group across 1 directory with 4 updates ([#​1646](https://github.com/grimmory-tools/grimmory/issues/1646)) ([d6a88a3](https://github.com/grimmory-tools/grimmory/commit/d6a88a32f6f1687a4d53951bfac34a6f0afbbff5))
- **deps:** bump the npm-dependencies group in /frontend with 25 updates ([#​1647](https://github.com/grimmory-tools/grimmory/issues/1647)) ([1ffbd54](https://github.com/grimmory-tools/grimmory/commit/1ffbd543e9938321592f9945d691284b0a557165))
- **i18n:** update translations from Weblate ([#​1644](https://github.com/grimmory-tools/grimmory/issues/1644)) ([11febb9](https://github.com/grimmory-tools/grimmory/commit/11febb9d40336596feedece540507f7d61371d90))
- **i18n:** update translations from Weblate ([#​1665](https://github.com/grimmory-tools/grimmory/issues/1665)) ([2675c4a](https://github.com/grimmory-tools/grimmory/commit/2675c4a04ac418138bb911e7b88650a98a87ccbe))
- **i18n:** update translations from Weblate ([#​1678](https://github.com/grimmory-tools/grimmory/issues/1678)) ([1037757](https://github.com/grimmory-tools/grimmory/commit/103775710be9da26bc4bcdfa4ed926083e400b9f))
- **i18n:** update translations from Weblate ([#​1679](https://github.com/grimmory-tools/grimmory/issues/1679)) ([1b64f13](https://github.com/grimmory-tools/grimmory/commit/1b64f13033045c7869ed12c2ffc296d0d0bdbc3d))
- **i18n:** update translations from Weblate ([#​1686](https://github.com/grimmory-tools/grimmory/issues/1686)) ([6b28d14](https://github.com/grimmory-tools/grimmory/commit/6b28d14ba2f98e39e943e236aa541d99c9555383))
- **repo:** migrate from yarn to pnpm ([#​1598](https://github.com/grimmory-tools/grimmory/issues/1598)) ([e83a143](https://github.com/grimmory-tools/grimmory/commit/e83a143c36e9890ffb22e5e937d0a21e423aec06))
- **ui:** add warning for goodreads metadata provider ([#​1732](https://github.com/grimmory-tools/grimmory/issues/1732)) ([b25a3f5](https://github.com/grimmory-tools/grimmory/commit/b25a3f5b87e5e91a960e3e1f9ef50938adc3a9d6))
- **ui:** normalise text size and spacing ([#​1656](https://github.com/grimmory-tools/grimmory/issues/1656)) ([349f046](https://github.com/grimmory-tools/grimmory/commit/349f04606265d40613ce4cdba9f54b9c8c3d6215))
##### Documentation
- document Weblate translation workflows ([#​1643](https://github.com/grimmory-tools/grimmory/issues/1643)) ([d929cd2](https://github.com/grimmory-tools/grimmory/commit/d929cd2df649a61a888c37d306739dc4425156c3))
- update README badges for consistency ([#​1645](https://github.com/grimmory-tools/grimmory/issues/1645)) ([7129d3c](https://github.com/grimmory-tools/grimmory/commit/7129d3cf82e10ec07e6a6b0a665edc3b3c5dcae0))
#### Contributors
We'd like to thank the contributors for this release for taking the time to make Grimmory better.
Including but not limited to: [@​zachyale](https://github.com/zachyale) [@​alexhb1](https://github.com/alexhb1) [@​DeeWooo](https://github.com/DeeWooo) [@​imnotjames](https://github.com/imnotjames) [@​raphkun](https://github.com/raphkun)
#### New Contributors
- [@​DeeWooo](https://github.com/DeeWooo) made their first contribution in [#​1436](https://github.com/grimmory-tools/grimmory/pull/1436)
- [@​raphkun](https://github.com/raphkun) made their first contribution in [#​1726](https://github.com/grimmory-tools/grimmory/pull/1726)
</details>
<details>
<summary>jordan-dalby/ByteStash (ghcr.io/jordan-dalby/bytestash)</summary>
### [`v1.5.12`](https://github.com/jordan-dalby/ByteStash/releases/tag/v1.5.12)
[Compare Source](https://github.com/jordan-dalby/ByteStash/compare/v1.5.11...v1.5.12)
#### What's Changed
- Added basepath to OpenInNewTab handler by [@​gatherfetch](https://github.com/gatherfetch) in [#​326](https://github.com/jordan-dalby/ByteStash/pull/326)
- \[feat] Add mermaid diagram rendering support by [@​jospaquim](https://github.com/jospaquim) in [#​328](https://github.com/jordan-dalby/ByteStash/pull/328)
- feat(i18n): add comprehensive Spanish (es-ES) localization by [@​jospaquim](https://github.com/jospaquim) in [#​329](https://github.com/jordan-dalby/ByteStash/pull/329)
- feat(i18n): add comprehensive Japanese (ja-JP) localization by [@​yudukiak](https://github.com/yudukiak) in [#​331](https://github.com/jordan-dalby/ByteStash/pull/331)
- feat(ui): add native github-flavored markdown tables with typography styling by [@​jospaquim](https://github.com/jospaquim) in [#​330](https://github.com/jordan-dalby/ByteStash/pull/330)
- \[chore] changed version number to 1.5.12 to prepare for upcoming release by [@​jordan-dalby](https://github.com/jordan-dalby) in [#​332](https://github.com/jordan-dalby/ByteStash/pull/332)
- feat: editor and viewer UI overhaul with VS Code styling and native icons by [@​jospaquim](https://github.com/jospaquim) in [#​333](https://github.com/jordan-dalby/ByteStash/pull/333)
- feat(i18n): add comprehensive sChinese (zh-CN) localization by [@​xjndfdfe](https://github.com/xjndfdfe) in [#​335](https://github.com/jordan-dalby/ByteStash/pull/335)
- feat(client): implement code wrapper export to image like carbon by [@​jospaquim](https://github.com/jospaquim) in [#​337](https://github.com/jordan-dalby/ByteStash/pull/337)
- feat(i18n): add comprehensive Italian (it) localization by [@​albyalex96](https://github.com/albyalex96) in [#​340](https://github.com/jordan-dalby/ByteStash/pull/340)
- \[fix] OIDC logout and login error for Google SSO by [@​dannyyy](https://github.com/dannyyy) in [#​343](https://github.com/jordan-dalby/ByteStash/pull/343)
- fix: allow snippet API key authentication by [@​SirEdvin](https://github.com/SirEdvin) in [#​347](https://github.com/jordan-dalby/ByteStash/pull/347)
- Feature: Add a dev environment for ByteStash using containerization and nvm. by [@​MahakSangwan](https://github.com/MahakSangwan) in [#​350](https://github.com/jordan-dalby/ByteStash/pull/350)
- Add remote MCP endpoint for AI clients (Claude, OpenAI, Perplexity) by [@​juliuszfedyk-ai](https://github.com/juliuszfedyk-ai) in [#​351](https://github.com/jordan-dalby/ByteStash/pull/351)
- \[bug] updated swagger.yml to reflect new API routes by [@​jordan-dalby](https://github.com/jordan-dalby) in [#​353](https://github.com/jordan-dalby/ByteStash/pull/353)
#### New Contributors
- [@​gatherfetch](https://github.com/gatherfetch) made their first contribution in [#​326](https://github.com/jordan-dalby/ByteStash/pull/326)
- [@​jospaquim](https://github.com/jospaquim) made their first contribution in [#​328](https://github.com/jordan-dalby/ByteStash/pull/328)
- [@​yudukiak](https://github.com/yudukiak) made their first contribution in [#​331](https://github.com/jordan-dalby/ByteStash/pull/331)
- [@​xjndfdfe](https://github.com/xjndfdfe) made their first contribution in [#​335](https://github.com/jordan-dalby/ByteStash/pull/335)
- [@​albyalex96](https://github.com/albyalex96) made their first contribution in [#​340](https://github.com/jordan-dalby/ByteStash/pull/340)
- [@​dannyyy](https://github.com/dannyyy) made their first contribution in [#​343](https://github.com/jordan-dalby/ByteStash/pull/343)
- [@​SirEdvin](https://github.com/SirEdvin) made their first contribution in [#​347](https://github.com/jordan-dalby/ByteStash/pull/347)
- [@​MahakSangwan](https://github.com/MahakSangwan) made their first contribution in [#​350](https://github.com/jordan-dalby/ByteStash/pull/350)
- [@​juliuszfedyk-ai](https://github.com/juliuszfedyk-ai) made their first contribution in [#​351](https://github.com/jordan-dalby/ByteStash/pull/351)
**Full Changelog**: <https://github.com/jordan-dalby/ByteStash/compare/v1.5.11...v1.5.12>
</details>
<details>
<summary>grafana/alloy (grafana/alloy)</summary>
### [`v1.17.0`](https://github.com/grafana/alloy/releases/tag/v1.17.0)
[Compare Source](https://github.com/grafana/alloy/compare/v1.16.3...v1.17.0)
##### Features 🌟
- Add gql subcommand ([#​6242](https://github.com/grafana/alloy/issues/6242)) ([ec09c43](https://github.com/grafana/alloy/commit/ec09c439407e61757bd2c626f86ada17dba9b262)) ([@​jharvey10](https://github.com/jharvey10))
- **database\_observability.mysql:** Add database\_observability\_wait\_event\_seconds\_total counter ([#​6106](https://github.com/grafana/alloy/issues/6106)) ([602b0b5](https://github.com/grafana/alloy/commit/602b0b54bc65290862920f5a6cd0a5ac949c092d)) ([@​gaantunes](https://github.com/gaantunes))
- **database\_observability.mysql:** Refactor bulk table metadata collection ([#​6222](https://github.com/grafana/alloy/issues/6222)) ([e8d441b](https://github.com/grafana/alloy/commit/e8d441bb7f3f582627bf364f6e4529d32db0f177)) ([@​cristiangreco](https://github.com/cristiangreco))
- **database\_observability.mysql:** Refactor schema\_details logging strategy ([#​6239](https://github.com/grafana/alloy/issues/6239)) ([fd51530](https://github.com/grafana/alloy/commit/fd5153020f1561433a868e8a51ddc9f76b23f506)) ([@​cristiangreco](https://github.com/cristiangreco))
- **database\_observability.postgres:** Add `exclude_current_user` top-level setting ([#​6187](https://github.com/grafana/alloy/issues/6187)) ([f019b5e](https://github.com/grafana/alloy/commit/f019b5e6c60c10485db48fec9eeb2f932f191068)) ([@​cristiangreco](https://github.com/cristiangreco), [@​matthewnolf](https://github.com/matthewnolf))
- **database\_observability.postgres:** Improve monitoring user privileges check ([#​6177](https://github.com/grafana/alloy/issues/6177)) ([96b50d1](https://github.com/grafana/alloy/commit/96b50d1cc734fa5cffbc6cf68fcd832b754fd92d)) ([@​cristiangreco](https://github.com/cristiangreco))
- **database\_observability.postgres:** Make health\_check respect user/database exclusions settings ([#​6144](https://github.com/grafana/alloy/issues/6144)) ([b4ee0a7](https://github.com/grafana/alloy/commit/b4ee0a77cec0ed8fd7ce3d8cd2ad8e886acfea09)) ([@​cristiangreco](https://github.com/cristiangreco))
- **database\_observability.postgres:** Throttle schema details create\_statement logs ([#​6260](https://github.com/grafana/alloy/issues/6260)) ([fcb3d3e](https://github.com/grafana/alloy/commit/fcb3d3ef3cc390424def01a7e7f62d8ce6cfb32d)) ([@​cristiangreco](https://github.com/cristiangreco))
- **database\_observability:** Add wait\_event\_v2 op with pre-classified wait\_event\_type ([#​6105](https://github.com/grafana/alloy/issues/6105)) ([f7a1ebd](https://github.com/grafana/alloy/commit/f7a1ebd769e04924adad69f2e082ce92c85b5977)) ([@​gaantunes](https://github.com/gaantunes))
- **database\_observability:** Always extract traceparent in MySQL query\_samples collector ([#​6081](https://github.com/grafana/alloy/issues/6081)) ([bf2b436](https://github.com/grafana/alloy/commit/bf2b436f55fa9cf0eb7c2c2400c4c646b8a8ecb8)) ([@​fridgepoet](https://github.com/fridgepoet))
- **database\_observability:** Always extract traceparent in Postgres query\_samples collector ([#​6411](https://github.com/grafana/alloy/issues/6411)) ([74d595a](https://github.com/grafana/alloy/commit/74d595ab2ce8f7ccc86f558ad512eb75a40f4cfc)) ([@​fridgepoet](https://github.com/fridgepoet))
- **database\_observability:** Set query\_sample, wait\_event timestamps at query start for MySQL ([#​6291](https://github.com/grafana/alloy/issues/6291)) ([a47de00](https://github.com/grafana/alloy/commit/a47de00d07475f2fdc54249e021fc39f2a4281df)) ([@​fridgepoet](https://github.com/fridgepoet))
- **database\_observability:** Set timestamp query\_sample at query start for Postgres ([#​6393](https://github.com/grafana/alloy/issues/6393)) ([62d8ecc](https://github.com/grafana/alloy/commit/62d8ecc299cb976e33d5dd340cafe9e675d5d547)) ([@​fridgepoet](https://github.com/fridgepoet))
- **database\_observability:** Update wait\_event\_v2 to a 6-bucket taxonomy and surface Mysql nested events ([#​6143](https://github.com/grafana/alloy/issues/6143)) ([3df9542](https://github.com/grafana/alloy/commit/3df95423c5609b484c79dcd212fcc3e44b194857)) ([@​gaantunes](https://github.com/gaantunes), [@​cristiangreco](https://github.com/cristiangreco))
- **faro.receiver:** Support gzip-compressed request bodies ([#​6195](https://github.com/grafana/alloy/issues/6195)) ([4fa44d2](https://github.com/grafana/alloy/commit/4fa44d2e014392a9a3278e958f14467188514622)) ([@​d0ugal](https://github.com/d0ugal))
- GraphQL server ([#​5580](https://github.com/grafana/alloy/issues/5580)) ([5a2562f](https://github.com/grafana/alloy/commit/5a2562f1093e13c7d9f03e9e0f708ef4143707af)) ([@​jharvey10](https://github.com/jharvey10))
- **helm:** Support externally-managed HPAs via controller.autoscaling.horizontal.externalHPA ([#​6311](https://github.com/grafana/alloy/issues/6311)) ([a1e61c7](https://github.com/grafana/alloy/commit/a1e61c7abc7c0840be9bc29b96ea208fe43be115)) ([@​jmichalek132](https://github.com/jmichalek132))
- Integration tests for aws firehose and cloudflare logpull ([#​6089](https://github.com/grafana/alloy/issues/6089)) ([f55f780](https://github.com/grafana/alloy/commit/f55f78039189186e6e77d3bdb8cfd2fb3480fe41)) ([@​x1unix](https://github.com/x1unix))
- Integration tests for loki.source.azure\_event\_hubs ([#​6113](https://github.com/grafana/alloy/issues/6113)) ([8e40165](https://github.com/grafana/alloy/commit/8e4016506250063be863ff35eeeda348b912295c)) ([@​x1unix](https://github.com/x1unix))
- Integration tests for loki.source.gcplog ([#​6161](https://github.com/grafana/alloy/issues/6161)) ([feceb8d](https://github.com/grafana/alloy/commit/feceb8d20d4aa0e7366c7c5c6cc35255af7d18f8)) ([@​x1unix](https://github.com/x1unix))
- **loki.process:** Add regex field to logfmt and json stages ([#​4941](https://github.com/grafana/alloy/issues/4941)) ([cfbabda](https://github.com/grafana/alloy/commit/cfbabda3eb9ffd4ece693e23baed38c8ee46ea0d)) ([@​timonegk](https://github.com/timonegk))
- **loki.rules.kubernetes:** Add external\_labels support ([#​6320](https://github.com/grafana/alloy/issues/6320)) ([9166a61](https://github.com/grafana/alloy/commit/9166a61d408538e4f4aceeda0b8638069513484a)) ([@​gianvetter](https://github.com/gianvetter))
- **loki.source.heroku:** Drop github.com/heroku/x package ([#​6064](https://github.com/grafana/alloy/issues/6064)) ([3382721](https://github.com/grafana/alloy/commit/3382721d7a44647cfcd2e86ce1d82f8d282f7854)) ([@​x1unix](https://github.com/x1unix))
- Migrate from Docker to Moby ([#​6167](https://github.com/grafana/alloy/issues/6167)) ([1e2bbf9](https://github.com/grafana/alloy/commit/1e2bbf9d8d73f34c7ccec651a5c41a2b6718dacc)) ([@​x1unix](https://github.com/x1unix))
- **mimir.rules.kubernetes, loki.rules.kubernetes:** Add configurable `mimir_namespace_separator` and `loki_namespace_separator` arguments to allow using a URL-safe separator ([#​5961](https://github.com/grafana/alloy/issues/5961)) ([7dba4f1](https://github.com/grafana/alloy/commit/7dba4f196f06c9813c1ef9c4de6002076b6f6738)) ([@​QuentinBisson](https://github.com/QuentinBisson), [@​clayton-cornell](https://github.com/clayton-cornell))
- **otelcol.exporter.prometheus:** Config option to prevent stripping `service.*` attributes ([#​6434](https://github.com/grafana/alloy/issues/6434)) ([c229b3c](https://github.com/grafana/alloy/commit/c229b3c64c512b69263a2e0ec329d6e3e12cde6f)) ([@​jcreixell](https://github.com/jcreixell))
- **otelcol.exporter.prometheus:** Convert classic histograms to NHCB ([#​6281](https://github.com/grafana/alloy/issues/6281)) ([46f4fb6](https://github.com/grafana/alloy/commit/46f4fb61e57f8e05110a21bfafc063a8ac6ec443)) ([@​madaraszg-tulip](https://github.com/madaraszg-tulip))
- **otelcol:** Add Nginx receiver ([#​6141](https://github.com/grafana/alloy/issues/6141)) ([fa8d520](https://github.com/grafana/alloy/commit/fa8d520297301f5d14cf83fde96818efa19587cd)) ([@​henworth](https://github.com/henworth), [@​clayton-cornell](https://github.com/clayton-cornell), [@​blewis12](https://github.com/blewis12))
- **prometheus.enrich:** Support multi-label matching ([#​5822](https://github.com/grafana/alloy/issues/5822)) ([04a1aba](https://github.com/grafana/alloy/commit/04a1aba1fcbac25bbe1ecc5e86cafdcdd5eff6b9)) ([@​dtrejod](https://github.com/dtrejod))
- **prometheus.relabel:** Add opt-in TTL cache mode ([#​6169](https://github.com/grafana/alloy/issues/6169)) ([40632c3](https://github.com/grafana/alloy/commit/40632c33aef80490f3735a767f2c193c8bfa4b62)) ([@​kgeckhart](https://github.com/kgeckhart))
- **telemetry:** Add graph connection metrics ([#​6243](https://github.com/grafana/alloy/issues/6243)) ([4f3bbbe](https://github.com/grafana/alloy/commit/4f3bbbefd67d4ba5f7291d713a9a6d52ea20dde6)) ([@​theSuess](https://github.com/theSuess))
- **telemetry:** Add pyroscope\_forwarded\_entries\_total metric ([#​6244](https://github.com/grafana/alloy/issues/6244)) ([65ad64c](https://github.com/grafana/alloy/commit/65ad64c22e7bf9524e3e83823817cf3386dbe9a2)) ([@​theSuess](https://github.com/theSuess))
- Update to Beyla 3.9.7 ([#​6175](https://github.com/grafana/alloy/issues/6175)) ([4015bd9](https://github.com/grafana/alloy/commit/4015bd95f58d5f3375af93d20fb75f1fdd17b90a)) ([@​rafaelroquetto](https://github.com/rafaelroquetto))
- Update to Beyla 3.9.8 ([#​6189](https://github.com/grafana/alloy/issues/6189)) ([6fffa30](https://github.com/grafana/alloy/commit/6fffa30c273fa3c9a6870174b552c1be2934d9a8)) ([@​skl](https://github.com/skl))
##### Bug Fixes 🐛
- Address Critical CVE's From Scanner ([#​6232](https://github.com/grafana/alloy/issues/6232)) ([e713e7a](https://github.com/grafana/alloy/commit/e713e7ada335ec3800c66dd9913ee34c7dbee493)) ([@​blewis12](https://github.com/blewis12))
- **alloycli:** Use filepath.Base for CLI Use name to fix shell completions ([#​6217](https://github.com/grafana/alloy/issues/6217)) ([17cfd01](https://github.com/grafana/alloy/commit/17cfd01f03379e7e9d265932451c6f2b584da781)) ([@​IngmarStein](https://github.com/IngmarStein))
- **cluster:** Fix nodes failing to join the cluster when TLS is enabled ([#​6437](https://github.com/grafana/alloy/issues/6437)) ([efbad6d](https://github.com/grafana/alloy/commit/efbad6de6cdd67732bfa41ea1fe6191be0ee5b91)) ([@​kgeckhart](https://github.com/kgeckhart))
- **database\_observability.mysql:** Exclude system schemas from MySQL health check ([#​6116](https://github.com/grafana/alloy/issues/6116)) ([fcae6f4](https://github.com/grafana/alloy/commit/fcae6f4beff1d582c7e3ac0708256ef12ab10302)) ([@​matthewnolf](https://github.com/matthewnolf))
- **database\_observability.postgres:** Count error logs when log\_timezone is non-UTC ([#​6274](https://github.com/grafana/alloy/issues/6274)) ([2eaa769](https://github.com/grafana/alloy/commit/2eaa76967e0932869843b39a17021bfc69ed2eda)) ([@​gaantunes](https://github.com/gaantunes), [@​cristiangreco](https://github.com/cristiangreco))
- **database\_observability.postgres:** Do not retain query text in `explain_plans` collector ([#​6461](https://github.com/grafana/alloy/issues/6461)) ([4c06a64](https://github.com/grafana/alloy/commit/4c06a64254aacabab5af377908df9c9f07323de7)) ([@​cristiangreco](https://github.com/cristiangreco))
- **database\_observability:** Exclude more explain plan output keywords ([#​6145](https://github.com/grafana/alloy/issues/6145)) ([3ff6c14](https://github.com/grafana/alloy/commit/3ff6c1489882139822427e4232e9b186db0043e9)) ([@​cristiangreco](https://github.com/cristiangreco))
- **deb:** Restart Alloy only on upgrade in postinst script ([#​6094](https://github.com/grafana/alloy/issues/6094)) ([8c15cb3](https://github.com/grafana/alloy/commit/8c15cb358b7d8e5ff159e633a5b5ae867e3c2e94)) ([@​guoard](https://github.com/guoard), [@​jharvey10](https://github.com/jharvey10))
- **deps:** Pin dependencies ([#​6376](https://github.com/grafana/alloy/issues/6376)) ([79323b5](https://github.com/grafana/alloy/commit/79323b5685acda5fc538b3a18ccc1906b14218e2))
- **deps:** Update dependencies for catchpoint, databricks, and snowflake exporters ([#​6188](https://github.com/grafana/alloy/issues/6188)) ([c1b740c](https://github.com/grafana/alloy/commit/c1b740cd7fc7d2b521304ee15c9c9f61d0d5ceb0)) ([@​Dasomeone](https://github.com/Dasomeone))
- **deps:** Update module go.opentelemetry.io/obi to v0.8.0 \[SECURITY] ([#​6091](https://github.com/grafana/alloy/issues/6091)) ([05c14af](https://github.com/grafana/alloy/commit/05c14af450000f11a367d5f62fd5e9334a49f160))
- **documentation:** Fix documentation for loki.rules.kubernetes ([#​6088](https://github.com/grafana/alloy/issues/6088)) ([61f2b8a](https://github.com/grafana/alloy/commit/61f2b8a09e7705714553662de4dfc7a33a8536bb)) ([@​timonegk](https://github.com/timonegk), [@​clayton-cornell](https://github.com/clayton-cornell))
- Enforce Singleton For Running Alloy Extension Instances ([#​5763](https://github.com/grafana/alloy/issues/5763)) ([83da6f0](https://github.com/grafana/alloy/commit/83da6f0cd3604a8b4306e5ddecd685db54d38361)) ([@​blewis12](https://github.com/blewis12), [@​clayton-cornell](https://github.com/clayton-cornell))
- **faro:** Abort on context cancelation ([#​6104](https://github.com/grafana/alloy/issues/6104)) ([bf733a6](https://github.com/grafana/alloy/commit/bf733a6d549b4cd9320a9b19a2940a74fd15dfad)) ([@​kalleep](https://github.com/kalleep))
- Fix bug that caused 'logging' block's 'write\_to' to be used after config update even if not set ([#​6264](https://github.com/grafana/alloy/issues/6264)) ([cba7243](https://github.com/grafana/alloy/commit/cba72437c9f34ce8658a4bf49dbbea1b1207db3f)) ([@​ptodev](https://github.com/ptodev))
- **graphql:** Update cli flags for consistency ([#​6441](https://github.com/grafana/alloy/issues/6441)) ([7749d4f](https://github.com/grafana/alloy/commit/7749d4f3f5f259e0352e029189691f6385d859d0)) ([@​jharvey10](https://github.com/jharvey10))
- **helm:** Honor alloy.configMap.key in templates/configmap.yaml ([#​6312](https://github.com/grafana/alloy/issues/6312)) ([415af2c](https://github.com/grafana/alloy/commit/415af2cb369dea327389c81832a6f7e4e241d2b2)) ([@​jmichalek132](https://github.com/jmichalek132), [@​kalleep](https://github.com/kalleep))
- **integration-tests:** Forward GO\_TAGS to k8s integration tests ([#​6220](https://github.com/grafana/alloy/issues/6220)) ([b00f79c](https://github.com/grafana/alloy/commit/b00f79c6f58b54806465685f11f7999d10bad964)) ([@​thampiotr](https://github.com/thampiotr))
- **logging:** Fix startup deadlock when components log before logging config is evaluated ([#​6112](https://github.com/grafana/alloy/issues/6112)) ([6cdce9e](https://github.com/grafana/alloy/commit/6cdce9ed9c225f0e4addef3300e9fb11df6e41b6)) ([@​kgeckhart](https://github.com/kgeckhart))
- **loki.process:** Make limit stage shutdown cancelable ([#​6215](https://github.com/grafana/alloy/issues/6215)) ([20717b5](https://github.com/grafana/alloy/commit/20717b56d17ac6fe487c4c3f665d2262c2afbde8)) ([@​boinger](https://github.com/boinger))
- **loki.process:** New `action_on_duplicate_timestamp` config attribute to fudge identical log timestamps ([#​5615](https://github.com/grafana/alloy/issues/5615)) ([7d56f50](https://github.com/grafana/alloy/commit/7d56f50fc860b7c417c8733e58000a7f6c297666)) ([@​boussaffawalid](https://github.com/boussaffawalid))
- **loki.process:** No longer mutate rules in stage.truncate causing every config update to reload pipeline when this stage is used ([#​6271](https://github.com/grafana/alloy/issues/6271)) ([b52a4d8](https://github.com/grafana/alloy/commit/b52a4d887b6cbeb06a9cd50426745e6ea4d1c48b)) ([@​kalleep](https://github.com/kalleep))
- **loki.process:** Potential deadlock on update with stage and receiver changes ([#​6270](https://github.com/grafana/alloy/issues/6270)) ([cb22e82](https://github.com/grafana/alloy/commit/cb22e82ce74f5727a8d8d0a5b743ff6a0033ba55)) ([@​kalleep](https://github.com/kalleep))
- **loki.process:** Wrap NewPipeline error correctly in match stage ([#​6216](https://github.com/grafana/alloy/issues/6216)) ([f3af2dd](https://github.com/grafana/alloy/commit/f3af2ddba71b17707c12529851c0c713746a9754)) ([@​boinger](https://github.com/boinger))
- **loki.rules.kubernetes:** Add timeout to ruler sync calls ([26170d4](https://github.com/grafana/alloy/commit/26170d4d8fcb8b03dfda5dbff11fdf307496b96b)) ([@​QuentinBisson](https://github.com/QuentinBisson))
- **loki.source.syslog:** Fix goroutine leak in UDP listener ([#​6231](https://github.com/grafana/alloy/issues/6231)) ([268b260](https://github.com/grafana/alloy/commit/268b260fbb0c693fe6efbf275b41379fb000e5a2)) ([@​x1unix](https://github.com/x1unix))
- **loki:** Clone structured metadata so we can perform fan-out correctly ([#​6138](https://github.com/grafana/alloy/issues/6138)) ([473244d](https://github.com/grafana/alloy/commit/473244daec6de6a6d29284b4e49bdd0456b338da)) ([@​kalleep](https://github.com/kalleep))
- **oracledb\_exporter:** Support CGO\_ENABLED=0 cross-compilation ([#​6168](https://github.com/grafana/alloy/issues/6168)) ([63ab53d](https://github.com/grafana/alloy/commit/63ab53d8b477a0403ce24dbd759572707bd3fef2)) ([@​korniltsev-grafanista](https://github.com/korniltsev-grafanista))
- **otelcol.exporter.awss3:** Add missing `unique_key_func_name` attribute ([#​6184](https://github.com/grafana/alloy/issues/6184)) ([9ad2b44](https://github.com/grafana/alloy/commit/9ad2b4419620e8c4aa69dd63a166af6fb4e4d7ac)) ([@​kalleep](https://github.com/kalleep))
- **prometheus.exporter.oracledb:** Fix issue with custom metrics not appearing when more than one instance of prometheus.exporter.oracledb is used ([#​6228](https://github.com/grafana/alloy/issues/6228)) ([57de4f4](https://github.com/grafana/alloy/commit/57de4f4aab2c2cc4602f1c63a8f9989f0ed1143e)) ([@​ptodev](https://github.com/ptodev))
- **prometheus.operator.\*:** Pass ScrapeNativeHistograms to ScrapeOptions ([#​6356](https://github.com/grafana/alloy/issues/6356)) ([a44fced](https://github.com/grafana/alloy/commit/a44fced4a7cfdeb663c90cec469a3fdf47e73fe6)) ([@​sberz](https://github.com/sberz))
- **remotewrite:** Use blocking send with timeout in test server ([#​6208](https://github.com/grafana/alloy/issues/6208)) ([a279088](https://github.com/grafana/alloy/commit/a2790882c9df8ca4228491719947912a6c4e97b9)) ([@​kgeckhart](https://github.com/kgeckhart))
- **security:** Update module github.com/jackc/pgx/v5 to v5.9.2 \[SECURITY] ([#​6326](https://github.com/grafana/alloy/issues/6326)) ([bf3ff2e](https://github.com/grafana/alloy/commit/bf3ff2e22273e5ee22031dff7b2495bc7441b868))
- **security:** Update x/crypto and x/net for CVEs ([#​6336](https://github.com/grafana/alloy/issues/6336)) ([4c7b93b](https://github.com/grafana/alloy/commit/4c7b93b9fd3c27cd519a1841654b34e1091c856b)) ([@​thampiotr](https://github.com/thampiotr))
- **ui:** Reduce UI dependencies ([#​6349](https://github.com/grafana/alloy/issues/6349)) ([85e12ba](https://github.com/grafana/alloy/commit/85e12ba42faa7331bb03156e2f1873f977bf2dae)) ([@​jharvey10](https://github.com/jharvey10))
- **ui:** Update dependency minor versions ([#​6288](https://github.com/grafana/alloy/issues/6288)) ([52a28d2](https://github.com/grafana/alloy/commit/52a28d2306e0b379436721f7ca2ec98ef32c1d31)) ([@​jharvey10](https://github.com/jharvey10))
- Update go to v1.26.4 ([#​6418](https://github.com/grafana/alloy/issues/6418)) ([51fb7d2](https://github.com/grafana/alloy/commit/51fb7d21eb9c2c328ad60f5ed3aae0c828672cde)) ([@​kalleep](https://github.com/kalleep))
- **validation:** Improve type checking of ast.LiteralExpr ([#​5916](https://github.com/grafana/alloy/issues/5916)) ([d0a1177](https://github.com/grafana/alloy/commit/d0a11773cd22ffd32e7c9e06d8f23256c44f0dcf)) ([@​kalleep](https://github.com/kalleep))
#### Upgrading
Read the [release notes] for specific instructions on upgrading from older versions:
[release notes]: https://grafana.com/docs/alloy/v1.17/release-notes/
#### Installation
Refer to our [installation guide] for how to install Grafana Alloy.
[installation guide]: https://grafana.com/docs/alloy/v1.17/get-started/install/
### [`v1.16.3`](https://github.com/grafana/alloy/releases/tag/v1.16.3)
[Compare Source](https://github.com/grafana/alloy/compare/v1.16.2...v1.16.3)
##### Bug Fixes 🐛
- **cluster:** Fix nodes failing to join the cluster when TLS is enabled \[backport] ([#​6438](https://github.com/grafana/alloy/issues/6438)) ([4920e69](https://github.com/grafana/alloy/commit/4920e698823c8d574bb10334dfe5edec574aa255)) ([@​kgeckhart](https://github.com/kgeckhart))
#### Upgrading
Read the [release notes] for specific instructions on upgrading from older versions:
[release notes]: https://grafana.com/docs/alloy/v1.16/release-notes/
#### Installation
Refer to our [installation guide] for how to install Grafana Alloy.
[installation guide]: https://grafana.com/docs/alloy/v1.16/get-started/install/
</details>
<details>
<summary>plantuml/plantuml-server (plantuml/plantuml-server)</summary>
### [`v1.2026.6`](https://github.com/plantuml/plantuml-server/compare/v1.2026.5...v1.2026.6)
[Compare Source](https://github.com/plantuml/plantuml-server/compare/v1.2026.5...v1.2026.6)
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My43My4yIiwidXBkYXRlZEluVmVyIjoiNDMuNzMuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->
Reviewed-on: https://forgejo.internal/forgejo_admin/infra-personal/pulls/104
Co-authored-by: Renovate Bot <renovatebot@forgejo.internal>
Co-committed-by: Renovate Bot <renovatebot@forgejo.internal>
Three related changes to kanban time tracking.
1. Time tracking in the card detail modal
The timer and tracked sessions were only reachable on the card. This reuses the
existing
KanbanItemTimer,TimeEntriesAccordionandTimeEntriesModalinKanbanCardDetailas a "Time Tracking" section in the properties sidebar, with thesame read-only behaviour as the card (buttons disable for viewers).
Because the card stays mounted behind the detail modal,
useKanbanItemruns twicefor the same item and shares one localStorage key. I added a small sync (the
storageevent plus a same-tab event) so both instances stay consistent. This alsofixes a possible duplicate time entry when you stop the timer in one place and then
drag the card, and it covers multi-tab use.
2. Fix editing/deleting sessions
"Edit sessions" → delete showed the confirm dialog but nothing happened.
editTimeEntry/deleteTimeEntryresolved the list by uuid with no username(
getListById(listId, undefined, …)), which returned nothing, so the action failedsilently. They now resolve by the plain list id + current user, the same way
updateItemStatusdoes, and the modal passes the plainchecklistIdinstead of theuuid.
3. Hide time tracking on cards (user setting)
New
hideTimeTrackingOnCardspreference under Kanban settings, next to the existing"hide status" / "hide mobile dropdown" toggles. When enabled, the timer and sessions
are hidden on the cards but stay available in the detail view (which is why 1.
exists).
Translations
en/de written by hand, the other 12 languages machine-translated.
Testing
yarn lintandtscare clean (aside from the pre-existing, unrelatedConnectionsGraphtype errors). Checked manually: timer in the detail view,add/edit/delete sessions, card↔detail sync, the hide toggle, and read-only boards.
Summary by CodeRabbit