How to Manage Third-Party APT Repos on Debian with extrepo

Last updated Monday, May 11, 2026 11:46 am Joshua James 8 min read

Third-party APT repositories are easier to audit when every external source uses a predictable file name, a dedicated signing key, and a repeatable enable or disable command. Debian’s extrepo tool gives you that managed path for repositories listed in the Debian-maintained extrepo-data catalog. Use it when you want to search, enable, disable, refresh, and remove third-party APT repos on Debian without hand-writing every DEB822 source file yourself.

The commands apply to Debian 13 (trixie), Debian 12 (bookworm), and Debian 11 (bullseye). The core workflow works across all three releases, but Debian 11 lacks the extrepo-offline-data package, and Debian 13 can reject older SHA-1 key signatures in some extrepo entries until the bundled key is refreshed.

Understand extrepo on Debian

The extrepo command reads repository definitions from the extrepo-data catalog on Salsa. Each entry describes the repository URL, package components, supported architecture, signing key, and license policy. When you enable an entry, extrepo writes a DEB822 .sources file under /etc/apt/sources.list.d/ and stores the matching key under /var/lib/extrepo/keys/.

The main tradeoff is control versus freshness. Extrepo saves time for cataloged repositories, but the catalog can lag behind a vendor’s current repository instructions or signing key. If a vendor publishes a current DEB822 setup, that direct vendor method is often clearer for a dedicated install article. Extrepo is still useful for discovery, quick repository setup, temporary testing, and cleanup of repositories it manages.

TaskExtrepo BehaviorManual DEB822 Behavior
Find repository namesextrepo search searches the catalogYou check vendor docs or package indexes yourself
Create source filesextrepo enable writes extrepo_*.sourcesYou write or download the .sources file
Signing keysKeys come from the catalog and are stored in /var/lib/extrepo/keys/You fetch the current vendor key and choose the keyring path
Disable a sourceextrepo disable adds Enabled: noYou edit, disable, or remove the source file
Refresh a managed sourceextrepo update repo-name rewrites the source and key from catalog metadataYou update the source and key from vendor instructions
Best fitCataloged repositories, testing, temporary access, and managed cleanupVendor-recommended production setup or repositories not in the catalog

Install extrepo on Debian

Refresh Debian’s package metadata before installing the repository manager:

sudo apt update

If your account cannot use sudo, configure administrative access first with the Debian guide to add a user to sudoers on Debian.

On Debian 13 and Debian 12, install extrepo with the offline catalog package:

sudo apt install extrepo extrepo-offline-data

On Debian 11, install extrepo by itself because extrepo-offline-data is not packaged for bullseye:

sudo apt install extrepo

Verify the installed package state:

dpkg -l extrepo | grep '^ii'

Relevant output on Debian 13 includes:

ii  extrepo        0.14         all          External repository manager

Current default package candidates are 0.14 on Debian 13, 0.11 on Debian 12, and 0.8 on Debian 11. Those versions support search, enable, disable, and repository-specific update commands.

Search the extrepo Catalog on Debian

Run extrepo search without a search key to list every catalog entry available to your Debian release:

extrepo search

The full list can be long. The current catalogs returned hundreds of entries on Debian 13, Debian 12, and Debian 11, so use a search key when you already know the vendor or repository name.

Search for an Exact extrepo Entry

The search key is a regular expression matched against the repository name, description, and URL. For exact entry-name matching, anchor the pattern so broad words do not match unrelated descriptions:

extrepo search '^brave_release$'

Relevant output on Debian 13 includes:

Found brave_release:
---
description: Brave browser release repository
gpg-key-checksum:
  sha256: 167dff45524ce196a8d14c7b1586944724afc182a11be96d45b047f825f444c5
gpg-key-file: brave_release.asc
policy: main
source:
  Architectures: amd64
  Components: main
  Suites: stable
  Types: deb
  URIs: https://brave-browser-apt-release.s3.brave.com

The Found brave_release line is the repository name to pass to extrepo enable. For a complete browser install workflow after enabling that source, use the dedicated guide to install Brave Browser on Debian.

A broad pattern such as extrepo search "brave|chrome|edge" can match unrelated entries because extrepo also searches descriptions and URLs. Use anchored patterns when you need a specific repository name.

Use the Offline extrepo Catalog on Debian 13 and 12

Debian 13 and Debian 12 can search the catalog shipped by extrepo-offline-data instead of fetching the catalog from the project URL:

extrepo --offlinedata search '^brave_release$'

Debian 11 does not ship extrepo-offline-data, and its older extrepo package does not handle the --offlinedata option. Use the normal online search on bullseye.

Enable a Third-Party Repository with extrepo on Debian

Enable a repository by passing the exact catalog entry name. This example uses the Brave stable repository because it is categorized under the default main policy:

sudo extrepo enable brave_release

Inspect the generated source file:

cat /etc/apt/sources.list.d/extrepo_brave_release.sources

Relevant output on Debian 13 includes:

Architectures: amd64
Types: deb
Suites: stable
Components: main
Uris: https://brave-browser-apt-release.s3.brave.com
Signed-By: /var/lib/extrepo/keys/brave_release.asc

Field order can vary by release, and APT treats DEB822 field names case-insensitively. The important checks are the repository URL, suite, component, architecture, and Signed-By key path.

Refresh APT and confirm that the new repository contributes the package you expect:

sudo apt update
apt-cache policy brave-browser

Relevant output on Debian 13 includes:

brave-browser:
  Installed: (none)
  Candidate: 1.90.121
  Version table:
     1.90.121 500
        500 https://brave-browser-apt-release.s3.brave.com stable/main amd64 Packages

The version will change as Brave publishes updates. The stable signal is that apt-cache policy shows the expected repository URL and package source after sudo apt update.

Disable, Re-enable, and Update extrepo Repositories on Debian

Disable an extrepo Repository

Disabling a repository keeps the source file in place but tells APT to ignore it:

sudo extrepo disable brave_release

Confirm the file now includes Enabled: no:

grep -E '^(Enabled|Uris|Suites|Components|Signed-By):' /etc/apt/sources.list.d/extrepo_brave_release.sources

Relevant output includes:

Suites: stable
Components: main
Uris: https://brave-browser-apt-release.s3.brave.com
Signed-By: /var/lib/extrepo/keys/brave_release.asc
Enabled: no

Re-enable the same repository when you want APT to use it again:

sudo extrepo enable brave_release
sudo apt update

Refresh an extrepo-Managed Source and Key

The extrepo update repo-name command rewrites that repository’s source file and signing key from current catalog metadata:

sudo extrepo update brave_release
sudo apt update

Debian 13 uses extrepo 0.14, so you can omit the repository name to update all files named extrepo_*.sources. Debian 12 and Debian 11 need the repository name.

On Debian 12, running sudo extrepo update without a repository name returns:

Repository  does not exist! at /usr/share/perl5/Debian/ExtRepo/Commands/Enable.pm line 24.

On Debian 11, the same command returns:

Update without a repository is not yet supported

Enable Non-Free and Contrib Policies with extrepo on Debian

Extrepo enables only main policy repositories by default. Repositories for proprietary software, such as Google Chrome, Microsoft Edge, Opera, and Slack, are usually tagged as non-free. If you try to enable one before changing the policy setting, extrepo refuses to write the source.

sudo extrepo enable google_chrome

Expected policy error:

None of the license inclusion policies in google_chrome were enabled. Please edit /etc/extrepo/config.yaml and enable the required policies

Open or inspect the configuration file:

cat /etc/extrepo/config.yaml

The default policy block looks like this:

enabled_policies:
- main
# - contrib
# - non-free

Uncomment contrib and non-free. Use these sed command examples to make the change directly:

sudo sed -i 's/^# - contrib/- contrib/' /etc/extrepo/config.yaml
sudo sed -i 's/^# - non-free/- non-free/' /etc/extrepo/config.yaml

Verify the policy block now includes all three entries:

cat /etc/extrepo/config.yaml
enabled_policies:
- main
- contrib
- non-free

The same google_chrome command can now create the source file:

sudo extrepo enable google_chrome
cat /etc/apt/sources.list.d/extrepo_google_chrome.sources

Relevant output on Debian 13 includes:

Uris: http://dl.google.com/linux/chrome/deb/
Architectures: amd64
Types: deb
Components: main
Suites: stable
Signed-By: /var/lib/extrepo/keys/google_chrome.asc

If you enabled Chrome only to test policy access, disable it and remove the generated source and key:

sudo extrepo disable google_chrome
sudo rm -f /etc/apt/sources.list.d/extrepo_google_chrome.sources
sudo rm -f /var/lib/extrepo/keys/google_chrome.asc
sudo apt update

For Debian-owned archive components such as contrib, non-free, and non-free-firmware, use the separate guide to enable contrib and non-free repositories on Debian. Extrepo policies only control which third-party catalog entries the extrepo tool may enable.

Handle Debian 13 SHA-1 Key Errors in extrepo

Debian 13 uses Sequoia’s sqv verifier for some APT key checks. If an extrepo entry still ships an ASCII-armored key with SHA-1 binding signatures, sudo apt update can reject the repository even when the vendor has already refreshed the current public key. The Microsoft Edge extrepo entry currently shows this failure on Debian 13.

The error looks like this:

Sub-process /usr/bin/sqv returned an error code (1), error message is: Signing key on BC528686B50D79E339D3721CEB3E94ADBE1229CF is not bound:
Policy rejected non-revocation signature (PositiveCertification) requiring second pre-image resistance
SHA1 is not considered secure since 2026-02-01T00:00:00Z

Install ca-certificates, gpg, and wget if your system does not already have them:

sudo apt install ca-certificates gpg wget

Check the bundled extrepo key. digest algo 2 indicates SHA-1:

gpg --list-packets /var/lib/extrepo/keys/edge.asc 2>&1 | grep 'digest algo'
digest algo 2, begin of digest 1a 9b

Compare it with the current Microsoft key. digest algo 8 indicates SHA-256:

wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --list-packets 2>&1 | grep 'digest algo'
digest algo 8, begin of digest 8f f6

Replace the extrepo-managed key with the vendor’s current key, then refresh APT:

wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo tee /var/lib/extrepo/keys/edge.asc > /dev/null
sudo apt update

Running sudo extrepo update edge can restore the stale catalog key until the extrepo-data entry itself is fixed. If the SHA-1 error returns, repeat the key replacement or switch that repository to the vendor’s current manual DEB822 setup.

Fix Vendor Repository Conflicts with extrepo on Debian

Some vendor packages create their own repository file after installation. If that file points at the same repository as an extrepo-managed source but uses a different Signed-By path, APT can stop with a conflict instead of refreshing package metadata.

A typical conflict looks like this:

E: Conflicting values set for option Signed-By regarding source http://dl.google.com/linux/chrome/deb/ stable: /var/lib/extrepo/keys/google_chrome.asc != 
E: The list of sources could not be read.

Find duplicate Chrome source files before deleting anything:

grep -R "dl.google.com/linux/chrome/deb" /etc/apt/sources.list.d/

If the duplicate file is a vendor-created google-chrome*.list entry and you want extrepo to own the repository, remove the duplicate legacy file and refresh APT:

sudo rm -f /etc/apt/sources.list.d/google-chrome*.list
sudo apt update

For Microsoft Edge, search for the Edge repository URL and remove only the duplicate Edge source file if extrepo should remain the owner:

grep -R "packages.microsoft.com/repos/edge" /etc/apt/sources.list.d/
sudo rm -f /etc/apt/sources.list.d/microsoft-edge*.list
sudo apt update

Remove only files that point at the same repository URL. A source file with an unrelated product name can still contain a duplicate repository line, so inspect the matching lines before deleting by filename.

Use Tor, Offline Data, and Custom Mirrors with extrepo on Debian

Route extrepo Repositories Through Tor on Debian 13

Debian 13’s extrepo 0.14 package supports the --tor option. It changes the source URL that extrepo writes for a repository. Install the APT Tor transport first:

sudo apt install apt-transport-tor

APT installs the Tor service and transport helper as dependencies. Enable a repository with automatic Tor handling:

sudo extrepo --tor auto enable brave_release
ModeBehavior
onionUses a cataloged .onion URL and fails if the entry has none.
tunnelPrepends tor+ to the normal repository URL.
autoUses .onion when available, otherwise falls back to tunnel.
if-onionUses .onion when available, otherwise keeps the normal URL.
offWrites the normal repository URL.

To make Tor routing the default for future extrepo commands, add this setting to /etc/extrepo/config.yaml:

tor: auto

Debian 12’s extrepo 0.11 package does not support --tor, and Debian 11’s extrepo 0.8 package does not support that option syntax. Keep Tor routing to Debian 13 unless you have independently verified a newer backported extrepo package.

Use a Custom Mirror with extrepo on Debian 13 and 12

The --mirror option is available in Debian 13 and Debian 12. It overrides the repository URL while keeping extrepo’s original signing-key metadata. Replace the mirror URL with your internal mirror before running the command:

sudo extrepo --mirror https://mirror.example.com/brave enable brave_release

Debian 11’s extrepo 0.8 package does not support --mirror. The --url option is different. It changes the extrepo metadata catalog source itself, not the third-party repository URL. Use --offlinedata on Debian 13 or Debian 12 when you want to search the packaged offline catalog instead of the online catalog:

extrepo --offlinedata search '^brave_release$'

Troubleshoot Common extrepo Issues on Debian

Repository Name Not Found

If extrepo enable says a repository does not exist, confirm the exact catalog name first:

extrepo search keyword

Use the name after Found, not the package name you plan to install. For example, the Brave package is brave-browser, but the extrepo entry is brave_release.

If the entry is not in the catalog, use the vendor’s manual DEB822 instructions instead of forcing an extrepo workflow. The Debian sources.list(5) man page explains the source-file format that extrepo writes.

Policy Error When Enabling a Repository

If the error says no license inclusion policies were enabled, the repository is tagged under contrib or non-free. Edit /etc/extrepo/config.yaml as shown in the non-free policy section, then run the same extrepo enable command again.

Package Missing After Enabling a Repository

A repository name and package name are not always the same. After enabling the source and running sudo apt update, search APT for the package names that repository exposes:

apt search keyword
apt-cache policy package-name

If apt-cache policy does not show the repository URL, APT did not ingest the source. Recheck the .sources file, the signing key error, and the output from the most recent sudo apt update.

Remove extrepo and Clean Up Repositories on Debian

Remove One extrepo-Managed Repository

To stop using a single extrepo-managed source, disable it, remove its source file and key, then refresh APT:

sudo extrepo disable brave_release
sudo rm -f /etc/apt/sources.list.d/extrepo_brave_release.sources
sudo rm -f /var/lib/extrepo/keys/brave_release.asc
sudo apt update

Confirm the removed source no longer contributes the package candidate:

apt-cache policy brave-browser

After sudo apt update, the removed extrepo URL should no longer appear in the policy output.

Remove extrepo Completely

List any remaining extrepo source files before uninstalling the tool:

ls /etc/apt/sources.list.d/extrepo_*.sources 2>/dev/null

Remove those sources and refresh APT:

sudo rm -f /etc/apt/sources.list.d/extrepo_*.sources
sudo apt update

On Debian 13 and Debian 12, remove both packages:

sudo apt remove --purge extrepo extrepo-offline-data

On Debian 11, remove only extrepo:

sudo apt remove --purge extrepo

The next command permanently deletes extrepo’s downloaded keys and repository metadata under /var/lib/extrepo/. Packages already installed from those repositories remain installed, but they stop receiving updates from the removed source.

sudo rm -rf /var/lib/extrepo/

Verify that extrepo is no longer installed:

dpkg -l extrepo 2>/dev/null | grep '^ii' || echo "extrepo is not installed"
extrepo is not installed

Run sudo apt autoremove only after reviewing the package list APT proposes. On reused systems, autoremove can include packages unrelated to extrepo.

Further Reading and Related Debian Guides

  • extrepo(1p) man page – Official command reference for extrepo options, subcommands, and configuration syntax.
  • extrepo-data on Salsa – Debian-maintained repository metadata used by extrepo.
  • Install Backports on Debian – Use Debian’s official backports and experimental suites when the package you need is in Debian but not current enough in stable.
  • Install Flatpak on Debian – Use Flathub for desktop applications when a third-party APT repository is not the best fit.

Conclusion

Extrepo is installed and ready to manage cataloged third-party APT repositories on Debian with clear source files, dedicated keys, and reversible enable or disable commands. For repositories outside the catalog, use the vendor’s current DEB822 setup; for Debian-owned package components, keep using the normal Debian component workflow.

Follow LinuxCapable

Want more LinuxCapable guides in Google?

Add LinuxCapable as a preferred source so Google can show more of our fresh Linux tutorials in Top Stories and From your sources when relevant.

Add LinuxCapable as a preferred source on Google
Search LinuxCapable

Need another guide?

Search LinuxCapable for package installs, commands, troubleshooting, and follow-up guides related to what you just read.

Found this guide useful?

Support LinuxCapable to keep tutorials free and up to date.

Buy me a coffeeBuy me a coffee
Before commenting, please review our Comments Policy.
Formatting tips for your comment

You can use basic HTML to format your comment. Useful tags currently allowed in published comments:

You type Result
<code>command</code> command
<strong>bold</strong> bold
<em>italic</em> italic
<blockquote>quote</blockquote> quote block

Got a Question or Feedback?

We read and reply to every comment - let us know how we can help or improve this guide.

Let us know you are human: