BlitzCut
Video parlati pronti per TikTok in pochi minuti
Incasso mensile: 2000 USD (fonte indicata nella scheda)
Cosa fa
Toglie in automatico i silenzi imbarazzanti dai video in cui si parla alla camera e aggiunge sottotitoli accattivanti.
Come guadagna
Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.
Rendilo tuo
- Pensato per professionisti che fanno video informativi: avvocati, medici, agenti immobiliari.
- Modelli di sottotitoli in stile italiano.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Taglia Pause": toglie in automatico i silenzi e le pause dai video in cui si parla alla camera e aggiunge sottotitoli animati, pronti per Reels, TikTok e Shorts. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con un video prima/dopo e prezzi
2. Registrazione e accesso
3. Caricamento del video e scelta dell'intensità del taglio
4. Editor: linea del tempo con i tagli proposti da accettare o annullare
5. Esportazione e i miei video
Stile: veloce e creativo: sfondo scuro #0F0F14, verde acido #A3E635, bianco, carattere "Inter", linea del tempo con le parti tagliate in rosso. 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:
- "video": file originale e finale nello Storage, durata prima e dopo, impostazioni del taglio, stato, collegati all'utente
- "tagli": inizio e fine di ogni pausa trovata, accettato o no
Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi video
- i minuti disponibili non si modificano dal browser
- i video si cancellano dopo 14 giorni
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. Trovare e togliere le pause
L'utente carica il video e sceglie l'intensità: leggera (pause oltre 0,8 secondi), media (0,5), forte (0,3). Sul server, FFmpeg con il filtro "silencedetect" trova i silenzi; il codice nei Dettagli tecnici li trasforma nelle parti da tenere, lasciando 0,1 secondi di margine per non tagliare le parole.
L'editor mostra la linea del tempo con le pause in rosso: cliccandone una si ascolta e si può annullare il taglio. In alto: "Durata: 2:14 → 1:37".
Al conferma, FFmpeg unisce le parti tenute e crea il video finale.
4. Sottotitoli animati ed esportazione
Dopo il taglio, trascrivi l'audio con un servizio di trascrizione e aggiungi i sottotitoli: 3 stili (una parola alla volta grande al centro, due righe in basso, parola evidenziata), colore e carattere a scelta, correggibili prima dell'esportazione.
Esporta in 9:16 verticale, 1:1 e 16:9, fino a 1080p. Si scalano i minuti del video originale.
5. Pagamenti con Stripe
Aggiungi pacchetti di crediti: 60 minuti a 9 €, 300 minuti a 29 €. Ogni nuovo utente riceve 5 crediti gratis. Ogni minuto di video caricato costa un credito (minuto). 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. Taglio: con un video in cui si parla in fretta, controlla che non vengano tagliati pezzi di parole all'inizio o alla fine delle frasi.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Dai silenzi alle parti da tenere
FFmpeg trova i silenzi e li scrive nel registro. Questa funzione legge quel testo e calcola le parti di video da tenere, con un piccolo margine.
// Comando sul server:
// ffmpeg -i video.mp4 -af silencedetect=noise=-30dB:d=0.5 -f null - 2> registro.txt
type Parte = { inizio: number; fine: number };
export function partiDaTenere(registro: string, durata: number, margine = 0.1): Parte[] {
const inizi = [...registro.matchAll(/silence_start: ([\d.]+)/g)].map((m) => Number(m[1]));
const fini = [...registro.matchAll(/silence_end: ([\d.]+)/g)].map((m) => Number(m[1]));
const parti: Parte[] = [];
let cursore = 0;
inizi.forEach((inizioSilenzio, i) => {
const fineSilenzio = fini[i] ?? durata;
const fineParte = Math.min(inizioSilenzio + margine, durata);
if (fineParte - cursore > 0.2) parti.push({ inizio: cursore, fine: fineParte });
cursore = Math.max(fineSilenzio - margine, 0);
});
if (durata - cursore > 0.2) parti.push({ inizio: cursore, fine: durata });
return parti;
}
// Filtro FFmpeg che tiene solo le parti scelte (video e audio insieme)
export function filtroTaglio(parti: Parte[]): string {
const condizione = parti.map((p) => "between(t," + p.inizio + "," + p.fine + ")").join("+");
return "[0:v]select='" + condizione + "',setpts=N/FRAME_RATE/TB[v];" +
"[0:a]aselect='" + condizione + "',asetpts=N/SR/TB[a]";
}Tabelle del database
I video e le pause trovate, ognuna da accettare o annullare.
create table video (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
originale_path text not null,
finale_path text,
durata_prima numeric,
durata_dopo numeric,
intensita text not null default 'media' check (intensita in ('leggera', 'media', 'forte')),
stato text not null default 'caricato'
check (stato in ('caricato', 'analizzato', 'in_esportazione', 'pronto', 'errore'))
);
create table tagli (
id bigint generated always as identity primary key,
video_id uuid not null references video(id) on delete cascade,
utente_id uuid not null references auth.users(id) on delete cascade,
inizio numeric(8, 3) not null,
fine numeric(8, 3) not null,
accettato boolean not null default true
);
alter table video enable row level security;
create policy "le mie righe" on video
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
alter table tagli enable row level security;
create policy "le mie righe" on tagli
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
insert into storage.buckets (id, name, public) values ('video', 'video', false);
create policy "la mia cartella video" on storage.objects for all to authenticated
using (bucket_id = 'video' and (storage.foldername(name))[1] = auth.uid()::text)
with check (bucket_id = 'video' 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.
- FFmpeg
- Un programma gratuito che lavora i video: taglia, unisce, converte e aggiunge scritte.