App per restaurare vecchie foto
Restaura e colora le vecchie foto rovinate con l'AI
Incasso mensile: 158 USD (fonte indicata nella scheda)
Cosa fa
App per iPhone che restaura, migliora e colora con l'AI le vecchie foto danneggiate. Venduta per circa 2.000 $.
Come guadagna
Incasso annuo dichiarato di circa 1.900 $ nell'annuncio di vendita su Microns, che verifica i dati. Il nome del progetto non è pubblico.
Rendilo tuo
- Per le famiglie italiane: le foto dei nonni, con un album da regalare a Natale.
- Servizio di stampa delle foto restaurate.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Foto di Famiglia": restaura con l'AI le vecchie foto di famiglia rovinate (graffi, pieghe, macchie), le rende più nitide e, se si vuole, le colora. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con esempi prima/dopo e prezzi
2. Registrazione e accesso
3. Carica la foto (o la scansione) e scegli: restaura, rendi nitida, colora
4. Risultato con il cursore prima/dopo e download in alta qualità
5. Album delle foto restaurate
Stile: nostalgico e delicato: sfondo seppia chiaro #F5F0E6, marrone #6B4F3A, oro antico #B08D57, carattere "Cormorant Garamond" per i titoli e "Inter" per i testi, foto con bordo bianco come le stampe d'epoca. 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:
- "foto": originale e risultati nello Storage, operazioni scelte, data, collegate all'utente
Regole di sicurezza obbligatorie:
- ogni utente vede solo le sue foto
- le foto stanno in uno spazio privato
- i crediti non si modificano dal browser
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. Restauro e colore
L'utente carica la foto (anche una scansione di qualità alta, fino a 20 MB) e sceglie le operazioni: restauro (graffi, pieghe, macchie), nitidezza dei volti, colore. Mostra un consiglio per fotografare bene una stampa: luce naturale, niente riflessi, foto dritta.
Una Edge Function scala un credito e invia la foto a un'API di restauro e colorazione di immagini. Il risultato si vede con il cursore prima/dopo (codice nei Dettagli tecnici) e si scarica in alta qualità.
Nota onesta sotto le foto colorate: "I colori sono ricostruiti dall'AI e possono non essere quelli reali".
4. Album e regali
Album delle foto restaurate con titolo e anno facoltativi, e la possibilità di condividerne uno con i parenti tramite un link privato.
Prodotti regalo: stampa della foto restaurata o fotolibro tramite un servizio di stampa partner. Cancellazione di tutte le foto in un clic.
5. Pagamenti con Stripe
Aggiungi pacchetti di crediti: 5 foto a 4,99 €, 20 foto a 14,99 €. Ogni nuovo utente riceve 1 crediti gratis. Ogni foto restaurata costa un credito, la colorazione è inclusa. Mostra sempre in alto quanti crediti restano e, quando finiscono, un riquadro per comprarne altri.
A pagamento riuscito il webhook aggiunge i crediti del pacchetto con la funzione aggiungi_crediti.
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. Volti: verifica su 5 foto di gruppo che il restauro non cambi i lineamenti delle persone.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Il cursore prima/dopo
Due immagini sovrapposte: quella sopra si taglia in base alla posizione del cursore, che si trascina con il dito o il mouse.
import { useState } from "react";
export function PrimaDopo({ prima, dopo }: { prima: string; dopo: string }) {
const [posizione, setPosizione] = useState(50); // percentuale
return (
<div style={{ position: "relative", userSelect: "none" }}>
<img src={dopo} alt="Foto restaurata" style={{ display: "block", width: "100%" }} />
<img
src={prima}
alt="Foto originale"
style={{
position: "absolute", inset: 0, width: "100%", height: "100%",
clipPath: "inset(0 " + (100 - posizione) + "% 0 0)", // mostra solo la parte sinistra
}}
/>
<input
type="range" min={0} max={100} value={posizione}
onChange={(e) => setPosizione(Number(e.target.value))}
aria-label="Confronta prima e dopo"
style={{ position: "absolute", inset: 0, width: "100%", height: "100%", opacity: 0, cursor: "ew-resize" }}
/>
<div style={{ position: "absolute", top: 0, bottom: 0, left: posizione + "%", width: 2, background: "#fff" }} />
</div>
);
}Foto e Storage privato
Le foto con le operazioni scelte, in uno spazio privato con una cartella per utente.
create table foto (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
titolo text,
anno int,
operazioni text[] not null, -- es. {restauro, nitidezza, colore}
originale_path text not null,
risultato_path text,
creato_il timestamptz not null default now()
);
alter table foto enable row level security;
create policy "le mie righe" on foto
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
insert into storage.buckets (id, name, public) values ('vecchie-foto', 'vecchie-foto', false);
create policy "la mia cartella vecchie-foto" on storage.objects for all to authenticated
using (bucket_id = 'vecchie-foto' and (storage.foldername(name))[1] = auth.uid()::text)
with check (bucket_id = 'vecchie-foto' and (storage.foldername(name))[1] = auth.uid()::text);
Pezzi comuni a tutti i progetti
Glossario
- Storage
- Lo spazio di Supabase dove si salvano i file, come foto e audio, con le sue regole di accesso.