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

@origin-detect/cli

v0.1.1

Published

Verificación de procedencia C2PA por lotes desde la terminal

Readme

@origin-detect/cli

Verificación de procedencia de contenido por lotes, desde la terminal.

pnpm dlx @origin-detect/cli verify ./fotos
SIN C2PA     CA-reencodeado.jpg
NO CONFIADO  CA.jpg               firma valida, firmante no reconocido: C2PA Test Signing Cert
INVALIDO     E-sig-CA.jpg         claimSignature.mismatch
SIN C2PA     IMG_0003.jpg         Adobe Lightroom 5.3 (Macintosh)
INDEFINIDO   cloudx.jpg           manifest remoto no consultado: https://cai-manifests.adobe.com/…
TEXTO        notas.txt            4 caracteres invisibles (U+200B, U+202F) — heuristica, no prueba nada

6 archivos: 2 SIN C2PA · 1 NO CONFIADO · 1 INVALIDO · 1 INDEFINIDO · 1 TEXTO

[!IMPORTANT] Esto no es un detector de contenido generado por IA. No adivina. Lee Qué no hace antes de usarlo para tomar una decisión editorial.

Instalación

pnpm add -D @origin-detect/cli   # en un proyecto
pnpm dlx @origin-detect/cli …    # sin instalar

Requiere Node 22 o superior. exiftool viene incluido: no hay que instalarlo en el sistema.

Los cinco estados

La mayor parte del valor está aquí. Las herramientas de consumo colapsan la procedencia en un tick verde, y eso oculta justo el caso que le interesa a quien verifica.

| Estado | Significado | |---|---| | CONFIABLE | Firma válida y firmante en la lista de confianza del C2PA. | | NO CONFIADO | Firma criptográficamente válida, pero el firmante no está en ninguna lista reconocida. Cualquiera puede firmar: esto no prueba el origen, y tampoco es sospechoso por sí mismo. | | INVALIDO | Hay manifest y la validación falla: firma que no cuadra, contenido alterado tras firmar. | | SIN C2PA | No hay procedencia. No dice nada del origen: la mayoría del contenido del mundo está aquí. | | INDEFINIDO | No se pudo determinar, con el motivo. Nunca se reporta como SIN C2PA. |

Los códigos crudos de validación van siempre en la salida --json, sin interpretar, para que puedas comprobar el razonamiento.

Un detalle que cuesta ver: el estado depende de la lista de confianza, y esa lista es una foto de un momento. Todas las CAs del C2PA se crearon a partir de mayo de 2025, así que un archivo firmado antes de que la CA de su producto entrara en la lista sale NO CONFIADO por mucho que su firma sea impecable. Cada informe registra el SHA-256 de la lista usada, precisamente para poder explicar eso después.

Opciones

--json                 informes completos en JSON
--csv                  una fila por archivo, para hoja de cálculo
--fail-on=<umbral>     invalid | untrusted | indeterminate | absent | never
--anchors <fichero>    anchors propios en PEM en vez de la lista oficial
--fetch-remote         consultar manifests alojados en una URL
--no-metadata          no extraer metadatos

Códigos de salida

0 ningún archivo alcanzó el umbral · 1 al menos uno lo alcanzó · 2 error de ejecución.

Por defecto solo falla INVALIDO: SIN C2PA es el estado de casi todo el contenido que existe, y hacerlo fallar dejaría la herramienta inservible en CI. --fail-on=absent es el otro extremo: exige que todo sea de confianza.

# en un pipeline de ingesta
origin-detect verify ./entrantes --fail-on=untrusted

Sobre --fetch-remote

Desactivado por defecto a propósito. Consultar un manifest remoto revela a un tercero que estás verificando un archivo concreto; con material sin publicar eso es una fuga de información, no solo un riesgo técnico. Sin el flag, esos archivos salen como INDEFINIDO con la URL, para que decidas tú. Lo mismo con OCSP, que contactaría con la CA del firmante.

Archivos de texto

Un .txt, .md o .json no puede llevar C2PA, así que no se juzga su procedencia ni cuenta para el umbral. Se informa solo de caracteres Unicode invisibles, que rompen diffs, compiladores y buscadores — razón suficiente para saberlo — y que no prueban generación por IA.

Qué no hace

Escrito antes que el resto, a propósito.

  • No detecta SynthID. El patrón y el modelo detector de Google no son públicos, no hay especificación abierta y no está licenciado a terceros. Ninguna herramienta de terceros puede hacerlo, incluidas las que lo anuncian.
  • No detecta texto generado por IA. No hay clasificador. Los estudios de 2026 sitúan a esas herramientas entre el 61 % y el 69 % de acierto, con un rendimiento cercano a cero en texto híbrido, y sus falsos positivos ya han hecho daño a personas reales.
  • No atribuye proveedor cuando no hay C2PA. Con manifest, el generador viene escrito. Sin manifest no existe señal que permita atribuirlo, y aquí no se inventa ninguna.
  • No hay puntuación de riesgo agregada. Un 0.73 compuesto con pesos arbitrarios aparenta una precisión que no existe.
  • No modifica nada. Solo lectura sobre los archivos que analiza.
  • No sube nada a ningún sitio. Todo ocurre en tu máquina; la única salida de red posible es --fetch-remote, y hay que pedirla.

Formatos

image/jpeg, image/png, image/webp para procedencia. .txt, .md, .json para la heurística de texto.

TIFF queda fuera adrede: c2pa-rs sabe leerlo, pero no hemos medido su comportamiento lo suficiente para publicar un veredicto. Ampliar la lista exige un fixture nuevo con su veredicto comprobado.

Licencia

MIT © Adrián Campos Vargas — origin-detect.com