ABR Transfer
Aplicación de escritorio para pasar archivos y carpetas entre dispositivos de la misma red local, sin configurar carpetas compartidas ni permisos del sistema y sin subir nada a la nube. Quien envía crea una sesión temporal con enlace y QR y acepta cada conexión con un PIN. Quien recibe descarga con la app, con pausa y reanudación a mitad de archivo y verificación SHA-256, o desde cualquier navegador, también el del móvil. Para Windows y Linux, hecha con Tauri y Rust.





- instalador de Windows
- 3,3 MB
- instalador de Windows
- tests (Vitest)
- 450
- tests (Vitest)
- tests de Rust
- 78
- tests de Rust
- commits
- 119
- commits
Qué hace
- Compartir sin configurar nada. Eliges archivos o carpetas (o los arrastras), y la app crea una sesión temporal de 10, 30 o 60 minutos con un enlace y un código QR. No hay carpetas compartidas del sistema, ni usuarios, ni permisos que tocar.
- Nadie entra sin permiso. Cada conexión llega como una solicitud con su IP y un PIN de cuatro cifras, que el otro equipo ve también en su pantalla, para comprobarlo antes de aceptar. La app no busca dispositivos en la red ni se anuncia.
- Recibir con la app. Descarga a la carpeta que elijas, conserva la estructura de carpetas, muestra progreso, velocidad y tiempo restante también dentro de un archivo grande, se puede pausar a mitad y continúa donde lo dejó, reintenta cada archivo hasta tres veces sin empezar de cero y comprueba al final con SHA-256 que todo ha llegado igual.
- Recibir desde un navegador. El otro equipo no necesita instalar nada: con el enlace o el QR se abre una página con la lista de archivos, descarga uno a uno, por carpetas o todo en un ZIP que se genera mientras se descarga. En el móvil, permite compartir el archivo con otra app.
- Sin nube. Los archivos van directos de un equipo al otro por la red local. Sin cuentas, sin telemetría y sin límite de tamaño.
- Historial local que se puede desactivar, bandeja del sistema, notificaciones, elección de la interfaz de red, tema claro u oscuro e interfaz en español, inglés y chino.
Cómo está hecho
Un servidor HTTP dentro de la app
Al crear una sesión, el backend de Rust abre un servidor axum en un puerto libre, en todas las interfaces, con un token aleatorio de 256 bits en la URL. Ese servidor sirve tanto a la app receptora como a cualquier navegador: la misma API de manifiesto y de archivos, y una página HTML incrustada en el binario para quien no tiene la app.
Un ZIP que no vuelve atrás
El crate zip necesita volver atrás en el archivo para escribir el CRC, así que el ZIP se construía entero en memoria. Desde la 1.2.0 lo escribe un módulo propio con data descriptors y ZIP64, sin volver atrás nunca, por un canal de 1 MiB y con un Content-Length exacto calculado antes de empezar. La memoria del emisor se queda igual con una carpeta de 4 GB.
Indexado y verificación
Antes de compartir, un hilo recorre la selección sin seguir enlaces simbólicos, avisa de lo que no puede leer y calcula el SHA-256 de cada archivo. El receptor descarga por streaming con reqwest y, al terminar, vuelve a calcular los hashes y los compara con el manifiesto.
Defensa en las rutas
Las rutas relativas del manifiesto se validan en los dos extremos: el emisor rechaza cualquier .. antes de tocar el disco, y el receptor solo acepta componentes normales antes de escribir en la carpeta de destino.
Problemas que resolví
- Una barra en 0 % con archivos grandes. El progreso solo contaba archivos terminados. En la 1.2.0 suma los bytes del archivo en curso, y la pausa corta la conexión y continúa con una petición
Range. - Un QR en blanco en producción. La política de seguridad de contenido solo permitía imágenes de
'self', y el QR se generaba comodata:. En desarrollo se veía y en el instalador no. - Nuxt que no arrancaba en Windows. Un fallo del socket IPC de
vite-nodeen Windows obligó a bajar Nuxt a la 3.16.2 y a arrancar el servidor de desarrollo aparte de Tauri. - La interfaz de red equivocada. En un equipo con VPN, VirtualBox o WSL, la primera IP no es la de la red de casa. La versión 1.1 deja elegir la interfaz y regenera el enlace y el QR.
- Mutex envenenados. Si un manejador del servidor entra en pánico con el bloqueo de las conexiones cogido, el
Mutexqueda envenenado y unlock().unwrap()haría fallar todas las peticiones siguientes. Los manejadores recuperan el estado coninto_inner()en vez de propagar el error.