0.23.0
Welcome to the 0.23.0
release of Hoarder! This release brings quality of life improvements, bug fixes, and introduces several new features, including the long awaited safari extension, PDF screenshotting, bulk tag deletion, and an assets management page! We welcome new contributor @Kaio-Cesar, @erik-nilcoast, @mos3abof, @halkeye, @saadmanfarhad, and @lexafaxine (and as usual, many more translators on Weblate!).
If you enjoy using Hoarder, consider supporting the project here ☕️ or via GitHub here.
New Features 🚀
- Safari Extension: The long awaited safari extension is now finally in TestFlight.
- PDF Screenshot Generation and Display (by @AhmadMuj): Hoarder can now generate screenshots for PDF files and display them, making it easier to preview and identify saved PDFs.
- Bulk Tag Deletion (by @lexafaxine): You can now delete multiple tags at once, simplifying tag management.
- Asset Management Page: A new settings page allows you to manage your assets and find the ones eating most of your storage.
- "AI Tagged" Webhook Trigger: You can now configure webhooks to trigger when AI automatically tags a bookmark.
- YTDLP Command Line Arguments: youtube-dl library supports a ton of configuration and flags. This release allows you to configure the flags that gets passed to the YTDLP binary for better control on video downloads. (by @erik-nilcoast)
UX Improvements ✨
- Import/Export Page got redesigned to look slightly nicer.
- The web UI now displays statistics for your lists directly in the sidebar.
- Merged background jobs stats and admin actions in the admin panel. Also the stats show more workers that were previously missing.
- Multiple new languages got enabled (Arabic, Slovak, Portuguese (Brazil), Slovenian & Vietnamese). Some of those languages are AI translated, please help us enhance them over at weblate.
For Developers 🛠️
- Bookmark Summarization: The API now exposes a way to trigger bookmark summarization. (by @erik-nilcoast)
- User Stats Endpoints: Added new endpoints to retrieve user information and statistics. This is used by the new homepage widget support implemented by @vhsdream.
- We now have a new CONTRIBUTING.md.
- Added instructions for setting up the Node.js environment for development (by @mos3abof)
Fixes 🐛
- Fixed an issue that was preventing the use of LLM providers like gemini and preplexity. If you're running ollama, you might need to upgrade your server to a newer version. If the model you're using doesn't support structured outputs, set
INFERENCE_SUPPORTS_STRUCTURED_OUTPUT=false
. - Fixed an issue where shared links on mobile were incorrectly stored as text (undergoing apple's review).
- Fixed webhook events being sent regardless of user-selected operations.
- Fixed an issue were RSS feed ingestion was failing for some feeds.
- You can now access the lists from the PWA, which was missing before.
- Hardened the
getBookmarks
endpoint against inconsistent bookmarks. - Fixed an issue in mobile to correctly set a dark theme classname to update the header text color. (by @saadmanfarhad).
- Fixed corepack issues in the CI and docker build, and in the Linux installation script.
- Added a custom fetch wrapper for Ollama inference that prevents timeouts for slow ollama instances (by @halkeye)
- Added an environment variable to configure OAuth timeouts. (by @Kaio-Cesar)
Community Projects 💡
Hoarder Random Bookmark
By @treyg
Sends random bookmarks from your Hoarder account to your email, Discord or exposes your hoarder bookmarks over RSS. Get it here.
Homepage Widget
By @vhsdream
Homepage now has a Hoarder widget that exposes stats about your bookmarks. Get it here.
Screenshots 📸
The new Asset Management Page

The redesigned Import/Export page

Upgrading 📦
To upgrade:
- If you're using
HOARDER_VERSION=release
, rundocker compose pull && docker compose up -d
. - If you're pinning it to a specific version, upgrade the version and then run
docker compose pull && docker compose up -d
.
All Commits
- fix(ui): Fix export button sizing to match the import cards - @MohamedBassem in a384860
- build: Fix lint error in UpdatableBookmarksGrid - @MohamedBassem in 5fca5c8
- deps: Upgrade trpc and react query - @MohamedBassem in 7297144
- deps: Upgrade pdfjs and dompurify - @MohamedBassem in 84ba482
- deps: Upgrade nextjs - @MohamedBassem in 8b9a447
- deps: Upgrade vitest - @MohamedBassem in 7fcedc5
- feat(auth): Added env variable for OAuth timeout (#1136) - @Kaio-Cesar in 71fff38
- feat(workers): allows videoWorker to use ytdlp command line arguments specified in the config. Fixes #775 #792 (#1117) - @erik-nilcoast in bffbd43
- i18n: Sync weblate translations - Weblate in 6bbf4cb
- ci: Fix E2E test timeout - @MohamedBassem in e9afdb5
- ci: Run E2E tests in CI - @MohamedBassem in 927cd89
- i18n: Enable new languages - @MohamedBassem in ad9aa96
- fix(mobile): Fix shared links getting stored as text. #956 - @MohamedBassem in 40fb401
- i18n: Sync weblate translations - Weblate in c388fb2
- fix(translations): fixes typo in video download (#1116) - @erik-nilcoast in 7a372cf
- fix(extension): Fix handling for empty storage. #10 - @MohamedBassem in 7bffa02
- feat: Add endpoints for whoami and user stats. Fixes #1113 - @MohamedBassem in b8c587e
- fix: Revert the accidental upgrade of deps. #1107 - @MohamedBassem in 59c444a
- build(deps-dev): bump vitest from 1.3.1 to 1.6.1 (#1104) - @dependabot[bot] in 6d6790a
- fix: Resync the openapi spec - @MohamedBassem in 96c6378
- fix: Add error boundary around bookmark cards - @MohamedBassem in 82ca8e3
- fix: Harden getBookmarks endpoint against inconsistent bookmarks. Fixes #1094 - @MohamedBassem in dbe6c1d
- build(deps-dev): bump vite from 5.1.4 to 5.4.12 (#1103) - @dependabot[bot] in d2c37c2
- build(deps): bump dompurify from 3.0.9 to 3.2.4 (#1102) - @dependabot[bot] in 849cf4b
- fix(extension): Fix extension setting hook not firing on setting change. #10 - @MohamedBassem in 2fdf754
- feat: Expose bookmark summarization in the API (#1088) - @erik-nilcoast in 9fb8051
- feat: Move background jobs with the admin actions. Fixes #1083 - @MohamedBassem in 80a8080
- fix: Fix missing workers in the server stats - @MohamedBassem in f42a305
- feat(web): Redesign the import/export page - @MohamedBassem in 0c4ea74
- fix(workers): Small typo fix in assetPreprocessingWorker.ts - @vhsdream in e17342e
- feat: Add support for 'ai tagged' as a webhook trigger. Fixes #1092 - @MohamedBassem in 3329317
- fix(workers): Fix webhook events being sent regardless of selected user operation. Fixes #1092 - @MohamedBassem in 6bbfb8c
- fix(workers): Fix pdf screenshotting not working when a text is extracted. Fixes #1096 - @MohamedBassem in bbed0ad
- fix: Validate the output of the feed xml parser. Fixes #1085 - @MohamedBassem in 947ea29
- fix: Fix fixMode preventing images from getting tagged - @MohamedBassem in 2399dcb
- fix: Move away from JSON outputs to structured outputs. Fixes #1047 - @MohamedBassem in 69d81aa
- feat(web): Show list stats in the sidebar - @MohamedBassem in 379c49b
- refactor: Move the list logic into a separate model - @MohamedBassem in feac314
- docs: Add instructions for node environment setup (#1078) - @mos3abof in ac885d8
- fix: Add missing list to PWA. Fixes #884 - @MohamedBassem in 61d398a
- feat: Add a setting page to manage assets. Fixes #730 - @MohamedBassem in 14e4fed
- feat: Add PDF screenshot generation and display (#995) - @AhmadMuj in e5cb9aa
- chore: Add question issue template and update other ones - @MohamedBassem in a14be10
- fix: custom fetch wrapper for ollama inference. Fixes #656 (#1032) - @halkeye in 0621cd9
- docs: Add CONTRIBUTING.md (#1009) - @MohamedBassem in 602e938
- docker: Pin corepack version in the AIO image - @MohamedBassem in c032f50
- fix(mobile): add header class name corresponding to dark mode for text color (#1005) - @saadmanfarhad in 45706a0
- fix: Loosen the restriction about the browser address env variable. Fixes #1000 - @MohamedBassem in a89e052
- docker: Add a warning about now changing the DATA_DIR env variable - @MohamedBassem in bc1e496
- feat(web): bulk tag deletion. Fixes #872 (#900) - @lexafaxine in f9c2557
- build: Add error handling to installation script and other small fixes (#980) - @vhsdream in d6456eb
- feat: add URL protocol validation to extension and mobile app (#996) - @AhmadMuj in 192a7e0
- feat(i18n): add Arabic language support (#983) - @AhmadMuj in f6cdcc0
- ci: Fix corepack issue in CI and docker build - @MohamedBassem in ccd9159
- build: Fix corepack issues in the linux installation script. #967 - @MohamedBassem in f1d2a80
- release(sdk): Release the 0.22 sdk - @MohamedBassem in 4b94c60
- docs: Release the 0.22 docs - @MohamedBassem in f91fe67