russellromney/honkerPublic

SQLite extension + bindings for Postgres NOTIFY/LISTEN semantics with durable queues, streams, pub/sub, and scheduler

AI summary: A SQLite extension bringing durable pub/sub, task queues, and Postgres-style NOTIFY/LISTEN semantics.

Stars
3K
+2 today
Forks
79
Watchers
9
Open issues
18
Open PRs
24
Contributors
~8
Commits
412
Branches
60

RustOtherCreated Apr 18, 2026Last push 1d agoLatest release v0.6.0+7 stars this week+15 this month

Quick answers

What is honker?
A SQLite extension bringing durable pub/sub, task queues, and Postgres-style NOTIFY/LISTEN semantics.
What does honker do?
honker is an extension and set of language bindings for SQLite that introduces robust asynchronous messaging capabilities. It adds Postgres-style `NOTIFY` and `LISTEN` semantics, enabling real-time event streaming and pub/sub patterns directly within a SQLite database. Unlike traditional polling solutions, it uses highly efficient `PRAGMA data_version` reads to eliminate polling overhead and avoid the need for a separate broker daemon. This allows applications using SQLite to implement durable task queues and event-driven architectures effortlessly. It brings enterprise-grade messaging features to the simplicity of a local SQLite file.
Who is honker for?
Backend developers and software engineers building applications with SQLite who need asynchronous messaging, task queues, or real-time event systems without the operational complexity of dedicated message brokers.
How do I get started with honker?
Load the extension in your SQLite client or application using `SELECT load_extension('honker')`.
How popular is honker on GitHub?
russellromney/honker has 3,033 stars and 79 forks on GitHub, and gained 7 stars in the last 7 days.
What license does honker use?
russellromney/honker is released under the Other license.

Star history

since Jul 29, 2026
01K2K3KJul 2026Aug 2026Sep 2026Oct 2026
3K stars as of Oct 3, 2026. Measured daily since Jul 29, 2026; GitHub no longer exposes earlier star timestamps.

Contribution activity

commits per day, last 52 weeks
SepOctNovDecJanFebMarAprMayJunJulAugSepMonWedFri2025-09-28: 0 commits2025-09-29: 0 commits2025-09-30: 0 commits2025-10-01: 0 commits2025-10-02: 0 commits2025-10-03: 0 commits2025-10-04: 0 commits2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-08: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 0 commits2026-02-18: 0 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 0 commits2026-02-24: 0 commits2026-02-25: 0 commits2026-02-26: 0 commits2026-02-27: 0 commits2026-02-28: 0 commits2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 0 commits2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 0 commits2026-04-04: 0 commits2026-04-05: 0 commits2026-04-06: 0 commits2026-04-07: 0 commits2026-04-08: 0 commits2026-04-09: 0 commits2026-04-10: 0 commits2026-04-11: 0 commits2026-04-12: 0 commits2026-04-13: 0 commits2026-04-14: 0 commits2026-04-15: 0 commits2026-04-16: 0 commits2026-04-17: 0 commits2026-04-18: 25 commits2026-04-19: 44 commits2026-04-20: 48 commits2026-04-21: 21 commits2026-04-22: 0 commits2026-04-23: 3 commits2026-04-24: 13 commits2026-04-25: 2 commits2026-04-26: 1 commit2026-04-27: 0 commits2026-04-28: 1 commit2026-04-29: 15 commits2026-04-30: 16 commits2026-05-01: 34 commits2026-05-02: 2 commits2026-05-03: 2 commits2026-05-04: 18 commits2026-05-05: 2 commits2026-05-06: 1 commit2026-05-07: 1 commit2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 0 commits2026-05-11: 0 commits2026-05-12: 0 commits2026-05-13: 0 commits2026-05-14: 0 commits2026-05-15: 0 commits2026-05-16: 0 commits2026-05-17: 0 commits2026-05-18: 0 commits2026-05-19: 0 commits2026-05-20: 7 commits2026-05-21: 0 commits2026-05-22: 0 commits2026-05-23: 2 commits2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 0 commits2026-05-27: 1 commit2026-05-28: 4 commits2026-05-29: 0 commits2026-05-30: 0 commits2026-05-31: 0 commits2026-06-01: 0 commits2026-06-02: 0 commits2026-06-03: 0 commits2026-06-04: 2 commits2026-06-05: 3 commits2026-06-06: 0 commits2026-06-07: 0 commits2026-06-08: 0 commits2026-06-09: 0 commits2026-06-10: 0 commits2026-06-11: 0 commits2026-06-12: 0 commits2026-06-13: 0 commits2026-06-14: 0 commits2026-06-15: 0 commits2026-06-16: 0 commits2026-06-17: 0 commits2026-06-18: 0 commits2026-06-19: 0 commits2026-06-20: 0 commits2026-06-21: 0 commits2026-06-22: 0 commits2026-06-23: 0 commits2026-06-24: 0 commits2026-06-25: 0 commits2026-06-26: 0 commits2026-06-27: 0 commits2026-06-28: 0 commits2026-06-29: 0 commits2026-06-30: 0 commits2026-07-01: 0 commits2026-07-02: 0 commits2026-07-03: 1 commit2026-07-04: 0 commits2026-07-05: 0 commits2026-07-06: 0 commits2026-07-07: 0 commits2026-07-08: 25 commits2026-07-09: 6 commits2026-07-10: 0 commits2026-07-11: 0 commits2026-07-12: 0 commits2026-07-13: 0 commits2026-07-14: 0 commits2026-07-15: 0 commits2026-07-16: 0 commits2026-07-17: 0 commits2026-07-18: 0 commits2026-07-19: 0 commits2026-07-20: 5 commits2026-07-21: 7 commits2026-07-22: 0 commits2026-07-23: 0 commits2026-07-24: 0 commits2026-07-25: 4 commits2026-07-26: 0 commits2026-07-27: 2 commits2026-07-28: 0 commits2026-07-29: 0 commits2026-07-30: 0 commits2026-07-31: 8 commits2026-08-01: 9 commits2026-08-02: 0 commits2026-08-03: 0 commits2026-08-04: 0 commits2026-08-05: 0 commits2026-08-06: 0 commits2026-08-07: 0 commits2026-08-08: 0 commits2026-08-09: 0 commits2026-08-10: 0 commits2026-08-11: 0 commits2026-08-12: 0 commits2026-08-13: 0 commits2026-08-14: 0 commits2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 4 commits2026-08-22: 0 commits2026-08-23: 4 commits2026-08-24: 3 commits2026-08-25: 13 commits2026-08-26: 6 commits2026-08-27: 2 commits2026-08-28: 0 commits2026-08-29: 0 commits2026-08-30: 0 commits2026-08-31: 0 commits2026-09-01: 3 commits2026-09-02: 0 commits2026-09-03: 0 commits2026-09-04: 3 commits2026-09-05: 0 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 0 commits2026-09-09: 0 commits2026-09-10: 0 commits2026-09-11: 0 commits2026-09-12: 0 commits2026-09-13: 0 commits2026-09-14: 0 commits2026-09-15: 0 commits2026-09-16: 0 commits2026-09-17: 0 commits2026-09-18: 0 commits2026-09-19: 0 commits2026-09-20: 0 commits2026-09-21: 0 commits2026-09-22: 0 commits2026-09-23: 0 commits2026-09-24: 0 commits2026-09-25: 0 commits2026-09-26: 0 commits
373 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Actively maintained

    Pushed within 48 hours

  • Continuous integration

    Automated checks passing

What honker does

honker is an extension and set of language bindings for SQLite that introduces robust asynchronous messaging capabilities. It adds Postgres-style `NOTIFY` and `LISTEN` semantics, enabling real-time event streaming and pub/sub patterns directly within a SQLite database. Unlike traditional polling solutions, it uses highly efficient `PRAGMA data_version` reads to eliminate polling overhead and avoid the need for a separate broker daemon. This allows applications using SQLite to implement durable task queues and event-driven architectures effortlessly. It brings enterprise-grade messaging features to the simplicity of a local SQLite file.

Backend developers and software engineers building applications with SQLite who need asynchronous messaging, task queues, or real-time event systems without the operational complexity of dedicated message brokers.

  • Postgres-style NOTIFY/LISTEN: Replicates the familiar asynchronous notification system found in PostgreSQL.
  • No separate broker: Implements pub/sub and task queues entirely within the SQLite extension, requiring no external daemon like Redis.
  • Zero-polling architecture: Uses single-digit-microsecond `PRAGMA data_version` checks to replace inefficient queue-table polling.
  • Language agnostic: Can be used by any language capable of running `SELECT load_extension('honker')`.
  • Durable event streams: Ensures that messages and events are reliably stored and processed, even across restarts.

Where teams use it

Local task queues

Building robust background job processing systems for desktop or mobile apps using only SQLite.

Real-time UI updates

Pushing database changes immediately to the frontend without heavy polling intervals.

Event-driven microservices

Using a shared SQLite file as a lightweight message broker for communicating processes on a single machine.

Simplifying deployment architectures

Replacing complex stacks involving PostgreSQL and Redis with a single SQLite file and the honker extension.

Getting started: Load the extension in your SQLite client or application using `SELECT load_extension('honker')`.

README

main branch


honker

honker is a SQLite extension + language bindings that add Postgres-style NOTIFY/LISTEN semantics to SQLite, with built-in durable pub/sub, task queue, and event streams, without client polling or a daemon/broker. Any language that can SELECT load_extension('honker') gets the same features.

honker replaces queue-table polling with a single-digit-microsecond PRAGMA data_version read. The default watcher checks every 1 ms, giving push-like semantics and single-digit-millisecond cross-process delivery; raise the watcher interval when lower idle CPU matters more than lowest-latency wakeups.

If SQLite is your primary datastore, the queue should live in the same file. INSERT INTO orders and queue.enqueue(...) can commit in the same transaction. Rollback drops both.

See honker.dev for guides and API details, and Binding support for what each binding supports.

Simon Willison highlighted honker as a SQLite implementation of the transactional outbox pattern.

Alpha software. Better than experimental, not beta-quality yet.

Quick Start

pip install honker
import honker

db = honker.open("app.db")
emails = db.queue("emails")

with db.transaction() as tx:
    tx.execute("INSERT INTO orders (user_id) VALUES (?)", [42])
    emails.enqueue({"to": "[email protected]"}, tx=tx)

async for job in emails.claim("worker-1"):
    send_email(job.payload)
    job.ack()

The enqueue is atomic with the order insert. A worker in another process wakes when the transaction commits.

What It Does

  • Notify/listen across processes on one SQLite .db file
  • Durable at-least-once queues with retries, delayed jobs, priority, visibility timeouts, dead-letter rows, and task result storage
  • Durable streams with per-consumer offsets
  • Time-trigger scheduling with cron and @every <duration> expressions
  • Named locks, rate limits, and transactional outbox helpers
  • SQL functions through a SQLite loadable extension
  • Thin bindings for Python, Node.js, Rust, Go, Ruby, Bun, Elixir, C++, .NET / C#, Java/JVM, and Kotlin

Deliberately not included: workflow DAGs, task chains/groups/chords, multi-writer replication, or distributed locking across machines.

Why

SQLite is increasingly the database for shipped projects. Those projects eventually need pub/sub and a task queue. The usual answer is "add Redis

  • Celery." That works, but it introduces a second datastore with its own backup story, a dual-write problem between your business table and the queue, and a broker to run.

Honker takes the approach that if SQLite is the primary datastore, the queue should live in the same file. The queue is just rows in a table with a partial index. Every binding uses the same schema and extension, so one language can enqueue work and another can claim it.

Design

Honker is built around three pieces:

  • ephemeral pub/sub with notify() / listen()
  • durable streams with per-consumer offsets
  • at-least-once queues with visibility timeouts and retries

All three are INSERTs inside your transaction. Put queue.enqueue(...), stream.publish(...), or notify(...) beside the write that created the work. Commit lands both rows. Rollback drops both rows.

SQLite has no server-side push channel, so honker uses a shared watcher. The stable backend reads PRAGMA data_version every millisecond; when the counter changes, listeners re-read indexed SQLite state.

If you use your app's existing SQLite file, honker wakes workers on every commit to that file. Most wakes will not find work for a given queue or channel. That overtriggering is on purpose: one indexed SELECT is cheap, while a missed wake is a correctness bug. The stable semantics are:

  • wake on committed updates
  • ignore rolled-back work
  • re-read SQLite state after every wake
  • use file-backed SQLite databases, not :memory:

Optional source-build backends also exist for kernel file events and WAL shared-memory reads. See Binding support for which bindings expose backend options and what CI proves.

Honker is single-machine and file-backed. SQLite's locking model is designed for one host writing one database file; two servers writing the same .db over NFS is not a Honker deployment strategy.

Prior Art

pg_notify gives Postgres fast triggers, but no retry or visibility timeout. pg-boss and Oban are the Postgres-side gold standards we're chasing on SQLite. Huey is an excellent SQLite-backed Python task queue. If you already run Postgres, use the Postgres tools, as they are excellent.

The transactional outbox idea also owes a lot to Brandur Leach's Transactionally Staged Job Drains in Postgres: write the job row in the same transaction as the business row, then let a worker deliver it after commit.

Bindings

Ecosystem Package / path Notes
Python pip install honker Batteries-included package; includes the Python API and loadable extension in release wheels
Node.js npm install @russellthehippo/honker-node Native Node binding
Ruby gem install honker Native gem with precompiled platforms where available
.NET / C# dotnet add package Honker NuGet package with bundled runtime assets
Rust honker, honker-core, honker-extension Core engine and Rust wrapper
Elixir Hex package honker Extension-backed Elixir binding
Go, Bun, C++, JVM, Kotlin in packages/ Maintained in-tree bindings
SQLite honker-extension Loadable extension for any SQLite 3.9+ client

The detailed parity table lives in BINDINGS.md. Language-specific install and API notes live in each package README.

SQL Extension

Any SQLite client that can load extensions can use honker directly:

.load ./libhonker_ext
SELECT honker_bootstrap();
INSERT INTO _honker_live (queue, payload) VALUES ('emails', '{"to":"alice"}');
SELECT honker_claim_batch('emails', 'worker-1', 32, 300);    -- JSON array
SELECT honker_ack_batch('[1,2,3]', 'worker-1');              -- DELETEs; returns count
SELECT honker_sweep_expired('emails');                       -- count moved to dead
SELECT honker_lock_acquire('backup', 'me', 60);              -- 1 = got it, 0 = held
SELECT honker_lock_release('backup', 'me');                  -- 1 = released
SELECT honker_rate_limit_try('api', 10, 60);                 -- 1 = under, 0 = at limit
SELECT honker_rate_limit_sweep(3600);                        -- drop windows >1h old
SELECT honker_cron_next_after('0 3 * * *', unixepoch());     -- 5-field cron
SELECT honker_cron_next_after('*/2 * * * * *', unixepoch()); -- 6-field cron
SELECT honker_cron_next_after('@every 5s', unixepoch());     -- interval schedule
SELECT honker_scheduler_register('nightly', 'backups',
  '0 3 * * *', '"go"', 0, NULL);                             -- periodic task
SELECT honker_scheduler_tick(unixepoch());                   -- JSON: fires due
SELECT honker_scheduler_soonest();                           -- min next_fire_at
SELECT honker_queue_next_claim_at('emails');                 -- next run/reclaim deadline
SELECT honker_stream_publish('orders', 'k', '{"id":42}');    -- returns offset
SELECT honker_stream_read_since('orders', 0, 1000);          -- JSON array
SELECT honker_stream_save_offset('worker', 'orders', 42);    -- monotonic upsert
SELECT honker_stream_get_offset('worker', 'orders');         -- offset or 0
SELECT honker_result_save(42, '{"ok":true}', 3600);          -- save w/ 1h TTL
SELECT honker_result_get(42);                                -- value or NULL
SELECT honker_result_sweep();                                -- prune expired
SELECT notify('orders', '{"id":42}');
SELECT honker_enqueue('emails', '{"to":"[email protected]"}', NULL, NULL, 0, 3, NULL);

The extension shares tables with the language bindings, so a Python worker can claim jobs written by SQL, Node, Ruby, Go, or any other binding.

How long has this job been running

_honker_live.claimed_at is when the CURRENT claim started. Nothing else answers that: created_at includes queue wait, run_at is when the job became ready, and claim_expires_at moves on every heartbeat. No language binding exposes claimed_at yet, so read it in SQL:

SELECT id, queue, unixepoch() - claimed_at AS running_s
  FROM _honker_live
 WHERE state = 'processing'
   AND claim_expires_at >= unixepoch();   -- required, see below

claimed_at is only meaningful while claim_expires_at >= unixepoch(). When a claim lapses and nobody reclaims the job — attempts exhausted, no worker on that queue, queue drained — honker does not touch the row. worker_id, claim_expires_at and claimed_at all stay put and all go stale together, and the next claim overwrites all three. Without the claim_expires_at filter, unixepoch() - claimed_at keeps counting up for an attempt nobody is running.

claimed_at is NULL until the first claim, and stays NULL for jobs that were already in flight when an existing database was upgraded: the migration adds the column without backfilling, because a backfill would date those rows to upgrade time and read as a claim that never happened. They pick up a real value on their next claim.

Architecture

  • One PRAGMA data_version watcher per Database; the default Rust-backed watcher cadence is 1 ms and can be raised
  • Counter change fans out a wake to each listener/worker/subscriber
  • Subscribers re-read SQLite state with indexed SELECTs
  • 100 subscribers still share one watcher
  • Idle listeners run zero queue/notification SELECTs

Queue claim is one UPDATE ... RETURNING through a partial index: (queue, priority DESC, run_at, id) WHERE state IN ('pending','processing'). Ack is one DELETE. Retry-exhausted jobs move to _honker_dead, so claim speed depends on pending/processing jobs, not old queue history.

The language bindings default to WAL because it gives concurrent readers with one writer and efficient fsync batching. Other journal modes still work. Correctness and cross-process wake do not depend on WAL; the wake path is SQLite's own data_version counter.

ORMs And Frameworks

Honker does not ship framework plugins. Load the extension on your framework or ORM connection, run honker_bootstrap(), and call SQL functions inside the ORM's transaction.

That works with SQLAlchemy, SQLModel, Django, Drizzle, Kysely, sqlx, GORM, ActiveRecord, Ecto, Hibernate, jOOQ, MyBatis, and Exposed. See the ORM guide at honker.dev/guides/orm.

Performance

On a modern laptop, honker handles thousands of messages per second. Cross-process wake latency is set by the watcher cadence, which defaults to 1 ms. Measure on your hardware with:

python bench/wake_latency_bench.py --samples 500
python bench/real_bench.py --workers 4 --enqueuers 2 --seconds 15

Development

make test              # Rust + Python + Node fast path
make test-all          # broader suite, including slower tests
make build             # build Python package + loadable extension
cargo build --release -p honker-extension

Repo layout:

honker-core/          # shared Rust engine
honker-extension/     # SQLite loadable extension
packages/             # language bindings
tests/                # cross-package integration tests
bench/                # benchmarks

Docs

License

Apache-2.0 OR MIT. See LICENSE.

View on GitHub

Recent activity

commits and pull requests

Recent open issues

view all

Releases and announcements

4 total
  1. Package versions differ by binding — this release marks the repository state, not a uniform bump. | Package | Version | Changed | |---|---|---| | [`honker` (Ruby)](https://rubygems.org/gems/honker) | 0.6.0 | listeners | | [`honker` (Elixir)](https://hex.pm/packages/honker) | 0.6.0 | listeners | | [`@russellthehippo/honker-node`](https://www.npmjs.com/package/@russellthehippo/honker-node) | 0.5.0 | **stream checkpoint fix** | | `honker`, `honker-core`, `honker-extension` (crates.io) | 0.5.0 | — | | [`honker` (PyPI)](https://pypi.org/project/honker/) | 0.5.0 | — | | [`Honker` (NuGet)](https://www.nuget.org/packages/Honker) | 0.5.1 | — | | `@russellthehippo/honker-bun` | 0.4.2 | — | The loadable extension is unchanged; [`ext-v0.5.0`](https://github.com/russellromney/honker/releases/tag/ext-v0.5.0) remains current for Go, C++, and anything loading it directly. ## Node: stream checkpoints are interoperable again **Anyone using named stream consumers from Node should upgrade.** Every Node release through 0.4.6 passed the stream topic and consumer name to the extension in reverse order when saving and loading offsets. Node-to-Node resume was self-consistent, so this was invisible fro

  2. Honker 0.5.0v0.5.0Aug 23, 2026321 downloads

    Every binding, published to every registry. This is the first release where the SQLite extension is installable rather than something you build yourself. ## Install | Language | Package | Version | |---|---|---| | Rust | [`honker`](https://crates.io/crates/honker) · [`honker-core`](https://crates.io/crates/honker-core) · [`honker-extension`](https://crates.io/crates/honker-extension) | 0.5.0 | | Python | [`honker`](https://pypi.org/project/honker/) | 0.5.0 | | Ruby | [`honker`](https://rubygems.org/gems/honker) | 0.5.0 | | Elixir | [`honker`](https://hex.pm/packages/honker) | 0.5.0 | | .NET | [`Honker`](https://www.nuget.org/packages/Honker) | 0.5.0 | | Node | [`@russellthehippo/honker-node`](https://www.npmjs.com/package/@russellthehippo/honker-node) | 0.4.6 | | Bun | [`@russellthehippo/honker-bun`](https://www.npmjs.com/package/@russellthehippo/honker-bun) | 0.4.2 | Go, C++, and anything else that loads a SQLite extension: download from [`ext-v0.5.0`](https://github.com/russellromney/honker/releases/tag/ext-v0.5.0) — five platform builds with checksums. ## Using Honker with an ORM You no longer have to find the extension yourself. It installs alongside the binding, and each

  3. Honker SQLite extension ext-v0.5.0ext-v0.5.0Aug 23, 2026361 downloads

    ## What's Changed * Bump every binding to 0.5.0 for release by @russellromney in https://github.com/russellromney/honker/pull/104 * Fix the source gem's vendored workspace lints by @russellromney in https://github.com/russellromney/honker/pull/105 **Full Changelog**: https://github.com/russellromney/honker/compare/ext-v0.4.0...ext-v0.5.0

  4. Honker SQLite extension ext-v0.4.0ext-v0.4.0Aug 22, 2026196 downloads

    ## What's Changed * feat: replace WAL stat-polling with PRAGMA data_version + identity check by @russellromney in https://github.com/russellromney/honker/pull/1 * refactor: use file-id crate for rust stable by @qiuzhanghua in https://github.com/russellromney/honker/pull/7 * fix: address all file-id follow-ups (#8) — entropy + Windows CI + non-{unix,windows} fallback by @russellromney in https://github.com/russellromney/honker/pull/9 * ci: add windows for python/node/extension; rename WalWatcher → UpdateWatcher; add panic + XOR-fold tests by @russellromney in https://github.com/russellromney/honker/pull/10 * test: fill cross-platform gaps and finish watcher cleanup (#12) by @russellromney in https://github.com/russellromney/honker/pull/13 * ci: harden against supply-chain attacks; add agent-ci Makefile targets by @russellromney in https://github.com/russellromney/honker/pull/15 * docs: drop pre-1.0 cleanup sequence from README by @russellromney in https://github.com/russellromney/honker/pull/17 * fix(core): explicit close() drops pool connections so Windows can unlink by @russellromney in https://github.com/russellromney/honker/pull/18 * ci: enable windows-latest for python and node

Code frequency

additions and deletions
+39.9K-39.9KWeek of 2026-04-12: +10,997 linesWeek of 2026-04-12: -1,943 linesWeek of 2026-04-19: +39,878 linesWeek of 2026-04-19: -35,152 linesWeek of 2026-04-26: +36,972 linesWeek of 2026-04-26: -6,124 linesWeek of 2026-05-03: +24,231 linesWeek of 2026-05-03: -2,540 linesWeek of 2026-05-10: +0 linesWeek of 2026-05-10: -0 linesWeek of 2026-05-17: +1,546 linesWeek of 2026-05-17: -90 linesWeek of 2026-05-24: +212 linesWeek of 2026-05-24: -18 linesWeek of 2026-05-31: +1,048 linesWeek of 2026-05-31: -896 linesWeek of 2026-06-07: +0 linesWeek of 2026-06-07: -0 linesWeek of 2026-06-14: +0 linesWeek of 2026-06-14: -0 linesWeek of 2026-06-21: +0 linesWeek of 2026-06-21: -0 linesWeek of 2026-06-28: +54 linesWeek of 2026-06-28: -7 linesWeek of 2026-07-05: +3,915 linesWeek of 2026-07-05: -1,273 linesWeek of 2026-07-12: +0 linesWeek of 2026-07-12: -0 linesWeek of 2026-07-19: +1,031 linesWeek of 2026-07-19: -488 linesWeek of 2026-07-26: +4,395 linesWeek of 2026-07-26: -907 linesWeek of 2026-08-02: +0 linesWeek of 2026-08-02: -0 linesWeek of 2026-08-09: +0 linesWeek of 2026-08-09: -0 linesApr 12, 2026Aug 9, 2026
+124.3K lines added, -49.4K removed over the last year.

Commits per week

last 52 weeks
1310Week of 2025-09-28: 0 commitsWeek of 2025-10-05: 0 commitsWeek of 2025-10-12: 0 commitsWeek of 2025-10-19: 0 commitsWeek of 2025-10-26: 0 commitsWeek of 2025-11-02: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 0 commitsWeek of 2026-02-15: 0 commitsWeek of 2026-02-22: 0 commitsWeek of 2026-03-01: 0 commitsWeek of 2026-03-08: 0 commitsWeek of 2026-03-15: 0 commitsWeek of 2026-03-22: 0 commitsWeek of 2026-03-29: 0 commitsWeek of 2026-04-05: 0 commitsWeek of 2026-04-12: 25 commitsWeek of 2026-04-19: 131 commitsWeek of 2026-04-26: 69 commitsWeek of 2026-05-03: 24 commitsWeek of 2026-05-10: 0 commitsWeek of 2026-05-17: 9 commitsWeek of 2026-05-24: 5 commitsWeek of 2026-05-31: 5 commitsWeek of 2026-06-07: 0 commitsWeek of 2026-06-14: 0 commitsWeek of 2026-06-21: 0 commitsWeek of 2026-06-28: 1 commitsWeek of 2026-07-05: 31 commitsWeek of 2026-07-12: 0 commitsWeek of 2026-07-19: 16 commitsWeek of 2026-07-26: 19 commitsWeek of 2026-08-02: 0 commitsWeek of 2026-08-09: 0 commitsWeek of 2026-08-16: 4 commitsWeek of 2026-08-23: 28 commitsWeek of 2026-08-30: 6 commitsWeek of 2026-09-06: 0 commitsWeek of 2026-09-13: 0 commitsWeek of 2026-09-20: 0 commitsSep 28, 2025Sep 20, 2026
373 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 3 commitsSun 1:00 — 3 commitsSun 2:00 — 1 commitsSun 3:00 — 3 commitsSun 4:00 — 2 commitsSun 5:00 — 1 commitsSun 6:00 — 0 commitsSun 7:00 — 0 commitsSun 8:00 — 0 commitsSun 9:00 — 0 commitsSun 10:00 — 0 commitsSun 11:00 — 0 commitsSun 12:00 — 0 commitsSun 13:00 — 0 commitsSun 14:00 — 0 commitsSun 15:00 — 2 commitsSun 16:00 — 0 commitsSun 17:00 — 3 commitsSun 18:00 — 6 commitsSun 19:00 — 7 commitsSun 20:00 — 6 commitsSun 21:00 — 10 commitsSun 22:00 — 1 commitsSun 23:00 — 3 commitsMon 0:00 — 1 commitsMon 1:00 — 3 commitsMon 2:00 — 5 commitsMon 3:00 — 16 commitsMon 4:00 — 5 commitsMon 5:00 — 5 commitsMon 6:00 — 2 commitsMon 7:00 — 3 commitsMon 8:00 — 0 commitsMon 9:00 — 1 commitsMon 10:00 — 0 commitsMon 11:00 — 0 commitsMon 12:00 — 0 commitsMon 13:00 — 1 commitsMon 14:00 — 0 commitsMon 15:00 — 0 commitsMon 16:00 — 3 commitsMon 17:00 — 0 commitsMon 18:00 — 11 commitsMon 19:00 — 7 commitsMon 20:00 — 2 commitsMon 21:00 — 4 commitsMon 22:00 — 3 commitsMon 23:00 — 4 commitsTue 0:00 — 2 commitsTue 1:00 — 3 commitsTue 2:00 — 3 commitsTue 3:00 — 3 commitsTue 4:00 — 2 commitsTue 5:00 — 0 commitsTue 6:00 — 0 commitsTue 7:00 — 0 commitsTue 8:00 — 0 commitsTue 9:00 — 0 commitsTue 10:00 — 2 commitsTue 11:00 — 1 commitsTue 12:00 — 1 commitsTue 13:00 — 1 commitsTue 14:00 — 2 commitsTue 15:00 — 6 commitsTue 16:00 — 2 commitsTue 17:00 — 6 commitsTue 18:00 — 6 commitsTue 19:00 — 4 commitsTue 20:00 — 0 commitsTue 21:00 — 1 commitsTue 22:00 — 2 commitsTue 23:00 — 0 commitsWed 0:00 — 3 commitsWed 1:00 — 0 commitsWed 2:00 — 0 commitsWed 3:00 — 5 commitsWed 4:00 — 5 commitsWed 5:00 — 2 commitsWed 6:00 — 0 commitsWed 7:00 — 4 commitsWed 8:00 — 0 commitsWed 9:00 — 0 commitsWed 10:00 — 0 commitsWed 11:00 — 0 commitsWed 12:00 — 0 commitsWed 13:00 — 0 commitsWed 14:00 — 0 commitsWed 15:00 — 1 commitsWed 16:00 — 3 commitsWed 17:00 — 1 commitsWed 18:00 — 13 commitsWed 19:00 — 2 commitsWed 20:00 — 1 commitsWed 21:00 — 5 commitsWed 22:00 — 6 commitsWed 23:00 — 4 commitsThu 0:00 — 6 commitsThu 1:00 — 4 commitsThu 2:00 — 2 commitsThu 3:00 — 6 commitsThu 4:00 — 1 commitsThu 5:00 — 2 commitsThu 6:00 — 3 commitsThu 7:00 — 4 commitsThu 8:00 — 0 commitsThu 9:00 — 0 commitsThu 10:00 — 0 commitsThu 11:00 — 0 commitsThu 12:00 — 0 commitsThu 13:00 — 0 commitsThu 14:00 — 0 commitsThu 15:00 — 0 commitsThu 16:00 — 2 commitsThu 17:00 — 0 commitsThu 18:00 — 0 commitsThu 19:00 — 3 commitsThu 20:00 — 0 commitsThu 21:00 — 1 commitsThu 22:00 — 0 commitsThu 23:00 — 0 commitsFri 0:00 — 3 commitsFri 1:00 — 3 commitsFri 2:00 — 0 commitsFri 3:00 — 1 commitsFri 4:00 — 5 commitsFri 5:00 — 3 commitsFri 6:00 — 10 commitsFri 7:00 — 11 commitsFri 8:00 — 0 commitsFri 9:00 — 1 commitsFri 10:00 — 0 commitsFri 11:00 — 0 commitsFri 12:00 — 0 commitsFri 13:00 — 3 commitsFri 14:00 — 5 commitsFri 15:00 — 0 commitsFri 16:00 — 3 commitsFri 17:00 — 8 commitsFri 18:00 — 0 commitsFri 19:00 — 1 commitsFri 20:00 — 0 commitsFri 21:00 — 2 commitsFri 22:00 — 7 commitsFri 23:00 — 0 commitsSat 0:00 — 1 commitsSat 1:00 — 1 commitsSat 2:00 — 4 commitsSat 3:00 — 0 commitsSat 4:00 — 0 commitsSat 5:00 — 0 commitsSat 6:00 — 0 commitsSat 7:00 — 0 commitsSat 8:00 — 0 commitsSat 9:00 — 0 commitsSat 10:00 — 0 commitsSat 11:00 — 0 commitsSat 12:00 — 0 commitsSat 13:00 — 0 commitsSat 14:00 — 1 commitsSat 15:00 — 1 commitsSat 16:00 — 15 commitsSat 17:00 — 5 commitsSat 18:00 — 2 commitsSat 19:00 — 2 commitsSat 20:00 — 4 commitsSat 21:00 — 1 commitsSat 22:00 — 5 commitsSat 23:00 — 2 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits390 (95%)
Community commits22 (5%)

412 commits in total over the last year.

DateListRankStars gained
May 27, 2026daily#22+38
  • ultraworkers/claw-code

    An agent-managed museum exhibit, built in Rust with Gajae-Code / LazyCodex — developed and maintained with no human intervention.

    195.2K stars · Rust

  • farion1231/cc-switch

    A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io

    140K stars · Rust

  • openai/codex

    Lightweight coding agent that runs in your terminal

    127.8K stars · Rust

  • denoland/deno

    A modern runtime for JavaScript and TypeScript.

    108.6K stars · Rust

  • ruvnet/RuView

    π RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.

    96.4K stars · Rust

  • oven-sh/bun

    Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one

    96.1K stars · Rust