ingestlayer/blog

all posts
Post#founding

valve: your pipeline in the menu bar.

valve makes your menu bar a pipeline destination, so the pipeline decides which events are worth a desktop notification — not a setting in the app.

ben5 min read


You build a pipeline. You test it, you ship it, it works. And then you never look at it again — not because you don't care, but because there's nowhere to look. The events keep flowing whether you're watching or not, and you are, almost always, not.

That bothered me more than I expected, so I built a small thing to fix it. It's called valve, and it lives in your menu bar.

the dashboard you never open

A good pipeline is invisible. That's sort of the point — you wire up “when this happens, do that, there,” and then it recedes into the background and just runs. But invisible has a cost: you lose the feel for it. You don't notice that a signup just landed, or that three payments failed in a row, or that the classify step has been calling everything spam since lunch.

You could keep a dashboard tab open. Nobody keeps a dashboard tab open. It's one more thing to refresh, one more tab to lose, and it competes with the actual work on your screen. The information you want here is ambient — a glance, not a destination — and a browser tab is the opposite of ambient.

a window, not a tab

valve is a little macOS app that sits in your menu bar. Click the icon and a popover drops down with a live feed of your events as they flow through ingestlayer, newest first, each one tagged with the path it took. Click away and it's gone. No window to manage, no tab to babysit. The unread count rides on the menu-bar icon, so you get the pulse of things without even opening it.

valve is a destination

Here's the part that makes it click: valve isn't a viewer bolted onto the side. It's a destination, the same as Slack or your warehouse. You add it to a pipeline's destinations, and whatever you route there shows up in your menu bar — as a feed entry, and, when you want it, a desktop notification.

Which means the noise control isn't a setting buried in the app. It's the same when condition that gates every other destination. You decide, per pipeline, exactly what's worth interrupting you for.

pipelines/signups.yaml
# pipelines/signups.yaml
pipeline: signups
source:
  type: sdk.event
  match: user.signup

steps:
  - enrich.person: $event.email
  - classify:
      input: $event + $person
      labels:
        intent: [casual, hot_lead, partner, spam]

destinations:
  # everything is recorded
  - warehouse: events.signups

  # only the signal reaches your menu bar
  - valve:
      when: $classify.intent == "hot_lead"
      body: "{{ $person.name }} · {{ $person.company }} · hot lead"

Every signup still lands in the warehouse. But only the ones a model labels a hot lead reach valve, so those are the only ones that ever surface a notification on your desktop. The casual signups and the spam never make a sound. The pipeline did the filtering, not you, which is alerting without the noise pointed at your own machine instead of a channel.

Route anything you'd want to glance at the same way — a failed payment, a churn-risk signal, a partner signing up — and your menu bar becomes a feed of exactly the events you decided were worth seeing, and nothing else. It's just another destination, so it composes with all the rest; more on that in sending one event to many destinations.

what it shows you

Three things, really. A feed of recent events, each labeled with the actions it ran on the way through, so you can read an event's journey at a glance. A read-only view of your pipelines and the entities they've built up, for when a glance turns into a question. And notifications, the OS kind, for whatever you routed to valve while it's in the background — so the things you care about can find you instead of the other way around.

it stays out of the way

It's a menu-bar app in the literal sense: no dock icon, no Cmd-Tab entry, nothing in your task switcher. It launches at login and then disappears until you want it. It connects with the same il_ key you already use; the key lives in your system keychain and never leaves the machine. And it keeps itself current, checking for new versions and updating quietly in the background.

it's live

valve is out now for macOS (Apple Silicon), signed and notarized, on the download page. Point it at your workspace and you'll have a live read on your pipelines in about thirty seconds. Windows is next.

I built this because I wanted it on my own machine — I wanted to feel the thing I made actually running. If you try it, I'd love to know what you reach for it for, and what's missing. You can see what each step does in the actions reference, or just email me at ben@ingestlayer.com. I read everything.


Read next

Route one event to many destinations at once.

You wire each destination by hand — a Slack call, a CRM POST, a database insert. Here's how to route one event to multiple destinations from one pipeline.

← back to all posts