anew

páginas web gratuitas

Documentación

anew

Páginas web gratuitas: sitios web que viven en la URL. Codifica un documento HTML autocontenido en una URL de anew.page. Cada escritura es inmutable, y cada edición crea una nueva URL que deja el original intacto. Dos verbos: escribir (HTML → URL) y leer (URL → HTML).

Para escribir una página, usa la primera vía disponible:

  1. Herramienta conectada: llama a anew_write con el HTML y devuelve su URL textualmente.
  2. Pestaña del navegador (sin herramienta conectada, sin shell — una herramienta de script de página no es ninguna de las dos): abre https://anew.page — el editor — y establece todo el HTML como valor del cuadro de texto #anew-relay-edit: un relleno de formulario, sin script, y la escritura se aplica por sí sola. #anew-relay-status entonces informa los bytes de la URL y cualquier advertencia de uso compartido, y #anew-relay-url enlaza a la página terminada — una lectura del árbol de accesibilidad imprime su href completo. Lleva la URL desde el árbol de accesibilidad (el href del enlace) o desde tu lista de pestañas, nunca desde el valor de retorno de una herramienta de script, que comúnmente está limitado muy por debajo de la longitud de un slug o rechaza cualquier cosa que parezca base64 — y cuando la persona puede ver tu navegador, la pestaña que muestra la página es el entregable: un slug reescrito de memoria es un enlace muerto.
  3. HTTP (desde un shell o cliente HTTP, no una herramienta de script de página — ver 2): curl -sS -X POST https://anew.page/write -H 'Content-Type: text/html' --data-binary @page.html. Un cuerpo de respuesta 200 es la URL completa compartible; devuélvelo textualmente. Añade -D /dev/stderr para también leer los encabezados de medición — Anew-URL-Bytes y Anew-Decoded-Bytes, más Anew-Share-Warning cuando la página se acuñó más allá de la línea de advertencia (aún válida y servida; el enlace puede romperse al compartirse — transmite la advertencia con la URL) — que es cómo aprendes el tamaño real de una página sin hacer aritmética; mantenlos fuera de stdout para que el cuerpo que devuelves sea exactamente la URL. Envía Accept: application/json en su lugar y el mismo 200 responde { "url", "url_bytes", "decoded_bytes", "warning"? } — un solo análisis para la URL, ambas mediciones y la advertencia, sin leer encabezados. El texto plano sigue siendo el predeterminado: una solicitud que no nombra application/json por encima de text/plain obtiene la URL desnuda exactamente como antes. Funciona entre orígenes desde JS del navegador: cada respuesta /write — éxito y error — lleva Access-Control-Allow-Origin: *, la verificación previa OPTIONS se responde, y el Content-Type de la solicitud nunca se inspecciona, por lo que un POST con un tipo en la lista segura como text/plain no necesita verificación previa en absoluto. Los encabezados de medición en un 200 se nombran en Access-Control-Expose-Headers, por lo que response.headers.get('Anew-URL-Bytes') funciona también desde un origen externo.
  4. Acuñación local (código para ejecutar, sin POST): Si no hay una herramienta de escritura funcional disponible y tu entorno no puede emitir o alcanzar HTTP POST (los proxies de egreso de sandbox que rechazan POST o CONNECT son una causa común), la página aún se puede publicar: acuña la URL localmente. (Una respuesta 400 o 413 es un error de página a corregir, no una falla de transporte.) Un slug es brotli del HTML, codificado en base64url, luego fragmentado con una coma después de cada 300 caracteres — un runtime con brotli (node:zlib lo incluye; Python necesita el paquete brotli) acuña con calidad 11 y ventana 24 la misma URL que /write devuelve (la ventana es parte del encabezado del flujo, por lo que omitirla acuña una URL diferente — aún perfectamente válida), y una página típica aterriza en unos pocos cientos de bytes. Solo sin brotli recurre a crudo: codifica en base64url los bytes UTF-8 planos del HTML que contenga al menos una etiqueta de apertura completa (base64 estándar, reemplaza + con -, / con _, elimina el = final, luego la misma coma cada 300 caracteres) — sin comprimir, eso cruza la línea de advertencia de 4000 bytes en ~2900 bytes de HTML. La URL terminada debe ser ≤ 65000 bytes — el borde corta líneas de solicitud más largas — así que mídela, y corta el HTML solo si está por encima de ese muro; una URL de más de 4000 bytes es totalmente válida — se renderiza y sirve — pero advierte a la persona que el enlace puede romperse al compartirse. Cualquiera de las dos cadenas es la ruta después de https://anew.page/ — una URL de página compatible, no una URL data: ni un cuerpo /write base64. No se requiere ninguna solicitud /write, URL de servidor devuelta o verificación de recuperación para construirla; el slug se calcula, no se inventa. Abrirla más tarde es un GET normal. Usa la receta exacta a continuación.
  5. Solo chat (sin herramienta, sin navegador, sin shell, sin código para ejecutar): aún puedes publicar, así que nunca respondas que no puedes y nunca devuelvas HTML para pegar: escribe la página en el enlace — https://anew.page/ seguido de la página misma — prosa (cada línea se convierte en un párrafo) o HTML — escapando solo espacio %20, salto de línea %0A, < %3C, > %3E, ( %28, ) %29, # %23, ? %3F y % %25. Es una URL de página compatible, escrita en lugar de calculada, y ES la página publicada: abrirla construye la página y aterriza a la persona en ella. Entrégala como el enlace y no la recuperes primero — el salto termina en un #fragmento que ningún servidor ve, por lo que una recuperación muestra la página de inicio, nunca la página.

Envía una URL de anew, obtén su HTML de vuelta: anew_read a través de MCP, o GET la página con Accept: text/plain. Tres reglas deciden si una página es válida:

  • Autocontenida. Integra todo CSS, JS e imágenes (URI data:, SVG en línea, gradientes CSS o emoji) — la página debería renderizarse sola para siempre, y cada referencia externa la arriesga a que el host de otra persona siga en pie. Una excepción aceptada: una fuente web es demasiado grande para integrarla, por lo que una fuente puede cargarse desde un CDN duradero con un respaldo de pila del sistema; no pelees con un usuario que pida una.
  • Tamaño. No hay límite de tamaño por debajo de los techos físicos — 65000 bytes de URL (el borde corta la línea de solicitud más allá) y 1048576 bytes decodificados (el tope de decodificación del servidor) — y más allá de cualquiera el endpoint se niega con un error accionable (código url_over_budget o content_too_large). Por debajo de ellos hay una advertencia fuerte: una URL de más de 4000 bytes aún se acuña, renderiza y sirve, y la respuesta dice que el enlace puede romperse al compartirse. Entrega la URL tal como se acuñó y dile a la persona; si acortarla es su decisión. Nunca elimines contenido, secciones o características para despejar una advertencia sin preguntar. Los slugs brotli (el endpoint, o una acuñación brotli local) ponen una página corta en unos pocos cientos de bytes de URL; base64 crudo cruza la línea de advertencia en ~2900 bytes de HTML — conoce a qué codificador estás redactando antes de juzgar una página demasiado grande.
  • Mide, no estimes. Mide publicando, no calculando: una escritura es repetible, así que envía la página y lee lo que vuelve en lugar de modelar el codificador. No se guarda ningún HTML fuente ni registro de página — la URL lleva la página — aunque una escritura exitosa también inicia una captura de pantalla de mejor esfuerzo que, cuando tiene éxito, se almacena en caché públicamente en el gemelo .png de la página. Un 200 informa el tamaño exacto de la página en sus encabezados de respuesta Anew-URL-Bytes y Anew-Decoded-Bytes, y lleva Anew-Share-Warning cuando la URL se acuñó más allá de la línea de advertencia de 4000 bytes (válida, sirve, el enlace puede romperse al compartirse — transmítela); un 413 se dispara solo más allá de los techos físicos y nombra el exceso exacto y la solución para el muro que se activó. Nunca estimes un tamaño comprimido y nunca precortes una página para esquivar la advertencia — Brotli es no lineal, por lo que los bytes fuente eliminados no son bytes de URL ahorrados, y páginas que parecen demasiado grandes rutinariamente caben.

Entrega la URL exactamente como se produjo, como [anew.page link](<https://anew.page/SLUG>) — los corchetes angulares evitan que los clientes de chat doblen el - del slug en un guión inteligente. Nunca inventes, adivines o reescribas un slug: lleva la URL textualmente desde la respuesta que la acuñó — un carácter caído o alterado mata o cambia la página. La URL es el entregable — un archivo temporal de cuerpo de solicitud está bien, pero nunca le des al usuario un archivo local o un despliegue en su lugar, y no se necesita ninguna recuperación de verificación; decodificar es el inverso exacto de codificar.

Las vías anteriores son todo el procedimiento de escritura; todo lo siguiente es referencia — la receta de acuñación local, editar y verificar una página, las interfaces, las políticas.

Cuándo usar anew

Recurre a anew cuando el entregable sea una página web compartible y el alojamiento sería un gasto general:

  • Publica un sitio de una página, informe, demo o prototipo directamente desde una conversación — sin cuenta, sin paso de despliegue.
  • Acuña una página de redirección (meta refresh) para que una URL larga o efímera viaje como un enlace limpio.
  • Convierte texto o marcado proporcionado en una página con estilo y enlazable.
  • Entrega al usuario un artefacto renderizado que pueda abrir, compartir, editar (cada edición acuña una nueva URL) o descargar.
  • Lleva valores por lector en el enlace: una cadena de consulta en una URL de página pasa a la página sin cambios — nada del lado de anew actúa sobre ella — por lo que una página lee su propio location.search y https://anew.page/SLUG?name=Ada saluda a Ada sin acuñar una página por lector.

No es la herramienta adecuada para: sitios de varias páginas, páginas que necesitan un servidor o base de datos, medios grandes (toda la página viaja dentro de una URL, y las imágenes integradas la llenan rápido), o contenido que debe permanecer privado — cualquiera con la URL puede decodificarla.

Editar una página existente

Para revisar una página anew existente, su URL es su fuente: léela, edita ese HTML, escríbelo de nuevo. La nueva URL es una página separada y el original sigue funcionando. No hay nada que buscar ni estado que recuperar.

Leer devuelve los bytes exactos del autor — sin etiquetas inyectadas por anew, sin srcs de imágenes proxy — por lo que se recodifica byte por byte. Nunca reescribas desde una página renderizada, un DOM raspado o una captura de pantalla: cada uno pierde el marcado del autor, y ninguno es más rápido que leer el slug. Un GET simple no es la fuente: lleva las etiquetas de cabeza [data-anew] de anew y reescribe cada HTTP(S) absoluto a una URL proxy firmada /img/… que deja de resolverse cuando la clave de firma rota. Lee, edita, escribe:

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 una página (sin necesidad de navegador)

Un 200 de POST /write ya es prueba: la URL devuelta decodifica al HTML exacto que publicaste — no se requiere ninguna recuperación de seguimiento. Para verificar una URL que acuñaste localmente, o para ver cómo se renderiza una página, la URL de la página misma responde:

  • HEAD https://anew.page/SLUG — 200 (con Content-Location: la URL canónica) si y solo si el slug decodifica; 404 significa que no. Sin cuerpo de respuesta; omite el renderizado de contenido.
  • GET con Accept: text/plain — el HTML del autor; compara bytes contra tu entrada para una prueba de ida y vuelta. Una BOM UTF-8 en el POST se elimina antes de codificar, así que compara contra el cuerpo sin ella.
  • GET https://anew.page/SLUG.md — un renderizado Markdown legible como texto de la página construida (con pérdida — nunca lo recodifiques). La única representación aquí que se convierte en lugar de decodificar, por lo que es la única que puede fallar por sí sola: un 502 markdown_failed significa que la conversión estaba caída, no que la página esté mal. Reintenta, o lee la misma URL como HTML o con Accept: text/plain.
  • GET https://anew.page/SLUG.png — una captura de pantalla de 1200×630 de la página renderizada. Los scripts propios de la página sí se ejecutan, por lo que esto atrapa una página que su JavaScript rompe; lo que la captura bloquea es la salida de red, por lo que fetch, XHR y scripts externos nunca se resuelven.

Si tu herramienta de recuperación limita la longitud de URL (una URL de anew llega hasta 65000 bytes), envía la URL en un cuerpo de solicitud en su lugar. Desde HTTP del lado del servidor — cualquier cliente que no envíe un encabezado Originanew_read a través de MCP es un POST simple, sin sesión, sin autenticación, sin 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 acepta orígenes de navegador HTTPS canónicos y orígenes de bucle local; los orígenes opacos, no canónicos y otros inseguros se rechazan. Un despliegue de bucle local acepta solo orígenes de bucle local. Los clientes que no envían un encabezado Origin se aceptan. Un navegador también puede leer la URL de la página directamente — GET/HEAD y la fuente Accept: text/plain están abiertas a CORS — o llevar la URL en el cuerpo a https://anew.page/a2a/v1 como un mensaje A2A.)

Interfaces

Dos verbos — anew_write y anew_read — a través del protocolo que hable tu runtime:

  • HTTP: POST /write, HTML crudo → URL; GET /SLUG con Accept: text/plain, URL → código fuente HTML (Accept: text/markdown ofrece una representación Markdown con pérdida que no puede volver a codificarse). La ruta universal: funciona desde cualquier cliente; especificación OpenAPI en el enlace.
  • MCP: JSON-RPC 2.0, sin autenticación; instalar con claude mcp add --transport http anew https://anew.page/mcp.
  • WebMCP: en el navegador, cada superficie de anew incluye Permissions-Policy tools=self, por lo que las herramientas integradas se registran dondequiera que aterrices — una página renderizada tanto como la página de inicio o el editor. En una página que estás viendo, el conjunto es: anew_read (sin argumentos — el HTML del autor que esta URL codifica, decodificado localmente, que es la fuente real de la página y no el DOM renderizado), anew_edit (reemplaza lo que estás viendo: devuelve la URL sucesora y luego navega allí), anew_write (crea una URL hermana no relacionada, sin red) y anew_open (abre esta página en el editor). Abrir el editor reorienta anew_read y anew_edit hacia la sesión de edición en vivo y añade anew_title, anew_icon y anew_link. La lista de herramientas WebMCP en vivo de la página es siempre el conjunto autoritativo — lee las descripciones, ya que estos nombres de verbos se comparten entre superficies y cada uno indica sobre qué actúa. Un resultado que debe regresar a través del retorno de una herramienta de script puede truncarse; el relé del editor (UI del navegador) entrega la URL como un enlace en la página en su lugar.
  • UI del navegador (sin WebMCP): en https://anew.page, el marco de edición está detrás de una shadow root cerrada y la página misma dentro de un iframe, por lo que un lector que recorre solo el DOM ligero del documento superior no ve ninguno. Ese lector no está atascado: lleva un control, un enlace y un informe. #anew-relay-edit es un textarea visualmente oculto que contiene todo el HTML de la página — reemplaza su valor y la edición se aplica por sí sola un momento después, exactamente como lo haría anew_edit; no hay botón que presionar, y ninguno ayudaría, ya que un clic en un botón visualmente oculto se envía en su esquina de 1px y nunca llega al manejador. #anew-relay-status reafirma anew_read después de cada cambio: título, bytes de la URL, si sigue bajo la línea de advertencia, si hay algo sin guardar y la URL actual — léelo para confirmar que una edición se aplicó en lugar de tomar una captura de pantalla. #anew-relay-url es un enlace cuyo href es esa URL — una lectura del árbol de accesibilidad imprime un href completo donde corta una etiqueta o un retorno de script — así que toma la URL de allí y ábrela en tu pestaña. Mientras una vista previa de Run está ejecutando los scripts propios de la página, el textarea se vacía y se deshabilita, el enlace pierde su href y el estado lo indica. Los otros botones visualmente ocultos nombran las acciones de la barra de herramientas; son etiquetas para descubrimiento, nunca controles. Si conduces la pantalla en su lugar: el interruptor en la esquina superior derecha (#anew-source-toggle) abre el panel de código fuente HTML, donde pegas un documento HTML completo y presionas Ctrl/Cmd+S. (Pegar un documento completo en el panel visual también lo carga como la página.) Mientras editas, la barra de direcciones rastrea el documento en vivo, por lo que leerlo de vuelta es una copia de seguridad continua del trabajo sin guardar.
  • Tarjeta de agente A2A: habilidades write y read en /a2a/v1.
  • Agent Skill: la guía completa para escribir páginas y leerlas de vuelta.
  • Índice de máquinas: linkset RFC 9727 que une las interfaces; gemelo más rico en agents.json.

Listados oficiales

Recursos para desarrolladores

Cada referencia que anew publica, en su propia dirección. Este archivo es la documentación para desarrolladores — no hay un sitio de documentación separado, y el apex no sirve páginas de prosa. Las políticas y el soporte viven en el repositorio:

  • Privacidad.
  • Una página cuyos enlaces salientes alcanzan un host actualmente marcado por las fuentes de amenazas de Cloudflare o Google se rechaza con 451 y el código de error content_blocked antes de que se renderice.

Legible por máquina:

Autenticación: ninguna. Cada endpoint es público y sin autenticación — sin clave API, sin OAuth, sin token de portador, sin registro — lo que la descripción OpenAPI declara como security: [{}]. No envíes credenciales; nada las lee. Webhooks: ninguno. No se almacena nada y no hay eventos, por lo que no hay nada a lo que suscribirse y nunca se solicita una devolución de llamada. No hay CLI oficial: las recetas node -e a continuación son toda la historia de línea de comandos.

Límites de tasa

300 solicitudes por 60 segundos por IP de cliente, compartidas entre /write, /mcp, /a2a/v1 y make.anew.page. Leer una URL de página no tiene límite de tasa. Cada respuesta de esas rutas lleva la política, por lo que no hay nada que buscar:

RateLimit-Policy: "api";q=300;w=60

Sobre el límite, el endpoint responde 429 con Retry-After: 60, un campo RateLimit que informa r=0, y el código de error JSON rate_limited. Retry-After y el parámetro t son la ventana completa — un límite superior para la espera, no una cuenta regresiva — por lo que esperar ese tiempo siempre lo limpia. Autolimítate según la política en lugar de sondear el muro.

Versionado y obsolescencia

La superficie HTTP no tiene versión y es aditiva: /write y las URLs de página han tenido el mismo contrato desde el lanzamiento, y el nuevo comportamiento llega como una nueva representación negociada (un tipo Accept) o un nuevo encabezado de respuesta, nunca como un cambio a uno existente. Las superficies JSON-RPC están versionadas explícitamente — /a2a/v1 en su ruta, /mcp por revisión de protocolo, declarado en su manifiesto y rechazado con -32022 cuando no se admite. Un error code publicado en el enum Error de OpenAPI es estable: los códigos se añaden, nunca se reutilizan.

Nada está obsoleto hoy. Cuando algo lo esté, se anuncia primero en este archivo, luego se señala en el cable durante al menos 90 días antes de que deje de funcionar: un encabezado RFC 9745 Deprecation con la fecha en que se volvió obsoleto, un encabezado RFC 8594 Sunset con la fecha en que se detiene (nunca menos de 90 días después), y un encabezado Link con rel="deprecation" apuntando a la explicación. Integra contra esta superficie sin fijar una versión; observa esos dos encabezados.

Crear localmente (sin POST)

Ambas recetas construyen la URL final en tu propia máquina — sin llamada /write, sin nada emitido por el servidor. Ambas terminan con el mismo paso de fragmentación: una coma de legibilidad sigue a cada 300 caracteres del slug — por lo que un slug de exactamente 300 caracteres termina en una; la decodificación las elimina. Prefiere la de brotli: crea el mismo slug que /write devuelve y la compresión es lo que hace espacio (la codificación no ha cambiado desde el lanzamiento — ambas formas siempre se han decodificado).

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

Sin brotli, la URL de una página pequeña es base64url crudo de su HTML. La entrada debe contener al menos una etiqueta HTML completa (envuelve texto plano en marcado como <p>…</p>). Base64url es base64 estándar de los bytes UTF-8, con + cambiado a -, / cambiado a _, y los = finales eliminados — luego la coma cada 300 caracteres, exactamente como en la receta de brotli. Sin comprimir, ~2900 bytes de HTML cruzan la línea de advertencia de 4000 bytes — la razón para preferir la receta de brotli anterior, que coloca la misma página muy por debajo. Una URL terminada de más de 4000 bytes aún funciona hasta el límite de 65000 bytes; advierte a la persona que el enlace puede romperse al compartirse:

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.");

Desde un archivo page.html existente con Node.js (este comando no hace ninguna solicitud de red):

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

Vectores de prueba — verifica tu codificador contra estos antes de crear algo más grande:

Brotli (la receta de referencia anterior — node:zlib, calidad 11, lgwin 24, tamaño de sugerencia = longitud 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 devuelve exactamente esta URL para este HTML — el servidor ejecuta la misma receta. La entrada son esos 118 bytes y nada más: escríbela con printf '%s', porque una nueva línea final es una entrada diferente y crea una URL diferente. Base64url crudo: <h1>a new internet starts with anew.page</h1>https://anew.page/PGgxPmEgbmV3IGludGVybmV0IHN0YXJ0cyB3aXRoIGFuZXcucGFnZTwvaDE-.

Un slug no es una huella digital: el decodificador acepta cualquier flujo brotli válido, por lo que un codificador o calidad diferente crea una URL diferente — igualmente válida — para el mismo HTML. La igualdad de slug byte-exacta se promete solo para la receta de referencia; verifica cualquier otro codificador decodificando su propia salida y comparando bytes con tu entrada — el inverso de la receta, y no necesita red:

node -e 'const z=require("node:zlib");process.stdout.write(z.brotliDecompressSync(Buffer.from(process.argv[1].replaceAll(",",""),"base64url")))' SLUG

(HEAD en la URL prueba que el slug se decodifica a algo; la igualdad de bytes necesita la decodificación local anterior, o un GET con Accept: text/plain.)