Gestión de casas familiares (calendario, reservas, inspecciones con fotos/vídeo, anuncios, sorteos, usuarios). Una sola base de código Flutter → 4 apps nativas:
| Plataforma | Distribución | Auto-update |
|---|---|---|
| Android | APK propio alojado en tu Docker (sin Google Play) | ✅ desde la app |
| Windows | Instalador .exe (Inno Setup) alojado en tu Docker |
✅ desde la app |
| Linux | AppImage (cualquier distro: Ubuntu, Kali, Arch, Fedora…) + .deb (Ubuntu/Debian/Kali) + .tar.gz, alojados en tu Docker |
✅ desde la app (el AppImage, sin contraseña) |
| Apple (iOS) | App Store de forma privada (no listado / unlisted) — accesible solo por enlace, NO público y NO por TestFlight | ✅ auto-update de App Store (cada versión nativa pasa revisión, rápida en no listado) |
Backend: Supabase Cloud (Postgres + Auth + API + Edge Functions). Media (fotos/vídeo): MinIO self-hosted en tu Docker — los archivos viven en tu servidor, no en Supabase.
Arquitectura completa: docs/ARQUITECTURA.md. Seguridad (explicada para todos): docs/SEGURIDAD.md. Despliegue paso a paso (de dónde sale cada valor del
.env+ comandos): docs/DESPLIEGUE.md. Servidor con Dockge en Ubuntu (colocación del stack, rutas y permisos): docs/DOCKGE.md.
- Compatible con Linux. Cualquier distro: AppImage (un solo fichero, se actualiza solo y
sin contraseña),
.debpara Ubuntu/Debian/Kali y.tar.gzcon instalador de dos modos. Se compila desde Windows dentro de Docker. Guía: docs/LINUX.md. - Registro de fallos en las 5 plataformas. Si la app se cierra sola o falla, deja un informe técnico (sin credenciales) que el usuario puede enviarte desde Configuración → Diagnóstico. Guía: docs/REGISTROS.md.
- Lista de espera (cola) de reservas. Si unas fechas están ocupadas, te apuntas a la cola; si quien la tiene cancela, el siguiente (orden FIFO) hereda la reserva automáticamente y recibe 2 avisos ("X canceló" y "las fechas son tuyas").
- Tiempo real (Supabase Realtime). Calendario, reservas, cola y anuncios se actualizan solos en todos los dispositivos abiertos, sin recargar.
- Notificaciones push (FCM). Avisos de dispositivo además de email. Requiere setup de Firebase (ver guía). Push iOS pendiente de la cuenta Apple/APNs.
- iOS ahora por App Store privado (no listado), no por TestFlight: no caduca y auto-actualiza.
Guía de la cola + push + tiempo real: docs/COLA-NOTIFICACIONES-TIEMPO-REAL.md.
README.md ← este archivo
.env.example ← ÚNICA fuente de configuración (credenciales, rutas, URLs)
compose.yaml ← Docker: minio + updates (docker compose up -d)
app_flutter/ ← la app (android/ · ios/ · linux/ · macos/ · windows/ · lib/ · test/)
supabase/ ← migraciones (0001–0021) + Edge Functions (media-sign · send-email ·
admin-users · test-smtp · send-push · notify-waitlist)
server/ ← soporte del servidor: cloudflared/ · updates/ (plantillas) ·
media-scrub/ (fuente de la imagen que publica GitHub Actions)
scripts/ ← release.ps1 · build-aab.ps1 · build-windows.ps1 · build-linux.ps1|.sh ·
linux-build.Dockerfile · linux/instalar.sh · push-supabase-secrets.*
docs/ ← DESPLIEGUE.md · GOOGLE.md · APPLE.md · WINDOWS.md · LINUX.md · ANDROID.md ·
ARQUITECTURA.md · SEGURIDAD.md · REGISTROS.md ·
COLA-NOTIFICACIONES-TIEMPO-REAL.md
dist/ ← (generado) artefactos finales: setup.exe (Windows), .AppImage/.deb/.tar.gz
(Linux), .aab (Google Play), version.json
Toda la configuración está en .env (copia de .env.example). Es la única fuente de la
verdad. Como Docker, Supabase y las apps son sistemas distintos que no leen el mismo archivo en
ejecución, 3 adaptadores lo reparten (sin filtrar secretos al cliente):
| Adaptador | Qué hace |
|---|---|
| Docker | docker compose up -d lee .env directamente (MinIO + updates) |
| Supabase | scripts/push-supabase-secrets.* sube los secrets a las Edge Functions |
| Apps | scripts/build-*.ps1 hornean SOLO los valores públicos (SUPABASE_URL/ANON_KEY, MEDIA_PUBLIC_URL, UPDATES_PUBLIC_URL) con --dart-define |
- Instala Docker (Docker Desktop en Windows/Mac, o Docker Engine en Linux): https://docs.docker.com/get-docker/
cp .env.example .envy rellena las líneas marcadas con CAMBIA (rutas de almacenamiento, contraseña de MinIO, subdominios).docker compose up -d→ levanta MinIO (media) y updates (instaladores).- cloudflared (en el host) para publicar
media.yapp.: ver server/cloudflared/config.example.yml. ./scripts/push-supabase-secrets.ps1(o.sh) → sube los secrets de Supabase.
| Plataforma | Cómo se compila y se actualiza | Guía |
|---|---|---|
| Android | flutter build appbundle (build-aab.ps1) → Google Play (por invitación) |
docs/GOOGLE.md |
| Windows | flutter build windows (Visual Studio C++) + Inno Setup → setup.exe; auto-update |
docs/WINDOWS.md |
| Linux | flutter build linux dentro de Docker (build-linux.ps1) → AppImage + .deb + .tar.gz; auto-update |
docs/LINUX.md |
| Apple | flutter build ipa en un Mac → App Store Connect → App Store privado (no listado) |
docs/APPLE.md |
./scripts/release.ps1 -BumpSube el número de versión de app_flutter/pubspec.yaml, compila Windows y Linux, deja los
artefactos en dist/ y —si UPDATES_DATA_DIR es accesible— los publica en el servidor y
regenera la página de descargas. No hace falta reconstruir imágenes ni reiniciar contenedores: el
servicio updates sirve la carpeta en vivo y Windows y Linux se actualizan solos al reabrirse.
(Android va por Google Play —build-aab.ps1— e iOS por el App Store; se publican aparte, ver
sus guías.)
Linux se compila dentro de Docker porque Flutter no puede compilar Linux desde Windows. Si no tienes Docker arrancado,
release.ps1avisa y sigue con lo demás; puedes hacerlo luego con./scripts/build-linux.ps1, o saltártelo con-SkipLinux.
Si el servidor Docker está en otra máquina (Linux), copia el contenido de
dist/a la carpetaUPDATES_DATA_DIRde ese servidor (la primera vez incluyeindex.html).
- Android: Android Studio o el Android SDK (cmdline-tools). Keystore de subida (ver ANDROID.md); el
.aabse compila conbuild-aab.ps1(ver GOOGLE.md). - Windows: Visual Studio con Desktop development with C++ + Inno Setup.
- Linux: solo Docker (el mismo que ya usas para el servidor). No hace falta un ordenador con
Linux:
build-linux.ps1compila dentro de un contenedor Ubuntu 22.04 — y esa versión antigua es a propósito, es lo que hace que el binario arranque también en distros más viejas (ver docs/LINUX.md). - Apple: un Mac con Xcode + Apple Developer Program (99 €/año). Distribución en App Store no listado (privado por enlace), no TestFlight — ver docs/APPLE.md.
- Push (FCM): proyecto Firebase (
flutterfire configure+ service account). Setup completo en docs/COLA-NOTIFICACIONES-TIEMPO-REAL.md.
MIT — Copyright © 2026 Ignacio Sánchez Bas.
Puedes usar, copiar, modificar y redistribuir el código, incluso con fines comerciales, siempre que mantengas el aviso de copyright y el texto de la licencia. Se ofrece sin garantía de ningún tipo.
Lo que no cubre la licencia: este repositorio es público, pero las credenciales no están en él.
El .env está en .gitignore y nunca debe subirse. Quien clone el proyecto tiene que crear el suyo
a partir de .env.example y generar sus propios secretos.