Dashboard di casa (presenze a pranzo e cena, turni pulizia) mostrata su una TV LG webOS e alimentata da una web app per telefono (Android e iPhone). Supabase è l’unico datastore condiviso, nessun backend proprio. Specifiche: docs/PRD.md, docs/PRP.md.
supabase/migrations/ — schema e policy RLS (Fase 0)tv-app/ — app webOS, sola lettura (Fase 1)scripts/devmode/ — rinnovo automatico della Developer Mode dal PC di un coinquilino sulla rete della TV (Fase 2)mobile-app/ — web app per telefono (Fase 3)Crea il progetto su supabase.com, piano Free. Conserva la password del database in un password manager, mai nel repo.
supabase/migrations/20260915000000_initial_schema.sqlsupabase/migrations/20260915000001_rls_policies.sqlsupabase/migrations/20260916000000_active_flags.sqlsupabase/migrations/20260916000001_meal_presence.sqlsupabase/migrations/20261008000000_meal_defaults.sql (abitudini ai pasti, Fase 3b)Popola a mano roommates e cleaning_tasks, dal Table Editor oppure dal SQL Editor (che gira con un ruolo privilegiato, quindi non è bloccato dalla RLS). Esempio, con i nomi dei coinquilini da sostituire:
insert into roommates (name) values ('Nome 1'), ('Nome 2');
insert into cleaning_tasks (name, sort_order) values
('Sala', 1), ('Camera 1', 2), ('Camera 2', 3), ('Bagno 1', 4),
('Bagno 2', 5), ('Cucina', 6), ('Pavimenti e polveri mensole', 7);
meal_presence e cleaning_shifts restano vuote: le riempie l’app. Chi lascia la casa non si cancella, si imposta active = false.
Copia URL e publishable key nel tuo .env locale:
Copy-Item .env.example .env
Compila SUPABASE_URL (https://<project-ref>.supabase.co, il ref è nell’indirizzo della dashboard dopo /project/) e SUPABASE_PUBLISHABLE_KEY (Project Settings → API Keys, inizia con sb_publishable_). Non usare le chiavi legacy anon/service_role, in dismissione entro fine 2026, e mai la secret key: bypassa la RLS e non deve finire in nessuna app né nel repo. .env è già escluso da .gitignore.
Checkpoint Fase 0 (dal PRP): dalla dashboard web di Supabase riesci a leggere e scrivere righe di test. Solo dopo si passa alla Fase 1.
L’app TV è in tv-app/: HTML e JS senza dipendenze, legge Supabase via REST ogni 20 s e non scrive mai. Riferimento ufficiale LG: Developer Mode, CLI.
Genera la config dal .env:
pwsh -File tv-app/make-config.ps1
Se va a buon fine non stampa nulla e crea tv-app/config.js, git-ignorato. Rifiuta chiavi che non iniziano con sb_publishable_.
Apri tv-app/index.html con doppio clic (Chrome o Edge). Devi vedere: la data di oggi in alto; Pranzo e Cena con ogni coinquilino attivo (presente / assente / non specificato, orario, ospiti, nota); i turni della settimana corrente in ordine di area; in basso Aggiornato alle HH:MM:SS, Screensaver: WebOSServiceBridge non disponibile (normale fuori dalla TV) e Codice: remoto (oppure Codice: copia locale finché GitHub Pages non è attivo, sezione G).
Confronta con Supabase (Table Editor): meal_presence con date = oggi, cleaning_shifts con week_start = lunedì di questa settimana.
Modifica una riga dal Table Editor senza toccare la pagina: entro circa 20 s la pagina cambia.
Premi Invio (sulla TV: OK): la settimana successiva compare o sparisce.
Controllo della logica di date e testi, senza rete:
node tv-app/app.test.js
Developer Mode e installala.Alla scadenza della sessione Developer Mode le app installate così vengono disinstallate (doc LG). Solo da fonte community (webosbrew): un account LG Developer resta collegato a una sola TV alla volta, e il Key Server si spegne quando la TV si riavvia.
Controlla Node: @webos-tools/cli 3.2.6 richiede Node 20 o successivo (campo engines del pacchetto npm; la pagina di installazione LG indica ancora 14.15.1–16.20.2, superata).
node --version
Installa e verifica il CLI:
npm install -g @webos-tools/cli
ares -V
Registra la TV (sostituisci l’IP con quello annotato al passo B4):
ares-setup-device --add tv -i "host=192.168.1.50" -i "port=9922" -i "username=prisoner"
Scarica la chiave: il comando chiede la passphrase di 6 caratteri mostrata sulla TV (maiuscole e minuscole contano).
ares-novacom --device tv --getkey
Verifica la connessione e leggi modello e firmware:
ares-device --device tv --system-info
Dalla root del repo. Il file .ipk viene creato nella root ed è git-ignorato; contiene la publishable key, che è pubblica per design.
pwsh -File tv-app/make-config.ps1
ares-package tv-app -e "app.test.js" -e "make-config.ps1" -e "config.example.js"
ares-install --device tv com.apparentati.dashboard_0.2.0_all.ipk
ares-launch --device tv com.apparentati.dashboard
Poi, senza toccare la TV: i dati devono essere gli stessi del browser, e una riga modificata dalla dashboard Supabase (Table Editor o SQL Editor) deve comparire entro 30 s.
Se la pagina resta vuota, ares-inspect --device tv --app com.apparentati.dashboard apre i DevTools (serve un Chromium compatibile con la versione webOS della TV).
L’app TV è un’app normale, aperta quando serve: lo screensaver non blocca la Fase 1, si osserva e basta.
Screensaver: in basso.Screensaver: e l’orario di Aggiornato alle.ares-cli si collega alla TV sulla porta 9922 del suo indirizzo IP, quindi serve un computer sulla stessa rete della TV. Se non è il PC dove sviluppi, la procedura completa e autosufficiente sta in docs/sideload-tv.md: basta portare quel file e il .ipk, senza repo.
L’app installata è un guscio: all’avvio carica tv-app/app.js da https://pepuz.github.io/dashboard_apparentati/tv-app/app.js e, se non ci riesce, usa la copia inclusa nel pacchetto. La riga Codice: in basso dice quale sta usando. GitHub Pages è gratuito per i repo pubblici con GitHub Free (doc GitHub); il repo pubblicato non contiene chiavi, perché tv-app/config.js è git-ignorato e resta solo nel pacchetto.
Una volta sola:
Su github.com, in alto a destra, + → New repository. Owner: il tuo account; nome dashboard_apparentati; visibilità Public; nessun README, .gitignore o licenza, perché il repo esiste già in locale. Poi Create repository.
Collega il repo locale e pubblicalo:
git remote add origin https://github.com/Pepuz/dashboard_apparentati.git
git push -u origin main
Nel repo su GitHub: Settings → nella barra laterale, sezione Code, planning, and automation, Pages → sotto Build and deployment, in Source scegli Deploy from a branch → nel menu del branch scegli main e in quello della cartella la radice del repo → Save.
Quando la pubblicazione è finita (la doc non dice quanto ci vuole), l’indirizzo https://pepuz.github.io/dashboard_apparentati/tv-app/app.js aperto nel browser mostra il codice.
Un ultimo sideload del pacchetto 0.2.0 (sezione D, o F da un altro PC). Sulla TV la riga in basso deve dire Codice: remoto.
A ogni aggiornamento successivo:
tv-app/app.js, esegui node tv-app/app.test.js e prova nel browser (sezione A).main.Un nuovo sideload serve ancora per modifiche a index.html, appinfo.json o config.js (URL o chiave), o per cambiare l’indirizzo da cui si carica il codice.
Checkpoint Fase 1 (dal PRP): dati corretti nel browser e sulla TV, una modifica da Supabase compare sulla TV entro 30 s senza toccarla. L’osservazione dello screensaver è facoltativa.
Il rinnovo della Developer Mode gira sul PC fisso di un coinquilino, sulla rete della TV (PRP §2), con scripts/devmode/renew-devmode.ps1. L’attività pianificata lo avvia ogni ora, ma lo script contatta la TV solo nelle ultime 240 ore prima della scadenza, circa una volta al mese. Allora:
Il residuo si legge da developer.lge.com/secure/CheckDevModeSession.dev, anche questo solo community. Chiave SSH della TV, log (renew.log) e ora del prossimo controllo (next-check.txt) restano su quel PC. I comandi sono per Windows PowerShell 5.1 e usano npm.cmd e ares-*.cmd: il criterio di esecuzione predefinito di Windows 10 blocca gli script .ps1, compresi quelli che npm installa per npm e ares (doc Microsoft).
Controllo della logica di decisione, con CLI, TV e servizio LG simulati:
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/devmode/renew-devmode.test.ps1
Controlla se l’account è amministratore:
whoami /groups | Select-String 'S-1-5-32-544'
Se compare una riga, l’account è nel gruppo Administrators e l’attività della sezione E girerà senza finestre. Se non compare nulla, vedi la nota nella sezione E.
Controlla Node: serve la versione 20 o successiva. Se c’è, passa al punto 3.
node --version
Scarica da https://nodejs.org/dist/latest-v24.x/ il file node-v24.…-x64.msi (il 2026-09-24 era node-v24.21.0-x64.msi), aprilo e completa l’installazione con le opzioni predefinite: Windows chiede il permesso di amministratore. Poi chiudi e riapri PowerShell.
Installa il CLI nella versione con cui lo script è stato verificato:
npm.cmd install -g @webos-tools/cli@3.2.6
ares.cmd -V
Atteso: Version: 3.2.6. Se ares.cmd non è riconosciuto, aggiungi al PATH della sola finestra corrente la cartella dei pacchetti globali di npm:
$env:Path = "$env:APPDATA\npm;$env:Path"
Sostituisci IP_DELLA_TV con l’indirizzo annotato al punto A1:
ares-setup-device.cmd --add tv -i "host=IP_DELLA_TV" -i "port=9922" -i "username=prisoner"
Scarica la chiave: il comando chiede la passphrase di 6 caratteri mostrata sulla TV (maiuscole e minuscole contano).
ares-novacom.cmd --device tv --getkey
Verifica il collegamento:
ares-device.cmd --device tv --system-info
Atteso: modelName : OLED48A16LA e firmwareVersion : 03.53.45.
Crea la cartella dello script e spostati lì:
New-Item -ItemType Directory "$env:USERPROFILE\dashboard-devmode"
Set-Location "$env:USERPROFILE\dashboard-devmode"
Scarica lo script dal repo pubblico:
curl.exe -L -o renew-devmode.ps1 https://raw.githubusercontent.com/Pepuz/dashboard_apparentati/main/scripts/devmode/renew-devmode.ps1
Prova a mano. Senza next-check.txt lo script rinnova subito: sulla TV compare Developer Mode e, entro circa due minuti, Dashboard casa.
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\renew-devmode.ps1
Get-Content .\renew.log
Atteso: una riga OK renewed at …, con il residuo prima e dopo (vicino a 1000 h).
Cancella il prossimo controllo, così anche il primo giro dell’attività pianificata rinnova: è il rinnovo automatico del checkpoint.
Remove-Item .\next-check.txt
Dalla stessa finestra, nella cartella dello script. Il primo giro parte dopo 5 minuti, poi ogni ora e a ogni accesso dell’utente (doc Microsoft).
$user = "$env:USERDOMAIN\$env:USERNAME"
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument "-NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File `"$PWD\renew-devmode.ps1`""
$triggers = (New-ScheduledTaskTrigger -AtLogOn -User $user), (New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(5) -RepetitionInterval (New-TimeSpan -Hours 1))
$principal = New-ScheduledTaskPrincipal -UserId $user -LogonType S4U
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -ExecutionTimeLimit (New-TimeSpan -Minutes 10) -MultipleInstances IgnoreNew
Register-ScheduledTask -TaskName 'dashboard-devmode' -Action $action -Trigger $triggers -Principal $principal -Settings $settings
Con S4U l’attività gira senza finestre, anche a utente disconnesso, e non memorizza la password; parte solo se l’utente ha il diritto di accesso come processo batch, che di default hanno gli amministratori (doc Microsoft). Se al punto A3 non è comparso nulla, usa -LogonType Interactive: l’attività gira solo con l’utente collegato e a ogni giro può comparire per un attimo una finestra di PowerShell.
Controlla che la ripetizione oraria non abbia scadenza: il secondo blocco deve mostrare Interval : PT1H e Duration vuoto.
(Get-ScheduledTask -TaskName 'dashboard-devmode').Triggers.Repetition | Format-List Interval, Duration
Dopo 5 minuti:
Get-ScheduledTaskInfo -TaskName 'dashboard-devmode'
Get-Content .\renew.log -Tail 3
LastTaskResult 0 vuol dire riuscito, 1 che lo script ha scritto un problema nel log. Sulla TV devono comparire Developer Mode e poi Dashboard casa, con Remain Session vicino a 1000 h.
Checkpoint Fase 2 (dal PRP): almeno un rinnovo automatico osservato senza intervento manuale (Remain Session torna vicino a 1000 h e il log lo registra) e l’app installata ancora presente.
| Riga | Significato |
|---|---|
OK renewed at IP: X -> Y h left |
rinnovo confermato dal servizio LG |
OK no renewal needed, X h left |
la sessione era già stata rinnovata, per esempio con EXTEND: nessun avvio |
TV not reachable … |
TV spenta o fuori rete: riprova al giro successivo |
TV address changed: A -> B |
IP della TV cambiato, dispositivo tv aggiornato |
WARN time left unknown: … |
servizio LG o token non disponibili |
WARN renewal launched at IP but not confirmed |
avviato senza poter verificare: prossimo controllo fra 760 h |
FAIL renewal launched at IP but X h left … |
il timer non si è mosso: riprova fra 24 h |
ERROR … |
errore imprevisto: riprova al giro successivo |
next-check.txt contiene l’ora (UTC) in cui lo script tornerà a contattare la TV; cancellarlo forza un rinnovo al giro successivo.
Unregister-ScheduledTask -TaskName 'dashboard-devmode' -Confirm:$false
ares-setup-device.cmd --remove tv
La chiave privata della TV resta in %USERPROFILE%\.ssh\tv_webos (così sul portatile di lavoro; LG non documenta il percorso): cancellala insieme alla cartella dashboard-devmode. Se vuoi, disinstalla anche il CLI con npm.cmd uninstall -g @webos-tools/cli.
L’app per telefono è in mobile-app/: una pagina HTML e JS senza dipendenze, pubblicata da GitHub Pages insieme all’app TV. Legge e scrive Supabase via REST (solo meal_presence, cleaning_shifts e, dalla Fase 3b, meal_defaults) e, mentre la pagina è visibile, rilegge ogni 10 s. URL e publishable key non stanno nel repo: viaggiano nel frammento del link (#url=…&key=…), che il browser non manda a GitHub, e restano salvati sul telefono. Il sito senza link non mostra dati.
Controllo della logica (date, righe da scrivere, ospiti, assente senza orario né ospiti), senza rete:
node mobile-app/app.test.js
pwsh -File mobile-app/make-link.ps1 | Set-Clipboard
Copia negli appunti il link https://pepuz.github.io/dashboard_apparentati/mobile-app/#url=…&key=…, composto da SUPABASE_URL e SUPABASE_PUBLISHABLE_KEY del .env. Rifiuta chiavi che non iniziano con sb_publishable_. Chiunque abbia il link legge i nomi e può scrivere presenze, turni e abitudini (non cancellarli): va condiviso solo in casa.
Per provare nel browser del PC modifiche non ancora pubblicate, servi la cartella del repo con un server locale (serve Python 3):
python -m http.server 8765 --bind 127.0.0.1
e nel link sostituisci https://pepuz.github.io/dashboard_apparentati/ con http://localhost:8765/.
Aggiornato alle HH:MM:SS (oppure l’errore) e da dove arriva la configurazione.Una risposta data non torna a “non specificato” e un’area assegnata non torna vuota: la RLS non permette cancellazioni da app. Le righe di prova si tolgono dal SQL Editor di Supabase (sezione E).
Diciture dalle guide ufficiali di Apple e Google, verificate il 2026-10-06; sul telefono possono variare leggermente.
Android, Chrome (guida Google):
iPhone, Safari (guida Apple):
Senza manifest di proposito: il suo start_url sostituirebbe il link, e con lui il frammento che porta URL e chiave.
prova → Salva. Annota l’ora.Le righe scritte con la publishable key non si cancellano via API. Dal SQL Editor di Supabase, prima controlla quali sono:
select * from meal_presence where note = 'prova';
poi, se sono solo quelle di prova:
delete from meal_presence where note = 'prova';
Le assegnazioni di prova dei turni si correggono dall’app, riassegnando l’area.
Commit e push su main: GitHub Pages pubblica entro qualche minuto (fino a 10 secondo la doc GitHub) e i browser possono tenere in cache la versione precedente per altri 10 minuti (Cache-Control: max-age=600, misurato il 2026-09-30). Poi chiudi e riapri l’app sul telefono.
Checkpoint Fase 3 (dal PRP): node mobile-app/app.test.js passa; da un Android e da un iPhone una modifica compare sulla TV entro 30 s e sull’altro telefono entro 15 s, senza ricaricare.
Ogni coinquilino può dire, per il pranzo e la cena di ogni giorno della settimana, “di solito ci sono” o “di solito non ci sono”. L’abitudine vale per i pasti a cui non ha risposto; la risposta di un giorno prevale. Telefono e TV la mostrano come una risposta normale. Le abitudini stanno nella tabella meal_defaults.
Il codice nuovo chiede meal_defaults a Supabase: pubblicato prima che la tabella esista, la richiesta fallisce e la TV resta senza dati.
supabase/migrations/20261008000000_meal_defaults.sql, come le migrazioni della Fase 0. Non deve comparire nessun errore.Controlla tutto ciò che la migrazione crea, non solo i permessi:
select 'column' as kind, column_name || ' ' || data_type || case when is_nullable = 'NO' then ' not null' else '' end || coalesce(' default ' || column_default, '') as detail
from information_schema.columns where table_schema = 'public' and table_name = 'meal_defaults'
union all
select 'constraint', conname || ': ' || pg_get_constraintdef(oid) from pg_constraint where conrelid = 'public.meal_defaults'::regclass
union all
select 'rls', relrowsecurity::text from pg_class where oid = 'public.meal_defaults'::regclass
union all
select 'policy', policyname || ' ' || cmd || ' ' || roles::text || ' using=' || coalesce(qual, '-') || ' check=' || coalesce(with_check, '-') from pg_policies where schemaname = 'public' and tablename = 'meal_defaults'
union all
select 'grant', p || '=' || has_table_privilege('anon', 'public.meal_defaults', p)::text from unnest(array['SELECT', 'INSERT', 'UPDATE', 'DELETE']) as p;
Atteso: 5 colonne (is_present senza not null); 4 vincoli (chiave primaria su roommate_id, weekday, meal, chiave esterna verso roommates, controlli su meal e weekday); rls true; 3 policy per {anon} (SELECT, INSERT, UPDATE); SELECT, INSERT, UPDATE true. DELETE può essere true per i permessi predefiniti di Supabase: senza una policy di cancellazione la RLS la blocca comunque. Se manca qualcosa, per esempio le policy, esegui solo le istruzioni corrispondenti del file di migrazione e ricontrolla.
main, poi attendi GitHub Pages (sezione F della Fase 3).meal_defaults (Ctrl+F): se c’è, la versione nuova è pubblicata. La riga Codice: remoto sulla TV dice solo che Pages ha risposto, non quale versione.Nell’app, in fondo, Abitudini → Modifica abitudini: per ogni giorno, pranzo e cena a scelta tra nessuna, ci sono e non ci sono → Salva. Un’abitudine si toglie scegliendo “nessuna”: la riga resta con is_present vuoto, perché da app non si cancella nulla.
Per un pasto di oggi a cui non hai ancora risposto:
prova: la risposta prevale sull’abitudine.Pulizia: rimetti a “nessuna” le abitudini di prova dall’app, e togli le righe con nota prova dal SQL Editor, prima controllando:
select * from meal_presence where note = 'prova';
poi, se sono solo quelle di prova:
delete from meal_presence where note = 'prova';
La copia di riserva di app.js inclusa nel pacchetto della TV non conosce le abitudini: se la TV non raggiunge GitHub Pages, i pasti senza risposta restano “non specificato”.
Checkpoint Fase 3b (dal PRP): node mobile-app/app.test.js e node tv-app/app.test.js passano; con l’abitudine “di solito non ci sono” a pranzo per il giorno di oggi e nessuna risposta, telefono e TV mostrano assente; una risposta “ci sono” per oggi prevale; togliendo l’abitudine torna “non specificato”.
La dashboard TV prende la grafica delle bozze (PRP, Fase 5): schede Pranzo, Cena e Turni con icone, simbolo di stato per ogni coinquilino (prima del nome, in colonna) e per ogni area, il totale dei presenti accanto a Pranzo e Cena, chi non ha risposto in grigio, tema scuro all’avvio e tema chiaro con le frecce su e giù del telecomando, senza salvare la scelta. Nell’app per telefono l’orario del pasto si chiama “Orario preferito”; la colonna in Supabase resta required_time.
Tutto arriva da GitHub Pages, quindi niente sideload: tv-app/app.js (codice e icone), tv-app/style.css e il font Inter in tv-app/fonts/ (licenza SIL Open Font License 1.1, in tv-app/fonts/OFL.txt). index.html installato non cambia. La copia di riserva di app.js nel pacchetto resta con la grafica vecchia.
Margini, schede e dimensioni seguono le proporzioni delle bozze (PRP, Fase 5): data e titoli fissi, mentre il testo delle liste prende la dimensione più grande che entra, con i dettagli tra 12 e 21 px e i nomi fino a 34 px; una dimensione per le due schede dei pasti, una per i turni. Il caso peggiore (7 coinquilini con ospiti, orario e nota, più la settimana successiva) ha i dettagli a 19 px. Ogni coinquilino e ogni area occupano sempre la stessa parte della scheda, separata da una linea sottile e con il contenuto centrato: senza dettagli il nome resta al suo posto. Le righe Ospiti e Note più lunghe di due righe finiscono con “…”.
In basso, quando va tutto bene, resta solo Aggiornato alle HH:MM:SS. Le altre righe compaiono così:
| Cosa vedi in basso | Significato |
|---|---|
solo Aggiornato alle … |
grafica nuova completa, con il font Inter |
Stile: remoto, font … in rosso, con un nome diverso da Inter (o font Inter non caricato) |
grafica nuova con un altro font: misure diverse, ma l’adattamento tiene tutto nello schermo |
Errore alle … in rosso |
Supabase non risponde: restano i dati dell’ultimo aggiornamento |
tutte le righe della Fase 1 e Stile: non caricato |
style.css non raggiungibile: dati leggibili con lo stile del guscio, su tre colonne. Chiudi e riapri l’app |
tutte le righe della Fase 1, senza Stile: |
è in uso la copia di riserva (Codice: copia locale), con la grafica vecchia |
Controllo della logica, senza rete:
node tv-app/app.test.js
node mobile-app/app.test.js
main, poi attendi GitHub Pages (sezione F della Fase 3).theme-light (Ctrl+F): se c’è, la versione nuova è pubblicata.tv-app/config.js (Fase 1, sezione A, punto 1). Apri tv-app/index.html con doppio clic, in Chrome o Edge.Martedì 13 ottobre 2026, tre schede (Pranzo, Cena, Turni) e in basso solo Aggiornato alle …. Una finestra più piccola dello schermo della TV rimpicciolisce le schede: per vederle come sulla TV, schermo intero con F11 su un monitor 1920×1080.Dalla root del repo, con al posto di CARTELLA_DEL_SIMULATORE la cartella che contiene webOS_TV_24_Simulator_….exe (doc LG). Il comando non usa la TV.
ares-launch -s 24 -sp "CARTELLA_DEL_SIMULATORE" tv-app
Ripeti i controlli della sezione B con i tasti del telecomando virtuale del simulatore (frecce e OK). Il simulatore 24 usa Chromium 108, la TV Chromium 79 (doc LG): la compatibilità si prova solo sulla TV.
Aggiornato alle …: vuol dire codice e stile da Pages e font Inter. Una riga Stile: in rosso vuol dire che la TV impone un altro font: annotane il testo esatto.Checkpoint Fase 5 (dal PRP): node tv-app/app.test.js e node mobile-app/app.test.js passano; la dashboard si legge dal divano a colpo d’occhio; nel caso peggiore (7 coinquilini con ospiti, orario e nota a pranzo e a cena, più la settimana successiva) tutto entra nello schermo; provata nel browser del PC, nel simulatore webOS TV 24 e sulla TV, in tutti e due i temi; senza lo stile remoto i dati restano leggibili.
Sulla TV le frecce sinistra e destra del telecomando spostano le schede Pranzo e Cena da oggi fino a 6 giorni dopo, gli stessi giorni dell’app per telefono. La data in alto è quella del giorno mostrato, con “Domani, “ davanti per il giorno dopo; i turni restano quelli della settimana di oggi. Dopo 2 minuti senza tasti, e a ogni apertura dell’app, la TV torna a oggi. Frecce su e giù (tema) e OK (settimana successiva dei turni) funzionano come prima. Nessuna modifica a Supabase; la copia di riserva nel pacchetto mostra solo oggi.
main, poi attendi GitHub Pages (sezione F della Fase 3).DAYS_AHEAD (Ctrl+F): se c’è, la versione nuova è pubblicata.Domani, … e poi di nuovo la data di oggi.Domani, …. Confronta le presenze di domani con l’app per telefono, giorno “Domani”.Checkpoint Fase 5b (dal PRP): node tv-app/app.test.js passa; sulla TV, freccia destra mostra domani con la data “Domani, …” e le stesse presenze dell’app per telefono per quel giorno; freccia sinistra torna indietro fino a oggi; dopo 2 minuti senza tasti torna a oggi; frecce su e giù e OK funzionano come prima.
MIT, vedi LICENSE.