Skip to content

Releases: NativeMojo/mojo-pulse

Bloat tab: your data, one click closer

Choose a tag to compare

@iamojo iamojo released this 05 Jul 05:21

Fixes the Bufferbloat tab looking empty when data exists.

The Bloat view's Live and Minute ranges only span the last two hours — so Speed Test measurements from earlier in the day were silently out of frame, and the tab claimed "nothing in this window yet" while sitting one click from your data. The empty state now counts your week's Speed Test measurements and offers a one-tap jump to the Day view that shows them.

Auto-updates via Sparkle; also on Homebrew: brew upgrade --cask mojo-pulse.

Visible sentinel pauses

Choose a tag to compare

@iamojo iamojo released this 04 Jul 18:45

Makes the Network Sentinel's pauses visible.

By default the sentinel pauses its probes on battery power (and in Low Power Mode, and while a Speed Test runs) — but it paused silently, so an unplugged Mac showed an empty Network tile and a blank Health window that looked broken rather than resting.

Now a paused sentinel says so, everywhere: the Network Health header reads "Paused — on battery power · resumes automatically", the tile dot's tooltip explains the same, and your recorded history stays fully browsable while paused. Plug back in (or flip "Pause on battery" off in Settings → Network sentinel) and live probing resumes on the next cycle.

Auto-updates via Sparkle; also on Homebrew: brew upgrade --cask mojo-pulse.

Bufferbloat tab fix

Choose a tag to compare

@iamojo iamojo released this 04 Jul 18:09

Fixes the Bufferbloat tab staying empty in Network Health.

The passive bufferbloat measurement only counted your Mac as "under load" past roughly 100 Mbps of your own traffic — so on most days, no samples ever qualified and the Bloat tab said "Collecting…" forever. Now a video call, a stream, or a backup counts (down > 8 Mbps or up > 2 Mbps), and the tab fills in from normal life. The degradation alarm still requires genuinely heavy queueing before it says anything.

Also in this release:

  • The Bloat chart plots every Speed Test's measured latency-under-load as dots, so the tab shows real history even before passive samples accumulate — and its panel separates "Passive" from "Speed tests".
  • When bloat truly has nothing to show, the tab now says why ("needs load to measure") instead of a generic "Collecting…".
  • Fixed the live stats row wrapping when traffic units got long.

Auto-updates via Sparkle; also on Homebrew: brew upgrade --cask mojo-pulse.

Network Sentinel & Network Health

Choose a tag to compare

@iamojo iamojo released this 04 Jul 15:47

Pulse now watches your network's health passively — and warns you while "slow" is still becoming "down", not after.

The Network Sentinel (on by default, Settings → Network sentinel) sends a handful of tiny pings a minute (~1–2 MB/day — a speed test moves more in a second) to your router and rotating internet anchors, learns what your network's normal looks like, and quietly flags sustained drifts: climbing latency, packet loss, queueing under load, a slowing router hop, sluggish DNS. Every alert is judged against your own baseline, needs 10+ minutes of evidence, and lands as a quiet journal card — never a banner storm. Each card's button runs a full Speed Test to pinpoint the guilty hop.

  • Bufferbloat, measured from your own traffic. The sentinel tags its pings with what your Mac is already sending — your video call is the load generator, so queueing problems surface with zero added load.
  • "This network is just slow." New networks get a first-impressions verdict: a rough cafe network is named once (about 5 minutes in), with Always-Ignore scoped to that network.
  • The Network tile now carries a quality dot and live round-trip time. Green = normal for your network, amber = degraded or rough, gray = still learning. Hover for the story.
  • Click the Network tile for the new Network Health window: live mirrored traffic (download above, upload below), latency against your learned usual, 7 days of history for latency / loss / bufferbloat / DNS / traffic — with any degradation events painted as shaded bands right on the charts — plus your recent speed tests and a Run button.

Also: pauses itself on battery (configurable), in Low Power Mode, and while a Speed Test runs; all measurements stay on your Mac.

Auto-updates via Sparkle; also on Homebrew: brew upgrade --cask mojo-pulse.

Burst-proof measurement + provider canary

Choose a tag to compare

@iamojo iamojo released this 04 Jul 06:33

Makes the Speed Test's numbers burst-proof and its endpoints pre-checked.

  • The reported rate is now computed from cumulative bytes over the stable window (a windowed mean), not a median of 100 ms ticks. Upload progress arrives from the network stack in multi-MB bursts — most ticks legitimately read zero with spikes between — and a median of that could report a healthy upload as stalled. The chart keeps its live 10 Hz detail; the number is now immune to the burstiness.
  • Before the load phases commit to a provider, a one-second canary (100 KB down + 1 MB up) verifies it end to end — rate limiting or refused uploads now trigger an automatic Apple → Cloudflare fallback instead of a failed phase.
  • When a phase still can't produce a stable rate, the Test log says what actually moved ("94 MB sent, ~75 Mbps average") rather than implying a dead pipe.

Auto-updates via Sparkle; also on Homebrew: brew upgrade --cask mojo-pulse.

Speed Test upload fix

Choose a tag to compare

@iamojo iamojo released this 04 Jul 06:17

Fixes upload measurement in the new Speed Test.

A bookkeeping bug introduced with 1.15.0's per-connection streams could zero out upload progress — the test would finish with "— Mbps" for upload while download measured fine. (URLSession task identifiers are only unique within one session; with one session per stream, the per-task progress counters collided.)

Also in this release, a failed measurement phase is now impossible to miss:

  • A "▲ couldn't measure" tag appears right under the affected number.
  • The reason — HTTP status or a stall — leads the "Why this verdict" list and is spelled out in the Test log.
  • Upload gets the same refusal/stall diagnostics and anti-churn guards download already had.

Auto-updates via Sparkle; also on Homebrew: brew upgrade --cask mojo-pulse.

Network Speed Test

Choose a tag to compare

@iamojo iamojo released this 04 Jul 06:10

Pulse can now answer the question every speed test dodges: is it your network causing issues, or something out there?

Network screen → Speed test. Pulse saturates your connection against Apple's own network-quality infrastructure while watching your router, your ISP's edge, and the wider internet — separately. Then it names the guilty segment in plain English ("It's inside your network — your router chokes when the line is busy"), with a fix suggestion to match.

  • Three verdict lights — Speed · Responsiveness · Reliability — above download/upload with bufferbloat grades and Apple-style RPM.
  • The path strip shows each hop's idle latency and how far it balloons under load. Where the climb starts is where the queue lives.
  • Every metric is judged, not just reported: quality bands (excellent / good / fair / poor), deltas vs your idle baseline, and hover any value for its scale and what it affects.
  • Speeds are compared to your usual (your own median across runs), not an arbitrary scale; history keeps your last 200 tests.
  • For the network engineers: per-hop latency-under-load charts, per-phase throughput charts, jitter / loss / DNS / TTFB, and the raw test log — all one click deep, invisible until you ask.
  • Runs only on demand (~30 s, up to ~1 GB of data). Latency is measured with unprivileged ICMP — no elevated privileges, nothing running in the background.

Also in this release: quitting from the popover now asks first (with a "don't ask again" option) — no more accidental quits while navigating the drill-in screens.

Auto-updates via Sparkle; also on Homebrew: brew upgrade --cask mojo-pulse.

v1.14.0 — Notifications open the event behind them

Choose a tag to compare

@iamojo iamojo released this 04 Jul 03:50

Clicking a Mojo Pulse notification now takes you to the event it was about — the same detail window you'd get from clicking a card in Recent Activity. Previously the banner delivered fine, but clicking it did nothing.

  • A still-active incident opens live, straight from the running app.
  • An incident that already resolved (including one already sitting in Notification Center from before this fix) opens from history instead.
  • The risky Wi-Fi network alert opens Network Safety.

Auto-updates via Sparkle; also on Homebrew: brew upgrade --cask mojo-pulse.

v1.13.0 — Actionable security + events that stay dismissed

Choose a tag to compare

@iamojo iamojo released this 03 Jul 14:56

Pulse 1.13.0 makes the app actionable: the Security panel now hands you the fix, and event alerts finally stay dismissed.

Security panel — the fix is one click away

The Security screen is rebuilt around triage instead of a checklist:

  • Status pills up top: 1 to fix · 5 to review · 8 passing — one glance, no vague "items to review."
  • Needs attention cards for anything wrong, with the fix as the button: Turn On… opens the exact System Settings pane for FileVault or the Firewall, suspect processes get Review (opens the process explorer on the Unverified tab), unexpected listeners get Ports, exposed sharing services and new startup items jump to their Settings panes.
  • Passing checks compress into a quiet green grid — still clickable through to the pane that controls each one, with XProtect's last scan time inline.
  • Unrecognized apps expands on a whole-row click, and each app links to All Processes filtered to that binary.

Dismiss now means dismissed

Event actions are three plain verbs everywhere — cards, right-click, and the detail window:

  • Dismiss (a one-click ✕ on the card) — clears the event, keeps it in Recent, and stays cleared. You're only alerted again if something new happens: a fresh crash re-alerts; an ongoing condition (like the firewall being off) gets one honest re-mention the next day. Dismissals survive restarts.
  • Snooze for 1 hour and Always ignore round it out. The confusing "It's Real — Thanks" and "Not an issue right now" are gone.

Crash events you can investigate

Crash alerts are stamped with when the crash happened (from the report, not our scan) and say why in plain English — "shut itself down after a fatal internal error," "killed by macOS for touching protected data without permission" — parsed from the newest crash report. The detail view adds the faulting library, app version, raw exception line, and an Open Crash Report in Console button, with Show in Finder and All Crash Reports one menu away. Repeated crashes stay one event that updates its count instead of spamming history.

Auto-updates via Sparkle; also on Homebrew: brew upgrade --cask mojo-pulse.

v1.12.0 — Nearby Bluetooth sonar

Choose a tag to compare

@iamojo iamojo released this 02 Jul 18:38

Pulse 1.12.0 adds a Nearby Bluetooth scanner and a sharper alert for dev servers left open to the network.

Nearby Bluetooth — a sonar for the air around you

A new tool on the Network screen sweeps for Bluetooth devices advertising nearby and renders them as a sonar: range rings from arm's reach to faint, a rotating sweep, and one blip per device colored by type. On-demand only — the radio starts when you press Scan and stops the moment you close the window (or after a few idle minutes, to save battery).

  • Honest Find My detection. Passing phones relaying the Find My mesh are shown as calm "Find My network" dots, while an actual separated tracker (AirTag-class, broadcasting a location key) is called out in amber and sorted to the top — so the tracker count reflects real trackers, not the crowd.
  • Filter chips to show or hide device types (trackers, audio, wearables, Find My network, …), each with a live count.
  • Sonar or List view, and the sonar scales with the window.
  • Dive into any device: live signal strength and range band, rough distance when it advertises calibrated power, first/last seen, advertised services, Apple frame type, and the raw advertisement — plus an optional Probe that connects briefly and reads the public Device Information and Battery services (manufacturer, model, firmware, battery %) the way any Bluetooth utility can.

Your own paired gear is cross-referenced and labeled "yours." Bluetooth access is requested only when you first scan.

Dev servers exposed to your network

When a developer runtime (Python, Node, Ruby, …) listens on 0.0.0.0 — every network interface, not just localhost — Pulse now says so plainly: "open to your network," why it matters (debug endpoints, hot-reload sockets, and usually-unauthenticated APIs reachable by anyone nearby), and the exact fix — bind 127.0.0.1 instead — spelled out from your own command line. It escalates to red on insecure Wi-Fi with no VPN, and stays a quiet note on a trusted network.

Auto-updates via Sparkle; also on Homebrew: brew upgrade --cask mojo-pulse.