Skip to content
corprewPublic

About

macos ui interface for mailpit to improve developer experience

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

5 Commits

Folders and files

Repository files navigation

Hoppit

A native macOS app for running and viewing Mailpit, the email testing server.

The Hoppit window showing the Mailpit inbox, with server status and controls in the toolbar

The Hoppit menu bar dropdown showing server status, the SMTP address and recent messages
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 services or 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 a mailpit process or a brew services Mailpit) 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.

Requirements

  • macOS 15 Sequoia or later
  • Mailpit: brew install mailpit, or any mailpit binary chosen in Settings
  • Xcode 26 or later to build

Building

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.app

Run 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.

Keyboard shortcuts

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

How it works

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 debug

The 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.

Security

  • Hoppit's own server only accepts connections from this Mac unless you turn on "Allow connections from other devices". It also rejects requests whose Host isn'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-hosts to them.
  • Email content is untrusted. Only links you click leave the app, and only http, https and mailto links. Downloads only come from Mailpit itself, get safe file names and are quarantined, so Gatekeeper checks them before they open.
  • Hoppit only ever signals mailpit processes (or stops a brew services Mailpit). It never touches a container's port proxy, and it controls containers through the docker CLI by container ID.
  • When network access is on, the web UI has no password; see #3.

License

MIT. See LICENSE.

About

macos ui interface for mailpit to improve developer experience

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages