karatektus/pl_mail

▲ 33 stars today★ 255⑂ 15

Self-hosted, Gmail-style mail client. Multi-account IMAP, threaded conversations, real-time push via IMAP IDLE + Mercure. Built with Symfony, FrankenPHP, Hotwire Turbo. Clone and docker compose up.

About karatektus/pl_mail

karatektus/pl_mail is an open-source project on GitHub, mainly written in PHP. Self-hosted, Gmail-style mail client. Multi-account IMAP, threaded conversations, real-time push via IMAP IDLE + Mercure. It currently holds 255 stars and 15 forks with 25 open issues, and was last pushed on 2026-10-11 (repository created 2026-07-02).

Project Overview

Git Homed tracks it on the Today's Trending board, currently at rank #89 with 33 new stars today.

GitHub Repository Details

Repository karatektus/pl_mail · default branch main · size 34275 KB · watchers 2 · source: GitHub REST API and repository README

README

plMail

Self-hosted mail with a calendar beside it. Connect the mailboxes you already have — IMAP, Gmail, Outlook — and read them side by side in one inbox, on a server you own.

PHP Symfony PostgreSQL License

📖 Read the handbook →

Installing on Docker, Linux, WSL2, macOS or a NAS · every feature in detail · connecting Gmail and Outlook, with the exact permissions to tick · how the internals work. Also on the wiki and in docs/ — all three are built from the same files.

📱 Apps for your phone

Both connect to your own plMail server.

---

What it is

A mail client you host yourself. It connects to the mailboxes you already have — IMAP, Gmail, Outlook — syncs them into your own PostgreSQL database, and gives them one inbox, one search box and one set of labels in the browser.

It is not a mail server: it doesn't receive mail from the internet or host your domain. Because everything is synced locally, search runs against your database, and your mail stays readable when a provider doesn't.

The plMail inbox

Highlights

Credentials are encrypted before they touch the database. friends, completed as you type. Every hit shows the words it matched on, marked, in a window of the message around them. What the words found comes first; what the model merely thought looked similar follows, labelled, and never pushes a real match off the page. mail before you save. Apply one to mail that arrived before it existed. several at once if they are ticked. A folder moves it and a label just adds itself, so dropping on "Receipts" does not take the mail out of your inbox; Starred stars it and Unread — an optional list of every unread conversation, whatever folder it is in — marks it unread, both where it lies. Only the targets that will accept it light up, and a tab you choose by hand stays chosen when the next message in the thread arrives. week grid that pans rather than squeezes on a phone, invitations answered in place and landing in the calendar as you answer them, share and booking links. The time is always in view — on the Happening Soon button, under the name, or at the foot of the sidebar with the next thing coming up. Nextcloud, Immich and Paperless-ngx. any OpenAI-compatible endpoint, and it can search by meaning, draft replies, summarise a thread and sort mail into tabs. A long thread is summarised from as much of it as fits, and says so; ask for the whole conversation and it runs as a job with a context window to match. What it has been told about how you write is editable in the composer, for one attempt at a time. Off by default, each of the four switched on separately. Mail goes to the model host you name and nowhere else, so with a model on your own machine nothing leaves your network. model reading each message; and on Gmail, whether either of them is allowed to disagree with Google. Change your mind and the mailbox re-sorts itself in the background. Every message's Details panel shows what all three said and which one won, and a Report button tells your administrator when it got it wrong. syncing, push that lapsed, work the queue gave up on. Each with what it means for your mail and the smallest thing that fixes it. A Google sign-in dying every week gets named for what it is — Google expires tokens for an app still in Testing — and warned about before the next one. administrators hear about each new build once: on their devices and at the top of the admin area, with what changed since the one they run. phone's home screen, English, German and Pirate.

A look around

| | | |---|---| | Reading a thread | Writing a message | | Threads — replies collapse into one conversation. | Compose — rich text, autocomplete, undo send. | | Dark mode | Calendar | | Themes — 41 of them, light and dark. | Calendar — docked beside the mail, or its own page. | | Filters | Admin | | Filters — counted before you save. | Admin — workers, push health, logs, queue. | | Choosing an icon | Choosing its colours | | Icons — ten of them, a blue horn among them. | Colourways — each icon in its own colours, or any of 32. |

Screenshots use demo data — none of the accounts, senders or messages shown are real.

Install

Images are published for linux/amd64 and linux/arm64. Nothing to fill in first: the secrets are generated on first start, and the public address is asked for on the setup screen.

Docker

git clone https://github.com/karatektus/pl_mail.git
cd pl_mail
docker compose up -d

Open https://localhost and create your account. From another machine, open https:// and the server's address instead; the browser warns about the self-signed certificate once and lets you continue.

TrueNAS

plMail is in the TrueNAS app catalogue. Apps → Discover Apps, search for plMail, and install it. The form asks for one thing, a database password; everything else has a default that works.

Reach it on port 30519, and put a reverse proxy in front of it if it should be reachable from outside. Updates arrive through the catalogue like any other app's.

Then

Add an IMAP mailbox in Settings → Mail accounts and you're done. Gmail and Outlook need OAuth credentials from Google or Microsoft first — the handbook walks through both, including the optional Pub/Sub topic for instant Gmail delivery.

Back up two things, separately: the PostgreSQL data and var/secrets/generated.env. The
database holds your mail; the key inside that file unlocks the credentials in it. Keeping them
apart is the point — and losing the key means the stored mailbox passwords are gone.

Contributing

Bug reports and pull requests welcome — see CONTRIBUTING.md for the dev setup, the test suites and the console commands.

License

AGPL-3.0.

GitHub Stars & Activity

255Stars
15Forks
25Open issues
PHPLanguage

GitHub Popularity

GitHub stars255
Forks15
Open issues25
Primary languagePHP
LicenseAGPL-3.0
Stars gained today33
Created2026-07-02
Last pushed2026-10-11

Trending History

Daily boardrank #89 · ▲ 33 stars

Related GitHub Projects

1

Paymenter / Paymenter

PHP★ 2,479⑂ 520▲ 35 stars
→
2

openclaw / openclaw

TypeScript★ 391,685⑂ 82,361▲ 150 stars
→
3

mattpocock / skills

Shell★ 285,981⑂ 23,987▲ 1,768 stars
→
4

tensorflow / tensorflow

C++★ 200,869⑂ 79,102▲ 346 stars
→
5

jackfrued / Python-100-Days

Jupyter Notebook★ 187,041⑂ 55,779▲ 49 stars
→
6

flutter / flutter

Dart★ 179,777⑂ 33,748▲ 468 stars
→
7

f / prompts.chat

HTML★ 172,609⑂ 22,141▲ 227 stars
→
8

huggingface / transformers

Python★ 167,515⑂ 34,837▲ 536 stars
→

More Trending Repositories