vnsh

Compartición efímera de archivos cifrados para IA. Cifrado AES-256 del lado del cliente, autovaporización en 24h.

Documentación

vnsh logo

vnsh

Un solo espacio de trabajo que todos tus agentes de IA pueden leer y escribir

Build Status npm vnsh npm vnsh-mcp GitHub Action License

Sitio web • Comenzar • Enlaces • Cómo funciona • API • Autoalojamiento

A vnsh workspace: an incident report shared as one link, rendered from markdown, editable by any agent holding it


Ahora mismo pegas el mismo contexto en Claude Code, luego en Cursor, luego en Slack.

vnsh le da a ese contexto una única dirección. Pégalo una vez y obtén un enlace; cada agente y cada persona a quien se lo entregues abre el mismo documento vivo, y puede modificarlo. Cifrado en tu navegador antes de subirlo, así que vnsh nunca lo ve, y eliminado 24 horas después de la última edición.

kubectl logs pod/app | vn
# https://vnsh.dev/w/k2p9xf...#w=...   edit link — read and write
# https://vnsh.dev/w/k2p9xf...#r=...   view-only — read, never write

Por qué esto y no un pastebin

Un pastebin te da una instantánea. Un espacio de trabajo tiene una dirección estable y una versión, así que el siguiente agente escribe de vuelta en el mismo lugar en lugar de empezar uno nuevo. Dos propiedades hacen que sea seguro compartirlo:

  • El servidor no puede leerlo. El contenido se cifra en el cliente y la clave viaja en el fragmento de la URL, que HTTP nunca transmite. Lo que el servidor almacena es texto cifrado y un SHA-256 de un token de escritura — no el token. El nombre del archivo también está cifrado, con la misma clave, así que tu destinatario descarga analysis.py mientras vnsh guarda una cadena que no puede decodificar. Eso es comprobable desde fuera: falsifica un token y obtienes un 403.
  • Dos agentes no pueden sobrescribirse silenciosamente. Las escrituras son condicionales a la versión que leíste. Una escritura incondicional se rechaza por completo; una desactualizada recibe un 412 que te dice que vuelvas a leer y fusiones. Medido en producción con cinco escritores concurrentes: uno tuvo éxito, cuatro fueron notificados, nada se perdió.

Comenzar

Para un agente — el punto de la cosa

Pega esto en Claude Code, Cursor, OpenHands, Cline, Windsurf, Zed — cualquier cosa que hable MCP:

Set up vnsh workspaces — one link to hand work between people and agents: https://vnsh.dev/llms.txt

Lee el protocolo, instala el servidor MCP y escribe una regla permanente en su propio archivo de instrucciones para que siga usando espacios de trabajo después. A mano en su lugar:

claude mcp add vnsh -- npx -y vnsh-mcp@1.9.0

El servidor expone vnsh_artifact_create, vnsh_artifact_list, vnsh_artifact_read, vnsh_artifact_update, vnsh_workspace_create, vnsh_workspace_read, vnsh_workspace_update, vnsh_workspace_history, vnsh_workspace_restore, vnsh_workspace_renew y vnsh_workspace_open, además de vnsh_share, vnsh_share_file y vnsh_read para contenido de un solo uso.

Desde la terminal

npx vnsh                      # or: npm i -g vnsh
                              # or: curl -sL vnsh.dev/i | sh   (one-shot links only)

vn ./report.html              # create a workspace from a file
git diff | vn                 # or from stdin
vn read "<any vnsh url>"      # read one back — workspace, public, or legacy blob
vn write "<edit url>" ./new   # replace the contents; refuses to clobber
vn history "<workspace url>"  # list the latest 20 retained versions
vn restore "<edit url>" 3     # restore v3 as a new latest version
vn init .                     # teach agents in this project to use vnsh

vn init añade una sección gestionada idempotente al archivo de instrucciones del agente del proyecto. Funciona entre proveedores de agentes y registra solo una dimensión anónima de "proyecto inicializado" cuando esa CLI luego crea un espacio de trabajo, para que el experimento pueda medirse sin recopilar un nombre de proyecto o ruta.

--public lo publica sin cifrar (ver abajo). --blob crea explícitamente un enlace de un solo uso. --ttl también funciona para espacios de trabajo, hasta 168 horas; las escrituras posteriores preservan esa vida útil, y vn renew puede extenderla sin una edición.

La función de shell sin dependencias de curl -sL vnsh.dev/i | sh maneja solo enlaces de un solo uso. Los espacios de trabajo necesitan HKDF-SHA256 y AES-256-GCM, y el openssl que viene con macOS es LibreSSL, que no tiene ninguno — entrega enlaces /w/ a npx vnsh cuando Node está disponible y lo dice claramente cuando no lo está.

Desde un navegador

https://vnsh.dev — suelta un archivo o pega, y obtén ambos enlaces. Nada se sube antes de estar cifrado.

Desde CI

upload-to-vnsh sube la salida de compilación o los registros de pruebas fallidas e imprime un enlace en el resumen del trabajo.

Desde Chrome

La extensión previsualiza enlaces vnsh en línea en GitHub, Slack y Discord, y agrupa una captura de pantalla, errores de consola y la URL de la página en un solo enlace con ⌘D.

Los tres tipos de enlace

EnlaceLlevaQuién puede leerQuién puede escribir
vnsh.dev/w/{id}#w=<secret>el secreto raízcualquiera con el enlacecualquiera con el enlace
vnsh.dev/w/{id}#r=<key>la clave de contenidocualquiera con el enlacenadie
vnshcontent.dev/p/{id}nadacualquiera en absolutosolo el enlace #w= del autor

El nivel de solo lectura no es una configuración que el servidor imponga — es aritmética. La clave de contenido es HKDF(secret, "vnsh/enc/v2"), una derivación unidireccional, así que su titular puede descifrar cada versión sin poder recuperar el secreto y por lo tanto sin poder derivar un token de escritura.

Los espacios de trabajo públicos existen porque una persona que abre un enlace tiene un navegador haciendo el descifrado por ella, y el fetch de un agente no. Un espacio de trabajo público se almacena como se escribió y se sirve como un documento ordinario, así que cualquier cosa que hable HTTP puede leerlo sin clave y sin configuración. El intercambio se indica donde lo eliges: vnsh puede leer un espacio de trabajo público. Nunca es el predeterminado y nunca se infiere, su visibilidad se fija en la creación, y cambiarlo aún requiere el token de escritura.

Se sirven desde vnshcontent.dev, un dominio registrable separado, y eso no es cosmético. Un documento público es escrito por un extraño y renderizado como una página de nivel superior, mientras que los sistemas de reputación — Safe Browsing, pasarelas de correo, proxies corporativos — listan un dominio en lugar de una ruta. Una página abusiva en vnsh.dev derribaría la API, el sitio y cada CLI, servidor MCP y extensión instalados con ella. Un subdominio no ayudaría; la unidad es el dominio registrable. El sandboxing es un asunto separado y ya está manejado: un documento público se sirve con una directiva CSP sandbox, así que se carga en un origen opaco con sin cookies, sin almacenamiento, sin red y sin acceso a ninguna otra página. Los enlaces /w/ permanecen en vnsh.dev porque la clave en el fragmento es una puerta real — el servidor nunca ha visto su texto plano y un rastreador tampoco puede.

No armes una URL pública tú mismo. Crear una devuelve el enlace exacto en el campo url de la respuesta, que es también lo que mantiene funcionando una instancia autoalojada de un solo dominio.

Cómo funciona

you ──encrypt──▶ [ vnsh: ciphertext, no key ] ──decrypt──▶ agent / person
                              │
                    deleted 24h after the last write

Programa de claves

S = random(32)                        root secret, lives only in the fragment
K = HKDF-SHA256(S, "vnsh/enc/v2")     content key — AES-256-GCM
W = HKDF-SHA256(S, "vnsh/write/v2")   write token, sent as 64 hex chars
H = SHA-256(W)                        the only derived value the server stores

Los espacios de trabajo usan AES-256-GCM, no el AES-256-CBC de los blobs de un solo uso, porque el contenido mutable necesita integridad: sin una etiqueta de autenticación, cualquiera capaz de reescribir el almacenamiento — incluido el host — podría voltear bits de texto cifrado de manera indetectable, lo que vacía toda la garantía. Los nonces son aleatorios por escritura y se anteponen, nunca derivados de un número de versión.

El visor renderiza HTML y markdown en un marco con sandbox="allow-scripts" y deliberadamente sin allow-same-origin, así que el contenido se ejecuta en un origen opaco y no puede leer la clave de location.hash; un default-src 'none' inyectado elimina su acceso a la red.

Todo el protocolo está especificado en /llms.txt, incluida la creación, así que puedes implementarlo en cualquier lenguaje con una biblioteca criptográfica y no ejecutar ningún código vnsh. Alguien lo hizo, en unas 200 líneas.

API

EndpointPropósito
POST /api/workspaceCrear. Requiere X-Vnsh-Write-Hash; X-Vnsh-Public: 1 para publicar. Devuelve url cuando es público.
GET /api/workspace/:idLeer texto cifrado. ETag es la versión.
PUT /api/workspace/:idReemplazar. Requiere X-Vnsh-Write y If-Match.
GET /w/:idEl visor. Descifra en el cliente, renderiza en sandbox.
GET /p/:idUn espacio de trabajo público, como documento plano — en vnshcontent.dev.
POST /api/dropBlob de un solo uso (v1). ?ttl= y ?price=.
GET /api/blob/:idLeer un blob de un solo uso.
GET /llms.txtEl protocolo, escrito para agentes.

Las escrituras responden 428 sin If-Match, 412 en una versión desactualizada y 403 en un token de escritura malo. Referencia completa en docs/api.md.

Modelo de seguridad

Cuentas y artefactos permanentes

El intercambio anónimo sigue siendo sin cuenta y temporal. Inicia sesión en https://account.vnsh.dev con un enlace mágico para mantener los espacios de trabajo recién creados y las páginas /artifact/ hasta que los elimines. Las creaciones desde el navegador usan la sesión iniciada automáticamente. Para la CLI, ejecuta vn login y aprueba el dispositivo en tu navegador. MCP y CI pueden usar un token de cuenta en VNSH_TOKEN; el contenido sigue cifrado localmente para espacios de trabajo con enlace de capacidad, y la base de datos de la cuenta almacena solo sus metadatos de propiedad, no claves ni texto plano. Durante la vista previa gratuita, cada cuenta puede mantener 100 documentos y 1 GB en total, incluidas las versiones retenidas. Guarda el enlace devuelto: su fragmento es la única copia del secreto de descifrado/edición, así que la cuenta puede gestionar la retención y eliminación pero no puede recuperar una clave perdida.

Los Artefactos de cuenta de Fase 1 añaden un modo de colaboración separado: humanos autenticados y tokens de Agente pueden descubrir y versionar contenido de Artefacto privado sin llevar una clave de fragmento. Esa conveniencia tiene un límite de seguridad diferente— vnsh técnicamente puede leer el contenido de Artefactos de cuenta. Nunca se sustituye silenciosamente por un espacio de trabajo anónimo cifrado, y solo un humano puede aprobar o publicar por defecto.

vn login
vn artifact create report.md --title "Release report" --type report
vn artifact list --query release --status draft
vn artifact read <artifact-id>
vn artifact update <artifact-id> report.md --base-version 1 --change-summary "Verified production"

Añade --json a cualquier comando de Artefacto cuando otro programa o Agente consuma el resultado.

Qué se mantiene. vnsh no puede leer contenido cifrado, no puede escribir en él y no puede recuperar un token de escritura de nada que almacene. El contenido renderizado se ejecuta con sin acceso de mismo origen y sin red, así que un documento hostil no puede alcanzar la clave ni enviar nada a ningún lugar.

Qué no se mantiene.

  • Entregar un enlace a alguien le entrega la clave, incluido el proveedor de modelos de ese agente. El reloj de 24 horas es lo que limita esto, no el cifrado — y cada escritura lo reinicia, así que un espacio de trabajo editado a diario sigue vivo.
  • El límite es el cliente, no el transporte. Lo que cifra tiene tu texto plano primero, y tanto el servidor MCP como la CLI lo hacen. npx -y vuelve a buscar la última versión publicada en cada inicio; fíjalo (vnsh-mcp@1.9.0), instálalo globalmente una vez, o compílalo desde el código fuente si revisas lo que ejecutas.
  • Un espacio de trabajo público es legible por vnsh, por diseño. Ese es el nivel.
  • Los metadatos no son privados. Los tiempos, tamaños y direcciones existen para cualquier servicio alojado. Solo el contenido no lo es.

Autoalojamiento

Cloudflare Workers más un bucket R2. Sin base de datos, sin KV.

git clone https://github.com/raullenchai/vnsh.git
cd vnsh/worker && npm install
wrangler r2 bucket create vnsh-store
wrangler deploy

wrangler.toml vincula R2, dos limitadores de velocidad nativos y un conjunto de datos de Analytics Engine. Las versiones anteriores usaban un espacio de nombres KV para metadatos y contadores; se eliminó después de que el límite de escritura del nivel gratuito derribara todo el sitio, y nada lo necesita ahora — si estás siguiendo una guía más antigua que te dice que crees uno, no lo hagas. Ver docs/self-hosting.md.

Repositorio

RutaQué es
worker/Cloudflare Worker: API, visor, página de inicio, llms.txt
mcp/vnsh-mcp — el servidor MCP que usan los agentes
cli/npm/vnsh — el comando vn
cli/install.sh y la función de shell sin dependencias
extension/Extensión de Chrome
docs/Arquitectura, API, CLI, MCP, operaciones, autoalojamiento
docs/plans/Documentos de diseño, incluido el plan de espacio de trabajo v2
npm test                      # every package
cd worker && npm run dev      # local worker

Cuatro paquetes llevan su propia copia del programa de claves, porque se distribuyen de forma independiente. Cada uno está fijado a los mismos vectores de prueba: un enlace creado por uno que no se abrirá en otro se lee como corrupción en lugar de desviación de versión, por lo que el fallo sería silencioso. Si cambias una derivación, esas pruebas son lo que evita que eso ocurra silenciosamente.

Contribuciones

Las incidencias y las solicitudes de extracción son bienvenidas, incluidas las que nos dicen que estamos equivocados — la contribución más útil hasta ahora fue alguien que reimplementó el protocolo desde llms.txt e informó de todo lo que el documento no había dicho.

Comienza con CONTRIBUTING.md. Cubre las dos trampas en este código base que atrapan a todos: el código del lado del cliente del trabajador vive dentro de un literal de plantilla, por lo que las barras invertidas deben duplicarse y una comilla invertida suelta termina la cadena a cien líneas de donde el compilador se queja.

¿Encontraste un problema de seguridad? Por favor, no abras una incidencia pública — SECURITY.md tiene el formulario privado y enumera lo que se afirma y lo que deliberadamente no se afirma.

Licencia

MIT — consulta LICENSE.

vnsh.dev · el protocolo · documentación · por qué está construido de esta manera