PaperMono
La lista della spesa su una calamita e-ink da frigo
Cosa fa
Uno schermo e-ink (come quello degli e-reader) attaccato al frigo che mostra la lista della spesa, aggiornabile dal telefono.
Come guadagna
Presentato su Hacker News dal suo creatore, che non dichiara incassi. Idee nostre per guadagnare con un progetto simile: vendita del dispositivo già montato, o di un kit da montare.
Rendilo tuo
- Parti dalla parte software: lista condivisa per la famiglia, e il display come accessorio.
- Lo stesso display per i turni delle pulizie o il menù della settimana.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Lista sul Frigo": uno schermo e-ink (come quello degli e-reader) con la calamita, da attaccare al frigo, che mostra la lista della spesa e gli impegni di famiglia, aggiornati dal telefono di tutti. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con le foto del dispositivo e il prezzo del kit
2. Ordine del kit (schermo e-ink, scheda ESP32, batteria, cornice con calamita)
3. App della famiglia: lista della spesa condivisa e promemoria
4. Collegamento del dispositivo con un codice
5. Guida per chi vuole costruirlo da solo con i pezzi
Stile: domestico e pulito: sfondo bianco, grigio carta #E5E5E0, nero, accento verde #16A34A, carattere "Inter"; sullo schermo e-ink solo nero su bianco con caratteri grandi. Nessuna immagine generica di stock.
Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.
2. Database, account e sicurezza
Collega il progetto a Supabase e attiva la registrazione con email e password.
Crea queste tabelle:
- "famiglie" e "membri": la famiglia e chi ne fa parte
- "voci": lista della spesa e promemoria, fatte o no
- "dispositivi": codice del dispositivo, token segreto, famiglia, ultimo collegamento, batteria
- "ordini": kit ordinato, indirizzo, pagato
Regole di sicurezza obbligatorie:
- ogni famiglia vede solo le sue voci e i suoi dispositivi
- il dispositivo legge la lista con il suo token segreto, solo della sua famiglia
- "pagato" lo cambia solo il pagamento
Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.
3. Il dispositivo che legge la lista
Il dispositivo è una scheda ESP32 con uno schermo e-ink da 7,5 pollici e una batteria: si sveglia ogni 30 minuti (o quando si preme il pulsante), si collega al Wi-Fi, chiede la lista alla Edge Function "lista" con il suo token, la disegna e torna a dormire. Così la batteria dura settimane (codice del dispositivo nei Dettagli tecnici).
L'app della famiglia è una PWA: lista della spesa condivisa in tempo reale, voci da spuntare, e promemoria del giorno. La Edge Function restituisce al dispositivo solo un testo semplice già impaginato (titolo, voci, data), così il codice sul dispositivo resta piccolo.
Collegamento: il dispositivo mostra un codice di 6 caratteri, la famiglia lo inserisce nell'app.
4. Kit e versione fai da te
Il kit si ordina e si paga online: schermo, scheda, batteria, cornice stampata in 3D con calamita, già programmato. Pannello amministratori per gli ordini e la spedizione.
Guida gratuita per chi vuole costruirlo da solo: elenco dei pezzi, schema dei collegamenti e codice da caricare. L'app per la famiglia è gratuita per chi ha il kit.
5. Pagamenti con Stripe
Aggiungi un pagamento singolo di 79 € per il kit spedito. Il pagamento conferma l'ordine del kit.
A pagamento riuscito il webhook imposta "pagato" a true nella tabella "ordini", sulla riga del ordine indicata in client_reference_id.
Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.
6. Controlli specifici di questo progetto
Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Batteria: lascia un dispositivo acceso una settimana con aggiornamento ogni 30 minuti e misura quanta batteria consuma.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Il codice del dispositivo (ESP32)
Programma per ESP32 (Arduino): si sveglia, scarica la lista, la disegna sullo schermo e-ink con la libreria GxEPD2 e torna a dormire per 30 minuti.
#include <WiFi.h>
#include <HTTPClient.h>
#include <GxEPD2_BW.h>
#include <Fonts/FreeSansBold12pt7b.h>
// Schermo 7,5" 800x480 (modello da adattare al proprio)
GxEPD2_BW<GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT> schermo(GxEPD2_750_T7(5, 17, 16, 4));
const char* WIFI = "NOME-WIFI";
const char* PASSWORD = "PASSWORD-WIFI";
const char* URL = "https://TUO-PROGETTO.supabase.co/functions/v1/lista";
const char* TOKEN = "TOKEN-DEL-DISPOSITIVO";
void setup() {
WiFi.begin(WIFI, PASSWORD);
for (int i = 0; i < 40 && WiFi.status() != WL_CONNECTED; i++) delay(250);
String testo = "Nessuna connessione";
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(URL);
http.addHeader("Authorization", String("Bearer ") + TOKEN);
if (http.GET() == 200) testo = http.getString(); // testo semplice, una voce per riga
http.end();
}
schermo.init();
schermo.setRotation(0);
schermo.setFont(&FreeSansBold12pt7b);
schermo.setFullWindow();
schermo.firstPage();
do {
schermo.fillScreen(GxEPD_WHITE);
schermo.setTextColor(GxEPD_BLACK);
schermo.setCursor(30, 50);
int y = 50;
int inizio = 0;
while (inizio < testo.length() && y < 460) { // una riga alla volta
int fine = testo.indexOf('\n', inizio);
if (fine < 0) fine = testo.length();
schermo.setCursor(30, y);
schermo.print(testo.substring(inizio, fine));
y += 36;
inizio = fine + 1;
}
} while (schermo.nextPage());
schermo.hibernate();
esp_sleep_enable_timer_wakeup(30ULL * 60 * 1000000); // 30 minuti
esp_deep_sleep_start();
}
void loop() {}Famiglie, voci e dispositivi
La lista condivisa della famiglia e la funzione che il dispositivo usa con il suo token per leggere solo la sua lista.
create table membri (
famiglia_id uuid not null,
utente_id uuid not null references auth.users(id) on delete cascade,
primary key (famiglia_id, utente_id)
);
create function in_famiglia(f uuid) returns boolean
language sql stable security definer set search_path = public as $
select exists (select 1 from membri where famiglia_id = f and utente_id = auth.uid());
$;
create table voci (
id uuid primary key default gen_random_uuid(),
famiglia_id uuid not null,
testo text not null,
tipo text not null default 'spesa' check (tipo in ('spesa', 'promemoria')),
fatta boolean not null default false,
creata_il timestamptz not null default now()
);
alter table voci enable row level security;
create policy "lista di famiglia" on voci for all
using (in_famiglia(famiglia_id)) with check (in_famiglia(famiglia_id));
create table dispositivi (
codice text primary key,
famiglia_id uuid,
token_hash text not null,
ultimo_collegamento timestamptz
);
alter table dispositivi enable row level security;
-- Usata dalla Edge Function "lista" dopo aver controllato il token del dispositivo
create function testo_per_dispositivo(f uuid) returns text
language sql stable security definer set search_path = public as $
select 'SPESA - ' || to_char(now() at time zone 'Europe/Rome', 'DD/MM HH24:MI') || E'\n' ||
coalesce(string_agg('[ ] ' || testo, E'\n' order by creata_il), 'Lista vuota!')
from voci where famiglia_id = f and not fatta and tipo = 'spesa';
$;
revoke execute on function testo_per_dispositivo(uuid) from public, anon, authenticated;
grant execute on function testo_per_dispositivo(uuid) to service_role;
Pezzi comuni a tutti i progetti
Glossario
- E-ink
- Lo schermo degli e-reader: consuma corrente solo quando cambia immagine e si legge bene anche alla luce.
- ESP32
- Una piccola scheda elettronica economica con Wi-Fi, molto usata per i progetti fai da te.
- Deep sleep
- Un sonno profondo in cui la scheda consuma quasi niente, fino al risveglio programmato.