One Go binary stores alerts in one SQLite file
Boop accepts events from applications, scripts, or CI jobs and puts them in a private inbox. The server is one Go binary with an embedded Svelte interface, while SQLite holds the history. A project key can create events but cannot administer the server. Device credentials read events and manage their own device. That split is appropriate for a small alerting service because a leaked sender key does not automatically become an administrator credential.
The repository we measured contained 162 files, about 13,223 lines of source, and occupied 1.8 MB before dependencies. That is a modest codebase for a server, web interface, and iOS client. Event payloads can include exception data, stack frames, tags, breadcrumbs, links, and up to three action buttons. Repeated events can share a fingerprint, which collapses their display while preserving every occurrence in storage.
iPhone push requires an Apple account and a signed app
Phone delivery goes directly from the server to Apple Push Notification service. Boop needs an Apple team ID, key ID, bundle ID, and .p8 private key. You must open the included Xcode project, select your team, use the same bundle ID, install the app, and pair it with the server by QR code. Without those credentials, events still reach SQLite and the web inbox, but Boop skips push delivery.
Our 3-CPU, 8 GB sandbox did not exercise APNs or build the iOS application. It installed and compiled the Go server path in an unprivileged Debian container. That boundary matters: a successful server build says nothing about Apple signing, notification permissions, public HTTPS, or whether a tap opens the right event on your phone. Budget a real-device acceptance test before depending on Boop for overnight failures.
What happened when we ran it
Our sandbox installed 36 packages in 30 seconds, and the build completed in 10 seconds. The checkout was commit 881004d under server/ using the supplied Go 1.24 Bookworm image. Installation and compilation therefore worked in that environment, despite the README now listing Go 1.27 and Node 24 for development. We did not measure delivery latency, memory use, notification arrival time, or mobile reliability.
Tests ended with exit code 1 after 76 seconds. The harness counted 12 passed and 5 failed out of 17. The log tail identifies setup failures for github.com/chrisgreg/boop/server/cmd/boop and github.com/chrisgreg/boop/server/internal/web; API, APNs, MCP, projects, and two event packages are listed as passing. The available lines do not name the missing dependency or configuration, so any claim about the cause would be guesswork.
An unset admin password leaves the interface open
Boop can put the web interface behind a username and password, with 30-day sessions held in memory. When both variables are unset, the README says everything is open and recommends placing the service behind a proxy, Tailscale, or VPN. A restart signs out every admin because sessions are not stored. Project and device keys remain restricted to their narrower roles, but that does not protect an unguarded admin page.
The 1.8 MB checkout keeps deployment mechanics understandable, yet operating it still means owning HTTPS, access control, backups, and key rotation. SQLite uses WAL mode and the README recommends its .backup command for a consistent live copy. The APNs private key must be backed up separately. Docker runs as UID 1000, so a root-owned Linux bind mount can prevent the database from opening unless ownership is fixed or a named volume is used.
MCP exposes five read-only tools to an agent
Boop's Streamable HTTP endpoint supplies five tools for projects, event lists, search, event detail, and grouped occurrences. There is no language model in the server. An MCP client queries the same stored operational data through a bearer token of at least 16 characters, a device credential, or admin authentication. The settings page can disable the endpoint completely. Project write keys are refused, which keeps event senders from becoming readers.
Our test log lists the internal MCP package as passing in 4.389 seconds, one of the concrete successes inside the failed 76-second suite. That does not prove a remote client can reach a production endpoint through your proxy. Test the custom authorization header, TLS termination, disabled-state response, and query scope with the agent you use. Operational events may contain customer IDs or error context even after Boop redacts its default list of sensitive keys.
v1.3.0 is current, while the iOS client still needs caution
GitHub showed 742 stars, 4 open issues and pull requests, and a last push on August 30, 2026. Release v1.3.0 was published the same day with Sentry envelope ingestion and prebuilt binaries for Linux, macOS, and Windows on amd64 and arm64. Open work was still moving on September 8, when pull request 5 proposed a fix for an iOS 27 notification-tap abort. The combined open count is not a defect count.
Boop is unusually clear about its trust boundaries for a project that began in August 2026. Its small 13,223-line codebase and direct APNs design make it inspectable, while the 5 failed setup checks stop short of a clean recommendation for commit 881004d. Try it if an iPhone is central to your workflow, rerun the suite with Go 1.27, protect the admin route, and verify taps on the exact iOS version you deploy.

