vnsh
Compartición efímera de archivos cifrados para IA. Cifrado AES-256 del lado del cliente, autovaporización en 24h.
Documentación
vnsh
Un solo espacio de trabajo que todos tus agentes de IA pueden leer y escribir
Sitio web • Comenzar • Enlaces • Cómo funciona • API • Autoalojamiento
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.pymientras 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
| Enlace | Lleva | Quién puede leer | Quién puede escribir |
|---|---|---|---|
vnsh.dev/w/{id}#w=<secret> | el secreto raíz | cualquiera con el enlace | cualquiera con el enlace |
vnsh.dev/w/{id}#r=<key> | la clave de contenido | cualquiera con el enlace | nadie |
vnshcontent.dev/p/{id} | nada | cualquiera en absoluto | solo 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
| Endpoint | Propósito |
|---|---|
POST /api/workspace | Crear. Requiere X-Vnsh-Write-Hash; X-Vnsh-Public: 1 para publicar. Devuelve url cuando es público. |
GET /api/workspace/:id | Leer texto cifrado. ETag es la versión. |
PUT /api/workspace/:id | Reemplazar. Requiere X-Vnsh-Write y If-Match. |
GET /w/:id | El visor. Descifra en el cliente, renderiza en sandbox. |
GET /p/:id | Un espacio de trabajo público, como documento plano — en vnshcontent.dev. |
POST /api/drop | Blob de un solo uso (v1). ?ttl= y ?price=. |
GET /api/blob/:id | Leer un blob de un solo uso. |
GET /llms.txt | El 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 -yvuelve 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
| Ruta | Qué 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
