npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

omp-sync

v0.1.4

Published

Encrypted per-session sync for the omp coding agent (S3/R2 compatible).

Readme

omp-sync — Encrypted Per-Session Sync for omp

npm License: MIT

omp-sync syncs your omp coding-agent sessions across machines through any S3-compatible storage (AWS S3, Cloudflare R2, IDrive E2, MinIO, …). Every session JSONL is stored as its own object, wrapped as AES-256-GCM(gzip(plaintext)) and bound to its object key. Objects are content-addressed and immutable: a failed push can never corrupt the previously published generation, and pulls cryptographically verify every byte before it touches disk.

Install

omp plugin install npm:omp-sync

Quick start

  1. Create a bucket on any S3-compatible storage and grab the endpoint, region, and access keys.

  2. Write the config to <agentDir>/omp-sync.local.json (default agent dir: ~/.omp/agent):

    {
      "endpoint": "https://<bucket-host>",
      "bucket": "<bucket>",
      "region": "auto",
      "accessKeyId": "...",
      "secretAccessKey": "..."
    }

    Every field can also come from the environment (OMP_SYNC_ENDPOINT, OMP_SYNC_BUCKET, OMP_SYNC_REGION, OMP_SYNC_ACCESS_KEY_ID, OMP_SYNC_SECRET_ACCESS_KEY).

  3. Generate the encryption key once per machine set — it is shared by all machines but never leaves them (it is not synced, ever):

    echo "export OMP_SYNC_ENCRYPTION_KEY=\"$(openssl rand -base64 32)\"" >> ~/.zshrc
  4. In omp, run:

    /omp-sync doctor

    …should report config ok, encrypt key ok (32-byte), bucket reachable. Then on your first machine:

    /omp-sync push

    On the second machine:

    /omp-sync pull

Commands

| Command | What it does | | -------------------- | ------------------------------------------------------------------ | | /omp-sync status | Local vs remote diff. Never writes sessions or remote objects (a one-time local base-state migration may run after upgrades). | | /omp-sync push | Upload new/changed local sessions (last-writer-wins on first contact). | | /omp-sync pull | Download remote sessions (never touches your open session file). | | /omp-sync blobs | Full two-way reconcile of the attachment blob store. | | /omp-sync doctor | Config + key + bucket + lock diagnostics. Works without a config. | | /omp-sync config | Show resolved (secret-redacted) configuration. | | /omp-sync unlock | Inspect/remove a stale lock. Works without a config. |

Automation (no commands needed day to day):

  • After each turn, the current session file is pushed (debounced, one small upload — no shutdown race).
  • On startup, an opt-in pull fetches other sessions (autoPull, off by default, never overwrites the open file).
  • On shutdown, a best-effort final push of the current file runs inside omp's handler budget.

Conflict handling

When both sides edited the same session since the last sync, nothing is silently overwritten: the remote version is preserved next to your file as <session>.conflict-<timestamp>.jsonl, your bytes stay untouched, and the next push adopts your side. The copy syncs up like any other session, so both versions survive on every machine.

Configuration reference

omp-sync.local.json (or OMP_SYNC_* env vars):

| Key / env | Default | Meaning | | -------------------------------- | ------------ | ---------------------------------------------------- | | endpoint / OMP_SYNC_ENDPOINT | — (required) | Storage endpoint incl. scheme. If the endpoint's first host label equals the bucket name (e.g. bucket s3 with https://s3.example.com), embed the bucket in the host instead to force virtual-hosted addressing | | region / OMP_SYNC_REGION | auto | SigV4 region | | accessKeyId/secretAccessKey | — (required) | Storage credentials | | prefix / OMP_SYNC_PREFIX | omp-sync/ | Bucket namespace for all objects | | autoPush / OMP_SYNC_AUTO_PUSH | true | Debounced per-turn push of the current session | | autoPull / OMP_SYNC_AUTO_PULL | false | Pull other sessions on startup | | debounceMs | 5000 | Turn-end push debounce | | includeBlobs / OMP_SYNC_BLOBS | true | Sync blob:sha256: attachments alongside sessions | | maxBlobBytes | 33554432 | Oversized blobs are skipped with a warning on push; sessions referencing them fail to pull until the limit is raised | | pathMap / OMP_SYNC_PATHMAP | [] | [{from, to}] prefix rewrites for trees that differ beyond the home root (home shapes /Users/u, /home/u, /root reconcile automatically) | | OMP_SYNC_ENCRYPTION_KEY | — (required) | Base64 of 32 random bytes, shared across machines | | OMP_SYNC_TIMEOUT_MS | 15000 | Per-request network timeout |

How it works

  • Keys derive from the session header's cwd, never from the on-disk bucket directory (which is lossy). Two omp machines converge on the same keys for the same project, across macOS and Linux: any POSIX home shape (/Users/u/..., /home/u/..., /root/...) folds to home/... regardless of which machine encoded it, username included or not.
  • Change tracking is sha256-of-plaintext plus a local agreed-base, with mtime tie-breaking only on first contact.
  • Manifest (<prefix>manifest.json, itself sealed) is a truthful index of remote objects, updated with If-Match optimistic concurrency and bounded retries — concurrent pushes merge instead of clobbering.
  • Pulls land in omp's own sessions tree (<agentDir>/sessions/<omp bucket>/, or $XDG_DATA_HOME/omp/sessions/... when omp is XDG-redirected). Project working directories are never written to.
  • Deletions never propagate: the store is additive; deleting locally and pushing does not delete remotely.

Security notes

  • Payloads are AES-256-GCM(gzip(plaintext)) with a fresh 96-bit nonce per object; session, blob, and manifest envelopes are each bound (AAD) to their object key, so swapped or cross-prefix objects are rejected.
  • The storage operator sees only opaque blobs, content hashes, sizes, and modification times — never prompts, code, or file contents (note: object keys do reveal the sanitized project directory layout and per-object sizes, which are listable).
  • Downloads are hash-verified and size-bounded before they reach disk; oversized or mismatched objects are refused, never partially applied.
  • Credentials live in omp-sync.local.json / env on each machine. The encryption key lives only in OMP_SYNC_ENCRYPTION_KEY.

Requirements

  • omp coding agent (developed and tested against omp 18.1.13).
  • Node 22+ or Bun (for the fetch, AbortSignal.timeout, and Promise.withResolvers runtimes used internally).

License

MIT — see LICENSE.