Mail and calendar for Linux. Gmail and IMAP accounts, Google Calendar, contacts, OpenPGP and S/MIME. GTK4 and libadwaita, written in Rust.
See the codeMail and calendar for Linux, written in Rust.
Website · Watch the tour · Install · Features · Screenshots · Changelog
Penguin Mail is mail and calendar for Linux. It reads Gmail accounts, Microsoft accounts (Outlook.com, Hotmail, Live and Microsoft 365) and any IMAP and SMTP account, such as Fastmail, iCloud and Yahoo, and finds the server settings for you. It syncs from the system tray, shows your accounts in one inbox or one at a time, and keeps your mail on your own computer. Gmail and Google Calendar accounts talk to Google directly, and Microsoft accounts talk to Microsoft Graph, so no other server sees your mail.
It is built with GTK and libadwaita and fits best on GNOME. It runs on any Linux desktop, and the tray icon and every other feature work outside GNOME.
Penguin Mail has mail for Gmail, Microsoft (Outlook.com, Hotmail, Live and Microsoft 365), IMAP and POP3 accounts, a calendar, contacts, OpenPGP and S/MIME, rules, and an optional assistant. An IMAP or POP3 account gets its calendar and contacts over CalDAV and CardDAV where the provider offers them, and an IMAP account its rules over ManageSieve.
l, nested as a tree under their
account. Drag mail onto any mailbox or label to move it there..eml.you+kelp.ember795@gmail.com, for each site you sign up to, and turn it
off to send its mail to the Trash. Your real address stays visible inside
it, so this stops lazy spam, not a determined sender.Gmail runs all four, so they work with your computer off.
An assistant pane (Ctrl+J) summarizes, sorts, cleans up, drafts replies and changes settings such as an automatic reply, using the app's own tools. It also reads and changes your Google Calendar, finds free time, looks people up in your contacts, and reads attachments.
It asks before it sends mail, changes Gmail settings or your calendar, or uses a tool from outside the app, and it is off until you pick a model. docs/assistant.md covers setup.


| Week | Month | Agenda |
|---|---|---|
![]() | ![]() | ![]() |
| Invitation | Event |
|---|---|
![]() | ![]() |
| Dark | Writing | Narrow |
|---|---|---|
![]() | ![]() | ![]() |
| Several selected | Automatic reply |
|---|---|
![]() | ![]() |
| Flags | VIPs |
|---|---|
![]() | ![]() |
| Assistant | Categories |
|---|---|
![]() | ![]() |
| Send Later | Rules |
|---|---|
![]() | ![]() |
| Hide My Email | Preferences |
|---|---|
![]() | ![]() |
Penguin Mail runs on Linux, x86_64. The .deb, the rpm and the Arch package need GTK 4.20, libadwaita 1.8 and WebKitGTK 6.0 from your distribution, as Ubuntu 26.04, Fedora 43 and Arch's own repositories have; the snap brings its own. Penguin Mail is not on Flathub yet. The tray icon needs a StatusNotifier host, which Ubuntu's AppIndicator extension provides.
| .deb | rpm | Arch | Snap | |
|---|---|---|---|---|
| Updates | Install in the app, or apt upgrade | dnf upgrade | Download the new .pkg.tar.zst | Snap Store |
| GnuPG | the system's | the system's | the system's | the snap's, on your ~/.gnupg |
| Assistant skills | yes | yes | yes | no |
| Claude Code, and MCP servers you run as a command | yes | yes | yes | no |
| Tray icon | yes | yes | yes | yes |
Skills are off in the snap because a skill's scripts run in a sandbox of their own, which cannot start inside the one the snap runs in. That sandbox also keeps the app from starting programs installed on your system, such as Claude Code. docs/setup.md has the details.
Penguin Mail has its own apt repository. Add its key and entry, then install:
sudo curl -fsSLo /usr/share/keyrings/penguin-mail-archive-keyring.gpg \
https://c9dev.github.io/penguin-mail/penguin-mail-archive-keyring.gpg
sudo curl -fsSLo /etc/apt/sources.list.d/penguin-mail.sources \
https://c9dev.github.io/penguin-mail/penguin-mail.sources
sudo apt update && sudo apt install penguin-mail
sudo apt upgrade then brings each new version with the rest of the
system. The key's fingerprint is
FE3C 3B6E 699A F939 DC46 70DC F3A8 5303 5C3E 2B8E.
Download the .deb from the
latest release and
install it, replacing X.Y.Z with the version:
sudo apt install ./penguin-mail_X.Y.Z_amd64.deb
apt pulls in the libraries it needs. The .deb also adds the apt
repository above, so later versions arrive with sudo apt upgrade.
The same release has a tarball and a zip that install under ~/.local:
tar xzf penguin-mail-X.Y.Z-x86_64.tar.gz
cd penguin-mail-X.Y.Z-x86_64
./install-files.sh .
It starts in the tray at login unless you run it as
NO_AUTOSTART=1 ./install-files.sh ..
To check a download, fetch the release's SHA256SUMS and
SHA256SUMS.asc and the apt repository's key from above, then:
gpgv --keyring ./penguin-mail-archive-keyring.gpg SHA256SUMS.asc SHA256SUMS
sha256sum -c --ignore-missing SHA256SUMS
Penguin Mail has a dnf repository beside the apt one, signed with the same key:
sudo curl -fsSLo /etc/yum.repos.d/penguin-mail.repo \
https://c9dev.github.io/penguin-mail/rpm/penguin-mail.repo
sudo dnf install penguin-mail
dnf asks you to accept the key the first time. sudo dnf upgrade brings
each new version, and the .rpm on the releases page adds the repository
too.
Download the .pkg.tar.zst from the
latest release and
install it, replacing X.Y.Z with the version:
sudo pacman -U ./penguin-mail-X.Y.Z-1-x86_64.pkg.tar.zst
pacman pulls in the libraries it needs. There is no Penguin Mail
repository for Arch yet, so a new release means downloading and
installing its .pkg.tar.zst again.
packaging/aur/PKGBUILD is a ready AUR package
once someone publishes it, which would bring updates through an AUR
helper instead.
sudo snap install penguin-mail --edge
The snap waits for the Snap Store to approve its access to ~/.gnupg and
to the keyring, and the command above finds it once the store has. New
versions reach the edge channel first. The snap is strictly confined, and
signing and encryption use your own keys.
CONTRIBUTING.md has the steps, and how to build the Flatpak yourself.
The first screen signs you in with Google. Sign In with Google opens Google's sign-in page in your browser, and Add Account in the sidebar adds each account after that.
Until Google finishes verifying Penguin Mail, that page warns that Google has not verified the app. The warning means Google has not yet reviewed the app's request for Gmail access; choose Advanced, then continue.
A Penguin Mail installed from the .deb, the tarball or source checks GitHub for a new release once a day. When one is out, it says so in a notification, a banner across the window, and the tray menu, and Install does the rest:
.deb and
installs it with apt. GNOME asks for your password, because apt changes
files under /usr. sudo apt upgrade installs the same version, if you
would rather update that way.Before it installs anything, Penguin Mail checks that the release's
SHA256SUMS carries a good signature from the apt repository's key,
which is built into the app, and then checks the download against those
sums. It refuses a release whose signature is missing or made by any
other key, and the update log says so. Once the new version is in,
Penguin Mail restarts into it. With a message open in
the composer, it waits and shows Restart instead, since a draft saves
only when you save it.
Check for Updates in the tray menu checks at once. To stop the daily
check, turn off Check for Updates under Preferences, Startup. A copy run
with cargo run or as the demo never checks.
The rpm leaves updates to dnf, and the snap to the Snap Store. Those copies never check GitHub and offer no Install of their own; Preferences and the About window say who brings updates.
To update by hand, download the new release and install it the same way as
the first time. For a copy built from source, pull and run
scripts/install.sh again.
penguin-mail --demo
The demo opens three sample accounts in a throwaway store. Search, triage, the composer and attachments all work against sample data, and nothing talks to Google.
Apple Mail's shortcuts work with Ctrl in place of Command. Gmail's single
keys work whenever you are not typing. Ctrl+? lists every shortcut.
| Key | Action | Key | Action |
|---|---|---|---|
j / k | Next / previous conversation | Ctrl+R or r | Reply |
Ctrl+Alt+A or e | Archive | Ctrl+Shift+R or a | Reply all |
Delete or # | Move to trash | Ctrl+Shift+F or f | Forward |
Ctrl+Shift+J | Junk | Ctrl+N or c | New message |
Ctrl+Shift+L or s | Flag or unflag | Ctrl+Shift+D | Send |
Ctrl+Alt+1 to Ctrl+Alt+7 | Flag color | Ctrl+Shift+A | Attach files |
Ctrl+Shift+U or u | Mark read or unread | Ctrl+B / Ctrl+I / Ctrl+K | Bold, italic, link |
Ctrl+Alt+M or l | Labels | Ctrl+F or / | Search |
Ctrl+Z | Undo | Ctrl+1 to Ctrl+9 | Open a mailbox |
Ctrl+A | Select all | Ctrl+= / Ctrl+- / Ctrl+0 | Text size |
Ctrl+Shift+N or F5 | Check for mail | Ctrl+P | |
Ctrl+O or double-click | Open in a new window | Ctrl+Alt+U | View source |
penguin-mail --background # start in the tray, no window
penguin-mail --compose # new message
penguin-mail mailto:ann@example.com # new message to Ann
penguin-mail --version
To make Penguin Mail open mailto: links:
xdg-mime default io.github.c9dev.PenguinMail.desktop x-scheme-handler/mailto
The running app answers D-Bus actions, for custom shortcuts:
gdbus call --session --dest io.github.c9dev.PenguinMail --object-path /io/github/c9dev/PenguinMail \
--method org.gtk.Actions.Activate show-window [] {}
The actions are show-window, hide-window, compose, check and quit.
penguin-mail-cli drives the same sync core without a window: account add,
sync, threads, show, triage and export.
~/.local/share/penguin-mail: the last 30 days plus
everything in your inbox. Opening an older thread fetches it on demand.The full policy is in docs/privacy-policy.md.
Questions, bug reports and ideas are welcome in Issues. CONTRIBUTING.md says what a useful report holds, and how the code is built and tested. SECURITY.md says where to send a vulnerability.
Penguin Mail is free software under the GNU General Public License, version 3 or later.
The icon is a penguin holding a letter, drawn on the rounded square and bevel of the Gruvbox Plus icon pack so it sits among that pack's apps.
Mail and calendar for Linux. Gmail and IMAP accounts, Google Calendar, contacts, OpenPGP and S/MIME. GTK4 and libadwaita, written in Rust.
See the codeMail and calendar for Linux, written in Rust.
Website · Watch the tour · Install · Features · Screenshots · Changelog
Penguin Mail is mail and calendar for Linux. It reads Gmail accounts, Microsoft accounts (Outlook.com, Hotmail, Live and Microsoft 365) and any IMAP and SMTP account, such as Fastmail, iCloud and Yahoo, and finds the server settings for you. It syncs from the system tray, shows your accounts in one inbox or one at a time, and keeps your mail on your own computer. Gmail and Google Calendar accounts talk to Google directly, and Microsoft accounts talk to Microsoft Graph, so no other server sees your mail.
It is built with GTK and libadwaita and fits best on GNOME. It runs on any Linux desktop, and the tray icon and every other feature work outside GNOME.
Penguin Mail has mail for Gmail, Microsoft (Outlook.com, Hotmail, Live and Microsoft 365), IMAP and POP3 accounts, a calendar, contacts, OpenPGP and S/MIME, rules, and an optional assistant. An IMAP or POP3 account gets its calendar and contacts over CalDAV and CardDAV where the provider offers them, and an IMAP account its rules over ManageSieve.
l, nested as a tree under their
account. Drag mail onto any mailbox or label to move it there..eml.you+kelp.ember795@gmail.com, for each site you sign up to, and turn it
off to send its mail to the Trash. Your real address stays visible inside
it, so this stops lazy spam, not a determined sender.Gmail runs all four, so they work with your computer off.
An assistant pane (Ctrl+J) summarizes, sorts, cleans up, drafts replies and changes settings such as an automatic reply, using the app's own tools. It also reads and changes your Google Calendar, finds free time, looks people up in your contacts, and reads attachments.
It asks before it sends mail, changes Gmail settings or your calendar, or uses a tool from outside the app, and it is off until you pick a model. docs/assistant.md covers setup.


| Week | Month | Agenda |
|---|---|---|
![]() | ![]() | ![]() |
| Invitation | Event |
|---|---|
![]() | ![]() |
| Dark | Writing | Narrow |
|---|---|---|
![]() | ![]() | ![]() |
| Several selected | Automatic reply |
|---|---|
![]() | ![]() |
| Flags | VIPs |
|---|---|
![]() | ![]() |
| Assistant | Categories |
|---|---|
![]() | ![]() |
| Send Later | Rules |
|---|---|
![]() | ![]() |
| Hide My Email | Preferences |
|---|---|
![]() | ![]() |
Penguin Mail runs on Linux, x86_64. The .deb, the rpm and the Arch package need GTK 4.20, libadwaita 1.8 and WebKitGTK 6.0 from your distribution, as Ubuntu 26.04, Fedora 43 and Arch's own repositories have; the snap brings its own. Penguin Mail is not on Flathub yet. The tray icon needs a StatusNotifier host, which Ubuntu's AppIndicator extension provides.
| .deb | rpm | Arch | Snap | |
|---|---|---|---|---|
| Updates | Install in the app, or apt upgrade | dnf upgrade | Download the new .pkg.tar.zst | Snap Store |
| GnuPG | the system's | the system's | the system's | the snap's, on your ~/.gnupg |
| Assistant skills | yes | yes | yes | no |
| Claude Code, and MCP servers you run as a command | yes | yes | yes | no |
| Tray icon | yes | yes | yes | yes |
Skills are off in the snap because a skill's scripts run in a sandbox of their own, which cannot start inside the one the snap runs in. That sandbox also keeps the app from starting programs installed on your system, such as Claude Code. docs/setup.md has the details.
Penguin Mail has its own apt repository. Add its key and entry, then install:
sudo curl -fsSLo /usr/share/keyrings/penguin-mail-archive-keyring.gpg \
https://c9dev.github.io/penguin-mail/penguin-mail-archive-keyring.gpg
sudo curl -fsSLo /etc/apt/sources.list.d/penguin-mail.sources \
https://c9dev.github.io/penguin-mail/penguin-mail.sources
sudo apt update && sudo apt install penguin-mail
sudo apt upgrade then brings each new version with the rest of the
system. The key's fingerprint is
FE3C 3B6E 699A F939 DC46 70DC F3A8 5303 5C3E 2B8E.
Download the .deb from the
latest release and
install it, replacing X.Y.Z with the version:
sudo apt install ./penguin-mail_X.Y.Z_amd64.deb
apt pulls in the libraries it needs. The .deb also adds the apt
repository above, so later versions arrive with sudo apt upgrade.
The same release has a tarball and a zip that install under ~/.local:
tar xzf penguin-mail-X.Y.Z-x86_64.tar.gz
cd penguin-mail-X.Y.Z-x86_64
./install-files.sh .
It starts in the tray at login unless you run it as
NO_AUTOSTART=1 ./install-files.sh ..
To check a download, fetch the release's SHA256SUMS and
SHA256SUMS.asc and the apt repository's key from above, then:
gpgv --keyring ./penguin-mail-archive-keyring.gpg SHA256SUMS.asc SHA256SUMS
sha256sum -c --ignore-missing SHA256SUMS
Penguin Mail has a dnf repository beside the apt one, signed with the same key:
sudo curl -fsSLo /etc/yum.repos.d/penguin-mail.repo \
https://c9dev.github.io/penguin-mail/rpm/penguin-mail.repo
sudo dnf install penguin-mail
dnf asks you to accept the key the first time. sudo dnf upgrade brings
each new version, and the .rpm on the releases page adds the repository
too.
Download the .pkg.tar.zst from the
latest release and
install it, replacing X.Y.Z with the version:
sudo pacman -U ./penguin-mail-X.Y.Z-1-x86_64.pkg.tar.zst
pacman pulls in the libraries it needs. There is no Penguin Mail
repository for Arch yet, so a new release means downloading and
installing its .pkg.tar.zst again.
packaging/aur/PKGBUILD is a ready AUR package
once someone publishes it, which would bring updates through an AUR
helper instead.
sudo snap install penguin-mail --edge
The snap waits for the Snap Store to approve its access to ~/.gnupg and
to the keyring, and the command above finds it once the store has. New
versions reach the edge channel first. The snap is strictly confined, and
signing and encryption use your own keys.
CONTRIBUTING.md has the steps, and how to build the Flatpak yourself.
The first screen signs you in with Google. Sign In with Google opens Google's sign-in page in your browser, and Add Account in the sidebar adds each account after that.
Until Google finishes verifying Penguin Mail, that page warns that Google has not verified the app. The warning means Google has not yet reviewed the app's request for Gmail access; choose Advanced, then continue.
A Penguin Mail installed from the .deb, the tarball or source checks GitHub for a new release once a day. When one is out, it says so in a notification, a banner across the window, and the tray menu, and Install does the rest:
.deb and
installs it with apt. GNOME asks for your password, because apt changes
files under /usr. sudo apt upgrade installs the same version, if you
would rather update that way.Before it installs anything, Penguin Mail checks that the release's
SHA256SUMS carries a good signature from the apt repository's key,
which is built into the app, and then checks the download against those
sums. It refuses a release whose signature is missing or made by any
other key, and the update log says so. Once the new version is in,
Penguin Mail restarts into it. With a message open in
the composer, it waits and shows Restart instead, since a draft saves
only when you save it.
Check for Updates in the tray menu checks at once. To stop the daily
check, turn off Check for Updates under Preferences, Startup. A copy run
with cargo run or as the demo never checks.
The rpm leaves updates to dnf, and the snap to the Snap Store. Those copies never check GitHub and offer no Install of their own; Preferences and the About window say who brings updates.
To update by hand, download the new release and install it the same way as
the first time. For a copy built from source, pull and run
scripts/install.sh again.
penguin-mail --demo
The demo opens three sample accounts in a throwaway store. Search, triage, the composer and attachments all work against sample data, and nothing talks to Google.
Apple Mail's shortcuts work with Ctrl in place of Command. Gmail's single
keys work whenever you are not typing. Ctrl+? lists every shortcut.
| Key | Action | Key | Action |
|---|---|---|---|
j / k | Next / previous conversation | Ctrl+R or r | Reply |
Ctrl+Alt+A or e | Archive | Ctrl+Shift+R or a | Reply all |
Delete or # | Move to trash | Ctrl+Shift+F or f | Forward |
Ctrl+Shift+J | Junk | Ctrl+N or c | New message |
Ctrl+Shift+L or s | Flag or unflag | Ctrl+Shift+D | Send |
Ctrl+Alt+1 to Ctrl+Alt+7 | Flag color | Ctrl+Shift+A | Attach files |
Ctrl+Shift+U or u | Mark read or unread | Ctrl+B / Ctrl+I / Ctrl+K | Bold, italic, link |
Ctrl+Alt+M or l | Labels | Ctrl+F or / | Search |
Ctrl+Z | Undo | Ctrl+1 to Ctrl+9 | Open a mailbox |
Ctrl+A | Select all | Ctrl+= / Ctrl+- / Ctrl+0 | Text size |
Ctrl+Shift+N or F5 | Check for mail | Ctrl+P | |
Ctrl+O or double-click | Open in a new window | Ctrl+Alt+U | View source |
penguin-mail --background # start in the tray, no window
penguin-mail --compose # new message
penguin-mail mailto:ann@example.com # new message to Ann
penguin-mail --version
To make Penguin Mail open mailto: links:
xdg-mime default io.github.c9dev.PenguinMail.desktop x-scheme-handler/mailto
The running app answers D-Bus actions, for custom shortcuts:
gdbus call --session --dest io.github.c9dev.PenguinMail --object-path /io/github/c9dev/PenguinMail \
--method org.gtk.Actions.Activate show-window [] {}
The actions are show-window, hide-window, compose, check and quit.
penguin-mail-cli drives the same sync core without a window: account add,
sync, threads, show, triage and export.
~/.local/share/penguin-mail: the last 30 days plus
everything in your inbox. Opening an older thread fetches it on demand.The full policy is in docs/privacy-policy.md.
Questions, bug reports and ideas are welcome in Issues. CONTRIBUTING.md says what a useful report holds, and how the code is built and tested. SECURITY.md says where to send a vulnerability.
Penguin Mail is free software under the GNU General Public License, version 3 or later.
The icon is a penguin holding a letter, drawn on the rounded square and bevel of the Gruvbox Plus icon pack so it sits among that pack's apps.