Referência operacional para a equipe. Consulte sempre que houver dúvida sobre usuários, planos, dispositivos, privacidade ou o papel do painel administrativo.
1. O que é o Mural
- App nativo (Capacitor) para iPad: relógio, clima, fotos locais e câmeras ao vivo.
- Público-alvo: tablets antigos (mínimo iPadOS 15).
- Fotos não saem do aparelho — não vão para Supabase nem para admins.
2. Tabelas principais
| Tabela | Função |
|---|---|
admins |
Quem pode entrar no /admin (e-mail + senha). |
profiles |
Usuários do app (nome, e-mail, idioma, etc.). |
licenses |
Une usuário + dispositivo + plano (user_id + device_uuid + plan). |
A mesma conta Auth pode estar em admins e em profiles ao mesmo tempo
(ex.: Sergio admin + usuário de teste). licenses só existe para quem tem profile.
3. Como o usuário chega até nós
- Baixa o app na App Store (ou Google Play, quando publicado).
- Abre no iPad — não é necessário criar o usuário no painel admin.
- O aparelho gera um ID de dispositivo local.
- Conta: e-mail + código OTP em Configurações → Minha Conta.
- Premium: compra na loja (RevenueCat) → entitlement no aparelho + consolidação no Supabase via webhook.
O painel admin é só interno (SER). Clientes não usam admin.html.
4. Cadastro e uso sem conta
- O app abre e funciona sem login (relógio, clima, slideshow).
- Plano Free: até 50 fotos por dispositivo.
- Cortesia: fotos ilimitadas, concedida somente pelo admin (não vem da loja).
- Login (OTP) é necessário para conta, sync de licença e fluxo Premium completo.
- Vários profiles podem compartilhar o mesmo e-mail no app (seletor de conta). No Auth do Supabase o e-mail continua único.
5. Planos e licença
| Plano | Limite | Como obtém |
|---|---|---|
| Free | Até 50 fotos | Uso padrão no dispositivo |
| Cortesia | Fotos ilimitadas | Somente admin. No banco: premium + nota [CORTESIA] (ou enum complimentary). |
| Premium | Fotos ilimitadas | Assinatura App Store / Play (RevenueCat) |
- Multi-dispositivo: a mesma conta pode ter vários aparelhos; cada um tem sua linha em
licenses(unique(user_id, device_uuid)), herdando o plano da conta. - Não há exclusividade 1 aparelho por conta (takeover removido).
- Preços vêm das lojas, não do admin.
- Offline: licença em cache por até 7 dias.
- O frontend nunca usa
service_rolenem decide Premium só comlocalStorage.
6. Papel do painel administrativo
- Listar usuários (
profiles), planos e dispositivos. - Ajustar licença (Free / Premium / Cortesia).
- Criar outros administradores (
admins). - Trocar senha do admin logado (botão no topbar).
- Reset de vínculo de dispositivo (quando necessário no suporte).
Não use o admin para: cadastrar cada download da loja, ver fotos dos clientes, ou substituir a App Store / RevenueCat.
7. Privacidade
- Fotos e frames de câmera não sobem para servidor.
- Câmera no modo noturno: só luminosidade — sem gravar/enviar frames.
- Dados que podem sair do aparelho: e-mail, user ID, device ID, histórico de compras.
- Admins não acessam a galeria do usuário.
8. iOS / publicação
- App somente iPad (sem iPhone).
- Deployment target: iOS 15.0 (ex.: iPadOS 15.8.8).
- TestFlight exige iOS 16+ — em iPad 15.x use IPA + Sideloadly / Ad Hoc.
9. Acesso admin (equipe)
- Login: e-mail + senha do Supabase Auth (não a senha do Gmail).
- O usuário precisa existir em
auth.userse empublic.admins. - Se a mesma pessoa testa o app, ela também tem linha em
profiles/licenses. - Troca de senha: no painel, botão Trocar senha.
- Após criar usuário no Auth, rode:
insert into public.admins (id, email) select id, email from auth.users where email = '…' on conflict (id) do nothing;
10. Checklist rápido de suporte
- App abre? → rede / iPadOS ≥ 15.
- Fotos limitadas? → Free (50) ou Premium/Cortesia não ativo — restore / login OTP / conferir no admin.
- Não entra no admin? → senha Auth + linha em
admins. - Cliente em 2 iPads? → permitido; cada aparelho sincroniza sua licença com a mesma conta.
- Badge do plano no app: toque no nome/badge para atualizar a licença.
Operational reference for the team. Use whenever there is doubt about users, plans, devices, privacy, or the admin panel role.
1. What Mural is
- Native app (Capacitor) for iPad: clock, weather, local photos, and live cameras.
- Target: older tablets (minimum iPadOS 15).
- Photos never leave the device — not to Supabase, not to admins.
2. Main tables
| Table | Role |
|---|---|
admins |
Who can sign in to /admin (email + password). |
profiles |
App users (name, email, language, etc.). |
licenses |
Links user + device + plan (user_id + device_uuid + plan). |
The same Auth account may exist in both admins and profiles
(e.g. admin who also tests the app). licenses only exist for profiles.
3. How users reach us
- Download from the App Store (or Google Play when published).
- Open on iPad — no need to create the user in the admin panel.
- The device generates a local device ID.
- Account: email + OTP code under Settings → My Account.
- Premium: store purchase (RevenueCat) → on-device entitlement + Supabase webhook consolidation.
The admin panel is internal only. Customers never use admin.html.
4. Sign-up and guest use
- The app opens and works without login (clock, weather, slideshow).
- Free plan: up to 50 photos per device.
- Complimentary: unlimited photos, granted only by admin (not from the store).
- OTP login is required for account, license sync, and full Premium flow.
- Multiple profiles may share the same email in the app (account picker). Supabase Auth emails remain unique.
5. Plans and license
| Plan | Limit | How obtained |
|---|---|---|
| Free | Up to 50 photos | Default on device |
| Complimentary | Unlimited photos | Admin only. In DB: premium + note [CORTESIA] (or complimentary enum). |
| Premium | Unlimited photos | App Store / Play subscription (RevenueCat) |
- Multi-device: one account may have several devices; each has its own
licensesrow (unique(user_id, device_uuid)) and inherits the account plan. - No 1-device exclusivity / takeover.
- Prices come from the stores, not admin.
- Offline: cached license for up to 7 days.
- Frontend never uses
service_roleor decides Premium fromlocalStoragealone.
6. Admin panel role
- List users (
profiles), plans, and devices. - Adjust license (Free / Premium / Complimentary).
- Create other admins (
admins). - Change the logged-in admin password (topbar button).
- Reset device binding when support needs it.
Do not use admin to: register every store download, view customer photos, or replace App Store / RevenueCat.
7. Privacy
- Photos and camera frames do not upload to the server.
- Night-mode camera: brightness only — no frame capture/upload.
- Data that may leave the device: email, user ID, device ID, purchase history.
- Admins cannot access the user gallery.
8. iOS / publishing
- iPad only (no iPhone).
- Deployment target: iOS 15.0 (e.g. iPadOS 15.8.8).
- TestFlight needs iOS 16+ — on iPad 15.x use IPA + Sideloadly / Ad Hoc.
9. Admin access (team)
- Login: email + Supabase Auth password (not the Gmail password).
- User must exist in
auth.usersandpublic.admins. - If the same person tests the app, they also have
profiles/licensesrows. - Password change: panel button Change password.
- After creating an Auth user, run:
insert into public.admins (id, email) select id, email from auth.users where email = '…' on conflict (id) do nothing;
10. Quick support checklist
- App opens? → network / iPadOS ≥ 15.
- Photo limit? → Free (50) or Premium/Complimentary not active — restore / OTP login / check admin.
- Cannot enter admin? → Auth password + row in
admins. - Customer on 2 iPads? → allowed; each device syncs its license under the same account.
- Plan badge in app: tap name/badge to refresh the license.
Referencia operativa para el equipo. Consúltala cuando haya dudas sobre usuarios, planes, dispositivos, privacidad o el rol del panel administrativo.
1. Qué es Mural
- App nativa (Capacitor) para iPad: reloj, clima, fotos locales y cámaras en vivo.
- Público: tablets antiguos (mínimo iPadOS 15).
- Las fotos no salen del aparato — ni a Supabase ni a los admins.
2. Tablas principales
| Tabla | Función |
|---|---|
admins |
Quién puede entrar a /admin (correo + contraseña). |
profiles |
Usuarios de la app (nombre, correo, idioma, etc.). |
licenses |
Une usuario + dispositivo + plan (user_id + device_uuid + plan). |
La misma cuenta Auth puede estar en admins y en profiles
(p. ej. admin que también prueba la app). licenses solo existe para profiles.
3. Cómo llega el usuario
- Descarga en la App Store (o Google Play, cuando esté publicada).
- Abre en el iPad — no hace falta crearlo en el panel admin.
- El aparato genera un ID de dispositivo local.
- Cuenta: correo + código OTP en Ajustes → Mi Cuenta.
- Premium: compra en la tienda (RevenueCat) → entitlement en el aparato + webhook en Supabase.
El panel admin es solo interno. Los clientes no usan admin.html.
4. Registro y uso sin cuenta
- La app abre y funciona sin login (reloj, clima, slideshow).
- Plan Free: hasta 50 fotos por dispositivo.
- Cortesía: fotos ilimitadas, solo la concede el admin (no viene de la tienda).
- El login OTP es necesario para cuenta, sync de licencia y flujo Premium completo.
- Varios profiles pueden compartir el mismo correo en la app (selector). En Auth de Supabase el correo sigue siendo único.
5. Planes y licencia
| Plan | Límite | Cómo se obtiene |
|---|---|---|
| Free | Hasta 50 fotos | Uso estándar en el dispositivo |
| Cortesía | Fotos ilimitadas | Solo admin. En DB: premium + nota [CORTESIA] (o enum complimentary). |
| Premium | Fotos ilimitadas | Suscripción App Store / Play (RevenueCat) |
- Multi-dispositivo: la misma cuenta puede tener varios aparatos; cada uno tiene su fila en
licenses(unique(user_id, device_uuid)) e hereda el plan de la cuenta. - No hay exclusividad de 1 aparato por cuenta (takeover eliminado).
- Los precios vienen de las tiendas, no del admin.
- Offline: licencia en caché hasta 7 días.
- El frontend nunca usa
service_roleni decide Premium solo conlocalStorage.
6. Rol del panel administrativo
- Listar usuarios (
profiles), planes y dispositivos. - Ajustar licencia (Free / Premium / Cortesía).
- Crear otros administradores (
admins). - Cambiar la contraseña del admin conectado (botón en el topbar).
- Reset de vínculo de dispositivo cuando el soporte lo necesite.
No uses el admin para: registrar cada descarga de la tienda, ver fotos de clientes o sustituir App Store / RevenueCat.
7. Privacidad
- Fotos y frames de cámara no suben al servidor.
- Cámara en modo nocturno: solo luminosidad — sin grabar/enviar frames.
- Datos que pueden salir del aparato: correo, user ID, device ID, historial de compras.
- Los admins no acceden a la galería del usuario.
8. iOS / publicación
- App solo iPad (sin iPhone).
- Deployment target: iOS 15.0 (p. ej. iPadOS 15.8.8).
- TestFlight exige iOS 16+ — en iPad 15.x usa IPA + Sideloadly / Ad Hoc.
9. Acceso admin (equipo)
- Login: correo + contraseña de Supabase Auth (no la del Gmail).
- El usuario debe existir en
auth.usersy enpublic.admins. - Si la misma persona prueba la app, también tiene filas en
profiles/licenses. - Cambio de contraseña: botón Cambiar contraseña en el panel.
- Tras crear usuario en Auth, ejecuta:
insert into public.admins (id, email) select id, email from auth.users where email = '…' on conflict (id) do nothing;
10. Checklist rápido de soporte
- ¿Abre la app? → red / iPadOS ≥ 15.
- ¿Fotos limitadas? → Free (50) o Premium/Cortesía inactivo — restore / OTP / revisar admin.
- ¿No entra al admin? → contraseña Auth + fila en
admins. - ¿Cliente en 2 iPads? → permitido; cada aparato sincroniza su licencia con la misma cuenta.
- Badge del plan en la app: toca el nombre/badge para actualizar la licencia.