尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗App web multi-utente per tracciare patrimonio (liquidità, ETF, crypto, crediti), entrate, spese e versamenti PAC. Ogni utente vede solo i propri dati: l'isolamento è imposto dal database (Row Level Security).
Non è consulenza finanziaria. Strumento di tracciamento personale. La proiezione del PAC è un'ipotesi a rendimento costante, senza tasse, commissioni né inflazione. L'app non dà mai indicazioni di acquisto o vendita. Non chiede né salva credenziali di broker o banche: saldi e quote si inseriscono a mano, solo i prezzi di mercato sono automatici.
| Milestone | Stato |
|---|---|
| M1 base: auth, RLS, asset, movimenti, categorie, snapshot manuali, 3 viste, test di calcolo | fatto |
| M2 prezzi automatici (strumenti, job giornaliero, snapshot automatici) | fatto, vedi "Prezzi automatici" (EODHD/Alpha Vantage non ancora provati con una chiave reale) |
| M3 apertura agli amici (onboarding, demo, inviti, export JSON, cancellazione account, PWA) | fatto nel codice; manca il deploy (vedi sotto) |
Le porte locali di Supabase sono 553xx (API 55321, database 55322, Studio 55323, Mailpit 55324): Windows riserva a rotazione degli intervalli di porte e dopo un riavvio aveva incluso le 543xx, impedendo l'avvio.
Servono Node 24, pnpm e Docker Desktop acceso.
pnpm install
pnpm exec supabase start # DB + Auth + Mailpit in locale; applica le migrazioni
pnpm exec supabase status # copia URL e chiavi in .env.local (vedi .env.example)
pnpm dev # http://localhost:3000
insert into invite_codes (code, max_uses) values ('DEV-LOCAL', 5); (Studio: http://127.0.0.1:55323)update app_config set value = 'open' where key = 'signup_mode';Un account per ogni email, con email e password scelta dall'utente (8-72 caratteri). Nessuna email di verifica: niente link da aprire, quindi funziona anche nell'app installata su iPhone, e non ci sono limiti di invio email. La registrazione richiede il codice invito (controllato da un trigger del database), gli accessi successivi no. Tentativi limitati: 8 accessi per email e 30 per IP ogni 10 minuti.
Password dimenticata: non c'è il reset via email (servirebbe un SMTP personalizzato). Si reimposta dalla dashboard Supabase, Authentication, Users. Per il cloud la configurazione è [remotes.production] in supabase/config.toml (conferma email spenta, password minima 8) e si applica con pnpm exec supabase config push; alla domanda sullo storage rispondi "No".
La registrazione è su codice. Per crearne uno (serve il file .env.local con la chiave di servizio, quindi solo sul tuo PC):
pnpm invite 3 14 # codice valido per 3 persone, scade tra 14 giorni (entrambi opzionali)
Per aprire o chiudere la registrazione: update app_config set value = 'open' where key = 'signup_mode'; ('invite' per richiedere il codice).
tracker (ultima del file degli asset) porta l'ISIN o il ticker di ETF e azioni e il simbolo delle crypto (per esempio BTC): all'importazione l'app cerca lo strumento e collega da sola il prezzo automatico, quindi con un solo upload hai asset e prezzi. Vale anche per asset già presenti con lo stesso nome e senza prezzo collegato. Il collegamento si fa solo se la corrispondenza è esatta (ISIN uguale, ticker uguale, simbolo uguale), con la quotazione in euro e la borsa preferita tra Xetra, Milano, Parigi, Amsterdam, Londra; per gli ETF ogni ricerca usa una delle chiamate gratuite giornaliere EODHD, e se finiscono i restanti si collegano a mano dal Portafoglio (il messaggio finale dice quanti). L'esportazione scrive il tracker (ISIN o simbolo) dei prezzi già collegati, così un file esportato ricollega tutto in un colpo. Per avere il valore da prezzo servono anche le quote (initial_units). Per una copia completa usa il JSON./fire): numero FIRE = spese annuali ÷ tasso di prelievo, progresso, anni e mese stimati per arrivarci con i versamenti attuali, Coast FIRE (con età attuale e di pensionamento), grafico e tabella di sensibilità (rendimento × prelievo). Parte dai tuoi dati (capitale investito, media spese ultimi 12 mesi, PAC mensili) e ogni ipotesi è modificabile. Tutto in euro di oggi: il rendimento va inserito . Le ipotesi (tassi, età) restano solo nel tuo browser. Non è consulenza e non indica cosa comprare o vendere.pnpm exec supabase link --project-ref <ref> poi pnpm exec supabase db push.https://<tuo-dominio>/auth/callback ai Redirect URLs..env.example (chiavi di produzione, non quelle locali; usa chiavi di test per le preview). Imposta SITE_URL e un CRON_SECRET lungo.vercel.json schedula il job prezzi una volta al giorno (il piano Hobby ammette un cron al giorno).pnpm invite puntando .env.local al progetto cloud.Backup: ogni utente può scaricare il proprio JSON da Impostazioni. Per un backup del database intero usa quelli di Supabase (giornalieri sul piano a pagamento) o supabase db dump.
pnpm test # unità: calcoli (sezione 5 del handoff), formati, CSV, prezzi vecchi
pnpm test:db # RLS: l'utente B non vede né modifica i dati di A (serve supabase start)
pnpm typecheck && pnpm lint && pnpm build
Un job giornaliero (GET /api/cron/prices, protetto da CRON_SECRET, schedulato in vercel.json alle 16:45 UTC, dopo la chiusura di Xetra) aggiorna i prezzi degli strumenti collegati ad almeno un asset, poi salva lo snapshot automatico di ogni utente (source = 'auto'; uno snapshot manuale dello stesso giorno non viene sovrascritto). È idempotente: upsert su (instrument_id, date).
| Dato | Provider | Limite gratuito | Note |
|---|---|---|---|
| Crypto | CoinGecko (Demo) | 100/min, 10.000/mese | una chiamata per tutte le monete; attribuzione obbligatoria (footer); la chiave è opzionale, senza si usa l'endpoint pubblico |
| ETF e azioni | EODHD, primario | 20 chiamate/giorno, solo fine giornata | ricerca per ISIN, ticker o nome (costa 1 chiamata); simboli tipo VWCE.XETRA |
| ETF e azioni | Alpha Vantage, riserva | 25 chiamate/giorno | usato se EODHD fallisce o ha finito il budget; simboli .DEX (Xetra), .LON (Londra) |
| Cambio | BCE eurofxref-daily.xml | nessuna chiave | solo per strumenti non in EUR; i prezzi in pence (GBX) sono gestiti |
Come funziona il budget: le chiamate crescono con gli strumenti distinti (non con gli utenti). Il job conta le chiamate per provider e giorno (provider_calls) e, se gli strumenti sono più del budget, aggiorna a rotazione i più vecchi. Nel weekend aggiorna solo le crypto. Un prezzo che non si aggiorna non rompe la pagina: resta l'ultimo valore con l'avviso oltre 3 giorni lavorativi.
Collegare un asset: Portafoglio, Modifica, "Prezzo automatico", cerca e collega. I risultati sono firmati dal server (INSTRUMENT_SIGNING_SECRET) così nessun utente può inventare strumenti e consumare il budget condiviso.
Termini d'uso, da verificare prima di invitare gli amici. I piani gratuiti di prezzi azionari sono pensati per uso personale; i termini EODHD per l'uso non professionale vietano di mostrare i dati ad altri, e i termini Alpha Vantage non sono stati letti. Scrivi al supporto del provider o passa a un piano a pagamento. Non è stato verificato che i ticker UCITS reali siano coperti dai piani gratuiti: serve una prova con una chiave vera.
Prova a mano in locale: curl -H "Authorization: Bearer $CRON_SECRET" http://localhost:3000/api/cron/prices
supabase/migrations/ schema, RLS, trigger di registrazione (controllo invito, profilo, categorie predefinite).src/lib/calc/ funzioni pure di calcolo (valore asset, patrimonio, tasso di risparmio, proiezione, "Incassato"). Nessun I/O.src/app/actions.ts server actions: autenticazione, validazione zod, scrittura con il client dell'utente (RLS attiva).src/messages/it.ts tutte le stringhe dell'interfaccia (i18n pronta per l'inglese).src/lib/prices/ provider (CoinGecko, EODHD, Alpha Vantage), cambio BCE, orchestratore del job (run.ts, testato con provider finti).src/app/instruments.ts ricerca e collegamento strumenti (firmati).src/proxy.ts rinfresca la sessione e rimanda al login.Nome MyFinance, registrazione su codice invito (configurabile), repo privato, solo italiano, solo EUR (il modello dati ha già currency), mittente email predefinito del servizio.
etf e bond (nel prototipo erano ETF azionario + obbligazionario). Le stock ne restano fuori.Il piano gratuito Supabase ha un limite di progetti attivi: se è esaurito, libera o metti in pausa un vecchio progetto, oppure usa un altro Postgres (Neon, ecc.) e sostituisci Auth. Le migrazioni sono SQL standard; solo auth.users, auth.uid() e il trigger di registrazione dipendono da Supabase.
Audit prima del rilascio (checklist vibe-security + revisione manuale). Corretti nel codice:
SECURITY DEFINER interne non chiamabili da anon/authenticated (test automatico);rate_limits, funzione hit_rate_limit); il limiter fallisce "aperto" se il DB non risponde, i limiti dei provider restano;SITE_URL e non gli header della richiesta;Limiti noti e accettati: la CSP non ha script-src stretto (servono nonce per richiesta); con un codice invito sbagliato un indirizzo sconosciuto si distingue da uno noto (app su invito, con rate limit); il rate limit usa l'IP inoltrato dall'hosting, quindi dietro un proxy diverso da Vercel va verificato.
Il resto:
RLS su ogni tabella utente; chiave di servizio solo lato server (src/lib/supabase/admin.ts); la FK composita (asset_id, user_id) impedisce di collegare un movimento all'asset di un altro utente; export CSV protetto da formula injection. Nessun tracker o analytics.
/demo: dashboard in sola lettura con dati inventati, senza account. Come funziona /come-funziona: due schermate.