Microsoft does not ship a Teams client for Linux. The native app was retired, and the client documentation now lists Linux as unsupported. Two routes still work on Fedora: the community teams-for-linux desktop client, and the Teams web app installed as a PWA from Chrome. Everything below was run on Fedora 45 and Fedora 44 Workstation in October 2026, with teams-for-linux 2.24.0 and Google Chrome 155.
One thing changed since earlier versions of this guide, and it matters. The vendor key file now carries a second, unrelated signing key. The install below trusts only the key that actually signs the Teams package.
Pick a route
The Teams system requirements say Linux users get Teams for Web and the PWA. The community client wraps the same web app in Electron and adds a tray icon and a config file. None of them is a native Teams stack.
| teams-for-linux RPM | teams-for-linux Flatpak | PWA in Chrome | |
|---|---|---|---|
| Maintained by | Independent open source project | Same project, listed on Flathub as “Portal for Teams” | Microsoft (it is the web app) |
| Updates through | dnf upgrade | flatpak update | Chrome and Microsoft’s web releases |
| Disk on Workstation | 333 MiB | 1.7G with runtimes | Nothing beyond Chrome |
| Tray icon and config file | Yes | Yes | No |
| Microsoft support | None | None | Teams for Web is supported |
On Workstation, the RPM is the cleanest fit. Use the Flatpak on the Fedora Atomic Desktops such as Silverblue. Use the PWA when policy says Microsoft-supported only.
Import only the Teams signing key
The project’s own instructions download a key file and pass it straight to rpm --import. Look inside it first:
curl -fsSL -o /tmp/teams-for-linux.asc https://repo.teamsforlinux.de/teams-for-linux.asc
gpg --show-keys /tmp/teams-for-linux.asc
Two public keys come back. The second has nothing to do with Teams:
pub rsa4096 2023-06-30 [SC]
D112747BDF6269C845972E5C2FD80E00E6A6E47D
uid Teams for Linux Repo <[email protected]>
sub rsa4096 2023-06-30 [E]
pub rsa4096 2026-06-03 [SCEAR]
77A763264D32E3975FD9FB549F6DA9A97DEBF982
uid BackupPilot Repo <[email protected]>
sub rsa4096 2026-06-03 [SEA]
Every key in the RPM keyring is trusted for every package on the system, from any repository. Importing the whole file therefore lets a second, unrelated publisher sign packages your machine will accept. The Teams RPM is signed only by the first key, 2FD80E00E6A6E47D, so that is the only one you need.
Export that single key into the Fedora key directory. A throwaway GnuPG home keeps your own keyring out of it:
GNUPGHOME=$(mktemp -d); export GNUPGHOME
gpg --quiet --import /tmp/teams-for-linux.asc
gpg --armor --export D112747BDF6269C845972E5C2FD80E00E6A6E47D | sudo tee /etc/pki/rpm-gpg/RPM-GPG-KEY-teams-for-linux >/dev/null
rm -rf "$GNUPGHOME"; unset GNUPGHOME
Confirm the exported file holds one key and nothing else:
gpg --show-keys /etc/pki/rpm-gpg/RPM-GPG-KEY-teams-for-linux
Only the Teams for Linux key is listed:
pub rsa4096 2023-06-30 [SC]
D112747BDF6269C845972E5C2FD80E00E6A6E47D
uid Teams for Linux Repo <[email protected]>
sub rsa4096 2023-06-30 [E]
Add the repository and install
The repo file the project publishes sets gpgcheck=1 but has no gpgkey line. Write your own that points at the single key:
sudo vim /etc/yum.repos.d/teams-for-linux.repo
Paste the definition:
[teams-for-linux]
name=Teams for Linux
baseurl=https://repo.teamsforlinux.de/rpm/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-teams-for-linux
The baseurl has no $releasever, so one repository serves Fedora 45 and 44 alike. Install the client:
sudo dnf install -y teams-for-linux
On Workstation the transaction is three packages. DNF imports the key from the gpgkey path during the run and prints the fingerprint, which should match the one above:
Package Arch Version Repository Size
Installing:
teams-for-linux x86_64 0:2.24.0-1 teams-for-linux 333.2 MiB
Installing dependencies:
libXScrnSaver x86_64 0:1.2.4-7.fc44 fedora 49.5 KiB
Installing weak dependencies:
fido2-tools x86_64 0:1.16.0-5.fc44 fedora 138.3 KiB
Transaction Summary:
Installing: 3 packages
Total size of inbound packages is 88 MiB. Need to download 88 MiB.
After this operation, 333 MiB extra will be used (install 333 MiB, remove 0 B).
...
Running transaction
Importing OpenPGP key 0xE6A6E47D:
UserID : "Teams for Linux Repo <[email protected]>"
Fingerprint: D112747BDF6269C845972E5C2FD80E00E6A6E47D
From : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-teams-for-linux
The key was successfully imported.
...
Complete!
That run is from Fedora 44. Fedora 45 resolved the same three packages and sizes. A machine without a desktop is a different story, because the Electron app drags in the GTK, PipeWire and libcamera stack:
| Starting point | Packages | Download | Installed size |
|---|---|---|---|
| Fedora Workstation | 3 | 88 MiB | 333 MiB |
| Fedora Cloud Base / minimal | 220 | 238 MiB | 886 MiB |
Check the keyring. The Fedora key and the Teams key are the only entries:
rpmkeys --list
No BackupPilot key in sight:
d112747bdf6269c845972e5c2fd80e00e6a6e47d Teams for Linux Repo <[email protected]> public key
4f50a6114cd5c6976a7f1179655a4b02f577861e Fedora (45) <[email protected]> public key
Be clear about what this check proves. The key and the packages come from the same HTTPS host, and upstream publishes no fingerprint anywhere else, so this is trust on first use over TLS. If the project ever re-signs with a new key, installs start failing with a signature error and the export above has to be redone with the new fingerprint.
Then the package and the binary:
rpm -q teams-for-linux
teams-for-linux --version
The version flag prints a config notice before the number. That notice is normal until you create a config file:
teams-for-linux-2.24.0-1.x86_64
No config file found (user or system-wide), using default values
2.24.0
The package installs under /opt/teams-for-linux and runs as your user. The launcher pins Electron to X11:
grep ^Exec /usr/share/applications/teams-for-linux.desktop
On a GNOME Wayland session that means the app menu entry runs through XWayland. That is the upstream default, not a Fedora change:
Exec=/opt/teams-for-linux/teams-for-linux --ozone-platform=x11 %U
SELinux needs no attention. After installing, launching and closing the client with SELinux enforcing, ausearch -m AVC,USER_AVC -ts today had no entries mentioning Teams on either release.
Error: “The repository does not have any OpenPGP keys configured”
This is what the vendor repo file produces when the key never made it into the RPM keyring. DNF downloads everything first, then refuses the transaction at the very end:
[220/220] Total 100% | 2.0 MiB/s | 238.1 MiB | 02m00s
Running transaction
Transaction failed: Signature verification failed.
OpenPGP check for package "teams-for-linux-2.24.0-1.x86_64" (/var/cache/libdnf5/teams-for-linux-52070eda2215cb3c/packages/teams-for-linux-2.24.0.x86_64.rpm) from repo "teams-for-linux" has failed: The repository does not have any OpenPGP keys configured.
The fix is the gpgkey line from the repo file above. Do not reach for --nogpgcheck. The repository metadata itself is unsigned (there is no repomd.xml.asc), so the package signature is the only check you have. For other signature failures on local RPM files, see fixing NOKEY and signature errors on Fedora.
Launch Teams and sign in
Open “Teams for Linux” from Activities, or run teams-for-linux in a terminal. The window loads the Microsoft sign-in page, because the wrapper is the Teams web app in its own frame:

Chromium stores its session secrets in the desktop keyring. Our lab sessions used automatic login, which starts the session without the password that normally unlocks the keyring. That is when the prompts below appear, and the two releases behave differently.
Fedora 44 runs gnome-keyring. With no keyring created yet, the first launch opens “Choose password for new keyring”:

Set a password and the keyring is created. Cancel it and the client still loads the sign-in page. Fedora 45 replaces gnome-keyring with the oo7 secret service. Teams for Linux showed no dialog there and logged Prompt call returned no response instead. Chrome on the same Fedora 45 session did prompt, asking to unlock the “Login” keyring:

Your login password unlocks it. To keep the client away from the keyring entirely, start it with the basic password store:
teams-for-linux --password-store=basic
That flag applies only to the launch you type. The Activities entry runs the packaged launcher, so give your user a copy with the flag added:
mkdir -p ~/.local/share/applications
cp /usr/share/applications/teams-for-linux.desktop ~/.local/share/applications/
sed -i 's|^Exec=/opt/teams-for-linux/teams-for-linux |Exec=/opt/teams-for-linux/teams-for-linux --password-store=basic |' ~/.local/share/applications/teams-for-linux.desktop
grep ^Exec ~/.local/share/applications/teams-for-linux.desktop
The copy in your home directory overrides the system entry, and it no longer follows changes upstream makes to the packaged file:
Exec=/opt/teams-for-linux/teams-for-linux --password-store=basic --ozone-platform=x11 %U
On Fedora 44 with no keyring created, launching from that entry went straight to the sign-in page with no dialog. The cost is that the session data sits in the profile directory without keyring encryption. Fine on a single-user laptop, wrong on a shared machine.
Configure the client with config.json
Everything the wrapper adds on top of the web app is driven by one file, ~/.config/teams-for-linux/config.json. It does not exist until you create it. The client creates the directory on first launch:
vim ~/.config/teams-for-linux/config.json
This catches people out: most of the flat option names in older guides are deprecated. teams-for-linux --help marks them, for example closeAppOnCross with “deprecated: use window.closeOnCross instead”. Use the nested form:
{
"window": { "closeOnCross": true },
"tray": { "enabled": true },
"notificationMethod": "electron",
"platform": { "spellCheckerLanguages": ["en-US"] }
}
By default the close button only hides the window, and the process keeps running in the tray. With window.closeOnCross set, clicking the X exited the client completely in our test. notificationMethod accepts web, electron or custom, with web as the default.
Start the client from a terminal to confirm the file was read. The first line changes from the “No config file found” notice to this:
Using user configuration
Initialising logger with config: {"transports":{"console":{"level":"info"},"file":{"level":false}}}
12:49:17.697 › configPath: /home/[USER]/.config/teams-for-linux
A syntax error does not stop the app. It falls back to defaults and says so on the first line, with “Error in user config file, using system config or defaults”. Validate the file with python3 -m json.tool ~/.config/teams-for-linux/config.json if that shows up.
Every option is also a command line flag. The --help output lists 86 of them with defaults, including the start URL, https://teams.cloud.microsoft. The Flatpak build reads its config from ~/.var/app/com.github.IsmaelMartinez.teams_for_linux/config/teams-for-linux/config.json, so copy the file across if you switch.
Install Teams as a PWA in Chrome
This is the route Microsoft supports. It needs a Chromium browser and nothing else. If Chrome is not installed yet, install Google Chrome on Fedora from the Google repository so it updates with the system.
Open https://teams.cloud.microsoft in a tab and sign in before you install anything. The order matters, as shown below. Chrome keeps the generic install entry in the three-dot menu under Cast, save, and share, as Install page as app…, and may also offer an install icon in the address bar once the Teams page has loaded:

This catches people out. Chrome builds the app from whatever page is open. Before you sign in, the Teams URL redirects to login.microsoftonline.com, so the dialog offers “Sign in to your account” on that origin:

Cancel that dialog. An app created there starts from a one-time Microsoft sign-in request on the login origin, and renaming it does not change that. Finish signing in, wait for Teams itself to load, then install. Our lab had no Teams account, so the screens here stop at the sign-in page.
An installed app opens in its own window with no tabs. Its three-dot menu is the place to check the result: App info shows the origin the app was created on, and the uninstall entry sits below it. The window below is the wrong variant, built from the sign-in page, which is exactly what App info exposes:

If App info reads login.microsoftonline.com, uninstall from that menu and install again after signing in. The install also writes a chrome-*-Default.desktop file under ~/.local/share/applications, which puts the app in the GNOME app grid and launches it by app ID. Deleting that file by hand leaves the app registered in the Chrome profile, so always remove it from the app menu.
Use the Flatpak build
On Silverblue and the other Fedora Atomic Desktops, layering an RPM for a chat client is not worth a reboot. Use the Flathub build instead, which GNOME Software lists as “Portal for Teams”. A per-user install needs no root and no polkit prompt, which also makes it work over SSH. The Flatpak and Flathub guide for Fedora covers the system-wide setup.
flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
flatpak install --user flathub com.github.IsmaelMartinez.teams_for_linux
Flathub carries the same release as the RPM repository. The app is 359.5 MB installed, but it also needs the freedesktop runtime and GL extensions:
flatpak list --user --columns=application,version,size,runtime
On a user with no other Flatpaks, the runtimes outweigh the app:
com.github.IsmaelMartinez.teams_for_linux 2.24.0 359.5 MB org.freedesktop.Platform/x86_64/25.08
org.freedesktop.Platform freedesktop-sdk-25.08.17 668.9 MB
org.freedesktop.Platform.GL.default 26.2.2 462.4 MB
org.freedesktop.Platform.GL.default 26.2.2 462.4 MB
org.freedesktop.Platform.codecs-extra 43.4 MB
du -sh ~/.local/share/flatpak reported 1.7G after the install. The runtimes are shared, so the cost drops if other Flatpaks already use them. Check the sandbox before rolling it out:
flatpak info --user --show-permissions com.github.IsmaelMartinez.teams_for_linux
The Context section is the part that matters. The manifest grants your whole home directory and all devices, which covers webcams and file attachments. That is not much of a sandbox:
[Context]
shared=ipc;network;
sockets=fallback-x11;pulseaudio;wayland;
devices=all;
filesystems=home;xdg-run/pipewire-0;
...
Update or remove Teams
The RPM updates with the rest of the system through sudo dnf upgrade, and the Flatpak through flatpak update --user. Both reported nothing to do right after install, because Flathub and the RPM repository carried the same release.
To remove the RPM, take the key and repo file out with it:
sudo dnf remove teams-for-linux
sudo rpmkeys --delete d112747bdf6269c845972e5c2fd80e00e6a6e47d
sudo rm /etc/yum.repos.d/teams-for-linux.repo /etc/pki/rpm-gpg/RPM-GPG-KEY-teams-for-linux
rm -rf ~/.config/teams-for-linux
rm -f ~/.local/share/applications/teams-for-linux.desktop
rpmkeys --delete is the current way to drop a key. rpm -e gpg-pubkey-... still works but prints a deprecation warning. If you imported the vendor file whole at some point, delete the BackupPilot key, 77a763264d32e3975fd9fb549f6da9a97debf982, the same way.
For the Flatpak, uninstall the app, then the runtimes nothing else uses, then the app data:
flatpak uninstall --user com.github.IsmaelMartinez.teams_for_linux
flatpak uninstall --user --unused
rm -rf ~/.var/app/com.github.IsmaelMartinez.teams_for_linux
The RPM gives you a managed package with a config file. The PWA gives you the client Microsoft will actually answer tickets about. Most office desktops end up with Slack on Fedora and the Zoom client beside Teams. On a fresh install, work through the things to do after installing Fedora 45, and keep the DNF5 cheatsheet nearby.
This does not work.
[iss-soc@srcpos01 ~]$ sudo sh -c ‘echo -e “[teams]\nname=teams\nbaseurl=https://packages.microsoft.com/yumrepos/ms-teams\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc” > /etc/yum.repos.d/teams.repo’
[sudo] password for iss-soc:
[iss-soc@srcpos01 ~]$ sudo rpm –import https://packages.microsoft.com/keys/microsoft.asc
[iss-soc@srcpos01 ~]$ sudo dnf check-update
teams 4.6 kB/s | 1.5 kB 00:00
[iss-soc@srcpos01 ~]$ sudo dnf install teams
Last metadata expiration check: 0:00:14 ago on Fri 15 Sep 2023 05:53:16 AM PDT.
No match for argument: teams
Error: Unable to find a match: teams
See updated guide on using snap package.
hi Jim, teams package isn’t able in microsoft repository anymore , so you must use Snap package installation steps