Welcome to TagStudio 95 v9.5! This update has been several months in the making, and has focused largely on internal changes that completely rework the library system to run on SQLite instead of a homebrew JSON solution. This key change has allowed us to dramatically improve the search engine, reduce memory usage for large libraries, and provide a stable framework for several new additions - both in this release and in future releases moving forward! Despite this being a largely backend-focused update, there's still some exciting new features and changes that should make your tagging experiences better than ever! Thank you so much to everyone who's helped make this happen!
- Travis (CyanVoxel)
Added
Overhauled Search Engine
Boolean Operators
- feat: implement query language by @Computerdores in #606
- feat: optimize AND queries by @Computerdores in #679
Filetype, Mediatype, and Glob Path + Smartcase Searches
- fix: remove wildcard requirement for tags by @Tyrannicodin in #481
- feat: add filetype and mediatype searches by @python357-1 in #575
- feat: make path search use globs by @python357-1 in #582
- feat: implement search equivalence of "jpg" and "jpeg" filetypes by @Computerdores in #649
- feat: add smartcase and globless path searches by @CyanVoxel in #743
Sortable Results
- feat: sort by "date added" in library by @Computerdores in #674
Autocomplete
- feat: add autocomplete for search engine by @python357-1 in #586
Replaced "Tag Fields" with Tag Categories
Instead of tags needing to be added to a tag field type such as "Meta Tags", "Content Tags", or just the "Tags" field, tags are now added directly to file entries with no intermediary step. While tag field types offered a way to further organize tags, it was cumbersome, inflexible, and simply not fully fleshed out. Tag Categories offer all of the previous (intentional) functionality while greatly increasing the ease of use and customization.
-
feat!: tag categories by @CyanVoxel in #655
Thumbnails and File Previews
New Thumbnail Support
- feat: add svg thumbnail support (port #442) by @Tyrannicodin and @CyanVoxel in #540
- feat: add pdf thumbnail support (port #378) by @Heiholf and @CyanVoxel in #543
- feat: add ePub thumbnail support (port #387) by @Heiholf and @CyanVoxel in #539
- feat: add OpenDocument thumbnail support (port #366) by @Joshua-Beatty and @CyanVoxel in #545
- feat: add JXL thumbnail and animated APNG + WEBP support (port #344 and partially port #357) by @BPplays and @CyanVoxel in #549
- fix: catch ImportError for pillow_jxl module by @CyanVoxel in a2f9685
Audio Playback
Thumbnail Caching
- feat(ui): add thumbnail caching by @CyanVoxel in #694
Tags
Delete Tags (Finally!)
- feat: remove and create tags from tag database panel by @DandyDev01 in #569
Custom User-Created Tag Colors
Create your own custom tag colors via the new Tag Color Manager! Tag colors are assigned a namespace (group) and include a name, primary color, and optional secondary color. By default the secondary color is used for the tag text color, but this can also be toggled to apply to the border color as well!
- feat(ui)!: user-created tag colors@CyanVoxel in #801


New Tag Colors + UI
- feat: expanded tag color system by @CyanVoxel in #709
- fix(ui): use correct pink tag color by @CyanVoxel in 431efe4
- fix(ui): use consistent tag outline colors by @CyanVoxel in 020a73d

New Tag Alias UI
- fix: preview panel aliases not staying up to date with database by @DandyDev01 in #641
- fix: subtags/parent tags & aliases update the UI for building a tag by @DandyDev01 in #534
Translations
TagStudio now has official translation support! Head to the new settings panel and select from one of the initial languages included. Note that many languages currently have incomplete translations.
Translation hosting generously provided by Weblate. Check out our project page to help translate TagStudio! Thank you to everyone who's helped contribute to the translations so far!
- translations: add string tokens for en.json by @Bamowen in #507
- feat: translations by @Computerdores in #662
- feat(ui): add language setting by @CyanVoxel in #803
Initial Languages:
- Chinese (Traditional) (68%)
- Dutch (35%)
- Filipino (43%)
- French (100%)
- @Bamowen, @alessdangelo, @kitsumed, Obscaeris
- German (98%)
- @Ryussei, @Computerdores, Aaron M, @JoeJoeTV, @Kurty00
- Hungarian (100%)
- Norwegian Bokmål (16%)
- Polish (97%)
- Anonymous
- Portuguese (Brazil) (64%)
- @LoboMetalurgico, @SpaceFox1, @DaviMarquezeli, @viniciushelder, Alexander Lennart Formiga Johnsson
- Russian (22%)
- Spanish (57%)
- Swedish (24%)
- Tamil (22%)
- Toki Pona (32%)
- Turkish (22%)
Miscellaneous
- feat: about section by @mashed5894 in #712
- feat(ui): add configurable splash screens by @CyanVoxel in #703
- feat(ui): show filenames in thumbnail grid by @CyanVoxel in #633
- feat(about): clickable links to docs/discord/etc in about modal by @SkeleyM in #799
Fixed
- fix(ui): display all tags in panel during empty search by @samuellieberman in #328
- fix: avoid
KeyError
inadd_folders_to_tree()
(fix #346) by @CyanVoxel in #347 - fix: error on closing library by @yedpodtrzitko in #484
- fix: resolution info #550 by @Roc25 in #551
- fix: remove queued thumnail jobs when closing library by @yedpodtrzitko in #583
- fix: use absolute ffprobe path on macos (Fix #511) by @CyanVoxel in #629
- fix(ui): prevent duplicate parent tags in UI by @SkeleyM in #665
- fix: fix -o flag not working if path has whitespace around it by @python357-1 in #670
- fix: better file opening compatibility with non-ascii filenames by @SkeleyM in #667
- fix: restore environment before launching external programs by @mashed5894 in #707
- fix: have pydub use known ffmpeg + ffprobe locations by @CyanVoxel in #724
- fix: add ".DS_Store" to
GLOBAL_IGNORE_SET
by @CyanVoxel in b72a2f2 - fix: don't add "._" files to libraries by @CyanVoxel in eb1f634
Changed
SQLite Save File Format
This was the main focus of this update, and where the majority of development time and resources have been spent since v9.4. These changes include everything that was done to migrate from the JSON format to SQLite starting from the initial SQLite PR, while re-implementing every feature from v9.4 as the initial SQLite PR was based on v9.3.x at the time.
- refactor!: use SQLite and SQLAlchemy for database backend by @yedpodtrzitko in #332
- feat: make search results more ergonomic by @yedpodtrzitko in #498
- feat: store
Entry
suffix separately by @yedpodtrzitko in #503 - feat: port thumbnail (#390) and related features to v9.5 by @CyanVoxel in #522
- fix: don't check db version with new library by @yedpodtrzitko in #536
- fix(ui): update ui when removing fields by @DandyDev01 in #560
- feat(parity): backend for aliases and parent tags by @DandyDev01 in #596
- fix: "open in explorer" opens correct folder by @KirilBourakov in #603
- fix: ui/ux parity fixes for thumbnails and files by @CyanVoxel in #608
- feat(parity): migrate json libraries to sqlite by @CyanVoxel in #604
- fix: clear all setting values when opening a library by @VasigaranAndAngel in #622
- fix: remove/rework windows path tests by @VasigaranAndAngel in #625
- fix: add check to see if library is loaded in filter_items by @Roc25 in #547
- fix: multiple macro errors by @Computerdores in #612
- fix: don't allow blank tag alias values in db by @CyanVoxel in #628
- feat: Reimplement drag drop files on sql migration by @seakrueger in #528
- fix: stop sqlite db from being updated while running tests by @python357-1 in #648
- fix: enter/return adds top result tag by @SkeleyM in #651
- fix: show correct unlinked files count by @SkeleyM in #653
- feat: implement parent tag search by @Computerdores in #673
- fix: only close add tag menu with no search by @SkeleyM in #685
- fix: drag and drop no longer resets by @SkeleyM in #710
- feat(ui): port "create and add tag" to main branch by @SkeleyM in #711
- fix: don't add default title field, use proper phrasing for adding files by @CyanVoxel in #701
- fix: preview panel + main window fixes and optimizations by @CyanVoxel in #700
- fix: sort tag results by @mashed5894 in #721
- fix: restore opening last library on startup by @SkeleyM in #729
- fix(ui): don't always create tag on enter by @SkeleyM in #731
- fix: use tag aliases in tag search by @CyanVoxel in #726
- fix: keep initial id order in
get_entries_full()
by @CyanVoxel in #736 - fix: always catch db mismatch by @CyanVoxel in #738
- fix: relink unlinked entry to existing entry without sql error by @mashed5894 in #730
- fix: refactor and fix bugs with missing_files.py by @CyanVoxel in #739
- fix: dragging files references correct entry IDs @CyanVoxel in 44ff17c
- ui: port splash screen from Alpha-v9.4 by @CyanVoxel in af760ee
- fix: tags created from tag database now add aliases by @CyanVoxel in 2903dd2
- fix: check for tag name parity during JSON migration by @CyanVoxel in #748
- feat(ui): re-implement tag display names on sql by @CyanVoxel in #747
- fix(ui): restore Windows accent color on PySide 6.8.0.1 by @CyanVoxel in #755
- fix(ui): (mostly) fix right-click search option on tags by @CyanVoxel in #756
- feat: copy/paste fields and tags by @mashed5894 in #722
- perf: optimize query methods and reduce preview panel updates by @CyanVoxel in #794
- feat: port file trashing (#409) to v9.5 by @CyanVoxel in #792
- fix: prevent future library versions from being opened by @CyanVoxel in bcf3b2f
UI/UX
- feat(ui): pre-select default tag name in
BuildTagPanel
by @Cool-Game-Dev in #592 - feat(ui): keyboard navigation for editing tags by @Computerdores in #407
- feat(ui): use tag query as default new tag name by @CyanVoxel in 29c0dfd
- feat(ui): shortcut to add tags to selected entries; change click behavior of tags to edit by @CyanVoxel in #749
- fix(ui): use consistent dark mode colors for all systems by @CyanVoxel in #752
- fix(ui): use camera white balance for raw images by @CyanVoxel in 6ee5304
- Mixed field editing has been limited due to various bugs in both the JSON and SQL implementations. This will be re-implemented in a future release.
- fix(ui): improve tagging ux by @CyanVoxel in #633
- fix(ui): hide library actions when no library is open by @CyanVoxel in #787
- refactor(ui): recycle tag list in TagSearchPanel by @CyanVoxel in #788
- feat(ui): add tag view limit dropdown
- fix(ui): expand usage of esc and enter for modals by @CyanVoxel in #793
Performance
- feat: improve performance of "Delete Missing Entries" by @Toby222 and @Computerdores in #696
Internal Changes
- refactor: combine open launch args by @UnusualEgg in #364
- feat: add date_created, date_modified, and date_added columns to entries table by @CyanVoxel in #740
New Contributors
- @UnusualEgg made their first contribution in #364
- @zierf made their first contribution in #418
- @floogulinc made their first contribution in #460
- @CarterPillow made their first contribution in #467
- @Kn4ughty made their first contribution in #452
- @Bamowen made their first contribution in #474
- @Tyrannicodin made their first contribution in #481
- @FB100 made their first contribution in #496
- @weblate made their first contribution in #526
- @Hissymaster made their first contribution in #564
- @Roc25 made their first contribution in #551
- @python357-1 made their first contribution in #581
- @jakehurst made their first contribution in #594
- @DandyDev01 made their first contribution in #560
- @Cool-Game-Dev made their first contribution in #592
- @KirilBourakov made their first contribution in #603
- @csponge made their first contribution in #576
- @VasigaranAndAngel made their first contribution in #622
- @SkeleyM made their first contribution in #651
- @Nginearing made their first contribution in #676
- @mashed5894 made their first contribution in #712
- @pinheadtf2 made their first contribution in #760
- @ChloeZamorano made their first contribution in #791
- @sinbadthepoet made their first contribution in #806
Full Changelog: v9.3.2...v9.5.0