vnsh

Compartilhamento de arquivos criptografados efêmeros para IA. Criptografia AES-256 no lado do cliente, autovaporização em 24h.

Documentação

vnsh logo

vnsh

Um workspace para todos os seus agentes de IA lerem e escreverem

Build Status npm vnsh npm vnsh-mcp GitHub Action License

SiteComece agoraLinksComo funcionaAPISelf-Hosting

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


Agora você cola o mesmo contexto no Claude Code, depois no Cursor, depois no Slack.

O vnsh dá a esse contexto um único endereço. Cole uma vez e receba um link; cada agente e cada pessoa para quem você o enviar abre o mesmo documento vivo, e pode alterá-lo. Criptografado no seu navegador antes do upload, então o vnsh nunca o vê, e excluído 24 horas após a última edição.

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 que isso e não um pastebin

Um pastebin dá a você um instantâneo. Um workspace tem um endereço estável e uma versão, então o próximo agente escreve de volta no mesmo lugar em vez de começar um novo. Duas propriedades tornam isso seguro para compartilhar:

  • O servidor não pode lê-lo. O conteúdo é criptografado no lado do cliente e a chave viaja no fragmento da URL, que o HTTP nunca transmite. O que o servidor armazena é texto cifrado e um SHA-256 de um token de escrita — não o token. Isso é verificável de fora: forje um token e você recebe um 403.
  • Dois agentes não podem se sobrescrever silenciosamente. As escritas são condicionais à versão que você leu. Uma escrita incondicional é recusada de imediato; uma desatualizada recebe um 412 informando para você reler e mesclar. Medido em produção com cinco escritores concorrentes: um teve sucesso, quatro foram avisados, nada foi perdido.

Comece agora

Para um agente — o ponto central da coisa

Cole isso no Claude Code, Cursor, OpenHands, Cline, Windsurf, Zed — qualquer coisa que fale MCP:

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

Ele lê o protocolo, instala o servidor MCP e escreve uma regra permanente no próprio arquivo de instruções para continuar usando workspaces depois. À mão, em vez disso:

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

O servidor expõe 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 e vnsh_workspace_open, além de vnsh_share, vnsh_share_file e vnsh_read para conteúdo de uso único.

Pelo 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 adiciona uma seção gerenciada idempotente ao arquivo de instruções do agente do projeto. Funciona entre fornecedores de agentes e registra apenas uma dimensão anônima "projeto inicializado" quando esse CLI depois cria um workspace, para que o experimento possa ser medido sem coletar um nome de projeto ou caminho.

--public publica sem criptografia (veja abaixo). --blob cria explicitamente um link de uso único. --ttl também funciona para workspaces, até 168 horas; escritas subsequentes preservam essa vida útil, e vn renew pode estendê-la sem uma edição.

A função de shell sem dependências de curl -sL vnsh.dev/i | sh lida apenas com links de uso único. Workspaces precisam de HKDF-SHA256 e AES-256-GCM, e o openssl que acompanha o macOS é o LibreSSL, que não tem nenhum dos dois — ele entrega /w/ links para npx vnsh quando o Node está disponível e diz isso claramente quando não está.

Pelo navegador

https://vnsh.dev — solte um arquivo ou cole, e receba os dois links de volta. Nada é enviado antes de ser criptografado.

Pelo CI

upload-to-vnsh envia a saída de build ou logs de testes com falha e imprime um link no resumo do job.

Pelo Chrome

A extensão pré-visualiza links do vnsh inline no GitHub, Slack e Discord, e agrupa uma captura de tela, erros de console e a URL da página em um único link com ⌘D.

Os três tipos de link

LinkCarregaQuem pode lerQuem pode escrever
vnsh.dev/w/{id}#w=<secret>o segredo raizqualquer um com o linkqualquer um com o link
vnsh.dev/w/{id}#r=<key>a chave de conteúdoqualquer um com o linkninguém
vnshcontent.dev/p/{id}nadaqualquer pessoaapenas o link #w= do autor

O nível somente leitura não é uma configuração que o servidor impõe — é aritmética. A chave de conteúdo é HKDF(secret, "vnsh/enc/v2"), uma derivação de mão única, então seu detentor pode descriptografar cada versão sem conseguir recuperar o segredo e, portanto, sem conseguir derivar um token de escrita.

Workspaces públicos existem porque uma pessoa abrindo um link tem um navegador fazendo a descriptografia por ela, e o fetch de um agente não tem. Um workspace público é armazenado como escrito e servido como um documento comum, então qualquer coisa que fale HTTP pode lê-lo sem chave e sem configuração. A troca é declarada onde você a escolhe: o vnsh pode ler um workspace público. Nunca é o padrão e nunca é inferido, sua visibilidade é fixada na criação, e alterá-la ainda exige o token de escrita.

Eles são servidos de vnshcontent.dev, um domínio registrável separado, e isso não é cosmético. Um documento público é escrito por um estranho e renderizado como uma página de nível superior, enquanto sistemas de reputação — Safe Browsing, gateways de e-mail, proxies corporativos — listam um domínio em vez de um caminho. Uma página abusiva em vnsh.dev derrubaria a API, o site e cada CLI, servidor MCP e extensão instalados junto. Um subdomínio não ajudaria; a unidade é o domínio registrável. O sandboxing é uma questão separada e já tratada: um documento público é servido com uma diretiva CSP sandbox, então ele carrega em uma origem opaca com sem cookies, sem armazenamento, sem rede e sem acesso a qualquer outra página. Links /w/ permanecem em vnsh.dev porque a chave no fragmento é uma barreira real — o servidor nunca viu o texto simples deles e um rastreador também não pode.

Não monte uma URL pública você mesmo. Criar uma retorna o link exato no campo url da resposta, que também é o que mantém uma instância self-hosted de domínio único funcionando.

Como funciona

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

Agenda de chaves

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

Workspaces usam AES-256-GCM, não o AES-256-CBC de blobs de uso único, porque conteúdo mutável precisa de integridade: sem uma tag de autenticação, qualquer um capaz de reescrever o armazenamento — o host incluído — poderia alterar bits do texto cifrado de forma indetectável, o que esvazia toda a garantia. Nonces são aleatórios por escrita e prefixados, nunca derivados de um número de versão.

O visualizador renderiza HTML e markdown em um frame com sandbox="allow-scripts" e deliberadamente sem allow-same-origin, então o conteúdo roda em uma origem opaca e não pode ler a chave de location.hash; um default-src 'none' injetado remove seu acesso à rede.

Todo o protocolo é especificado em /llms.txt, criação incluída, então você pode implementá-lo em qualquer linguagem com uma biblioteca de criptografia e não rodar nenhum código do vnsh. Alguém fez, em cerca de 200 linhas.

API

EndpointPropósito
POST /api/workspaceCriar. Exige X-Vnsh-Write-Hash; X-Vnsh-Public: 1 para publicar. Retorna url quando público.
GET /api/workspace/:idLer texto cifrado. ETag é a versão.
PUT /api/workspace/:idSubstituir. Exige X-Vnsh-Write e If-Match.
GET /w/:idO visualizador. Descriptografa no lado do cliente, renderiza em sandbox.
GET /p/:idUm workspace público, como documento simples — em vnshcontent.dev.
POST /api/dropBlob de uso único (v1). ?ttl= e ?price=.
GET /api/blob/:idLer um blob de uso único.
GET /llms.txtO protocolo, escrito para agentes.

Escritas respondem 428 sem If-Match, 412 em uma versão desatualizada e 403 em um token de escrita ruim. Referência completa em docs/api.md.

Modelo de segurança

Contas e artefatos permanentes

Compartilhamento anônimo permanece sem conta e temporário. Entre em https://account.vnsh.dev com um link mágico para manter workspaces recém-criados e páginas /artifact/ até você excluí-los. Criações no navegador usam a sessão conectada automaticamente. Para o CLI, execute vn login e aprove o dispositivo no seu navegador. MCP e CI podem usar um token de conta em VNSH_TOKEN; o conteúdo ainda é criptografado localmente para workspaces de link de capacidade, e o banco de dados da conta armazena apenas seus metadados de propriedade, não chaves ou texto simples. Durante a pré-visualização gratuita, cada conta pode manter 100 documentos e 1 GB no total, incluindo versões retidas. Guarde o link retornado: seu fragmento é a única cópia do segredo de descriptografia/edição, então a conta pode gerenciar retenção e exclusão, mas não pode recuperar uma chave perdida.

Artefatos de conta da Fase 1 adicionam um modo de colaboração separado: humanos autenticados e tokens de Agente podem descobrir e versionar conteúdo privado de Artefato sem carregar uma chave de fragmento. Essa conveniência tem um limite de segurança diferente — o vnsh pode tecnicamente ler o conteúdo de Artefatos de conta. Nunca é substituído silenciosamente por um workspace criptografado anônimo, e apenas um humano pode aprovar ou publicar por padrão.

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"

Adicione --json a qualquer comando de Artefato quando outro programa ou Agente consumir o resultado.

O que se sustenta. O vnsh não pode ler conteúdo criptografado, não pode escrever nele e não pode recuperar um token de escrita de nada que armazena. Conteúdo renderizado roda com sem acesso de mesma origem e sem rede, então um documento hostil não pode alcançar a chave nem enviar nada para lugar nenhum.

O que não se sustenta.

  • Entregar um link a alguém entrega a chave, incluindo o provedor de modelo desse agente. O relógio de 24 horas é o que limita isso, não a criptografia — e cada escrita o reinicia, então um workspace editado diariamente permanece vivo.
  • O limite é o cliente, não o transporte. O que criptografa detém seu texto simples primeiro, e tanto o servidor MCP quanto o CLI fazem isso. npx -y busca novamente a versão publicada mais recente a cada início; fixe-a (vnsh-mcp@1.8.2), instale-a globalmente uma vez, ou compile a partir do código-fonte se você revisar o que executa.
  • Um workspace público é legível pelo vnsh, por design. Esse é o nível.
  • Metadados não são privados. Horários, tamanhos e endereços existem para qualquer serviço hospedado. Apenas o conteúdo não é.

Self-hosting

Cloudflare Workers mais um bucket R2. Sem banco de dados, sem 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, dois limitadores de taxa nativos e um conjunto de dados do Analytics Engine. Versões anteriores usavam um namespace KV para metadados e contadores; foi removido depois que o limite de escrita do nível gratuito derrubou o site inteiro, e nada precisa disso agora — se você está seguindo um guia mais antigo que manda criar um, não precisa. Veja docs/self-hosting.md.

Repositório

CaminhoO que é
worker/Cloudflare Worker: API, visualizador, página inicial, llms.txt
mcp/vnsh-mcp — o servidor MCP que os agentes usam
cli/npm/vnsh — o comando vn
cli/install.sh e a função de shell sem dependências
extension/Extensão do Chrome
docs/Arquitetura, API, CLI, MCP, operações, self-hosting
docs/plans/Documentos de design, incluindo o plano do workspace v2
npm test                      # every package
cd worker && npm run dev      # local worker

Quatro pacotes carregam sua própria cópia da agenda de chaves, porque são distribuídos independentemente. Cada um é fixado aos mesmos vetores de teste: um link feito por um que não abrirá em outro é lido como corrupção em vez de divergência de versão, então a falha seria silenciosa. Se você mudar uma derivação, esses testes são o que impede que isso aconteça silenciosamente.

Contribuindo

Issues e pull requests são bem-vindos, inclusive aqueles que nos dizem que estamos errados — a contribuição mais útil até agora foi alguém reimplementando o protocolo a partir de llms.txt e relatando tudo o que o documento deixou de dizer.

Comece por CONTRIBUTING.md. Ele cobre as duas armadilhas neste codebase que pegam todo mundo: o código do lado do cliente do worker vive dentro de um template literal, então barras invertidas devem ser duplicadas e um backtick perdido encerra a string cem linhas antes de onde o compilador reclama.

Encontrou um problema de segurança? Por favor, não abra uma issue pública — SECURITY.md tem o formulário privado e lista o que é declarado e o que deliberadamente não é.

Licença

MIT — veja LICENSE.

vnsh.dev · o protocolo · docs · por que é construído assim