← Proyectos

Reddit Archive

Extensión de Chrome que recupera, desde el archivo público de Arctic Shift, los posts y comentarios borrados o editados de Reddit y los muestra dentro de la propia página, siempre marcados como archivados. Perfiles, posts con su árbol de comentarios, estadísticas por subreddit y exportación de toda la actividad de un usuario a JSON, Markdown o CSV. No pide nada hasta que pulsas el botón.

El panel de Reddit Archive sobre un perfil de demostración con una cuenta eliminada, mostrando sus publicaciones archivadas
Una publicación borrada recuperada del archivo, con su árbol de comentarios debajoLa pestaña de estadísticas con los subreddits más activos, los flairs del autor y un gráfico de actividad por mesesEl menú Exportar con JSON, Markdown y CSV, tanto para lo cargado como para cargar todo y exportar
endpoints de Arctic Shift
11
endpoints de Arctic Shift
formatos de exportación
3
formatos de exportación
idiomas
3
idiomas
tests (Vitest y Playwright)
494
tests (Vitest y Playwright)

Qué hace

  • Lo borrado, de vuelta. En el perfil de cualquier usuario, un botón trae sus publicaciones y comentarios del archivo de Arctic Shift, incluidos los que ya no están en Reddit o los que se editaron después.
  • Posts completos. En la página de un post borrado muestra el título y el texto originales y, si quieres, todo el árbol de comentarios. También funciona con los enlaces cortos /s/ de la app.
  • Exportar a un usuario. Lo cargado o toda la actividad del usuario, página a página, a JSON, Markdown o CSV. Un post con sus comentarios se descarga o se copia en JSON.
  • Buscar y filtrar. Búsqueda en el texto, filtros por subreddit y fechas, y orden por más recientes, más antiguos o puntuación.
  • Estadísticas. Subreddits donde más participa, sus flairs en cada uno y un gráfico de actividad por día, semana, mes o año. Al pasar por encima de un subreddit, su descripción, suscriptores y normas.
  • Sin confusiones. Todo lo que viene del archivo va en un panel propio con la etiqueta "Archivado" y la fuente. Lo nativo de Reddit no se toca. Si la cuenta está eliminada o suspendida, lo avisa.
  • Solo cuando lo pides. No hace ninguna petición al archivo hasta que pulsas Ver archivo, salvo que actives la carga automática. Sin telemetría ni servidores propios. Español, inglés y chino.

Cómo está hecho

Un cliente para una API que no controlas

Toda la información sale de Arctic Shift, un archivo público de Reddit. Cada respuesta se valida antes de usarla: primero la forma del sobre, luego cada elemento, y después Zod la normaliza a un modelo propio con la procedencia marcada. Los errores no se lanzan: son resultados tipados (http, timeout, schema, not_found…) que la interfaz traduce a un mensaje.

Background, caché en dos niveles y rate limit

Las búsquedas pasan del content script al service worker por mensajes. Hay una caché en memoria por pestaña y otra en chrome.storage.session con caducidad, que solo guarda respuestas correctas. El cliente lee las cabeceras de rate limit y, si quedan pocas peticiones, espera antes de lanzar la siguiente.

Un panel en Shadow DOM encima de una SPA

El panel es una app de Vue 3 montada en un shadow root encima del feed. Un MutationObserver lo vuelve a montar si Reddit repinta la página, y otro sigue su tema claro u oscuro.

Problemas que resolví

  • "Más antiguos" que no lo era. Ordenaba solo lo ya cargado, que eran las páginas más recientes. Ahora se pide al servidor en orden ascendente y se pagina hacia delante con un cursor.
  • Detectar cuentas borradas. El aviso buscaba palabras como "suspended" en el texto de la página y saltaba con cualquier comentario que las tuviera. Ahora se pregunta a Reddit por about.json.
  • HTML de terceros. El Markdown archivado se convierte con marked y se limpia con DOMPurify, quitando también los estilos, porque un position: fixed podía tapar la página entera.
  • CSV que se ejecuta. Un comentario que empieza por = se convierte en una fórmula al abrir el CSV en una hoja de cálculo. Las columnas de texto se protegen, pero no las numéricas, para no romper puntuaciones negativas.

Stack

WXTManifest V3Vue 3TypeScriptZodArctic Shift APIChrome StorageShadow DOMmarkedDOMPurifyVitesthappy-domPlaywrightESLintPrettier