Archive Reader
Lector y gestor de archivos MHTML multiplataforma
- Rol
- Desarrollador único (arquitectura, diseño y desarrollo)
- Cliente
- Uso personal / distribución pública
- Duración
- 15-07-2026 — 20-08-2026
- Año
- 2026
- Equipo
- 1 persona

Problema
¿Qué había que resolver?
La gestión de archivos MHTML es complicada y poco intuitiva en plataformas móviles y de escritorio, especialmente al trabajar con grandes volúmenes de datos.
Solución
¿Cómo se resolvió?
Desarrollar una aplicación multiplataforma que facilite la lectura, gestión y creación de archivos MHTML, con un enfoque en la experiencia del usuario y el rendimiento.
Características
Lo que hace
- Sistema de múltiples bibliotecas con historial de carpetas y metadatos persistentes
- Parser MIME multipart propio, compatible con archivos MHTML reales de distintos navegadores
- Detección de encoding robusta (UTF-8, Windows-1252, ISO-8859-1) con sniffing de charset en el propio HTML
- Estrategia de lectura dual: servidor HTTP local en Android/iOS, archivo file:// en Windows
- Barra de desplazamiento personalizada con posición proporcional al contenido real
- Creación de archivos MHTML desde carpeta de imágenes, archivo .zip o un enlace web
- Captura de páginas web completas (HTML + imágenes + estilos) vía WebView invisible
- Generación de archivos en Isolates dedicados con escritura atómica, sin bloquear la UI
- Manejo estable de archivos de +130MB sin fugas de memoria
Responsabilidades
Mi rol en el proyecto
- Diseño completo de la arquitectura de la aplicación
- Desarrollo end-to-end en Flutter (UI, lógica de negocio, persistencia)
- Diseño e implementación del parser MIME/MHTML propio
- Resolución de bugs de bajo nivel (encodings, manejo de memoria, comportamiento nativo de WebView por plataforma)
- Pruebas manuales en Android y Windows
Retos técnicos
Lo que no fue trivial
Compatibilidad MHTML
Lograr compatibilidad real entre archivos MHTML generados por la app y lectores externos (Chrome, Edge, otras apps), ajustando el esquema de referencias (Content-Location vs. cid:) y la codificación CRLF
Optimización de memoria
Evitar bloqueos de UI y fugas de memoria al procesar archivos de más de 130MB, moviendo el trabajo pesado a Isolates y escribiendo recursos de a uno en vez de cargarlos completos en RAM
Media Scanner Android
Diagnosticar interferencia del escáner de medios de Android con archivos siendo escritos en almacenamiento público
Gestos WebView vs Flutter
Resolver conflictos entre gestos nativos del WebView (selección de texto) y GestureDetector de Flutter
Limitaciones CORS
Sortear limitaciones de CORS al capturar recursos de páginas web externas sin depender de un servidor backend
Resultado
Qué se logró
- Aplicación funcional en Android y Windows, con paridad de funcionalidades entre ambas plataformas
- Archivos MHTML generados por la app abren correctamente en navegadores de escritorio y otros lectores externos
- Manejo estable de bibliotecas con archivos de gran tamaño sin degradar el rendimiento de la interfaz
- getSaveLocation de file_selector no está implementado en Android/iOS; getDirectoryPath es la alternativa multiplataforma real
- Escribir archivos grandes primero en un directorio temporal privado y copiarlos al destino final evita corrupción por interferencia externa (escáner de medios, antivirus, etc.)
- Los eventos nativos de WebView no tienen paridad garantizada entre backends; un canal de mensajes JS↔Dart es más confiable multiplataforma que depender de callbacks nativos específicos
- Validar de forma crítica sugerencias técnicas de fuentes externas (incluyendo otras IAs) antes de aplicarlas, especialmente cuando son internamente contradictorias
- Preferir manipulación de HTML basada en DOM sobre reemplazos de string para mayor robustez ante marcado real y variado