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

@epistery/code-sync

v1.0.0

Published

Keep an epistery service's own git checkout in sync with a branch and self-restart. Poll or trigger; ff-only or reset-hard; install only when deps change.

Readme

@epistery/code-sync

The one place the "advance a git checkout to a branch, then act" logic lives, so epistery services stop each rolling their own. No dependency on @metric-im/administrate, and not part of core epistery (which is tight public middleware — no ops code there).

Core

import { syncCheckout } from '@epistery/code-sync';

const res = await syncCheckout({
  dir,                       // checkout root (contains .git)
  branch: 'main',
  advance: 'ff-only',        // 'ff-only' (never clobbers) | 'reset-hard'
  install: 'if-changed',     // 'if-changed' (default) | 'always' | 'never'
  installer: ['ci', '--no-audit', '--no-fund'],  // npm args (optional)
});
// → { advanced, before, after, installed }

syncCheckout fetches, no-ops when already current, else advances and installs only when package.json/package-lock.json changed. It performs no restart — the caller decides what an advance means.

Poll trigger (self-updating service under a supervisor)

import { poll } from '@epistery/code-sync';

const sync = poll({
  dir: appRoot,
  branch: 'main',
  intervalMs: 60_000,
  onAdvance: () => process.exit(0),   // systemd Restart=always respawns on new code
});
// sync.stop()  — stop polling
// sync.check() — force an immediate check (a future webhook/admin trigger reuses this)

Ticks never overlap; the interval timer is unref'd, so polling alone won't keep the process alive.

Restart model

code-sync never restarts the process itself. For a service that keeps its own code current, run it under a supervisor (systemd Restart=always) and pass onAdvance: () => process.exit(0) (optionally close the server first for a graceful exit). The install runs in the old process; the restart brings up the new code with the new deps already in place.

Not here yet

Signed-webhook (GitHub X-Hub-Signature-256) and admin-route triggers — the harness sync.mjs and epistery-host PluginManager/AgentManager shapes — layer over the same syncCheckout core and can migrate onto this module later. They're omitted for now to keep this dependency-free (no express, no auth model baked in). Credential/token injection for private managed clones is likewise a caller concern, added as a parameter if/when those callers migrate.