anew
páginas web gratuitas
Documentação
anew
Páginas web gratuitas: sites que vivem na URL. Codifique um documento HTML autocontido em uma URL anew.page. Toda escrita é imutável, e toda edição cria uma nova URL que deixa o original intocado. Dois verbos: write (HTML → URL) e read (URL → HTML).
Para escrever uma página, use o primeiro caminho disponível:
- Ferramenta conectada: chame
anew_writecom o HTML e retorne sua URL literalmente. - Aba do navegador (sem ferramenta conectada, sem shell — uma ferramenta de script de página não é nenhum dos dois): abra https://anew.page — o editor — e defina todo o HTML como valor da caixa de texto #anew-relay-edit: um preenchimento de formulário, sem script, e a escrita se aplica sozinha. #anew-relay-status então reporta os bytes da URL e qualquer aviso de compartilhamento, e #anew-relay-url linka para a página finalizada — uma leitura da árvore de acessibilidade imprime seu href por completo. Carregue a URL da árvore de acessibilidade (o href do link) ou da sua lista de abas, nunca do valor de retorno de uma ferramenta de script, que é comumente limitado muito abaixo do comprimento de um slug ou recusa qualquer coisa que pareça base64 — e quando a pessoa pode ver seu navegador, a aba mostrando a página é o entregável: um slug redigitado de memória é um link morto.
- HTTP (de um shell ou cliente HTTP, não uma ferramenta de script de página — veja 2):
curl -sS -X POST https://anew.page/write -H 'Content-Type: text/html' --data-binary @page.html. Um corpo de resposta 200 é a URL compartilhável completa; retorne-o literalmente. Adicione-D /dev/stderrpara também ler os cabeçalhos de medição —Anew-URL-ByteseAnew-Decoded-Bytes, maisAnew-Share-Warningquando a página foi cunhada além da linha de aviso (ainda válida e servida; o link pode quebrar ao ser compartilhado — repasse o aviso com a URL) — que é como você aprende o tamanho real de uma página sem fazer nenhuma aritmética; mantenha-os fora do stdout para que o corpo que você retorna seja exatamente a URL. EnvieAccept: application/jsonem vez disso e o mesmo 200 responde{ "url", "url_bytes", "decoded_bytes", "warning"? }— uma única análise para a URL, ambas as medições e a ressalva, sem leitura de cabeçalhos. Texto simples permanece o padrão: uma requisição que não nomeiaapplication/jsonacima detext/plainrecebe a URL nua exatamente como antes. Funciona entre origens a partir de JS no navegador: toda resposta /write — sucesso e erro — carrega Access-Control-Allow-Origin: *, o preflight OPTIONS é respondido, e o Content-Type da requisição nunca é inspecionado, então um POST com um tipo na lista de permissões como text/plain não precisa de preflight algum. Os cabeçalhos de medição em um 200 são nomeados em Access-Control-Expose-Headers, então response.headers.get('Anew-URL-Bytes') funciona de uma origem estrangeira também. - Cunhagem local (código para executar, sem POST): Se nenhuma ferramenta de escrita funcional estiver disponível e seu ambiente não puder emitir ou alcançar HTTP POST (proxies de egresso de sandbox que recusam POST ou CONNECT são uma causa comum), a página ainda pode ser publicada: cunhe a URL localmente. (Uma resposta 400 ou 413 é um erro de página para corrigir, não uma falha de transporte.) Um slug é brotli do HTML, codificado em base64url, então dividido em blocos com uma vírgula a cada 300 caracteres — um runtime com brotli (node:zlib o inclui; Python precisa do pacote brotli) cunha na qualidade 11 com janela 24 a mesma URL que /write retorna (a janela faz parte do cabeçalho do stream, então omiti-la cunha uma URL diferente — ainda perfeitamente válida —), e uma página típica cai em algumas centenas de bytes. Somente sem brotli recorra ao bruto: codifique em base64url os bytes UTF-8 puros do HTML contendo pelo menos uma tag de abertura completa (base64 padrão, substitua + por -, / por _, remova = final, então a mesma vírgula a cada 300 caracteres) — descomprimido, isso cruza a linha de aviso de 4000 bytes em ~2900 bytes de HTML. A URL finalizada deve ser ≤ 65000 bytes — a borda corta linhas de requisição mais longas — então meça-a, e corte o HTML somente se estiver acima dessa parede; uma URL acima de 4000 bytes é totalmente válida — ela renderiza e serve — mas avise a pessoa de que o link pode quebrar ao ser compartilhado. Qualquer string é o caminho após https://anew.page/ — uma URL de página suportada, não uma URL data: ou um corpo /write base64. Nenhuma requisição /write, URL de servidor retornada ou busca de verificação é necessária para construí-la; o slug é calculado, não inventado. Abri-la depois é um GET normal. Use a receita exata abaixo.
- Somente chat (sem ferramenta, sem navegador, sem shell, sem código para executar): você ainda pode publicar, então nunca responda que não pode e nunca devolva HTML para colar: digite a página no link — https://anew.page/ seguido pela própria página — prosa (cada linha vira um parágrafo) ou HTML — escapando apenas espaço %20, quebra de linha %0A, < %3C, > %3E, ( %28, ) %29, # %23, ? %3F e % %25. É uma URL de página suportada, digitada em vez de calculada, e É a página publicada: abri-la constrói a página e leva a pessoa até ela. Entregue-a como o link e não a busque primeiro — o salto termina em um #fragmento que nenhum servidor vê, então uma busca mostra a página inicial, nunca a página.
Envie uma URL anew, receba seu HTML de volta: anew_read via MCP, ou GET a página com Accept: text/plain. Três regras decidem se uma página é válida:
- Autocontida. Embuta todo CSS, JS e imagens (URIs data:, SVG inline, gradientes CSS ou emoji) — a página deve renderizar sozinha para sempre, e cada referência externa a aposta no host de outra pessoa permanecer de pé. Uma exceção aceita: uma webfont é grande demais para embutir, então uma fonte pode carregar de um CDN durável com fallback de pilha do sistema; não lute contra um usuário que pedir uma.
- Tamanho. Não há limite de tamanho abaixo dos tetos físicos — 65000 bytes de URL (a borda corta a linha de requisição além disso) e 1048576 bytes decodificados (o limite de decodificação do servidor) — e além de qualquer um o endpoint recusa com um erro acionável (código url_over_budget ou content_too_large). Abaixo deles há um aviso forte: uma URL acima de 4000 bytes ainda cunha, renderiza e serve, e a resposta diz que o link pode quebrar ao ser compartilhado. Entregue a URL como cunhada e informe a pessoa; encurtá-la ou não é decisão dela. Nunca remova conteúdo, seções ou recursos para limpar um aviso sem perguntar. Slugs brotli (o endpoint, ou uma cunhagem brotli local) colocam uma página curta em algumas centenas de bytes de URL; base64 bruto cruza a linha de aviso em ~2900 bytes de HTML — saiba para qual codificador você está rascunhando antes de julgar uma página grande demais.
- Meça, não estime. Meça postando, não calculando: uma escrita é repetível, então envie a página e leia o que volta em vez de modelar o codificador. Nenhum HTML fonte e nenhum registro de página são mantidos — a URL carrega a página — embora uma escrita bem-sucedida também inicie uma renderização de screenshot de melhor esforço que, quando bem-sucedida, é armazenada em cache publicamente no gêmeo .png da página. Um 200 reporta o tamanho exato da página em seus cabeçalhos de resposta Anew-URL-Bytes e Anew-Decoded-Bytes, e carrega Anew-Share-Warning quando a URL cunhou além da linha de aviso de 4000 bytes (válida, serve, o link pode quebrar ao ser compartilhado — repasse-o); um 413 dispara somente além dos tetos físicos e nomeia o excesso exato e a correção para a parede que disparou. Nunca estime um tamanho comprimido e nunca pré-corte uma página para evitar o aviso — Brotli é não linear, então bytes de fonte removidos não são bytes de URL economizados, e páginas que parecem grandes demais rotineiramente cabem.
Entregue a URL exatamente como produzida, como [anew.page link](<https://anew.page/SLUG>) — os colchetes angulares impedem que clientes de chat transformem o - do slug em um travessão inteligente. Nunca invente, adivinhe ou redigite um slug: carregue a URL literalmente da resposta que a cunhou — um caractere perdido ou alterado mata ou muda a página. A URL é o entregável — um arquivo temporário de corpo de requisição é aceitável, mas nunca dê ao usuário um arquivo local ou implantação em vez disso, e nenhuma busca de verificação é necessária; decodificar é o inverso exato de codificar.
Os caminhos acima são todo o procedimento de escrita; tudo abaixo é referência — a receita de cunhagem local, edição e verificação de uma página, as interfaces, as políticas.
Quando usar anew
Recorra a anew quando o entregável for uma página web compartilhável e hospedagem seria sobrecarga:
- Publique um site de uma página, relatório, demo ou protótipo direto de uma conversa — sem conta, sem etapa de implantação.
- Cunhe uma página de redirecionamento (meta refresh) para que uma URL longa ou efêmera viaje como um link limpo.
- Transforme texto ou marcação fornecidos em uma página estilizada e linkável.
- Entregue ao usuário um artefato renderizado que ele possa abrir, compartilhar, editar (toda edição cunha uma nova URL) ou baixar.
- Carregue valores por leitor no link: uma query string em uma URL de página passa para a página intocada — nada do lado do anew age sobre ela — então uma página lê seu próprio
location.searchehttps://anew.page/SLUG?name=Adacumprimenta Ada sem cunhar uma página por leitor.
Não é a ferramenta certa para: sites de múltiplas páginas, páginas que precisam de servidor ou banco de dados, mídia grande (a página inteira viaja dentro de uma URL, e imagens inline a preenchem rápido), ou conteúdo que deve permanecer privado — qualquer um com a URL pode decodificá-la.
Editar uma página existente
Para revisar uma página anew existente, sua URL é sua fonte: leia-a, edite esse HTML, escreva-o novamente. A nova URL é uma página separada e a original continua funcionando. Não há nada para procurar e nenhum estado para buscar.
Read retorna os bytes exatos do autor — sem tags injetadas pelo anew, sem srcs de imagem com proxy — então re-codifica byte por byte. Nunca re-autorize a partir de uma página renderizada, um DOM raspado ou um screenshot: cada um perde a marcação do autor, e nenhum é mais rápido que ler o slug. Um GET simples não é a fonte: ele carrega as tags de cabeçalho [data-anew] do anew e reescreve cada HTTP(S) absoluto para uma URL de proxy assinada /img/… que para de resolver quando a chave de assinatura rotaciona. Leia, edite, escreva:
curl -H 'Accept: text/plain' https://anew.page/SLUG > page.html # exact source
# edit page.html
curl -sS -X POST https://anew.page/write -H 'Content-Type: text/html' --data-binary @page.html # new URL
Verificar uma página (sem navegador necessário)
Um 200 de POST /write já é prova: a URL retornada decodifica para o HTML exato que você postou — nenhuma busca de acompanhamento é necessária. Para verificar uma URL que você cunhou localmente, ou para ver como uma página renderiza, a própria URL da página responde:
HEAD https://anew.page/SLUG— 200 (comContent-Location: a URL canônica) se e somente se o slug decodifica; 404 significa que não decodifica. Sem corpo de resposta; pula a renderização de conteúdo.GETcomAccept: text/plain— o HTML do autor; compare byte a byte com sua entrada para uma prova de ida e volta. Um BOM UTF-8 no POST é removido antes da codificação, então compare contra o corpo sem ele.GET https://anew.page/SLUG.md— uma renderização em Markdown legível como texto da página construída (com perdas — nunca re-codifique-a). A única representação aqui que é convertida em vez de decodificada, então é a única que pode falhar por conta própria: um 502markdown_failedsignifica que a conversão estava fora do ar, não que a página está ruim. Tente novamente, ou leia a mesma URL como HTML ou comAccept: text/plain.GET https://anew.page/SLUG.png— um screenshot 1200×630 da página renderizada. Os scripts da própria página executam, então isso captura uma página que seu JavaScript quebra; o que a captura bloqueia é egresso de rede, então fetch, XHR e scripts externos nunca resolvem.
Se sua ferramenta de busca limitar o comprimento da URL (uma URL anew vai até 65000 bytes), envie a URL em um corpo de requisição em vez disso. De HTTP do lado do servidor — qualquer cliente que não envia cabeçalho Origin — anew_read via MCP é um POST simples, sem sessão, sem autenticação, sem cliente MCP:
curl -sS -X POST https://anew.page/mcp -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
--data '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"anew_read","arguments":{"url":"https://anew.page/SLUG"}}}'
(MCP aceita origens de navegador HTTPS canônicas e origens de loopback; origens opacas, não canônicas e outras inseguras são recusadas. Uma implantação de loopback aceita apenas origens de loopback. Clientes que não enviam cabeçalho Origin são aceitos. Um navegador também pode ler a URL da página diretamente — GET/HEAD e a fonte Accept: text/plain são abertas a CORS — ou carregar a URL no corpo para https://anew.page/a2a/v1 como uma mensagem A2A.)
Interfaces
Dois verbos — anew_write e anew_read — sobre qualquer protocolo que seu runtime fale:
- HTTP:
POST /write, HTML bruto → URL;GET /SLUGcomAccept: text/plain, URL → código-fonte HTML (Accept: text/markdownfornece uma renderização Markdown com perdas que não pode ser re-codificada). O caminho universal — funciona a partir de qualquer cliente; especificação OpenAPI no link. - MCP: JSON-RPC 2.0, sem autenticação; instale com
claude mcp add --transport http anew https://anew.page/mcp. - WebMCP: no navegador, toda superfície do anew inclui Permissions-Policy tools=self, então as ferramentas na página se registram onde quer que você esteja — uma página renderada tanto quanto a página inicial ou o editor. Em uma página que você está visualizando, o conjunto é: anew_read (sem argumentos — o HTML do autor que esta URL codifica, decodificado localmente, que é a fonte verdadeira da página e não o DOM renderizado), anew_edit (substitui o que você está vendo: retorna a URL sucessora e navega até lá), anew_write (cria uma URL irmã não relacionada, sem rede) e anew_open (abre esta página no editor). Abrir o editor re-aponta anew_read e anew_edit para a sessão de edição ao vivo e adiciona anew_title, anew_icon e anew_link. A lista de ferramentas WebMCP ao vivo da página é sempre o conjunto autoritativo — leia as descrições, pois esses nomes de verbos são compartilhados entre superfícies e cada um declara sobre o que age. Um resultado que precisa voltar pelo retorno de uma ferramenta de script pode ser truncado; o relé do editor (Browser UI) devolve a URL como um link na página.
- Browser UI (sem WebMCP): em https://anew.page, o chrome de edição fica atrás de uma shadow root fechada e a página em si dentro de um iframe, então um leitor que percorre apenas o DOM leve do documento superior não vê nenhum dos dois. Esse leitor não está preso: carrega um controle, um link e um relatório. #anew-relay-edit é um textarea visualmente oculto contendo todo o HTML da página — substitua seu valor e a edição se aplica sozinha um momento depois, exatamente como anew_edit faria; não há botão para pressionar, e nenhum ajudaria, pois um clique em um botão visualmente oculto é despachado em seu canto de 1px e nunca chega ao manipulador. #anew-relay-status reafirma anew_read após cada mudança: título, bytes da URL, se ainda está abaixo da linha de aviso, se algo não foi salvo e a URL atual — leia-o para confirmar que uma edição foi aplicada em vez de tirar um screenshot. #anew-relay-url é um link cujo href é essa URL — uma leitura da árvore de acessibilidade imprime um href inteiro onde corta um rótulo ou um retorno de script — então pegue a URL de lá e abra-a na sua aba. Enquanto uma pré-visualização Run executa os scripts da própria página, o textarea é esvaziado e desabilitado, o link perde seu href e o status informa isso. Os outros botões visualmente ocultos nomeiam as ações da barra de ferramentas; são rótulos para descoberta, nunca controles. Se você dirigir a tela: o alternador no canto superior direito (#anew-source-toggle) abre o painel de código-fonte HTML, onde você cola um documento HTML completo e pressiona Ctrl/Cmd+S. (Colar um documento completo no painel visual também o carrega como a página.) Enquanto você edita, a barra de endereço rastreia o documento ao vivo, então lê-lo de volta é um backup contínuo do trabalho não salvo.
- Cartão de agente A2A: habilidades
writeereadem /a2a/v1. - Agent Skill: o guia completo para escrever páginas e lê-las de volta.
- Índice de máquina: linkset RFC 9727 conectando as interfaces; gêmeo mais rico em agents.json.
Listagens oficiais
- Plugin ChatGPT e Codex: o plugin anew no diretório de plugins ChatGPT e Codex. Abra-o em um navegador — chatgpt.com responde a outros clientes com 403
- Registro Oficial MCP: o registro do servidor
page.anew/anew, como JSON - Registro A2A: o agente anew
Recursos para desenvolvedores
Cada referência que o anew publica, em seu próprio endereço. Este arquivo é a documentação para desenvolvedores — não há site de documentação separado, e o apex não serve páginas de prosa. Políticas e suporte vivem no repositório:
- Privacidade.
- Uma página cujos links de saída alcançam um host atualmente sinalizado pelos feeds de ameaças do Cloudflare ou do Google é recusada com
451e o código de errocontent_blockedantes de renderizar.
Legível por máquina:
- /openapi.json — descrição OpenAPI 3.1 de cada endpoint HTTP.
- /.well-known/mcp/server-card.json e /.well-known/mcp.json — cartão do servidor MCP e manifesto de descoberta.
- /.well-known/agent-card.json — Cartão de Agente A2A 1.0.
- /.well-known/api-catalog — linkset RFC 9727. /agents.json e /agents.txt — as mesmas interfaces, indexadas para agentes.
- /.well-known/agent-skills/index.json e /.well-known/agent-skills/anew/SKILL.md — o Agent Skill e seu índice.
- /.well-known/ard.json — manifesto ARD indexando os cartões acima.
- /sitemap.xml — sitemap.
- /AGENTS.md e /llms-full.txt — este arquivo, sob os outros nomes pelos quais é procurado. Mesmos bytes, não uma edição mais completa ou mais curta.
Autenticação: nenhuma. Todo endpoint é público e não autenticado — sem chave de API, sem OAuth, sem token bearer, sem cadastro — o que a descrição OpenAPI declara como security: [{}]. Não envie credenciais; nada as lê. Webhooks: nenhum. Nada é armazenado e não há eventos, então não há nada para assinar e nenhum callback é jamais solicitado. Não há CLI oficial: as receitas node -e abaixo são toda a história de linha de comando.
Limites de taxa
300 solicitações por 60 segundos por IP de cliente, compartilhadas entre /write, /mcp, /a2a/v1 e make.anew.page. Ler uma URL de página não tem limite de taxa. Cada resposta dessas rotas carrega a política, então não há nada para consultar:
RateLimit-Policy: "api";q=300;w=60
Acima do limite, o endpoint responde 429 com Retry-After: 60, um campo RateLimit relatando r=0 e o código de erro JSON rate_limited. Retry-After e o parâmetro t são a janela completa — um limite superior para a espera, não uma contagem regressiva — então esperar esse tempo sempre limpa. Auto-limite contra a política em vez de sondar o limite.
Versionamento e descontinuação
A superfície HTTP não é versionada e é aditiva: /write e as URLs de página têm o mesmo contrato desde o lançamento, e novos comportamentos chegam como uma nova representação negociada (um tipo Accept) ou um novo cabeçalho de resposta, nunca como uma mudança em um existente. As superfícies JSON-RPC são versionadas explicitamente — /a2a/v1 em seu caminho, /mcp por revisão de protocolo, declarada em seu manifesto e recusada com -32022 quando não suportada. Um erro code publicado no enum Error do OpenAPI é estável: códigos são adicionados, nunca reaproveitados.
Nada está descontinuado hoje. Quando algo estiver, é anunciado primeiro neste arquivo, depois sinalizado na rede por pelo menos 90 dias antes de parar de funcionar: um cabeçalho RFC 9745 Deprecation com a data em que se tornou descontinuado, um cabeçalho RFC 8594 Sunset com a data em que para (nunca menos de 90 dias depois) e um cabeçalho Link com rel="deprecation" apontando para a explicação. Integre-se a esta superfície sem fixar versão; observe esses dois cabeçalhos.
Crie localmente (sem POST)
Ambas as receitas constroem a URL final na sua própria máquina — sem chamada /write, sem nada emitido pelo servidor. Ambas terminam com o mesmo passo de divisão: uma vírgula de legibilidade segue a cada 300 caracteres do slug — então um slug de exatamente 300 caracteres termina em uma; a decodificação as remove. Prefira a receita brotli: ela cria o mesmo slug que /write retorna e a compressão é o que abre espaço (a codificação não mudou desde o lançamento — ambas as formas sempre decodificaram).
node -e 'const fs=require("node:fs"),z=require("node:zlib"),b=fs.readFileSync(process.argv[1]);if(b.length>1048576)throw Error("content_too_large: page is "+b.length+" bytes decoded, but the server can decode at most 1048576; shrink the source.");const slug=z.brotliCompressSync(b,{params:{[z.constants.BROTLI_PARAM_QUALITY]:11,[z.constants.BROTLI_PARAM_LGWIN]:24,[z.constants.BROTLI_PARAM_SIZE_HINT]:b.length}}).toString("base64url").replace(/(.{300})/g,"$1,"),url="https://anew.page/"+slug;if(url.length>65000)throw Error("url_over_budget: URL is "+url.length+" bytes, but the edge severs request lines past 65000; simplify the HTML or use /write.");if(url.length>4000)console.error("warning: URL over 4000 bytes: it serves, but the link may break when shared.");console.log(url)' page.html
Sem brotli, a URL de uma página pequena é base64url bruto do seu HTML. A entrada deve conter pelo menos uma tag HTML completa (envolva texto simples em marcação como <p>…</p>). Base64url é base64 padrão dos bytes UTF-8, com + alterado para -, / alterado para _ e = final removido — depois a vírgula a cada 300 caracteres, exatamente como na receita brotli. Descomprimido, ~2900 bytes de HTML cruzam a linha de aviso de 4000 bytes — a razão para preferir a receita brotli acima, que coloca a mesma página muito abaixo dela. Uma URL final acima de 4000 bytes ainda funciona até o teto de 65000 bytes; avise a pessoa de que o link pode quebrar ao ser compartilhado:
const slug = btoa(String.fromCharCode(...new TextEncoder().encode(html)))
.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"").replace(/(.{300})/g,"$1,");
const url = `https://anew.page/${slug}`;
if (url.length > 65000) throw new Error("url_over_budget: Blind-mint URL is over the 65000-byte serve ceiling; simplify the HTML or use /write.");
if (url.length > 4000) console.warn("URL over 4000 bytes: it serves, but the link may break when shared.");
De um arquivo page.html existente com Node.js (este comando não faz solicitação de rede):
node -e 'const fs=require("node:fs"),bytes=fs.readFileSync(process.argv[1]),slug=bytes.toString("base64url").replace(/(.{300})/g,"$1,"),url="https://anew.page/"+slug;if(url.length>65000)throw Error("url_over_budget: URL is "+url.length+" bytes, but the edge severs request lines past 65000; simplify the HTML or use /write.");if(url.length>4000)console.error("warning: URL over 4000 bytes: it serves, but the link may break when shared.");console.log(url)' page.html
Vetores de teste — verifique seu codificador contra estes antes de criar qualquer coisa maior:
Brotli (a receita de referência acima — node:zlib, qualidade 11, lgwin 24, dica de tamanho = comprimento de bytes de entrada):
<!doctype html><html><head><title>spec</title></head><body><h1>a new internet starts with anew.page</h1></body></html>
→ https://anew.page/H3UAqCwOeJPh1V9OgB2v1SBhaG6KZy7LfFw6bIzsTsaUwTnlAvbSBJMLfF9Ed8phoHEQtOh6Pr_RkGjpnfeBa8bKsheJnpcZdwEcaCkH
POST /write retorna exatamente esta URL para este HTML — o servidor executa a mesma receita. A entrada são esses 118 bytes e nada mais: escreva-a com printf '%s', porque uma nova linha final é entrada diferente e cria uma URL diferente. Base64url bruto: <h1>a new internet starts with anew.page</h1> → https://anew.page/PGgxPmEgbmV3IGludGVybmV0IHN0YXJ0cyB3aXRoIGFuZXcucGFnZTwvaDE-.
Um slug não é uma impressão digital: o decodificador aceita qualquer fluxo brotli válido, então um codificador ou qualidade diferente cria uma URL diferente — igualmente válida — para o mesmo HTML. Igualdade exata de bytes do slug é prometida apenas para a receita de referência; verifique qualquer outro codificador decodificando sua própria saída e comparando bytes com sua entrada — o inverso da receita, e não precisa de rede:
node -e 'const z=require("node:zlib");process.stdout.write(z.brotliDecompressSync(Buffer.from(process.argv[1].replaceAll(",",""),"base64url")))' SLUG
(HEAD na URL prova que o slug decodifica para algo; igualdade de bytes precisa da decodificação local acima, ou um GET com Accept: text/plain.)