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 Thumbnail

zep.js

Tiny event pipeline with autocleanup, debounce & AbortSignal

Open Source
Software Engineering
Developer Tools
GitHub
Visit WebsiteSee on Product HuntGithub

Hunted byMarcel BosMarcel Bos

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.


Comment highlights

No comment highlights available yet. Please check back later!

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.

zep.js was featured in Open Source (68.9k followers), Software Engineering (43.1k followers), Developer Tools (519.8k followers) and GitHub (41.4k followers) on Product Hunt. Together, these topics include over 137.6k products, making this a competitive space to launch in.

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.

Want to see how zep.js stacked up against nearby launches in real time? Check out the live launch dashboard for upvote speed charts, proximity comparisons, and more analytics.