A native macOS app for running and viewing Mailpit, the email testing server.
The menu bar dropdown: server status and controls, the SMTP address, per-project mailboxes, and recent messages.
- Mailpit window: the full Mailpit web UI in a native window, with back/forward, reload, zoom and downloads. Links inside messages open in your default browser.
- Server control: start, stop and restart Mailpit from the toolbar, the Server menu, the Dock menu or the menu bar. Hoppit runs Mailpit as a child process and stops it when you quit.
- Menu bar mode (on by default): a menu bar item with a dropdown showing server status, the SMTP address, the unread count and recent messages. Right-click it for quick actions. In this mode Hoppit shows a Dock icon only while one of its windows is open.
- Notifications: one per new message (sender, subject, snippet). Bursts of more than three messages become a single summary. Clicking a notification opens that message. Hoppit can also notify you if Mailpit stops unexpectedly.
- Per-project mailboxes: set each app's SMTP username to its project name (e.g.
MAIL_USERNAME=shop; any password works). Hoppit shows a separate mailbox for each project, with unread counts, filtering in the dropdown and the window, project names on notifications, and per-project muting (right-click a project). Delete and mark-read act on the selected project. - Docker and OrbStack containers: Hoppit finds Mailpit containers and lets you switch between them and its own server from the dropdown header, the right-click menu or Server → Show. It can start, stop and restart a container. If a container is already using Hoppit's ports, Hoppit shows that container instead of fighting over them.
- Unread badges on the menu bar item and the Dock icon.
- Quick actions: send a test message, mark all as read, delete all messages, copy the SMTP address, open in browser.
- Server log: Mailpit's output, searchable, with copy and clear.
- Settings: Mailpit binary (auto-detected or custom), SMTP and web ports, network access, where messages are stored (Application Support, a custom file, or temporary), message limits, and extra command-line arguments. Hoppit tells you when a change needs a restart.
- Existing servers: if Mailpit is already running on the configured port (from a terminal,
brew servicesor a container), Hoppit uses it. If a port is taken, Hoppit says by what and offers to use it, stop it (only if it's amailpitprocess or abrew servicesMailpit) or change ports. Hoppit never signals a container's port proxy such as OrbStack or Docker. - Launch at login, with an option to start Mailpit when Hoppit opens.
- macOS 15 Sequoia or later
- Mailpit:
brew install mailpit, or anymailpitbinary chosen in Settings - Xcode 26 or later to build
open Hoppit.xcodeproj # then Run (⌘R)
# or
xcodebuild -project Hoppit.xcodeproj -scheme Hoppit -configuration Release -derivedDataPath build/DerivedData build
open build/DerivedData/Build/Products/Release/Hoppit.appRun the tests with xcodebuild -project Hoppit.xcodeproj -scheme Hoppit test.
The project uses folder-synchronized groups, so new files under Hoppit/ and HoppitTests/ are picked up without editing the project. Builds are ad-hoc signed. To distribute Hoppit, set a development team and notarize. The app isn't sandboxed because it launches a user-installed mailpit binary.
| Action | Shortcut |
|---|---|
| Start / Stop / Restart server | ⇧⌘S / ⇧⌘. / ⇧⌘R |
| Send test message | ⇧⌘T |
| Mark all as read | ⇧⌘K |
| Delete all messages | ⇧⌘⌫ |
| Copy SMTP address | ⇧⌘C |
| Open in browser | ⇧⌘O |
| Reload / Back / Forward / Inbox | ⌘R / ⌘[ / ⌘] / ⇧⌘I |
| Zoom in / out / actual size | ⌘+ / ⌘- / ⌥⌘0 |
| Mailpit window / Server log | ⌘0 / ⌥⌘L |
| Piece | File |
|---|---|
| App hub: services, windows, alerts | Hoppit/App/AppController.swift |
| Mailpit process lifecycle and port conflicts | Hoppit/Services/ServerController.swift |
Live mailbox over Mailpit's /api/events websocket |
Hoppit/Services/MailboxStore.swift |
| Notification coalescing and click routing | Hoppit/Services/NotificationManager.swift |
| Menu bar item and dropdown | Hoppit/UI/MenuBarController.swift, PopoverView.swift |
| Web UI hosting (WKWebView) | Hoppit/UI/WebViewModel.swift, MainWindowController.swift |
To see diagnostics:
log stream --predicate 'subsystem == "org.corprew.hoppit"' --level debugThe app icon is generated by swift scripts/make-icon.swift Hoppit/Assets.xcassets/AppIcon.appiconset. The screenshots use fictional messages from scripts/seed-demo-mail.sh.
- Hoppit's own server only accepts connections from this Mac unless you turn on "Allow connections from other devices". It also rejects requests whose
Hostisn't loopback (--allowed-hosts), so a malicious website can't read or delete captured mail through DNS rebinding. Containers you run yourself don't get this protection unless you pass--allowed-hoststo them. - Email content is untrusted. Only links you click leave the app, and only
http,httpsandmailtolinks. Downloads only come from Mailpit itself, get safe file names and are quarantined, so Gatekeeper checks them before they open. - Hoppit only ever signals
mailpitprocesses (or stops abrew servicesMailpit). It never touches a container's port proxy, and it controls containers through thedockerCLI by container ID. - When network access is on, the web UI has no password; see #3.
MIT. See LICENSE.
