Give your agent a wallet you control.
에이전트가 일회용 카드나 기계 결제 프로토콜로 온라인 결제하고, 모든 요청을 직접 승인
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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.