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

@dotrino/expenses-agent

v0.1.3

Published

El agente de Expenses en tu PC: lee los avisos del banco de tu buzón (IMAP) y se los pasa a expenses.dotrino.com por una sesión cifrada. Las credenciales viven en tu bóveda. Ecosistema Dotrino.

Readme

@dotrino/expenses-agent

Parte del ecosistema Dotrino. Dotrino es un ecosistema de aplicaciones centradas en la privacidad de los datos: tu información es tuya, y las decisiones sobre ella también — qué compartes, con quién, cuándo y por qué. Sin anuncios, sin cookies, sin rastreo de datos, sin vender tu identidad a nadie.

El agente de Expenses en tu PC. Lee los avisos del banco de tu buzón por IMAP y se los pasa a la app cuando ella se los pide, por una sesión cifrada de punta a punta (@dotrino/remote-agent). En la app caen en «Por confirmar»: nada entra al registro sin que lo aceptes.

Uso para quien no programa: wiki.dotrino.com/apps/gastos/#correo.

Lo que no hace, a propósito

  • No guarda tus credenciales en esta máquina. Viven en el cajón expenses de tu bóveda, selladas; el agente las pide en cada lectura y no se quedan en memoria entre una y otra.
  • No guarda correos. El buzón es el almacén: la app guarda en tu almacén hasta dónde leyó (el «cursor») y el agente lee lo nuevo desde ahí.
  • No es requisito. Con el PC apagado la app funciona igual; solo deja de llegar correo nuevo. Sin agente, el aviso se puede pegar a mano.

Instalar y poner en marcha

# 1. En el PC de tu bóveda: una invitación que deja leer el cajón «expenses»
dotrino-vault pair --service expenses --scope sign

# 2. En el PC donde va a correr el agente (puede ser el mismo)
npx @dotrino/expenses-agent              # enlaza (pega la invitación, aprueba el código) y corre
npx @dotrino/expenses-agent setup        # servidor, usuario, contraseña de aplicación, carpeta, remitentes
npx @dotrino/expenses-agent check        # prueba el buzón con lo guardado

Gmail y Outlook piden una contraseña de aplicación (con la verificación en dos pasos encendida), no la de siempre. IMAP_FROM (remitentes separados por comas) hace que el servidor filtre: solo se leen los correos del banco.

| Orden | | |---|---| | (sin orden) [--name <n>] | enlaza si falta y corre | | enroll | re-enlaza (sobrescribe el enlace) | | setup | sube los datos del buzón al cajón (storeVars: añadir es directo; cambiar uno existente espera la aprobación de tu bóveda) | | check | conecta con lo guardado y lista los últimos avisos | | info [--json] | qué aparato es: su ID, su bóveda, sus permisos (sin red) | | list | los agentes enlazados en esta máquina | | update [--approval on\|off] [--notify on\|off] | cómo se actualiza (por defecto, solo; CONVENCIONES §15) |

Enlaces en ~/.dotrino/agent/expenses-agent/<nombre>/ (DOTRINO_AGENT_HOME cambia la raíz).

Protocolo (lo que habla con la PWA)

Por la sesión de @dotrino/remote-agent, con re para emparejar pregunta y respuesta:

| Pide la PWA | Contesta el agente | |---|---| | { type: 'status' } | { type: 'status', configured, mailbox: { host, user (a medias), folder, from }, version } | | { type: 'pull', cursor } | { type: 'mails', mails: [{ id, from, subject, date, text }], cursor } | | — | { type: 'fail', code, message } |

El cursor es { uidValidity, uid }. Sin cursor (o si la carpeta se renumeró) se miran los últimos 30 días y el cursor queda en el último correo de la carpeta; después, lo nuevo en orden, como mucho 50 por lectura. El agente contesta kind: 'expenses-agent' al ping, que es como la app lo encuentra entre los aparatos de la cuenta.

Códigos: not-configured · bad-config · imap-auth · imap-unreachable · imap-folder · imap-failed · not-linked · unknown-type.

Desarrollo

npm test             # unitarias
npm run test:imap    # contra un IMAP de verdad (GreenMail en Docker)

Licencia

MIT.