diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index c2cdaaef..afcb7044 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1,2 +1,6 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
---
patreon: cyanvoxel
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index a719991f..35ad9dc6 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -1,3 +1,5 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
---
name: Bug Report
description: File a bug or issue report.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
index 32259fb6..7f8c726a 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -1,3 +1,5 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
---
name: Feature Request
description: Suggest a new feature.
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 9b1d9606..a012fd35 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,3 +1,5 @@
+
+
### Summary
+
# TagStudio: A User-Focused Photo & File Management System
[](https://github.com/TagStudioDev/TagStudio/releases)
diff --git a/REUSE.toml b/REUSE.toml
new file mode 100644
index 00000000..e4d032d7
--- /dev/null
+++ b/REUSE.toml
@@ -0,0 +1,46 @@
+version = 1
+
+[[annotations]]
+path = [
+ "tests/fixtures/**",
+
+ "contrib/.envrc-nix",
+ "contrib/.envrc-uv",
+ "contrib/.vscode/launch.json",
+ "docs/CNAME",
+ "docs/assets/**",
+ "src/tagstudio/qt/resources.json",
+ "src/tagstudio/resources/icon.*",
+ "src/tagstudio/resources/tagstudio.desktop",
+ "src/tagstudio/resources/templates/ts_ignore_template.txt",
+ "src/tagstudio/resources/templates/ts_ignore_template_blank.txt",
+ "src/tagstudio/resources/qt/images/**",
+ "tests/qt/__snapshots__/test_folders_to_tags.ambr",
+
+ ".git-blame-ignore-revs",
+ ".gitattributes",
+ ".gitignore",
+ ".pre-commit-config.yaml",
+ "flake.lock",
+]
+SPDX-FileCopyrightText = "(c) TagStudio Contributors"
+SPDX-License-Identifier = "GPL-3.0-only"
+
+[[annotations]]
+path = ["src/tagstudio/resources/translations/*.json"]
+SPDX-FileCopyrightText = "(c) TagStudio Contributors"
+SPDX-License-Identifier = "GPL-3.0-or-later"
+
+[[annotations]]
+path = [
+ "src/tagstudio/resources/qt/images/bxs-left-arrow.png",
+ "src/tagstudio/resources/qt/images/bxs-right-arrow.png",
+ "src/tagstudio/resources/qt/images/file_icons/database.png",
+]
+SPDX-FileCopyrightText = "(c) 2026 Boxicons"
+SPDX-License-Identifier = "MIT"
+
+[[annotations]]
+path = ["src/tagstudio/resources/qt/images/volume.svg", "src/tagstudio/resources/qt/images/volume_mute.svg"]
+SPDX-FileCopyrightText = "(c) github:google/material-design-icons Contributors"
+SPDX-License-Identifier = "Apache-2.0"
diff --git a/docs/changelog.md b/docs/changelog.md
index a3c6474a..2f1426aa 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -3,6 +3,8 @@ title: Changelog
icon: material/script-text
toc_depth: 2
---
+
+
# :material-script-text: Changelog
diff --git a/docs/colors.md b/docs/colors.md
index 8563388f..945f3434 100644
--- a/docs/colors.md
+++ b/docs/colors.md
@@ -1,6 +1,8 @@
---
icon: material/palette
---
+
+
# :material-palette: Colors
diff --git a/docs/contributing.md b/docs/contributing.md
index 449f73f8..0aa2e18d 100644
--- a/docs/contributing.md
+++ b/docs/contributing.md
@@ -1,6 +1,8 @@
---
icon: material/file-plus
---
+
+
# :material-file-plus: Contributing
diff --git a/docs/developing.md b/docs/developing.md
index dc49ee23..c177fb3b 100644
--- a/docs/developing.md
+++ b/docs/developing.md
@@ -1,6 +1,8 @@
---
icon: material/code-braces
---
+
+
# :material-code-braces: Developing
diff --git a/docs/entries.md b/docs/entries.md
index 6a1a9fbc..efd88129 100644
--- a/docs/entries.md
+++ b/docs/entries.md
@@ -1,6 +1,8 @@
---
icon: material/file
---
+
+
# :material-file: Entries
diff --git a/docs/fields.md b/docs/fields.md
index afcf057e..deec08ac 100644
--- a/docs/fields.md
+++ b/docs/fields.md
@@ -1,6 +1,8 @@
---
icon: material/text-box
---
+
+
# :material-text-box: Fields
diff --git a/docs/help/ffmpeg.md b/docs/help/ffmpeg.md
index 80746c6f..c526bc02 100644
--- a/docs/help/ffmpeg.md
+++ b/docs/help/ffmpeg.md
@@ -1,6 +1,8 @@
---
icon: material/movie-open-cog
---
+
+
# :material-movie-open-cog: Installing FFmpeg
diff --git a/docs/ignore.md b/docs/ignore.md
index 0e7687d0..f3c07768 100644
--- a/docs/ignore.md
+++ b/docs/ignore.md
@@ -2,6 +2,8 @@
title: Ignoring Files
icon: material/file-document-remove
---
+
+
# :material-file-document-remove: Ignoring Files & Directories
diff --git a/docs/index.md b/docs/index.md
index 62dfc1ed..51365001 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -4,6 +4,8 @@ hide:
- toc
- navigation
---
+
+
#
diff --git a/docs/install.md b/docs/install.md
index bec72c2b..51134e25 100644
--- a/docs/install.md
+++ b/docs/install.md
@@ -1,6 +1,8 @@
---
icon: material/download
---
+
+
# :material-download: Installation
diff --git a/docs/libraries.md b/docs/libraries.md
index 0afeb6ef..4b0515e5 100644
--- a/docs/libraries.md
+++ b/docs/libraries.md
@@ -1,6 +1,8 @@
---
icon: material/database
---
+
+
# :material-database: Libraries
diff --git a/docs/library-changes.md b/docs/library-changes.md
index 3ae570aa..cbd3594d 100644
--- a/docs/library-changes.md
+++ b/docs/library-changes.md
@@ -1,6 +1,8 @@
---
icon: material/database-edit
---
+
+
# :material-database-edit: Library Format
diff --git a/docs/macros.md b/docs/macros.md
index 9268d267..232bb4b6 100644
--- a/docs/macros.md
+++ b/docs/macros.md
@@ -1,6 +1,8 @@
---
icon: material/script-text
---
+
+
# :material-script-text: Tools & Macros
diff --git a/docs/preview-support.md b/docs/preview-support.md
index 7f1edd54..c1070ed7 100644
--- a/docs/preview-support.md
+++ b/docs/preview-support.md
@@ -1,6 +1,8 @@
---
icon: material/image-check
---
+
+
# :material-image-check: Supported Previews
diff --git a/docs/roadmap.md b/docs/roadmap.md
index f1417393..b0f6c48e 100644
--- a/docs/roadmap.md
+++ b/docs/roadmap.md
@@ -1,6 +1,8 @@
---
icon: material/map-check
---
+
+
# :material-map-check: Roadmap
diff --git a/docs/search.md b/docs/search.md
index 6d2007ed..bb6a5915 100644
--- a/docs/search.md
+++ b/docs/search.md
@@ -1,6 +1,8 @@
---
icon: material/magnify
---
+
+
# :material-magnify: Searching
diff --git a/docs/style.md b/docs/style.md
index 35b8841c..2763f642 100644
--- a/docs/style.md
+++ b/docs/style.md
@@ -1,6 +1,8 @@
---
icon: material/sign-text
---
+
+
# :material-sign-text: Style Guide
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
index f1e72d90..5ae0f7eb 100644
--- a/docs/stylesheets/extra.css
+++ b/docs/stylesheets/extra.css
@@ -1,3 +1,7 @@
+/*
+ * SPDX-FileCopyrightText: (c) TagStudio Contributors
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
/* Dark Theme */
[data-md-color-scheme="slate"] {
--md-default-bg-color: #060617;
diff --git a/docs/stylesheets/home.css b/docs/stylesheets/home.css
index 26e9c2d1..a32f0a80 100644
--- a/docs/stylesheets/home.css
+++ b/docs/stylesheets/home.css
@@ -1,3 +1,7 @@
+/*
+ * SPDX-FileCopyrightText: (c) TagStudio Contributors
+ * SPDX-License-Identifier: GPL-3.0-only
+ * */
h2 {
margin: 1rem 0 0 0 !important;
}
diff --git a/docs/tags.md b/docs/tags.md
index b8cb65e1..525b615e 100644
--- a/docs/tags.md
+++ b/docs/tags.md
@@ -1,6 +1,8 @@
---
icon: material/tag-text
---
+
+
# :material-tag-text: Tags
diff --git a/docs/usage.md b/docs/usage.md
index aa083e8c..a533f2cd 100644
--- a/docs/usage.md
+++ b/docs/usage.md
@@ -1,6 +1,8 @@
---
icon: material/mouse
---
+
+
# :material-mouse: Basic Usage
diff --git a/flake.nix b/flake.nix
index c12b22b6..ffde5e2e 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
{
description = "TagStudio";
diff --git a/mkdocs.yml b/mkdocs.yml
index aaf4b106..2a03b9ec 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
# yaml-language-server: $schema=https://squidfunk.github.io/mkdocs-material/schema.json
# MkDocs: https://www.mkdocs.org/
diff --git a/nix/package/default.nix b/nix/package/default.nix
index 3aa69219..b609e5f9 100644
--- a/nix/package/default.nix
+++ b/nix/package/default.nix
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
{
ffmpeg-headless,
lib,
diff --git a/nix/package/pillow-jxl-plugin.nix b/nix/package/pillow-jxl-plugin.nix
index 4df28aed..4b8ecba5 100644
--- a/nix/package/pillow-jxl-plugin.nix
+++ b/nix/package/pillow-jxl-plugin.nix
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
{
buildPythonPackage,
cmake,
diff --git a/nix/package/pyexiv2.nix b/nix/package/pyexiv2.nix
index 4761db49..a9cb9c41 100644
--- a/nix/package/pyexiv2.nix
+++ b/nix/package/pyexiv2.nix
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
{
autoPatchelfHook,
buildPythonPackage,
diff --git a/nix/shell.nix b/nix/shell.nix
index 81965fc8..797f1fc6 100644
--- a/nix/shell.nix
+++ b/nix/shell.nix
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
{
lib,
pkgs,
diff --git a/overrides/partials/header.html b/overrides/partials/header.html
index 0db2a399..e1ffcd5d 100644
--- a/overrides/partials/header.html
+++ b/overrides/partials/header.html
@@ -1,24 +1,7 @@
-
+
+
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to
- deal in the Software without restriction, including without limitation the
- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- sell copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- IN THE SOFTWARE.
--->
{% set class = "md-header" %}
diff --git a/overrides/partials/nav.html b/overrides/partials/nav.html
index 119d738a..432eb57f 100644
--- a/overrides/partials/nav.html
+++ b/overrides/partials/nav.html
@@ -1,24 +1,7 @@
-
+
+
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to
- deal in the Software without restriction, including without limitation the
- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- sell copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- IN THE SOFTWARE.
--->
{% import "partials/nav-item.html" as item with context %}
diff --git a/overrides/partials/toc-item.html b/overrides/partials/toc-item.html
index a0922005..349f10be 100644
--- a/overrides/partials/toc-item.html
+++ b/overrides/partials/toc-item.html
@@ -1,24 +1,7 @@
-
+
+
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to
- deal in the Software without restriction, including without limitation the
- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- sell copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- IN THE SOFTWARE.
--->
@@ -40,4 +23,4 @@
{% endif %}
-
\ No newline at end of file
+
diff --git a/pyproject.toml b/pyproject.toml
index e070c26f..8051f01e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
diff --git a/src/tagstudio/core/constants.py b/src/tagstudio/core/constants.py
index 7c98ddd5..4cd6f582 100644
--- a/src/tagstudio/core/constants.py
+++ b/src/tagstudio/core/constants.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
VERSION: str = "9.5.7" # Major.Minor.Patch
VERSION_BRANCH: str = "" # Usually "" or "Pre-Release"
diff --git a/src/tagstudio/core/driver.py b/src/tagstudio/core/driver.py
index 4343054d..cf50c45e 100644
--- a/src/tagstudio/core/driver.py
+++ b/src/tagstudio/core/driver.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
from pathlib import Path
import structlog
diff --git a/src/tagstudio/core/enums.py b/src/tagstudio/core/enums.py
index 2bc33748..f821e103 100644
--- a/src/tagstudio/core/enums.py
+++ b/src/tagstudio/core/enums.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import enum
diff --git a/src/tagstudio/core/exceptions.py b/src/tagstudio/core/exceptions.py
index 10bec533..f3ab828c 100644
--- a/src/tagstudio/core/exceptions.py
+++ b/src/tagstudio/core/exceptions.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
class NoRendererError(Exception): ...
diff --git a/src/tagstudio/core/library/alchemy/constants.py b/src/tagstudio/core/library/alchemy/constants.py
index 31065c2c..48ab5cbb 100644
--- a/src/tagstudio/core/library/alchemy/constants.py
+++ b/src/tagstudio/core/library/alchemy/constants.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from sqlalchemy import text
diff --git a/src/tagstudio/core/library/alchemy/db.py b/src/tagstudio/core/library/alchemy/db.py
index 7e728f79..de119d0a 100644
--- a/src/tagstudio/core/library/alchemy/db.py
+++ b/src/tagstudio/core/library/alchemy/db.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pathlib import Path
diff --git a/src/tagstudio/core/library/alchemy/default_color_groups.py b/src/tagstudio/core/library/alchemy/default_color_groups.py
index 9193fc09..4af29595 100644
--- a/src/tagstudio/core/library/alchemy/default_color_groups.py
+++ b/src/tagstudio/core/library/alchemy/default_color_groups.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import structlog
diff --git a/src/tagstudio/core/library/alchemy/enums.py b/src/tagstudio/core/library/alchemy/enums.py
index 020420f4..349d0e9e 100644
--- a/src/tagstudio/core/library/alchemy/enums.py
+++ b/src/tagstudio/core/library/alchemy/enums.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import enum
import random
from dataclasses import dataclass, field, replace
diff --git a/src/tagstudio/core/library/alchemy/fields.py b/src/tagstudio/core/library/alchemy/fields.py
index 5d4d6c96..729124af 100644
--- a/src/tagstudio/core/library/alchemy/fields.py
+++ b/src/tagstudio/core/library/alchemy/fields.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from __future__ import annotations
diff --git a/src/tagstudio/core/library/alchemy/joins.py b/src/tagstudio/core/library/alchemy/joins.py
index d01e6764..7cf1c486 100644
--- a/src/tagstudio/core/library/alchemy/joins.py
+++ b/src/tagstudio/core/library/alchemy/joins.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from sqlalchemy import ForeignKey
diff --git a/src/tagstudio/core/library/alchemy/library.py b/src/tagstudio/core/library/alchemy/library.py
index b04c031d..c55a10a0 100644
--- a/src/tagstudio/core/library/alchemy/library.py
+++ b/src/tagstudio/core/library/alchemy/library.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
# NOTE: This file contains necessary use of deprecated first-party code until that
# code is removed in a future version (prefs).
diff --git a/src/tagstudio/core/library/alchemy/models.py b/src/tagstudio/core/library/alchemy/models.py
index be4e1647..c2b81f66 100644
--- a/src/tagstudio/core/library/alchemy/models.py
+++ b/src/tagstudio/core/library/alchemy/models.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from datetime import datetime as dt
from pathlib import Path
diff --git a/src/tagstudio/core/library/alchemy/registries/dupe_files_registry.py b/src/tagstudio/core/library/alchemy/registries/dupe_files_registry.py
index 95143fe2..01147920 100644
--- a/src/tagstudio/core/library/alchemy/registries/dupe_files_registry.py
+++ b/src/tagstudio/core/library/alchemy/registries/dupe_files_registry.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import xml.etree.ElementTree as ET
from dataclasses import dataclass, field
from pathlib import Path
diff --git a/src/tagstudio/core/library/alchemy/registries/ignored_registry.py b/src/tagstudio/core/library/alchemy/registries/ignored_registry.py
index a864e248..5401c61b 100644
--- a/src/tagstudio/core/library/alchemy/registries/ignored_registry.py
+++ b/src/tagstudio/core/library/alchemy/registries/ignored_registry.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Iterator
diff --git a/src/tagstudio/core/library/alchemy/registries/unlinked_registry.py b/src/tagstudio/core/library/alchemy/registries/unlinked_registry.py
index 8058df85..3f2e8539 100644
--- a/src/tagstudio/core/library/alchemy/registries/unlinked_registry.py
+++ b/src/tagstudio/core/library/alchemy/registries/unlinked_registry.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
from collections.abc import Iterator
from dataclasses import dataclass, field
from pathlib import Path
diff --git a/src/tagstudio/core/library/alchemy/visitors.py b/src/tagstudio/core/library/alchemy/visitors.py
index 7f9fc799..35dcf56a 100644
--- a/src/tagstudio/core/library/alchemy/visitors.py
+++ b/src/tagstudio/core/library/alchemy/visitors.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import re
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/core/library/ignore.py b/src/tagstudio/core/library/ignore.py
index 79c70c54..63b7ab18 100644
--- a/src/tagstudio/core/library/ignore.py
+++ b/src/tagstudio/core/library/ignore.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from copy import deepcopy
from pathlib import Path
diff --git a/src/tagstudio/core/library/json/fields.py b/src/tagstudio/core/library/json/fields.py
index 5e3509e4..7797096a 100644
--- a/src/tagstudio/core/library/json/fields.py
+++ b/src/tagstudio/core/library/json/fields.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
BOX_FIELDS = ["tag_box", "text_box"]
TEXT_FIELDS = ["text_line", "text_box"]
DATE_FIELDS = ["datetime"]
diff --git a/src/tagstudio/core/library/json/library.py b/src/tagstudio/core/library/json/library.py
index 81367201..e3370e2a 100644
--- a/src/tagstudio/core/library/json/library.py
+++ b/src/tagstudio/core/library/json/library.py
@@ -1,8 +1,8 @@
# type: ignore
# ruff: noqa
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
"""The Library object and related methods for TagStudio."""
diff --git a/src/tagstudio/core/library/refresh.py b/src/tagstudio/core/library/refresh.py
index 531363f7..824cae52 100644
--- a/src/tagstudio/core/library/refresh.py
+++ b/src/tagstudio/core/library/refresh.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import shutil
diff --git a/src/tagstudio/core/media_types.py b/src/tagstudio/core/media_types.py
index c7c4f0fc..b18290d1 100644
--- a/src/tagstudio/core/media_types.py
+++ b/src/tagstudio/core/media_types.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import mimetypes
diff --git a/src/tagstudio/core/query_lang/ast.py b/src/tagstudio/core/query_lang/ast.py
index 0323bf26..166c9dd7 100644
--- a/src/tagstudio/core/query_lang/ast.py
+++ b/src/tagstudio/core/query_lang/ast.py
@@ -1,11 +1,10 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: MIT
from abc import ABC, abstractmethod
from enum import Enum
-from typing import Generic, TypeVar, override
+from typing import TypeVar, override
class ConstraintType(Enum):
@@ -98,7 +97,7 @@ class Not(AST):
T = TypeVar("T")
-class BaseVisitor(ABC, Generic[T]):
+class BaseVisitor[T](ABC):
def visit(self, node: AST) -> T:
if isinstance(node, ANDList):
return self.visit_and_list(node)
diff --git a/src/tagstudio/core/query_lang/parser.py b/src/tagstudio/core/query_lang/parser.py
index ff17465d..1dc336c5 100644
--- a/src/tagstudio/core/query_lang/parser.py
+++ b/src/tagstudio/core/query_lang/parser.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from tagstudio.core.query_lang.ast import (
diff --git a/src/tagstudio/core/query_lang/tokenizer.py b/src/tagstudio/core/query_lang/tokenizer.py
index 3cdb5035..fc6e6685 100644
--- a/src/tagstudio/core/query_lang/tokenizer.py
+++ b/src/tagstudio/core/query_lang/tokenizer.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from enum import Enum
diff --git a/src/tagstudio/core/query_lang/util.py b/src/tagstudio/core/query_lang/util.py
index 95e53dbe..e0c2b719 100644
--- a/src/tagstudio/core/query_lang/util.py
+++ b/src/tagstudio/core/query_lang/util.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: MIT
from typing import override
diff --git a/src/tagstudio/core/ts_core.py b/src/tagstudio/core/ts_core.py
index 85c800d6..752e1d4a 100644
--- a/src/tagstudio/core/ts_core.py
+++ b/src/tagstudio/core/ts_core.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
"""The core classes and methods of TagStudio."""
diff --git a/src/tagstudio/core/utils/encoding.py b/src/tagstudio/core/utils/encoding.py
index f5a4a0d9..73265f01 100644
--- a/src/tagstudio/core/utils/encoding.py
+++ b/src/tagstudio/core/utils/encoding.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from pathlib import Path
diff --git a/src/tagstudio/core/utils/silent_subprocess.py b/src/tagstudio/core/utils/silent_subprocess.py
index 75fb920d..d4d818a4 100644
--- a/src/tagstudio/core/utils/silent_subprocess.py
+++ b/src/tagstudio/core/utils/silent_subprocess.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import os
import subprocess
diff --git a/src/tagstudio/core/utils/singleton.py b/src/tagstudio/core/utils/singleton.py
index 76b6bf08..82b4518d 100644
--- a/src/tagstudio/core/utils/singleton.py
+++ b/src/tagstudio/core/utils/singleton.py
@@ -1,10 +1,11 @@
-# Based off example from Refactoring Guru:
-# https://refactoring.guru/design-patterns/singleton/python/example#example-1
-# Adapted for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from threading import Lock
+# See also: https://refactoring.guru/design-patterns/singleton/python/example#example-1
class Singleton(type):
"""A thread-safe implementation of a Singleton."""
diff --git a/src/tagstudio/core/utils/str_formatting.py b/src/tagstudio/core/utils/str_formatting.py
index 38151d0e..9fa41ebf 100644
--- a/src/tagstudio/core/utils/str_formatting.py
+++ b/src/tagstudio/core/utils/str_formatting.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import semver
diff --git a/src/tagstudio/core/utils/types.py b/src/tagstudio/core/utils/types.py
index d21feb95..57970334 100644
--- a/src/tagstudio/core/utils/types.py
+++ b/src/tagstudio/core/utils/types.py
@@ -1,5 +1,6 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from typing import TypeVar
diff --git a/src/tagstudio/main.py b/src/tagstudio/main.py
index 70411a27..7997884d 100755
--- a/src/tagstudio/main.py
+++ b/src/tagstudio/main.py
@@ -1,7 +1,6 @@
#!/usr/bin/env python
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
"""TagStudio launcher."""
diff --git a/src/tagstudio/qt/cache_manager.py b/src/tagstudio/qt/cache_manager.py
index e15ead68..00d812ff 100644
--- a/src/tagstudio/qt/cache_manager.py
+++ b/src/tagstudio/qt/cache_manager.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import math
from collections.abc import Iterable
diff --git a/src/tagstudio/qt/controllers/ffmpeg_missing_message_box.py b/src/tagstudio/qt/controllers/ffmpeg_missing_message_box.py
index 3de27f88..a3c71176 100644
--- a/src/tagstudio/qt/controllers/ffmpeg_missing_message_box.py
+++ b/src/tagstudio/qt/controllers/ffmpeg_missing_message_box.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
from shutil import which
import structlog
diff --git a/src/tagstudio/qt/controllers/fix_ignored_modal_controller.py b/src/tagstudio/qt/controllers/fix_ignored_modal_controller.py
index 1199f3cd..0a6bd368 100644
--- a/src/tagstudio/qt/controllers/fix_ignored_modal_controller.py
+++ b/src/tagstudio/qt/controllers/fix_ignored_modal_controller.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/controllers/ignore_modal_controller.py b/src/tagstudio/qt/controllers/ignore_modal_controller.py
index 66937d5b..e2226d66 100644
--- a/src/tagstudio/qt/controllers/ignore_modal_controller.py
+++ b/src/tagstudio/qt/controllers/ignore_modal_controller.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pathlib import Path
diff --git a/src/tagstudio/qt/controllers/library_info_window_controller.py b/src/tagstudio/qt/controllers/library_info_window_controller.py
index ad4a0127..f7bef1a4 100644
--- a/src/tagstudio/qt/controllers/library_info_window_controller.py
+++ b/src/tagstudio/qt/controllers/library_info_window_controller.py
@@ -1,6 +1,7 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import os
from pathlib import Path
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/controllers/out_of_date_message_box.py b/src/tagstudio/qt/controllers/out_of_date_message_box.py
index bc7fb75a..d22c148c 100644
--- a/src/tagstudio/qt/controllers/out_of_date_message_box.py
+++ b/src/tagstudio/qt/controllers/out_of_date_message_box.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import structlog
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QMessageBox
diff --git a/src/tagstudio/qt/controllers/paged_panel_controller.py b/src/tagstudio/qt/controllers/paged_panel_controller.py
index ddffe554..f4a7e8e8 100644
--- a/src/tagstudio/qt/controllers/paged_panel_controller.py
+++ b/src/tagstudio/qt/controllers/paged_panel_controller.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import override
diff --git a/src/tagstudio/qt/controllers/paged_panel_state.py b/src/tagstudio/qt/controllers/paged_panel_state.py
index 368cc4d4..a239ca76 100644
--- a/src/tagstudio/qt/controllers/paged_panel_state.py
+++ b/src/tagstudio/qt/controllers/paged_panel_state.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PySide6.QtWidgets import QPushButton
diff --git a/src/tagstudio/qt/controllers/preview_panel_controller.py b/src/tagstudio/qt/controllers/preview_panel_controller.py
index 360f0558..7933e488 100644
--- a/src/tagstudio/qt/controllers/preview_panel_controller.py
+++ b/src/tagstudio/qt/controllers/preview_panel_controller.py
@@ -1,5 +1,6 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import typing
from warnings import catch_warnings
diff --git a/src/tagstudio/qt/controllers/preview_thumb_controller.py b/src/tagstudio/qt/controllers/preview_thumb_controller.py
index 8986f06f..2c17e242 100644
--- a/src/tagstudio/qt/controllers/preview_thumb_controller.py
+++ b/src/tagstudio/qt/controllers/preview_thumb_controller.py
@@ -1,5 +1,6 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import io
from pathlib import Path
diff --git a/src/tagstudio/qt/controllers/tag_box_controller.py b/src/tagstudio/qt/controllers/tag_box_controller.py
index 2a5865d8..a2b43482 100644
--- a/src/tagstudio/qt/controllers/tag_box_controller.py
+++ b/src/tagstudio/qt/controllers/tag_box_controller.py
@@ -1,5 +1,5 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/global_settings.py b/src/tagstudio/qt/global_settings.py
index 42a7fe38..94be1f07 100644
--- a/src/tagstudio/qt/global_settings.py
+++ b/src/tagstudio/qt/global_settings.py
@@ -1,5 +1,6 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import platform
from datetime import datetime
diff --git a/src/tagstudio/qt/helpers/color_overlay.py b/src/tagstudio/qt/helpers/color_overlay.py
index 8fd43263..0d276210 100644
--- a/src/tagstudio/qt/helpers/color_overlay.py
+++ b/src/tagstudio/qt/helpers/color_overlay.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PIL import Image
diff --git a/src/tagstudio/qt/helpers/escape_text.py b/src/tagstudio/qt/helpers/escape_text.py
index 989ef114..0885d173 100644
--- a/src/tagstudio/qt/helpers/escape_text.py
+++ b/src/tagstudio/qt/helpers/escape_text.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
def escape_text(text: str):
diff --git a/src/tagstudio/qt/helpers/file_tester.py b/src/tagstudio/qt/helpers/file_tester.py
index d899f7e6..89e20295 100644
--- a/src/tagstudio/qt/helpers/file_tester.py
+++ b/src/tagstudio/qt/helpers/file_tester.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pathlib import Path
diff --git a/src/tagstudio/qt/helpers/gradients.py b/src/tagstudio/qt/helpers/gradients.py
index 1e672868..004a3852 100644
--- a/src/tagstudio/qt/helpers/gradients.py
+++ b/src/tagstudio/qt/helpers/gradients.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PIL import Image
diff --git a/src/tagstudio/qt/helpers/image_effects.py b/src/tagstudio/qt/helpers/image_effects.py
index ca764744..3af6cf3c 100644
--- a/src/tagstudio/qt/helpers/image_effects.py
+++ b/src/tagstudio/qt/helpers/image_effects.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import numpy as np
diff --git a/src/tagstudio/qt/helpers/text_wrapper.py b/src/tagstudio/qt/helpers/text_wrapper.py
index 71d6b5be..ce4bae5d 100644
--- a/src/tagstudio/qt/helpers/text_wrapper.py
+++ b/src/tagstudio/qt/helpers/text_wrapper.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PIL import Image, ImageDraw, ImageFont
diff --git a/src/tagstudio/qt/mixed/about_modal.py b/src/tagstudio/qt/mixed/about_modal.py
index e6be1c7d..3d1092f1 100644
--- a/src/tagstudio/qt/mixed/about_modal.py
+++ b/src/tagstudio/qt/mixed/about_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import math
diff --git a/src/tagstudio/qt/mixed/add_field.py b/src/tagstudio/qt/mixed/add_field.py
index ba83ab58..52b64e5e 100644
--- a/src/tagstudio/qt/mixed/add_field.py
+++ b/src/tagstudio/qt/mixed/add_field.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import override
diff --git a/src/tagstudio/qt/mixed/build_color.py b/src/tagstudio/qt/mixed/build_color.py
index a33ef435..07b43d88 100644
--- a/src/tagstudio/qt/mixed/build_color.py
+++ b/src/tagstudio/qt/mixed/build_color.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import contextlib
diff --git a/src/tagstudio/qt/mixed/build_namespace.py b/src/tagstudio/qt/mixed/build_namespace.py
index c7b4ed23..5b91a700 100644
--- a/src/tagstudio/qt/mixed/build_namespace.py
+++ b/src/tagstudio/qt/mixed/build_namespace.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import contextlib
diff --git a/src/tagstudio/qt/mixed/build_tag.py b/src/tagstudio/qt/mixed/build_tag.py
index 94e63f3e..a6aef61f 100644
--- a/src/tagstudio/qt/mixed/build_tag.py
+++ b/src/tagstudio/qt/mixed/build_tag.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import sys
diff --git a/src/tagstudio/qt/mixed/collage_icon.py b/src/tagstudio/qt/mixed/collage_icon.py
index 13930085..105aff34 100644
--- a/src/tagstudio/qt/mixed/collage_icon.py
+++ b/src/tagstudio/qt/mixed/collage_icon.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import math
diff --git a/src/tagstudio/qt/mixed/color_box.py b/src/tagstudio/qt/mixed/color_box.py
index 20866c43..59079412 100644
--- a/src/tagstudio/qt/mixed/color_box.py
+++ b/src/tagstudio/qt/mixed/color_box.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import typing
diff --git a/src/tagstudio/qt/mixed/datetime_picker.py b/src/tagstudio/qt/mixed/datetime_picker.py
index b059dd96..318c4768 100644
--- a/src/tagstudio/qt/mixed/datetime_picker.py
+++ b/src/tagstudio/qt/mixed/datetime_picker.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import typing
from collections.abc import Callable
from datetime import datetime as dt
diff --git a/src/tagstudio/qt/mixed/drop_import_modal.py b/src/tagstudio/qt/mixed/drop_import_modal.py
index 766ce608..570448b5 100644
--- a/src/tagstudio/qt/mixed/drop_import_modal.py
+++ b/src/tagstudio/qt/mixed/drop_import_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import enum
diff --git a/src/tagstudio/qt/mixed/field_containers.py b/src/tagstudio/qt/mixed/field_containers.py
index 12f82577..212e6a54 100644
--- a/src/tagstudio/qt/mixed/field_containers.py
+++ b/src/tagstudio/qt/mixed/field_containers.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import sys
diff --git a/src/tagstudio/qt/mixed/field_widget.py b/src/tagstudio/qt/mixed/field_widget.py
index d2678b55..04ee3c37 100644
--- a/src/tagstudio/qt/mixed/field_widget.py
+++ b/src/tagstudio/qt/mixed/field_widget.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import math
diff --git a/src/tagstudio/qt/mixed/file_attributes.py b/src/tagstudio/qt/mixed/file_attributes.py
index 5704e6e9..f4786ef4 100644
--- a/src/tagstudio/qt/mixed/file_attributes.py
+++ b/src/tagstudio/qt/mixed/file_attributes.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import os
diff --git a/src/tagstudio/qt/mixed/fix_dupe_files.py b/src/tagstudio/qt/mixed/fix_dupe_files.py
index c215e862..c7c3165b 100644
--- a/src/tagstudio/qt/mixed/fix_dupe_files.py
+++ b/src/tagstudio/qt/mixed/fix_dupe_files.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/mixed/fix_unlinked.py b/src/tagstudio/qt/mixed/fix_unlinked.py
index 63a1affc..59474c1f 100644
--- a/src/tagstudio/qt/mixed/fix_unlinked.py
+++ b/src/tagstudio/qt/mixed/fix_unlinked.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/mixed/folders_to_tags.py b/src/tagstudio/qt/mixed/folders_to_tags.py
index f7051f77..45cdbc0a 100644
--- a/src/tagstudio/qt/mixed/folders_to_tags.py
+++ b/src/tagstudio/qt/mixed/folders_to_tags.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import math
diff --git a/src/tagstudio/qt/mixed/item_thumb.py b/src/tagstudio/qt/mixed/item_thumb.py
index 49a9858f..1e112eaf 100644
--- a/src/tagstudio/qt/mixed/item_thumb.py
+++ b/src/tagstudio/qt/mixed/item_thumb.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from enum import Enum
diff --git a/src/tagstudio/qt/mixed/landing.py b/src/tagstudio/qt/mixed/landing.py
index 050994ac..7f5f6ba7 100644
--- a/src/tagstudio/qt/mixed/landing.py
+++ b/src/tagstudio/qt/mixed/landing.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import sys
diff --git a/src/tagstudio/qt/mixed/media_player.py b/src/tagstudio/qt/mixed/media_player.py
index 065e73d4..f4649efe 100644
--- a/src/tagstudio/qt/mixed/media_player.py
+++ b/src/tagstudio/qt/mixed/media_player.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import typing
from pathlib import Path
diff --git a/src/tagstudio/qt/mixed/merge_dupe_entries.py b/src/tagstudio/qt/mixed/merge_dupe_entries.py
index af56a0bf..0091bb3a 100644
--- a/src/tagstudio/qt/mixed/merge_dupe_entries.py
+++ b/src/tagstudio/qt/mixed/merge_dupe_entries.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import typing
diff --git a/src/tagstudio/qt/mixed/migration_modal.py b/src/tagstudio/qt/mixed/migration_modal.py
index fc5504c3..b761d81e 100644
--- a/src/tagstudio/qt/mixed/migration_modal.py
+++ b/src/tagstudio/qt/mixed/migration_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import traceback
diff --git a/src/tagstudio/qt/mixed/mirror_entries_modal.py b/src/tagstudio/qt/mixed/mirror_entries_modal.py
index 20c37881..d06627a6 100644
--- a/src/tagstudio/qt/mixed/mirror_entries_modal.py
+++ b/src/tagstudio/qt/mixed/mirror_entries_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import typing
diff --git a/src/tagstudio/qt/mixed/pagination.py b/src/tagstudio/qt/mixed/pagination.py
index e39fc048..b3a12643 100644
--- a/src/tagstudio/qt/mixed/pagination.py
+++ b/src/tagstudio/qt/mixed/pagination.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
"""A pagination widget created for TagStudio."""
diff --git a/src/tagstudio/qt/mixed/progress_bar.py b/src/tagstudio/qt/mixed/progress_bar.py
index 9dba568a..e9c46c09 100644
--- a/src/tagstudio/qt/mixed/progress_bar.py
+++ b/src/tagstudio/qt/mixed/progress_bar.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Callable
diff --git a/src/tagstudio/qt/mixed/relink_entries_modal.py b/src/tagstudio/qt/mixed/relink_entries_modal.py
index c966f873..8acd7c1b 100644
--- a/src/tagstudio/qt/mixed/relink_entries_modal.py
+++ b/src/tagstudio/qt/mixed/relink_entries_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PySide6.QtCore import QObject, Signal
diff --git a/src/tagstudio/qt/mixed/remove_ignored_modal.py b/src/tagstudio/qt/mixed/remove_ignored_modal.py
index 0d45f094..5977009e 100644
--- a/src/tagstudio/qt/mixed/remove_ignored_modal.py
+++ b/src/tagstudio/qt/mixed/remove_ignored_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/mixed/remove_unlinked_modal.py b/src/tagstudio/qt/mixed/remove_unlinked_modal.py
index 1b5353cb..0b4e6b6b 100644
--- a/src/tagstudio/qt/mixed/remove_unlinked_modal.py
+++ b/src/tagstudio/qt/mixed/remove_unlinked_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/mixed/settings_panel.py b/src/tagstudio/qt/mixed/settings_panel.py
index 19d33754..5e8c022d 100644
--- a/src/tagstudio/qt/mixed/settings_panel.py
+++ b/src/tagstudio/qt/mixed/settings_panel.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, Any
diff --git a/src/tagstudio/qt/mixed/tag_color_label.py b/src/tagstudio/qt/mixed/tag_color_label.py
index 39d5d96f..8052f59d 100644
--- a/src/tagstudio/qt/mixed/tag_color_label.py
+++ b/src/tagstudio/qt/mixed/tag_color_label.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import typing
diff --git a/src/tagstudio/qt/mixed/tag_color_manager.py b/src/tagstudio/qt/mixed/tag_color_manager.py
index d381fcac..92c3b42b 100644
--- a/src/tagstudio/qt/mixed/tag_color_manager.py
+++ b/src/tagstudio/qt/mixed/tag_color_manager.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from collections.abc import Callable
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/mixed/tag_color_preview.py b/src/tagstudio/qt/mixed/tag_color_preview.py
index 8d8a7e8b..c73571d4 100644
--- a/src/tagstudio/qt/mixed/tag_color_preview.py
+++ b/src/tagstudio/qt/mixed/tag_color_preview.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import typing
diff --git a/src/tagstudio/qt/mixed/tag_color_selection.py b/src/tagstudio/qt/mixed/tag_color_selection.py
index e6bacc1a..a58d3c06 100644
--- a/src/tagstudio/qt/mixed/tag_color_selection.py
+++ b/src/tagstudio/qt/mixed/tag_color_selection.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import structlog
diff --git a/src/tagstudio/qt/mixed/tag_database.py b/src/tagstudio/qt/mixed/tag_database.py
index 180cee9c..1ac59ea1 100644
--- a/src/tagstudio/qt/mixed/tag_database.py
+++ b/src/tagstudio/qt/mixed/tag_database.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import structlog
diff --git a/src/tagstudio/qt/mixed/tag_search.py b/src/tagstudio/qt/mixed/tag_search.py
index b4193307..e309d5d0 100644
--- a/src/tagstudio/qt/mixed/tag_search.py
+++ b/src/tagstudio/qt/mixed/tag_search.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, Union
diff --git a/src/tagstudio/qt/mixed/tag_widget.py b/src/tagstudio/qt/mixed/tag_widget.py
index 85b62c4e..5907fd18 100644
--- a/src/tagstudio/qt/mixed/tag_widget.py
+++ b/src/tagstudio/qt/mixed/tag_widget.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Callable
diff --git a/src/tagstudio/qt/mixed/text_field.py b/src/tagstudio/qt/mixed/text_field.py
index c50123ea..3d958e3c 100644
--- a/src/tagstudio/qt/mixed/text_field.py
+++ b/src/tagstudio/qt/mixed/text_field.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import re
diff --git a/src/tagstudio/qt/mnemonics.py b/src/tagstudio/qt/mnemonics.py
index a5f13bda..359e7f44 100644
--- a/src/tagstudio/qt/mnemonics.py
+++ b/src/tagstudio/qt/mnemonics.py
@@ -1,5 +1,7 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import re
import structlog
diff --git a/src/tagstudio/qt/models/palette.py b/src/tagstudio/qt/models/palette.py
index 0d658a57..120dab72 100644
--- a/src/tagstudio/qt/models/palette.py
+++ b/src/tagstudio/qt/models/palette.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import traceback
from enum import IntEnum
diff --git a/src/tagstudio/qt/platform_strings.py b/src/tagstudio/qt/platform_strings.py
index 6144896f..91f12a31 100644
--- a/src/tagstudio/qt/platform_strings.py
+++ b/src/tagstudio/qt/platform_strings.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
"""A collection of platform-dependant strings."""
diff --git a/src/tagstudio/qt/previews/renderer.py b/src/tagstudio/qt/previews/renderer.py
index 9fc8ae6c..1f4215f6 100644
--- a/src/tagstudio/qt/previews/renderer.py
+++ b/src/tagstudio/qt/previews/renderer.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import base64
diff --git a/src/tagstudio/qt/previews/vendored/blender_renderer.py b/src/tagstudio/qt/previews/vendored/blender_renderer.py
index 10e059e1..1d83f13f 100644
--- a/src/tagstudio/qt/previews/vendored/blender_renderer.py
+++ b/src/tagstudio/qt/previews/vendored/blender_renderer.py
@@ -1,22 +1,7 @@
#!/usr/bin/env python3
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
#
diff --git a/src/tagstudio/qt/previews/vendored/ffmpeg.py b/src/tagstudio/qt/previews/vendored/ffmpeg.py
index e2d9a6c7..84d6ba19 100644
--- a/src/tagstudio/qt/previews/vendored/ffmpeg.py
+++ b/src/tagstudio/qt/previews/vendored/ffmpeg.py
@@ -1,7 +1,9 @@
-# Copyright (C) 2022 Karl Kroening (kkroening).
-# Licensed under the GPL-3.0 License.
+# SPDX-FileCopyrightText: (c) 2022 Karl Kroening (kkroening)
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
# Vendored from ffmpeg-python and ffmpeg-python PR#790 by amamic1803
+
import contextlib
import json
import os
diff --git a/src/tagstudio/qt/previews/vendored/pydub/audio_segment.py b/src/tagstudio/qt/previews/vendored/pydub/audio_segment.py
index 2baad076..99ce1255 100644
--- a/src/tagstudio/qt/previews/vendored/pydub/audio_segment.py
+++ b/src/tagstudio/qt/previews/vendored/pydub/audio_segment.py
@@ -1,7 +1,8 @@
-# type: ignore
-# Copyright (C) 2022 James Robert (jiaaro).
-# Licensed under the MIT License.
+# SPDX-FileCopyrightText: (c) 2022 James Robert (jiaaro)
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
# Vendored from pydub
+# type: ignore
import array
diff --git a/src/tagstudio/qt/previews/vendored/pydub/utils.py b/src/tagstudio/qt/previews/vendored/pydub/utils.py
index 4a4cb889..abc8ce9f 100644
--- a/src/tagstudio/qt/previews/vendored/pydub/utils.py
+++ b/src/tagstudio/qt/previews/vendored/pydub/utils.py
@@ -1,3 +1,9 @@
+# SPDX-FileCopyrightText: (c) 2011 James Robert, http://jiaaro.com
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+# Vendored from pydub
+
+
import json
import re
import subprocess
diff --git a/src/tagstudio/qt/resource_manager.py b/src/tagstudio/qt/resource_manager.py
index e3d259b2..f1d387ab 100644
--- a/src/tagstudio/qt/resource_manager.py
+++ b/src/tagstudio/qt/resource_manager.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pathlib import Path
diff --git a/src/tagstudio/qt/resources.qrc b/src/tagstudio/qt/resources.qrc
index c425750b..fcaf44c8 100644
--- a/src/tagstudio/qt/resources.qrc
+++ b/src/tagstudio/qt/resources.qrc
@@ -1,3 +1,5 @@
+
+
@@ -9,4 +11,4 @@
-
\ No newline at end of file
+
diff --git a/src/tagstudio/qt/resources_rc.py b/src/tagstudio/qt/resources_rc.py
index 6e1940b3..fc514375 100644
--- a/src/tagstudio/qt/resources_rc.py
+++ b/src/tagstudio/qt/resources_rc.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
# Resource object code (Python 3)
# Created by: object code
# Created by: The Resource Compiler for Qt version 6.8.0
diff --git a/src/tagstudio/qt/thumb_grid_layout.py b/src/tagstudio/qt/thumb_grid_layout.py
index 2eba8c70..42fac679 100644
--- a/src/tagstudio/qt/thumb_grid_layout.py
+++ b/src/tagstudio/qt/thumb_grid_layout.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import math
import time
from collections.abc import Iterable
diff --git a/src/tagstudio/qt/translations.py b/src/tagstudio/qt/translations.py
index 0875bcf1..bec0b194 100644
--- a/src/tagstudio/qt/translations.py
+++ b/src/tagstudio/qt/translations.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
from collections import defaultdict
from pathlib import Path
from platform import system
diff --git a/src/tagstudio/qt/ts_qt.py b/src/tagstudio/qt/ts_qt.py
index 0f818460..538c053e 100644
--- a/src/tagstudio/qt/ts_qt.py
+++ b/src/tagstudio/qt/ts_qt.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
# SIGTERM handling based on the implementation by Virgil Dupras for dupeGuru:
# https://github.com/arsenetar/dupeguru/blob/master/run.py#L71
@@ -21,7 +21,7 @@ from collections import OrderedDict
from pathlib import Path
from queue import Queue
from shutil import which
-from typing import Generic, TypeVar
+from typing import TypeVar
from warnings import catch_warnings
import structlog
@@ -148,7 +148,7 @@ T = TypeVar("T")
# | A [B]<- C |
# |[A]<- B C | Previous routes still exist
# | A ->[D] | Stack is cut from [:A] on new route
-class History(Generic[T]):
+class History[T]:
__history: list[T]
__index: int = 0
diff --git a/src/tagstudio/qt/utils/custom_runnable.py b/src/tagstudio/qt/utils/custom_runnable.py
index 6520c16f..6c10dd06 100644
--- a/src/tagstudio/qt/utils/custom_runnable.py
+++ b/src/tagstudio/qt/utils/custom_runnable.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PySide6.QtCore import QObject, QRunnable, Signal
diff --git a/src/tagstudio/qt/utils/file_deleter.py b/src/tagstudio/qt/utils/file_deleter.py
index 1e264b07..d12d4a9d 100644
--- a/src/tagstudio/qt/utils/file_deleter.py
+++ b/src/tagstudio/qt/utils/file_deleter.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import os
diff --git a/src/tagstudio/qt/utils/file_opener.py b/src/tagstudio/qt/utils/file_opener.py
index e1b27c27..a009dcff 100644
--- a/src/tagstudio/qt/utils/file_opener.py
+++ b/src/tagstudio/qt/utils/file_opener.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import shutil
import subprocess
diff --git a/src/tagstudio/qt/utils/function_iterator.py b/src/tagstudio/qt/utils/function_iterator.py
index 9f213790..ef88d31e 100644
--- a/src/tagstudio/qt/utils/function_iterator.py
+++ b/src/tagstudio/qt/utils/function_iterator.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Callable
diff --git a/src/tagstudio/qt/views/clickable_label.py b/src/tagstudio/qt/views/clickable_label.py
index c7478b9f..f382d14e 100644
--- a/src/tagstudio/qt/views/clickable_label.py
+++ b/src/tagstudio/qt/views/clickable_label.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import override
diff --git a/src/tagstudio/qt/views/clickable_slider.py b/src/tagstudio/qt/views/clickable_slider.py
index a683a74a..d1ac82a1 100644
--- a/src/tagstudio/qt/views/clickable_slider.py
+++ b/src/tagstudio/qt/views/clickable_slider.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from typing import override
diff --git a/src/tagstudio/qt/views/edit_text_box_modal.py b/src/tagstudio/qt/views/edit_text_box_modal.py
index 3c3bce32..fd60ba21 100644
--- a/src/tagstudio/qt/views/edit_text_box_modal.py
+++ b/src/tagstudio/qt/views/edit_text_box_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PySide6.QtWidgets import QPlainTextEdit, QVBoxLayout
diff --git a/src/tagstudio/qt/views/edit_text_line_modal.py b/src/tagstudio/qt/views/edit_text_line_modal.py
index 5ee933cc..d7ce6d0d 100644
--- a/src/tagstudio/qt/views/edit_text_line_modal.py
+++ b/src/tagstudio/qt/views/edit_text_line_modal.py
@@ -1,5 +1,6 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from collections.abc import Callable
diff --git a/src/tagstudio/qt/views/fix_ignored_modal_view.py b/src/tagstudio/qt/views/fix_ignored_modal_view.py
index b198a2b4..fdad55e6 100644
--- a/src/tagstudio/qt/views/fix_ignored_modal_view.py
+++ b/src/tagstudio/qt/views/fix_ignored_modal_view.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from typing import TYPE_CHECKING, override
diff --git a/src/tagstudio/qt/views/ignore_modal_view.py b/src/tagstudio/qt/views/ignore_modal_view.py
index 7e7de161..277f5eea 100644
--- a/src/tagstudio/qt/views/ignore_modal_view.py
+++ b/src/tagstudio/qt/views/ignore_modal_view.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import structlog
diff --git a/src/tagstudio/qt/views/layouts/flow_layout.py b/src/tagstudio/qt/views/layouts/flow_layout.py
index 14fb411d..af14a7b2 100644
--- a/src/tagstudio/qt/views/layouts/flow_layout.py
+++ b/src/tagstudio/qt/views/layouts/flow_layout.py
@@ -1,6 +1,7 @@
-# Copyright (C) 2013 Riverbank Computing Limited.
-# Copyright (C) 2022 The Qt Company Ltd.
-# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+# SPDX-FileCopyrightText: (C) 2013 Riverbank Computing Limited.
+# SPDX-FileCopyrightText: (C) 2022 The Qt Company Ltd.
+# SPDX-FileCopyrightText: (C) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
"""PySide6 port of the widgets/layouts/flowlayout example from Qt v6.x."""
diff --git a/src/tagstudio/qt/views/library_info_window_view.py b/src/tagstudio/qt/views/library_info_window_view.py
index 694d9259..bfd06c0a 100644
--- a/src/tagstudio/qt/views/library_info_window_view.py
+++ b/src/tagstudio/qt/views/library_info_window_view.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import math
diff --git a/src/tagstudio/qt/views/main_window.py b/src/tagstudio/qt/views/main_window.py
index a4c0485a..374df646 100644
--- a/src/tagstudio/qt/views/main_window.py
+++ b/src/tagstudio/qt/views/main_window.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import typing
diff --git a/src/tagstudio/qt/views/paged_body_wrapper.py b/src/tagstudio/qt/views/paged_body_wrapper.py
index cb713b3e..a6380d54 100644
--- a/src/tagstudio/qt/views/paged_body_wrapper.py
+++ b/src/tagstudio/qt/views/paged_body_wrapper.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PySide6.QtCore import Qt
diff --git a/src/tagstudio/qt/views/panel_modal.py b/src/tagstudio/qt/views/panel_modal.py
old mode 100755
new mode 100644
index 241e57f7..b754c118
--- a/src/tagstudio/qt/views/panel_modal.py
+++ b/src/tagstudio/qt/views/panel_modal.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Callable
diff --git a/src/tagstudio/qt/views/preview_panel_view.py b/src/tagstudio/qt/views/preview_panel_view.py
index 5ae7004c..f83045cd 100644
--- a/src/tagstudio/qt/views/preview_panel_view.py
+++ b/src/tagstudio/qt/views/preview_panel_view.py
@@ -1,5 +1,6 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import traceback
import typing
diff --git a/src/tagstudio/qt/views/preview_thumb_view.py b/src/tagstudio/qt/views/preview_thumb_view.py
index e50509ad..d6c032f7 100644
--- a/src/tagstudio/qt/views/preview_thumb_view.py
+++ b/src/tagstudio/qt/views/preview_thumb_view.py
@@ -1,5 +1,6 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
import math
import time
diff --git a/src/tagstudio/qt/views/qbutton_wrapper.py b/src/tagstudio/qt/views/qbutton_wrapper.py
index e26703d5..c6f90e32 100644
--- a/src/tagstudio/qt/views/qbutton_wrapper.py
+++ b/src/tagstudio/qt/views/qbutton_wrapper.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PySide6.QtWidgets import QPushButton
diff --git a/src/tagstudio/qt/views/splash.py b/src/tagstudio/qt/views/splash.py
index fe139d17..220c4c5c 100644
--- a/src/tagstudio/qt/views/splash.py
+++ b/src/tagstudio/qt/views/splash.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import math
diff --git a/src/tagstudio/qt/views/styles/rounded_pixmap_style.py b/src/tagstudio/qt/views/styles/rounded_pixmap_style.py
index df83c5a0..33395a5a 100644
--- a/src/tagstudio/qt/views/styles/rounded_pixmap_style.py
+++ b/src/tagstudio/qt/views/styles/rounded_pixmap_style.py
@@ -1,8 +1,6 @@
-# Based on the implementation by eyllanesc:
-# https://stackoverflow.com/questions/54230005/qmovie-with-border-radius
-# Licensed under the Creative Commons CC BY-SA 4.0 License:
-# https://creativecommons.org/licenses/by-sa/4.0/
-# Modified for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) 2019 Edwin Yllanes
+# SPDX-License-Identifier: CC-BY-SA-4.0
+# See: https://stackoverflow.com/questions/54230005/qmovie-with-border-radius/54231484#54231484
from typing import override
diff --git a/src/tagstudio/qt/views/tag_box_view.py b/src/tagstudio/qt/views/tag_box_view.py
index bf24a88c..e5c96462 100644
--- a/src/tagstudio/qt/views/tag_box_view.py
+++ b/src/tagstudio/qt/views/tag_box_view.py
@@ -1,5 +1,5 @@
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Iterable
diff --git a/src/tagstudio/qt/views/thumb_button.py b/src/tagstudio/qt/views/thumb_button.py
index 88f5f906..d08f597d 100644
--- a/src/tagstudio/qt/views/thumb_button.py
+++ b/src/tagstudio/qt/views/thumb_button.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2024 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import sys
diff --git a/src/tagstudio/resources/qt/fonts/Oxanium-Bold.ttf.license b/src/tagstudio/resources/qt/fonts/Oxanium-Bold.ttf.license
new file mode 100644
index 00000000..d56fe894
--- /dev/null
+++ b/src/tagstudio/resources/qt/fonts/Oxanium-Bold.ttf.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: 2019 The Oxanium Project Authors (https://github.com/sevmeyer/oxanium)
+SPDX-License-Identifier: OFL-1.1
diff --git a/tagstudio.spec b/tagstudio.spec
index e64bdecf..fbed8ea6 100644
--- a/tagstudio.spec
+++ b/tagstudio.spec
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
import platform
from argparse import ArgumentParser
diff --git a/tests/conftest.py b/tests/conftest.py
index b9f4c0c5..28b1d577 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import sys
diff --git a/tests/macros/test_dupe_files.py b/tests/macros/test_dupe_files.py
index 05053555..cd296e16 100644
--- a/tests/macros/test_dupe_files.py
+++ b/tests/macros/test_dupe_files.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from pathlib import Path
diff --git a/tests/macros/test_folders_tags.py b/tests/macros/test_folders_tags.py
index 7beae3d8..c3fd32be 100644
--- a/tests/macros/test_folders_tags.py
+++ b/tests/macros/test_folders_tags.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from tagstudio.core.library.alchemy.library import Library
from tagstudio.qt.mixed.folders_to_tags import folders_to_tags
diff --git a/tests/macros/test_missing_files.py b/tests/macros/test_missing_files.py
index 61bacce0..3ea463a6 100644
--- a/tests/macros/test_missing_files.py
+++ b/tests/macros/test_missing_files.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from pathlib import Path
from tempfile import TemporaryDirectory
diff --git a/tests/macros/test_refresh_dir.py b/tests/macros/test_refresh_dir.py
index ca6ce697..01578aad 100644
--- a/tests/macros/test_refresh_dir.py
+++ b/tests/macros/test_refresh_dir.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from pathlib import Path
from tempfile import TemporaryDirectory
diff --git a/tests/qt/test_about_modal.py b/tests/qt/test_about_modal.py
index 523eb6a6..7ee64735 100644
--- a/tests/qt/test_about_modal.py
+++ b/tests/qt/test_about_modal.py
@@ -1,3 +1,7 @@
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
from pytestqt.qtbot import QtBot
from tagstudio.qt.mixed.about_modal import AboutModal
diff --git a/tests/qt/test_build_tag_panel.py b/tests/qt/test_build_tag_panel.py
index 9ae15726..b624356e 100644
--- a/tests/qt/test_build_tag_panel.py
+++ b/tests/qt/test_build_tag_panel.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Callable
diff --git a/tests/qt/test_field_containers.py b/tests/qt/test_field_containers.py
index 2b992114..0d19e4e0 100644
--- a/tests/qt/test_field_containers.py
+++ b/tests/qt/test_field_containers.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from tagstudio.core.library.alchemy.library import Library
diff --git a/tests/qt/test_file_path_options.py b/tests/qt/test_file_path_options.py
index 412cd56f..1d28f33d 100644
--- a/tests/qt/test_file_path_options.py
+++ b/tests/qt/test_file_path_options.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import os
diff --git a/tests/qt/test_flow_widget.py b/tests/qt/test_flow_widget.py
index 115ded7a..97393416 100644
--- a/tests/qt/test_flow_widget.py
+++ b/tests/qt/test_flow_widget.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from PySide6.QtCore import QRect
diff --git a/tests/qt/test_folders_to_tags.py b/tests/qt/test_folders_to_tags.py
index eebee999..7e48fc59 100644
--- a/tests/qt/test_folders_to_tags.py
+++ b/tests/qt/test_folders_to_tags.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from tagstudio.core.library.alchemy.library import Library
diff --git a/tests/qt/test_global_settings.py b/tests/qt/test_global_settings.py
index 95d6b5f6..63eb5195 100644
--- a/tests/qt/test_global_settings.py
+++ b/tests/qt/test_global_settings.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pathlib import Path
diff --git a/tests/qt/test_item_thumb.py b/tests/qt/test_item_thumb.py
index f022f976..d5c1e904 100644
--- a/tests/qt/test_item_thumb.py
+++ b/tests/qt/test_item_thumb.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import pytest
diff --git a/tests/qt/test_preview_panel.py b/tests/qt/test_preview_panel.py
index 12282c9b..b2e3ef5a 100644
--- a/tests/qt/test_preview_panel.py
+++ b/tests/qt/test_preview_panel.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from tagstudio.core.library.alchemy.library import Library
diff --git a/tests/qt/test_qt_driver.py b/tests/qt/test_qt_driver.py
index 3cf042aa..37bd3832 100644
--- a/tests/qt/test_qt_driver.py
+++ b/tests/qt/test_qt_driver.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
from tagstudio.core.library.alchemy.enums import BrowsingState
from tagstudio.core.utils.types import unwrap
diff --git a/tests/qt/test_resource_manager.py b/tests/qt/test_resource_manager.py
index bb9ae72f..5a6d72df 100644
--- a/tests/qt/test_resource_manager.py
+++ b/tests/qt/test_resource_manager.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import structlog
diff --git a/tests/qt/test_tag_panel.py b/tests/qt/test_tag_panel.py
index 0d813da6..d5c70564 100644
--- a/tests/qt/test_tag_panel.py
+++ b/tests/qt/test_tag_panel.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pytestqt.qtbot import QtBot
diff --git a/tests/qt/test_tag_search_panel.py b/tests/qt/test_tag_search_panel.py
index bc455685..04a176cc 100644
--- a/tests/qt/test_tag_search_panel.py
+++ b/tests/qt/test_tag_search_panel.py
@@ -1,6 +1,7 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
+
from PySide6.QtCore import SIGNAL
from pytestqt.qtbot import QtBot
diff --git a/tests/qt/test_theme_system.py b/tests/qt/test_theme_system.py
index 94a0bdac..ab2eecf3 100644
--- a/tests/qt/test_theme_system.py
+++ b/tests/qt/test_theme_system.py
@@ -1,6 +1,6 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
+
"""Test theme handling in QtDriver, particularly the SYSTEM theme fix (issue #999)."""
diff --git a/tests/test_db_migrations.py b/tests/test_db_migrations.py
index 6052a44a..7dee6b6c 100644
--- a/tests/test_db_migrations.py
+++ b/tests/test_db_migrations.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import shutil
diff --git a/tests/test_driver.py b/tests/test_driver.py
index 903cf1aa..5ca04b04 100644
--- a/tests/test_driver.py
+++ b/tests/test_driver.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pathlib import Path
diff --git a/tests/test_json_migration.py b/tests/test_json_migration.py
index e44a08d3..3c3c15db 100644
--- a/tests/test_json_migration.py
+++ b/tests/test_json_migration.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025 Travis Abendshien (CyanVoxel).
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from pathlib import Path
diff --git a/tests/test_library.py b/tests/test_library.py
index 64d3f961..17f0d990 100644
--- a/tests/test_library.py
+++ b/tests/test_library.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
from collections.abc import Callable
diff --git a/tests/test_search.py b/tests/test_search.py
index 79812dfa..ee36af1e 100644
--- a/tests/test_search.py
+++ b/tests/test_search.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import pytest
diff --git a/tests/test_translations.py b/tests/test_translations.py
index f01be2c6..8d0533f3 100644
--- a/tests/test_translations.py
+++ b/tests/test_translations.py
@@ -1,6 +1,5 @@
-# Copyright (C) 2025
-# Licensed under the GPL-3.0 License.
-# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
+# SPDX-FileCopyrightText: (c) TagStudio Contributors
+# SPDX-License-Identifier: GPL-3.0-only
import string