Código abierto · MIT · Sin dependencias Open source · MIT · Zero dependencies

Leé Markdown sin subirlo a ningún lado. Read Markdown without uploading it anywhere.

Los modelos escriben Markdown. Vos lo copiás, lo pegás, lo compartís — y para leerlo bien, casi siempre terminás subiéndolo a algún lado. Esta herramienta lo resuelve dentro de tu navegador: nada sale de tu equipo, no hay servidor detrás, y funciona con el wifi apagado. Language models write Markdown. You copy it, paste it, pass it around — and to actually read it, you usually end up uploading it somewhere. This does it inside your browser instead: nothing leaves your device, there is no server behind it, and it works with the wifi off.

No hay registro, ni instalación, ni nada que aceptar. Abrís el link y anda. No sign-up, no install, nothing to accept. Open the link and it works.

Por qué Why

Markdown se volvió el formato en el que la IA nos devuelve todo: informes, análisis, documentación, actas de reunión. Es texto plano, se lee más o menos en crudo, y por eso nadie se preocupa demasiado por dónde termina. Markdown has become the format AI hands everything back in: reports, analyses, documentation, meeting notes. It is plain text, it reads well enough raw, and so nobody thinks very hard about where it ends up.

Pero cuando querés leerlo bien — con sus tablas, su código resaltado, sus diagramas — la opción cómoda suele ser pegarlo en un visor online. Y ahí ese texto, que muchas veces es de tu trabajo o de tu cliente, pasó a estar en el servidor de otro. Nadie lo decidió; simplemente era el camino de menor fricción. But when you want to read it properly — with its tables, its highlighted code, its diagrams — the convenient option is usually to paste it into an online viewer. And at that point the text, which is often your employer's or your client's, is on somebody else's server. Nobody decided that; it was just the path of least friction.

Esto es el mismo camino de menor fricción, sin esa parte. This is that same path, without that part.

Qué hace What it does

Lee de verdadReads properly

CommonMark y las extensiones de GitHub: tablas, listas de tareas, notas al pie, avisos. Resaltado de sintaxis para unos 40 lenguajes. Índice lateral, progreso de lectura, tipografía ajustable. CommonMark plus the GitHub extensions: tables, task lists, footnotes, callouts. Syntax highlighting for around 40 languages. Outline sidebar, reading progress, adjustable typography.

Dibuja diagramasDraws diagrams

Los bloques mermaid se convierten en SVG, con layout por capas y reducción de cruces. Sin CDN y sin la librería de 2 MB: el renderizador está escrito acá. mermaid blocks become SVG, with layered layout and crossing reduction. No CDN and no 2 MB library: the renderer is written here.

Se queda en tu equipoStays on your device

Tu biblioteca vive en IndexedDB, en este navegador. Sin cuenta, sin sincronización, sin telemetría. Un botón borra todo rastro. Your library lives in IndexedDB, in this browser. No account, no sync, no telemetry. One button erases every trace.

Anda sin conexiónWorks offline

Se instala como PWA. Después de la primera visita funciona con el avión encendido, en un vuelo o en un sótano. Installs as a PWA. After the first visit it works in aeroplane mode, on a flight or in a basement.

Entra y sale fácilEasy in, easy out

Arrastrás archivos o una carpeta entera con sus imágenes, o pegás con ⌘V. Exportás a HTML autocontenido, a Markdown o a PDF. Y hacés backup de toda la biblioteca en un JSON. Drop files or a whole folder with its images, or paste with ⌘V. Export to self-contained HTML, to Markdown or to PDF. Back the whole library up as JSON.

Escribe tambiénWrites too

Vista dividida con scroll sincronizado. Solo se vuelve a renderizar el bloque que tocaste, así que un documento largo no se pone lento mientras escribís. Split view with synced scrolling. Only the block you touched is re-rendered, so a long document does not get sluggish as you type.

Cómo está hecho How it is built

0dependenciasdependencies
0pasos de buildbuild steps
0pedidos de rednetwork requests
105teststests

Todo lo que normalmente haría un servidor pasa en la pestaña: el parser de Markdown, el resaltador, el renderizador de diagramas, el sanitizador de HTML y la búsqueda. Nada de eso viene de una librería — están escritos en el repo, en JavaScript sin transpilar, servidos tal cual. Everything a server would normally do happens in the tab: the Markdown parser, the highlighter, the diagram renderer, the HTML sanitizer and the search. None of it comes from a library — they are written in the repository, in plain JavaScript, served as-is.

La parte más rara, y la que más me divirtió: hay un módulo WebAssembly para los bucles sobre bytes — hashear bloques para redibujar solo lo que cambió, buscar en la biblioteca. No hay ningún archivo .wasm en el repositorio. El módulo se ensambla al arrancar, a partir de opcodes escritos como JavaScript legible. No hay binario que auditar ni toolchain que instalar, y hay una implementación en JS con la misma semántica por si WebAssembly no está disponible — los tests corren las dos y las comparan entre sí. The strangest part, and the one I enjoyed most: there is a WebAssembly module for the byte-level loops — hashing blocks so only what changed gets redrawn, searching the library. There is no .wasm file in the repository. The module is assembled at startup from opcodes written as readable JavaScript. There is no binary to audit and no toolchain to install, and a JavaScript implementation with identical semantics takes over where WebAssembly is unavailable — the tests run both and compare them against each other.

Se despliega en GitHub Pages copiando el repositorio tal cual. El sitio es el repositorio. It deploys to GitHub Pages by copying the repository verbatim. The site is the repository.

Quién lo hizo Who made it

Soy Pablo Caviglia, Technical Lead en Senaptec, desde Uruguay. Llevo más de veinte años escribiendo software: hoy sobre todo Android y Kotlin Multiplatform, arquitectura offline-first y full-stack — Kotlin y Compose del lado del cliente, Django y Python en el backend, Vue.js en la web — con bastante trabajo pegado al hardware: C/C++ nativo, dispositivos a medida, sensores. I'm Pablo Caviglia, Technical Lead at Senaptec, based in Uruguay. I have been writing software for over twenty years: these days mostly Android and Kotlin Multiplatform, offline-first architecture and full-stack work — Kotlin and Compose on the client, Django and Python on the backend, Vue.js on the web — with a good deal of hardware-adjacent work alongside it: native C/C++, custom devices, sensors.

Me atraen los problemas de los bordes: redes que no funcionan, dispositivos raros, y la disciplina de mantener simple un código que crece. En Senaptec construí un framework de sincronización offline-first para que la plataforma siga andando en hardware de kiosco y con redes poco confiables. I'm drawn to problems at the edges: unreliable networks, custom devices, and the discipline of keeping a large codebase simple. At Senaptec I built an offline-first sync framework so the platform keeps working on kiosk hardware and flaky networks.

Que este proyecto guarde tus documentos en tu equipo y no en una base de datos ajena no es una postura de marketing: es el mismo argumento que vengo haciendo en el trabajo y en lo que hago aparte. That this project keeps your documents on your machine rather than in someone else's database is not a marketing position: it is the same argument I keep making at work and in what I build on the side.

Probalo con cualquier cosa que tengas en el portapapeles. Try it with whatever is on your clipboard.

Abrir la herramienta Open the app