← Tutte le idee Intelligenza artificiale

Screenshot to Code

Fai uno screenshot di un sito e ottieni il codice per rifarlo

Incasso mensile: 4700 USD (fonte indicata nella scheda)

Cosa fa

L'utente carica uno screenshot o un disegno di una pagina, e l'AI scrive il codice (HTML, React, Tailwind) che la riproduce. Utile a chi crea siti per partire più in fretta.

Come guadagna

Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.

Rendilo tuo

  • Da una foto di un menù o di un volantino a una pagina web pronta per ristoranti e negozi.
  • Da un disegno fatto a mano su carta a un sito vero, pensato per chi non sa programmare.
  • Nota: usalo per le tue idee, non per copiare il sito di qualcun altro.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Da Foto a Codice": trasforma lo screenshot o il disegno di una pagina web nel codice HTML e Tailwind che la riproduce, da usare come punto di partenza. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con esempi screenshot → pagina e prezzi
2. Registrazione e accesso
3. Nuova conversione: carica l'immagine e scegli il formato (HTML + Tailwind o React)
4. Risultato: anteprima e codice affiancati
5. Le mie conversioni

Stile: da strumento per sviluppatori: sfondo scuro #0B1120, testo #E2E8F0, accento ciano #22D3EE, carattere "Inter" e "JetBrains Mono" per il codice. 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:
- "conversioni": immagine nello Storage, formato, codice ottenuto, richieste di modifica, collegate all'utente

Regole di sicurezza obbligatorie:
- ogni utente vede solo le sue conversioni e immagini
- 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. La conversione

L'utente carica un'immagine (PNG o JPG, massimo 5 MB) o la incolla con Ctrl+V, e sceglie il formato: HTML con Tailwind, oppure componente React con Tailwind.

La Edge Function "converti" (un credito, codice nei Dettagli tecnici) invia l'immagine a Claude, che restituisce il codice completo: struttura fedele, colori e spaziature il più possibile uguali, testi copiati dall'immagine, immagini sostituite da riquadri segnaposto.

Il risultato si vede affiancato: a sinistra lo screenshot, a destra l'anteprima dentro un iframe isolato, e sotto il codice con il pulsante Copia e Scarica.

4. Ritocchi a parole

Sotto il risultato c'è un campo per chiedere modifiche ("rendi il menu scuro", "aggiungi la versione per telefono"): ogni modifica costa un credito e crea una nuova versione, con la cronologia per tornare indietro.

Pagina "Le mie conversioni" con miniature, formato e data. Ricorda nella pagina che bisogna avere il diritto di riprodurre il design dell'immagine caricata.

5. Pagamenti con Stripe

Aggiungi pacchetti di crediti: 25 conversioni a 9 €, 100 conversioni a 29 €. Ogni nuovo utente riceve 3 crediti gratis. Ogni conversione o modifica costa un credito. 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. Sicurezza: mostra il codice generato solo dentro un iframe con sandbox, mai inserito direttamente nella pagina del sito.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Conversione dell'immagine con Claude

La parte centrale della Edge Function: invia l'immagine a Claude e riceve il codice. Credito e accesso si controllano prima, come nelle altre funzioni.

import Anthropic from "npm:@anthropic-ai/sdk";
import { encodeBase64 } from "jsr:@std/encoding/base64";

const claude = new Anthropic({ apiKey: Deno.env.get("ANTHROPIC_API_KEY")! });

const ISTRUZIONI = {
  html: "Restituisci un unico file HTML completo che usa Tailwind CSS da CDN.",
  react: "Restituisci un unico componente React in TypeScript che usa classi Tailwind.",
};

export async function converti(immagine: Uint8Array, tipo: "image/png" | "image/jpeg", formato: "html" | "react") {
  const risposta = await claude.beta.messages.create({
    model: "claude-opus-5",
    max_tokens: 16000,
    betas: ["server-side-fallback-2026-07-01"],
    fallbacks: "default",
    system: "Riproduci fedelmente la pagina web dello screenshot. " + ISTRUZIONI[formato] +
      " Copia i testi visibili, rispetta colori, spaziature e allineamenti, sostituisci le immagini" +
      " con riquadri grigi della stessa misura. Rispondi solo con il codice, senza spiegazioni.",
    messages: [{
      role: "user",
      content: [
        { type: "image", source: { type: "base64", media_type: tipo, data: encodeBase64(immagine) } },
        { type: "text", text: "Converti questa pagina in codice." },
      ],
    }],
  });
  if (risposta.stop_reason === "refusal") return null;   // e si restituisce il credito
  return risposta.content.filter((b) => b.type === "text").map((b) => b.text).join("");
}

Tabella e Storage

Le conversioni con le loro versioni e lo spazio privato per le immagini.

create table conversioni (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,
  immagine_path text not null,
  formato text not null check (formato in ('html', 'react')),
  versioni jsonb not null default '[]',   -- [{ richiesta, codice, creato_il }]
  creato_il timestamptz not null default now()
);

alter table conversioni enable row level security;
create policy "le mie righe" on conversioni
  for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);

insert into storage.buckets (id, name, public) values ('screenshot', 'screenshot', false);
create policy "la mia cartella" on storage.objects for all to authenticated
  using (bucket_id = 'screenshot' and (storage.foldername(name))[1] = auth.uid()::text)
  with check (bucket_id = 'screenshot' 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.
iframe sandbox
Una finestra isolata dentro la pagina, che mostra un contenuto senza permettergli di toccare il resto del sito.