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

@substrat-run/engine-absence

v0.6.68

Published

Substrat engine: approved absence — an append-only entry ledger over an opaque subject, balance as a fold, approval as a state machine

Readme

@substrat-run/engine-absence

Absence engine for Substrat — an append-only entry ledger over an opaque subject, with approval as the only way onto it.

It knows nothing about who its subjects are, what "VAB" means, how vacation accrues, which days are weekends or red days, or what a holiday calendar says — all of that is vertical policy. It takes a subject ref the vertical provides and guards the ledger's integrity over it; it never owns a directory.

What it owns

  • The ledger is append-only. An accrual, a booking, a correction, a carryover, or a reversal is a new entry, never an edit. Balance is a pure fold over entries — no stored counter exists to drift.
  • Only an approved request books. The requested → approved | rejected → cancelled state machine cannot skip, and booking/reversal entries are mintable only through decideAbsence/cancelAbsence — a construction, not a convention.
  • A per-leave-type balance floor, enforced at decision time. Floor 0 refuses overdraft; a negative floor admits advance leave (förskottssemester) with no code change.
  • The subject is an opaque EntityRef + a vertical-supplied DataSubjectId — an employee, a plannable resource, whatever the vertical's noun is. The DataSubjectId keys crypto-shredding on every event.
  • Every mutation emits a fat event — absence.requested, absence.decided, absence.cancelled, absence.entry-recorded, … — so consumers never query back.
  • Stale requests expire under a system actor (absence/expire-stale, declared as a manifest schedule): a leave nobody approved before it began is cancelled by the platform sweep, attributed to the schedule and never to a manager.

Install

pnpm add @substrat-run/engine-absence
import { absenceModule, requestAbsence, availability, PERM } from '@substrat-run/engine-absence';
import { assertAllowed } from '@substrat-run/kernel';

host.registerModule(absenceModule);

// A vertical composes the in-scope functions inside its own operations — same
// transaction, its own permission check, its own directory:
host.defineOperation('crew/request-leave', async (ctx, input) => {
  assertAllowed(await ctx.check(PERM.request, resourceRef(input.resourceId)));
  requireResourceExists(ctx, input.resourceId); // the directory is YOURS, not the engine's
  return requestAbsence(ctx, {
    subject: { ref: resourceRef(input.resourceId), dataSubjectId: input.resourceId },
    leaveTypeKey: input.type, // your vocabulary, registered via configureLeaveType
    startDate: input.from,    // calendar days, inclusive
    endDate: input.to,
    days: input.days,         // YOU compute the day count (weekends, red days)
  });
});

The planner's read is availability(ctx, { subject, from, to }) — every date covered by an approved absence, for the vertical to compose with its own holiday calendar.

Documentation

https://substrat.net/engines — the domain model and ledger invariants, the full operation/permission surface, the event contracts, and how a vertical composes or extends it.

The docs site is the single source of truth; this README deliberately doesn't restate it.

Related packages

Status

Pre-release (0.x): surfaces change without notice until the first vertical ships.