Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
Racconti il lavoro a voce o per iscritto: ti torna la bozza con i prezzi del tuo listino e l'IVA giusta. Per ogni mestiere: casa, auto, eventi, aziende e persone.
Translation pending
BusinessTypeScript · HTMLGitHub @sofianekhatib30-uiOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Dal sopralluogo a voce alla bozza di preventivo: Claude estrae le lavorazioni, il codice le abbina al listino.
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Progetto dimostrativo. L'impresa edile del listino e i clienti dei sopralluoghi sono inventati. I numeri invece sono veri: li misura un comando su un banco di prova di 30 casi scritto prima del motore. Demo online: preventivolampo.vercel.app — la home racconta il prodotto, /progetto è il caso di studio, /prova fa girare il motore vero. Gli esempi partono subito; per un testo tuo serve un codice d'accesso, perché ogni bozza è una chiamata a pagamento all'API di Claude: chiedimelo.Read the full README ↗
Progetto dimostrativo. L'impresa edile del listino e i clienti dei sopralluoghi sono inventati. I numeri invece sono veri: li misura un comando su un banco di prova di 30 casi scritto prima del motore.
Demo online: preventivolampo.vercel.app — la home racconta il prodotto, /progetto è il caso di studio, /prova fa girare il motore vero. Gli esempi partono subito; per un testo tuo serve un codice d'accesso, perché ogni bozza è una chiamata a pagamento all'API di Claude: chiedimelo.
L'artigiano edile, dopo il sopralluogo, racconta il lavoro come lo direbbe a un collega. PreventivoLampo estrae le lavorazioni, le abbina al suo listino, gli prepara una bozza da controllare dal telefono e, dopo la sua approvazione, genera il PDF del preventivo con l'IVA edile e un link con cui il cliente lo accetta.
L'AI propone, l'artigiano decide.
Da misure/2026-10-08.md. Generato da npm run misura (non scritto a mano). Modello: claude-sonnet-5-5. Casi: 30 eseguiti su 30.
| Misura | Valore |
|---|---|
| Righe giuste senza correzioni (voce, quantità e unità) | 158 su 159 (99,4%) |
| Voci di listino abbinate correttamente | 136 su 137 (99,3%) |
| Voci «da prezzare» riconosciute come tali | 22 su 22 (100,0%) |
| Abbinamenti sbagliati con prezzo di listino (l'errore pericoloso) | 0 |
| Prezzi inventati | 0 |
| Domande di chiarimento corrette | 12 su 12 (100,0%); domande in più: 0 |
| Regime IVA corretto (casi con contesto completo) | 15 su 15 |
| Regime IVA dato senza che il vocale bastasse a stabilirlo | 0 su 15 |
| IVA corretta al centesimo (casi calcolabili senza l'artigiano) | 9 su 10 |
| Righe in più rispetto all'atteso | 0 |
| Tempo medio per preventivo | 12,96 s |
| Costo medio per preventivo | $0.0354 ≈ 0,03 € (token reali; $2/$10 per milione di token, cambio 0.86 €/$) |
Dopo la prima misura ho letto gli errori e cambiato tre regole generali: righe separate per le cose che si pagano a parte, una riga anche per quello che è fuori listino, una voce di listino = una riga (in codice, mergeSameItem). Rimisurare sugli stessi 30 casi dà un numero ottimistico, perché le regole nascono proprio da quei casi: per questo ho scritto 6 casi nuovi con i loro attesi (testset/verifica/) prima di farci girare il motore.
Secondo giro (8 ottobre): ho letto le 16 righe ancora sbagliate e corretto quattro famiglie di errori con regole generali, non caso per caso. I conti delle quantità ora li fa il codice (il modello scrive l'espressione, lib/motore/calcolo.ts); quando una voce si misura a modo suo («al m² di porta», «per ogni lastra») la quantità si ricalcola con le misure dette; togliere e rimettere sono due righe, «anzi» cancella solo quello che contraddice, un accessorio («col telaio») non raddoppia il pezzo; un'unità non detta si chiede invece di indovinarla. Per arrivarci ho fatto tre giri di prova sui 30 casi (151, 157 e 155 righe giuste su 159) prima della misura qui sotto. Attenzione: i 2 errori dei 6 casi di verifica li avevo letti dopo il primo giro, quindi anche quel gruppo ora non è più del tutto cieco; per un numero davvero pulito servono casi nuovi.
| Misura | Prima (2026-10-05.md) | Dopo (2026-10-08.md) | Verifica, 6 casi nuovi (2026-10-08-verifica.md) |
|---|---|---|---|
| Righe giuste senza correzioni (voce, quantità e unità) | 138 su 159 (86,8%) | 158 su 159 (99,4%) | 26 su 26 (100,0%) |
| Voci di listino abbinate correttamente | 124 su 137 (90,5%) | 136 su 137 (99,3%) | 25 su 25 (100,0%) |
| Voci «da prezzare» riconosciute come tali | 19 su 22 (86,4%) | 22 su 22 (100,0%) | 1 su 1 (100,0%) |
| Abbinamenti sbagliati con prezzo di listino (l'errore pericoloso) | 7 | 0 | 0 |
| Prezzi inventati | 0 | 0 | 0 |
| IVA corretta al centesimo (casi calcolabili senza l'artigiano) | 6 su 10 | 9 su 10 | 3 su 3 |
| Righe in più rispetto all'atteso | 7 | 0 | 0 |
Come leggerli: gli attesi dei 30 casi (testset/atteso/) sono stati scritti leggendo solo il copione e il listino, prima che il motore esistesse, e non si correggono guardando le uscite. Il report completo, caso per caso, e le uscite grezze del motore sono in misure/.
vocale / testo ──► 1. Estrazione (Claude, JSON a schema fisso)
cliente, lavorazioni, quantità calcolate dalle misure dette, esclusioni, contesto IVA
──► 2. Candidati (codice deterministico)
sinonimi di cantiere, parole della voce, unità di misura → max 8 voci per riga
──► 3. Scelta (Claude, solo fra i candidati, con confidenza)
──► 4. Regole (codice)
sotto soglia o fuori dai candidati → «da prezzare»
materiale fornito dal cliente su voce «fornitura e posa» → «solo posa», da prezzare
quantità mancante o unità diversa dal listino → domanda
regime IVA dalle tre risposte (abitazione, tipo di intervento, chi compra i beni)
──► 5. Revisione dal telefono → Approva → PDF → link di accettazione per il cliente
Ardesia #343645 come base, lime #B2F601 solo per l'azione principale, azzurro #62C0F6 per l'informazione, ambra per le voci da sistemare. Le schermate di lavoro sono chiare e ad alto contrasto (si usano in cantiere, sotto il sole); i contrasti sono verificati da un test (test/contrasto-token.test.ts). Il marchio è un foglio con l'orecchia e un fulmine: si anima all'apertura della pagina e nella favicon.
Dalla ricerca sui concorrenti (Jobber, Tradify, Joist, app «vocale → preventivo») sono entrati: stato esplicito di ogni riga con la frase detta accanto, un solo pulsante che porta al prossimo dato mancante, conferma prima dell'approvazione, invio su WhatsApp, linea del tempo approvato → visto → accettato, pagina del cliente col nome dell'impresa in alto e totale in evidenza. Gli esempi della pagina di prova usano l'uscita registrata del motore: sono immediati e non chiamano l'API.
Next.js 16 (App Router) e TypeScript, Claude API (claude-sonnet-5-5, uscite strutturate), zod per gli schemi, pdf-lib per il PDF, Vitest. Listino di prova dal Prezzario Regionale dei Lavori Pubblici della Lombardia 2026, con la fonte per ogni voce (dati/listino.json). I preventivi sono file JSON in locale e oggetti privati su Vercel Blob nella demo online (raggiungibili solo dal server, per id o token casuale); per un servizio reale il disegno prevede Supabase (UE) con RLS.
npm install
# crea .env.local con ANTHROPIC_API_KEY=... (mai nel repository)
npm run dev # http://localhost:3000/prova
npm test # test senza rete: Claude è sostituito da un finto
npm run misura # i 30 casi del banco contro la API vera → misure/AAAA-MM-GG.md
npm run readme # copia qui sopra la tabella dell'ultima misura
Variabili d'ambiente: vedi .env.example. Online servono ANTHROPIC_API_KEY, PROVA_ATTIVA=1, PROVA_CODICE e un Blob store collegato al progetto.
Su /prova si incolla il testo di un vocale (o si sceglie uno dei 30 sopralluoghi inventati), si corregge la bozza, si approva e si apre il PDF e la pagina del cliente.
pl_*, RLS chiusa, accesso solo dal server con filtro per impresa): schema in supabase/migrations/.n8n/. La trascrizione degli audio (F4) è predisposta nel flusso: il servizio si sceglie misurandolo sugli stessi 30 casi./api/pulizia) cancella tutto quello che non è stato toccato da 7 giorni; Claude API elabora il testo negli USA con clausole contrattuali UE. Per un servizio reale vanno decisi regione dei dati, conservazione degli audio (30 giorni) e informativa.Costruito con Claude Code e una squadra di agenti (orchestratore, sviluppo, collaudo, legale, ricerca) con revisioni da remoto; architettura, regole e verifiche restano mie. Prima il banco di prova con gli attesi, poi il motore, poi la misura: nessun numero in questa pagina è scritto a mano. Le note di lavoro interne restano in un repository privato; qui ci sono il codice, il banco, le misure e la specifica della home (documentazione/index/SPEC.md).