This product was not featured by Product Hunt yet.
It will not be visible on their landing page and won't be ranked (cannot win product of the day regardless of upvotes).

Product upvotes vs the next 3

Waiting for data. Loading

Product comments vs the next 3

Waiting for data. Loading

Product upvote speed vs the next 3

Waiting for data. Loading

Product upvotes and comments

Waiting for data. Loading

Product vs the next 3

Loading

zep.js

Tiny event pipeline with autocleanup, debounce & AbortSignal

Zep.js is an ultra-lightweight (265 bytes gzipped), zero-dependency JavaScript utility that turns event listeners into clean, reactive pipelines with automatic lifecycle management and debouncing. What makes Zep.js standout? - Ultra-lightweight: Only 265 bytes gzipped. - Built-in Auto-Cleanup. - Integrated Debouncing & Filtering. - Race-Condition Proof. - Avoids event-handling plumbing & boilerplate entirely.

Top comment

zep.js: events for slackers 🦥 ;)

Like most devs, I really dislike the boilerplate plumbing that comes with handling events.
Not simple click handlers, but the more "complex" stuff like debounced search, throttled scrolling or resize handlers, or requestAnimationFrame synchronization.
Every single time, I find myself setting up loose let-variables, timers, and manual cleanup.

I wanted to solve this with an ultra-lightweight, composable solution.
Inspired by RxJS (don't worry, it's NOT RxJS—no complex observables or heavy streams here), I simply borrowed the idea of turning events into declarative pipelines.

Key features:

- Extremely small (<1.3KB gzipped total, core is ~265 bytes gzipped).
- Completely synchronous execution core by default (no microtask queue overhead).
- Built-in AbortSignal / auto-cleanup integration. Timed operators clean themselves up automatically.

Here is what an auto-cancelling, debounced search looks like, using zep.js:

zep(queryElement, "input", { signal }) // <= Pass a signal to zep (optional)
  .use(
    map((e) => e.target.value.trim()),
    filter((query) => query.length > 2),
    debounce(300),
    latest((query, signal) =>
      fetch(`/api/products/search?q=${query}`, {
        signal,
      }).then((res) => res.json()),
    ),
  )
  .on((results) => {
    console.log(results);
  });

// controller.abort() will trigger the cleanup via the signal passed to zep.


About zep.js on Product Hunt

Tiny event pipeline with autocleanup, debounce & AbortSignal

zep.js was submitted on Product Hunt and earned 4 upvotes and 1 comments, placing #77 on the daily leaderboard. Zep.js is an ultra-lightweight (265 bytes gzipped), zero-dependency JavaScript utility that turns event listeners into clean, reactive pipelines with automatic lifecycle management and debouncing. What makes Zep.js standout? - Ultra-lightweight: Only 265 bytes gzipped. - Built-in Auto-Cleanup. - Integrated Debouncing & Filtering. - Race-Condition Proof. - Avoids event-handling plumbing & boilerplate entirely.

On the analytics side, zep.js competes within Open Source, Software Engineering, Developer Tools and GitHub — topics that collectively have 673.1k followers on Product Hunt. The dashboard above tracks how zep.js performed against the three products that launched closest to it on the same day.

Who hunted zep.js?

zep.js was hunted by Marcel Bos. A “hunter” on Product Hunt is the community member who submits a product to the platform — uploading the images, the link, and tagging the makers behind it. Hunters typically write the first comment explaining why a product is worth attention, and their followers are notified the moment they post. Around 79% of featured launches on Product Hunt are self-hunted by their makers, but a well-known hunter still acts as a signal of quality to the rest of the community. See the full all-time top hunters leaderboard to discover who is shaping the Product Hunt ecosystem.

For a complete overview of zep.js including community comment highlights and product details, visit the product overview.