diff --git a/.github/flake8-problem-matcher.json b/.github/flake8-problem-matcher.json
new file mode 100644
index 000000000..52f94e05e
--- /dev/null
+++ b/.github/flake8-problem-matcher.json
@@ -0,0 +1,16 @@
+{
+    "problemMatcher": [
+        {
+            "owner": "flake8",
+            "pattern": [
+                {
+                    "regexp": "^(.*?):(\\d+):(\\d+): (.*)$",
+                    "file": 1,
+                    "line": 2,
+                    "column": 3,
+                    "message": 4
+                }
+            ]
+        }
+    ]
+}
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 08e7548f2..48d43d059 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -65,9 +65,6 @@ jobs:
   lint:
     runs-on: ubuntu-latest
 
-    env:
-      PY_COLORS: 1
-
     steps:
       - uses: actions/checkout@v2
 
@@ -81,5 +78,8 @@ jobs:
           python -m pip install --upgrade pip
           python -m pip install tox sphinx
 
+      - name: Add problem matcher
+        run: echo "::add-matcher::.github/flake8-problem-matcher.json"
+
       - name: Lint with flake8
         run: tox -e py-lint
diff --git a/beetsplug/convert.py b/beetsplug/convert.py
index e7ac4f3ac..70363f6eb 100644
--- a/beetsplug/convert.py
+++ b/beetsplug/convert.py
@@ -148,6 +148,7 @@ class ConvertPlugin(BeetsPlugin):
             u'never_convert_lossy_files': False,
             u'copy_album_art': False,
             u'album_art_maxwidth': 0,
+            u'delete_originals': False,
         })
         self.early_import_stages = [self.auto_convert]
 
@@ -532,11 +533,16 @@ class ConvertPlugin(BeetsPlugin):
 
             # Change the newly-imported database entry to point to the
             # converted file.
+            source_path = item.path
             item.path = dest
             item.write()
             item.read()  # Load new audio information data.
             item.store()
 
+            if self.config['delete_originals']:
+                self._log.info(u'Removing original file {0}', source_path)
+                util.remove(source_path, False)
+
     def _cleanup(self, task, session):
         for path in task.old_paths:
             if path in _temp_files:
diff --git a/docs/changelog.rst b/docs/changelog.rst
index 4a87f7f07..0dfa2c5f8 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -142,6 +142,10 @@ New features:
 * :doc:`/plugins/thumbnails`: Fix a bug where pathlib expected a string instead
   of bytes for a path.
   :bug:`3360`
+* :doc:`/plugins/convert`: If ``delete_originals`` is enabled, then the source files will
+  be deleted after importing.
+  Thanks to :user:`logan-arens`.
+  :bug:`2947`
 
 Fixes:
 
diff --git a/docs/plugins/convert.rst b/docs/plugins/convert.rst
index 6e9d00a11..9581e24a4 100644
--- a/docs/plugins/convert.rst
+++ b/docs/plugins/convert.rst
@@ -111,6 +111,8 @@ file. The available options are:
   This option overrides ``link``. Only works when converting to a directory
   on the same filesystem as the library.
   Default: ``false``.
+- **delete_originals**: Transcoded files will be copied or moved to their destination, depending on the import configuration. By default, the original files are not modified by the plugin. This option deletes the original files after the transcoding step has completed.
+  Default: ``false``.
 
 You can also configure the format to use for transcoding (see the next
 section):

convert: In `auto` mode, respect `import.move` by deleting old files
The relevant parts of my config:
```
import:
    move: yes

plugins: convert

convert:
    auto: yes
    max_bitrate: 192
    format: mp3
```
If the imported mp3 file has a bitrate under 192 it gets moved unconverted as desired.
If it's higher than that the old file remains inside the source folder after the successful conversion and the new file get's copied to the destination folder. It acts like the copy flag. The output shows:

> convert: Encoding D:\Test\Test.mp3
> convert: Finished encoding D:\Test\Test.mp3
diff --git a/test/test_convert.py b/test/test_convert.py
index 33bdb3b24..b8cd56741 100644
--- a/test/test_convert.py
+++ b/test/test_convert.py
@@ -15,6 +15,7 @@
 
 from __future__ import division, absolute_import, print_function
 
+import fnmatch
 import sys
 import re
 import os.path
@@ -121,6 +122,15 @@ class ImportConvertTest(unittest.TestCase, TestHelper):
         self.assertIsNotNone(item)
         self.assertTrue(os.path.isfile(item.path))
 
+    def test_delete_originals(self):
+        self.config['convert']['delete_originals'] = True
+        self.importer.run()
+        for path in self.importer.paths:
+            for root, dirnames, filenames in os.walk(path):
+                self.assertTrue(len(fnmatch.filter(filenames, '*.mp3')) == 0,
+                                u'Non-empty import directory {0}'
+                                .format(util.displayable_path(path)))
+
 
 class ConvertCommand(object):
     """A mixin providing a utility method to run the `convert`command

pip install -e .[dev]
parse_log_pytest
pytest
pytest
apt-get update apt-get install -y gcc
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/beetbox/beets.git@20713a2ac3149b8f84dd8810364a9707bf5fa30f#egg=beets
confuse==2.0.1
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
filetype==1.2.0
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
jellyfish==1.1.3
mediafile==0.13.0
munkres==1.1.4
musicbrainzngs==0.7.1
mutagen==1.47.0
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
pytest @ file:///croot/pytest_1738938843180/work
PyYAML==6.0.2
six==1.17.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
Unidecode==1.3.8

name: beets
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - confuse==2.0.1
      - filetype==1.2.0
      - jellyfish==1.1.3
      - mediafile==0.13.0
      - munkres==1.1.4
      - musicbrainzngs==0.7.1
      - mutagen==1.47.0
      - pyyaml==6.0.2
      - six==1.17.0
      - unidecode==1.3.8
prefix: /opt/conda/envs/beets

test/test_convert.py::ImportConvertTest::test_delete_originals
test/test_convert.py::ImportConvertTest::test_import_converted test/test_convert.py::ImportConvertTest::test_import_original_on_convert_error test/test_convert.py::ConvertCliTest::test_convert test/test_convert.py::ConvertCliTest::test_convert_keep_new test/test_convert.py::ConvertCliTest::test_convert_with_auto_confirmation test/test_convert.py::ConvertCliTest::test_embed_album_art test/test_convert.py::ConvertCliTest::test_empty_query test/test_convert.py::ConvertCliTest::test_format_option test/test_convert.py::ConvertCliTest::test_pretend test/test_convert.py::ConvertCliTest::test_reject_confirmation test/test_convert.py::ConvertCliTest::test_skip_existing test/test_convert.py::NeverConvertLossyFilesTest::test_transcode_from_lossles test/test_convert.py::NeverConvertLossyFilesTest::test_transcode_from_lossy test/test_convert.py::NeverConvertLossyFilesTest::test_transcode_from_lossy_prevented
docs/plugins/convert.rst .github/flake8-problem-matcher.json docs/changelog.rst .github/workflows/ci.yaml beetsplug/convert.py
docs/plugins/convert.rst .github/flake8-problem-matcher.json docs/changelog.rst .github/workflows/ci.yaml beetsplug/convert.py