{"id":47299882,"url":"https://github.com/bulwarkmail/webmail","last_synced_at":"2026-05-04T12:03:35.546Z","repository":{"id":344290624,"uuid":"1180780252","full_name":"bulwarkmail/webmail","owner":"bulwarkmail","description":"JMAP Webmail built for the 21st Century. A modern, self-hosted email client for Stalwart Mail Server powered by the JMAP protocol. Email, calendar, contacts and files. Fast, private, and open source.","archived":false,"fork":false,"pushed_at":"2026-04-27T22:04:58.000Z","size":10985,"stargazers_count":356,"open_issues_count":21,"forks_count":45,"subscribers_count":6,"default_branch":"main","last_synced_at":"2026-04-27T22:19:02.206Z","etag":null,"topics":["calendar","contacts","email","email-client","jmap","mail","nextjs","self-hosted","typescript","webmail"],"latest_commit_sha":null,"homepage":"https://bulwarkmail.org","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bulwarkmail.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["bulwarkmail"]}},"created_at":"2026-03-13T12:01:48.000Z","updated_at":"2026-04-27T22:11:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bulwarkmail/webmail","commit_stats":null,"previous_names":["bulwarkmail/webmail"],"tags_count":25,"template":false,"template_full_name":null,"purl":"pkg:github/bulwarkmail/webmail","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulwarkmail%2Fwebmail","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulwarkmail%2Fwebmail/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulwarkmail%2Fwebmail/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulwarkmail%2Fwebmail/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bulwarkmail","download_url":"https://codeload.github.com/bulwarkmail/webmail/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bulwarkmail%2Fwebmail/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32394478,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-28T14:34:11.604Z","status":"ssl_error","status_checked_at":"2026-04-28T14:32:37.009Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["calendar","contacts","email","email-client","jmap","mail","nextjs","self-hosted","typescript","webmail"],"created_at":"2026-03-17T00:00:35.849Z","updated_at":"2026-05-04T12:03:35.540Z","avatar_url":"https://github.com/bulwarkmail.png","language":"TypeScript","funding_links":["https://github.com/sponsors/bulwarkmail"],"categories":["TypeScript"],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"public/branding/Bulwark_Logo_with_Lettering_White_and_Color.svg\" /\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"public/branding/Bulwark_Logo_with_Lettering_Dark_Color.svg\" /\u003e\n  \u003cimg src=\"public/branding/Bulwark_Logo_with_Lettering_Dark_Color.svg\" alt=\"Bulwark Webmail\" width=\"280\" /\u003e\n\u003c/picture\u003e\n\n# Bulwark Webmail\n\nA modern, self-hosted webmail client for [Stalwart Mail Server](https://stalw.art/), built with Next.js and the JMAP protocol.\n\n[![License: AGPL v3](https://img.shields.io/badge/license-AGPL%20v3-blue.svg?logo=gnu\u0026logoColor=white)](LICENSE)\n[![Discord](https://img.shields.io/discord/1482128142939455674?color=7289da\u0026label=discord\u0026logo=discord\u0026logoColor=white)](https://discord.gg/tYCujymGrT)\n[![Version](https://img.shields.io/badge/version-1.6.1-green.svg?logo=git\u0026logoColor=white)](CHANGELOG.md)\n[![Docker](https://img.shields.io/badge/docker-ghcr.io%2Fbulwarkmail%2Fwebmail-blue?logo=docker\u0026logoColor=white)](https://ghcr.io/bulwarkmail/webmail)\n\n\u003c/div\u003e\n\n---\n\n## Screenshots\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"screenshots/mail-dark.png\" /\u003e\n  \u003cimg src=\"screenshots/mail-white.png\" alt=\"Mail view\" width=\"100%\" /\u003e\n\u003c/picture\u003e\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"screenshots/calendar.png\" alt=\"Calendar\" /\u003e\u003c/td\u003e\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"screenshots/contacts.png\" alt=\"Contacts\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003csub\u003e\u003cb\u003eCalendar\u003c/b\u003e – month, week, day, and agenda views with drag-to-reschedule, iMIP invitations, and CalDAV subscriptions.\u003c/sub\u003e\u003c/td\u003e\n\u003ctd\u003e\u003csub\u003e\u003cb\u003eContacts\u003c/b\u003e – multiple address books, groups, vCard import/export, and autocomplete in the composer.\u003c/sub\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"screenshots/theme.png\" alt=\"Themes\" /\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"screenshots/plugins.png\" alt=\"Plugins\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003csub\u003e\u003cb\u003eThemes\u003c/b\u003e – bundled color themes or upload your own as ZIP bundles; admins can enforce presets.\u003c/sub\u003e\u003c/td\u003e\n\u003ctd\u003e\u003csub\u003e\u003cb\u003ePlugins\u003c/b\u003e – extend the client with bundled or third-party plugins installed from a .zip file.\u003c/sub\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"screenshots/mail-white.png\" alt=\"Light mode\" /\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"screenshots/settings.png\" alt=\"Settings\" /\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003csub\u003e\u003cb\u003eLight mode\u003c/b\u003e – full theme support with intelligent color transformation for HTML emails.\u003c/sub\u003e\u003c/td\u003e\n\u003ctd\u003e\u003csub\u003e\u003cb\u003eSettings\u003c/b\u003e – appearance, identities, filters, templates, security, and more.\u003c/sub\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n## Overview\n\nBulwark is a full webmail suite, not just an inbox. It bundles the four apps most self-hosters end up wanting on the same login:\n\n- **Mail** – threading, unified inbox, full-text search, Sieve filters, S/MIME, templates\n- **Calendar** – month/week/day/agenda, recurring events, iMIP invitations, CalDAV subscriptions\n- **Contacts** – multiple address books, groups, vCard import/export\n- **Files** – Stalwart's JMAP FileNode storage with previews and folder upload\n\nPlus the infrastructure around them: OAuth2 / OIDC SSO, TOTP 2FA, multi-account (up to 5 at once), 15 languages, PWA install, dark/light themes, a plugin system with an extension marketplace, and a admin dashboard.\n\nFull feature list: **[FEATURES.md](FEATURES.md)**.\n\n---\n\n## Quick Start\n\n### Docker\n\n```bash\ndocker run -d -p 3000:3000 \\\n  -e JMAP_SERVER_URL=https://mail.example.com \\\n  ghcr.io/bulwarkmail/webmail:latest\n```\n\nOr with Docker Compose:\n\n```bash\ncp .env.example .env.local\n# Edit .env.local – set JMAP_SERVER_URL\ndocker compose up -d\n```\n\n### From Source\n\n```bash\ngit clone https://github.com/bulwarkmail/webmail.git\ncd webmail\nnpm install\ncp .env.example .env.local\n# Edit .env.local – set JMAP_SERVER_URL\nnpm run build \u0026\u0026 npm start\n```\n\n### Development\n\n```bash\nnpm run dev        # Dev server with a mock JMAP server\nnpm run typecheck\nnpm run lint\n```\n\n## Configuration\n\nAll variables are evaluated at runtime, so Docker deployments can be reconfigured without rebuilding. Edit `.env.local`:\n\n```env\n# Required\nJMAP_SERVER_URL=https://mail.example.com\n\n# Optional\nAPP_NAME=My Webmail\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eServer listen address\u003c/summary\u003e\n\n```env\nHOSTNAME=0.0.0.0    # Default; use \"::\" for IPv6\nPORT=3000\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eOAuth2 / OIDC\u003c/summary\u003e\n\n```env\nOAUTH_ENABLED=true\nOAUTH_CLIENT_ID=webmail\nOAUTH_CLIENT_SECRET=              # optional, for confidential clients\nOAUTH_CLIENT_SECRET_FILE=         # path to a file containing the secret\nOAUTH_ISSUER_URL=                 # optional, for external IdPs\n```\n\nEndpoints are auto-discovered via `.well-known/oauth-authorization-server` or `.well-known/openid-configuration`.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eSession \u0026 settings sync\u003c/summary\u003e\n\n```env\nSESSION_SECRET=                      # openssl rand -base64 32\nSESSION_SECRET_FILE=/session-secret  # path to a file containing the secret\n\nSETTINGS_SYNC_ENABLED=true\nSETTINGS_DATA_DIR=./data/settings    # mount as a volume in Docker\n```\n\nCredentials are encrypted with AES-256-GCM and stored in an httpOnly cookie (30-day expiry). Settings sync stores per-account preferences encrypted at rest and requires `SESSION_SECRET`.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eCustom JMAP endpoint\u003c/summary\u003e\n\n```env\nALLOW_CUSTOM_JMAP_ENDPOINT=true\n```\n\nShows a \"JMAP Server\" field on the login form. External servers must CORS-allow the webmail origin.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eBranding \u0026 PWA\u003c/summary\u003e\n\n```env\nAPP_NAME=My Webmail\nAPP_SHORT_NAME=Webmail\nAPP_DESCRIPTION=Your personal mail\n\nFAVICON_URL=/branding/favicon.svg\nPWA_ICON_URL=/branding/icon.svg      # falls back to FAVICON_URL\nPWA_THEME_COLOR=#3b82f6\nPWA_BACKGROUND_COLOR=#ffffff\n\nAPP_LOGO_LIGHT_URL=/branding/logo-light.svg\nAPP_LOGO_DARK_URL=/branding/logo-dark.svg\nLOGIN_LOGO_LIGHT_URL=/branding/login-light.svg\nLOGIN_LOGO_DARK_URL=/branding/login-dark.svg\n\nLOGIN_COMPANY_NAME=My Company\nLOGIN_WEBSITE_URL=https://example.com\nLOGIN_IMPRINT_URL=https://example.com/imprint\nLOGIN_PRIVACY_POLICY_URL=https://example.com/privacy\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eExtension directory\u003c/summary\u003e\n\n```env\nEXTENSION_DIRECTORY_URL=https://extensions.bulwarkmail.org\n```\n\nEnables the admin marketplace for browsing and installing plugins and themes.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eStalwart integration \u0026 logging\u003c/summary\u003e\n\n```env\nSTALWART_FEATURES=true               # password change, Sieve filters, etc.\n\nLOG_FORMAT=text                      # \"text\" or \"json\"\nLOG_LEVEL=info                       # error | warn | info | debug\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eSubpath / reverse proxy mount\u003c/summary\u003e\n\nTo serve the webmail at a subpath (e.g. `https://example.com/webmail`):\n\n```env\nNEXT_PUBLIC_BASE_PATH=/webmail\nNEXT_PUBLIC_LOCALE_PREFIX=always     # avoids next-intl rewrite loops\n```\n\nUnlike most other variables, `NEXT_PUBLIC_BASE_PATH` is read at **build time** because Next.js bakes it into emitted asset URLs. To use it with the published Docker image, build your own image with the variable set:\n\n```bash\ndocker build --build-arg NEXT_PUBLIC_BASE_PATH=/webmail -t bulwark-webmail .\n```\n\nThen point your reverse proxy at the container without stripping the prefix - the app expects to receive requests under `/webmail/...` and serves all routes (`/webmail/api/...`, `/webmail/_next/static/...`, `/webmail/sw.js`, etc.) accordingly.\n\n\u003c/details\u003e\n\n## Keyboard Shortcuts\n\n| Key           | Action                  |\n| ------------- | ----------------------- |\n| `j` / `k`     | Navigate between emails |\n| `Enter` / `o` | Open email              |\n| `Esc`         | Close / deselect        |\n| `c`           | Compose                 |\n| `r` / `R`     | Reply / Reply all       |\n| `f`           | Forward                 |\n| `s`           | Star                    |\n| `e`           | Archive                 |\n| `#`           | Delete                  |\n| `/`           | Search                  |\n| `?`           | Show all shortcuts      |\n\n## Tech Stack\n\n|               |                                                   |\n| ------------- | ------------------------------------------------- |\n| **Framework** | [Next.js 16](https://nextjs.org/) with App Router |\n| **Language**  | TypeScript                                        |\n| **Styling**   | [Tailwind CSS v4](https://tailwindcss.com/)       |\n| **State**     | [Zustand](https://zustand-demo.pmnd.rs/)          |\n| **Protocol**  | Custom JMAP client (RFC 8620)                     |\n| **i18n**      | [next-intl](https://next-intl-docs.vercel.app/)   |\n| **Icons**     | [Lucide React](https://lucide.dev/)               |\n\n## Why Stalwart?\n\n[Stalwart](https://github.com/stalwartlabs/mail-server) is a Rust mail server with native JMAP support – not IMAP/SMTP with JMAP bolted on. It handles JMAP, IMAP, SMTP, and ManageSieve in a single self-hosted binary with no third-party dependencies.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## License\n\n[GNU AGPL v3](LICENSE). This repository preserves the original MIT attribution for the fork lineage in [NOTICE](NOTICE).\n\n## Acknowledgments\n\nThanks to [root-fr/jmap-webmail](https://github.com/root-fr/jmap-webmail/) and [@ma2t](https://github.com/ma2t) for the groundwork this project builds upon.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbulwarkmail%2Fwebmail","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbulwarkmail%2Fwebmail","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbulwarkmail%2Fwebmail/lists"}