Mirobody
The canonical registry of human health — roughly two thousand standardized indicators, clinical and lifestyle, resolved into one language.
Piani alimentari realistici, semplici e adattati alla vita quotidiana.
Translation pending
HealthTypeScript · JavaScriptGitHub @rdl1980OnlineOwner 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
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗MVP Next.js per un planner alimentare assistito da logica locale deterministica.
npm install
npm run dev
npm test # Vitest: unit (src), API route (tests/api), componenti jsdom (tests/components)
npm run test:unit
npm run test:api
npm run test:components
npm run test:ai-eval
npm run test:e2e # Playwright pubblico + autenticato (se E2E_TEST_EMAIL/PASSWORD presenti)
npm run test:e2e:production # smoke contro https://dietsprintai.com (o PLAYWRIGHT_BASE_URL)
npm run lint
npm run build
npm run db:backup
Il progetto Supabase originale non esiste piu': la procedura per ricrearlo, riapplicare lo schema e riallineare le variabili Vercel e' in docs/supabase-restore.md. Finche' non viene ripristinato, registrazione, login e salvataggio piani in produzione non funzionano; planner e risultati Free restano operativi.
//onboarding/planner/results/pricing/register/login/forgot-password/account/account/privacy/admin/users/admin/privacy/admin/templates/legal/disclaimerIl comportamento con condizioni mediche selezionate nel planner e' controllato da NEXT_PUBLIC_MEDICAL_SCREENING_MODE:
warn (default): il piano viene generato come bozza con un avviso di review medica in cima.block: planner, salvataggio (POST /api/plans) e generazione AI (POST /api/plans/generate) rifiutano il profilo con errore 422.La decisione definitiva va presa con legale e nutrizionista; la checklist di go-live e' in docs/go-live-checklist.md.
Le sessioni dell'app sono gestite da Auth.js (next-auth@5) con strategia JWT. Supabase Auth continua a gestire utenti, password, conferma email e recupero password. Il token Supabase resta nel cookie cifrato Auth.js e viene usato lato server per rispettare le policy RLS.
Genera e configura un segreto server-only:
AUTH_SECRET=
Non esporre il magic link come metodo di login.
In Supabase vai su Authentication > Providers > Email e abilita:
Per conferma account, in Confirm signup usa:
<a href="{{ .SiteURL }}/auth/confirm?token_hash={{ .TokenHash }}&type=signup">Conferma account</a>
Per recupero password, in Reset password usa:
<a href="{{ .SiteURL }}/auth/confirm?token_hash={{ .TokenHash }}&type=recovery&next=/account/password">Reimposta password</a>
In Authentication > URL Configuration imposta:
https://dietsprintai.comhttps://dietsprintai.com/auth/confirmhttps://www.dietsprintai.com/auth/confirmhttps://appdietasprint.vercel.app/auth/confirmhttp://127.0.0.1:3000/auth/confirmIl progetto usa database e autenticazione Supabase quando le variabili pubbliche Supabase sono configurate.
Le email applicative usano Resend lato server. Le email di conferma account e recupero password usano Resend tramite il custom SMTP di Supabase Auth.
Configurazione SMTP Supabase:
Host: smtp.resend.com
Porta: 465
Username: resend
Mittente: Diet Sprint AI <[email protected]>
La password SMTP e' una API key Resend con permesso di invio sul dominio dietsprintai.com. Non salvarla nel repository.
Variabili server-only:
RESEND_API_KEY=
RESEND_FROM_EMAIL="Diet Sprint AI <[email protected]>"
PRIVACY_NOTIFICATION_EMAIL=
Lo snapshot iniziale vive in supabase/schema.sql. Le migrazioni versionate vivono in supabase/migrations.
La procedura operativa per backup e restore vive in docs/backup-restore-runbook.md.
La procedura preview/staging vive in docs/preview-staging.md.
La checklist security, accessibilita e performance vive in docs/security-accessibility-performance.md.
Le tabelle MVP sono:
user_profilesmeal_plansprivacy_consentsdata_subject_requestsstripe_purchasesdata_subject_request_audit_eventsadmin_meal_templatesTutte hanno Row Level Security attiva. Le policy consentono agli utenti autenticati di accedere solo ai propri dati.
Comandi database:
npm run db:backup
npm run db:restore -- backups/supabase-YYYY-MM-DD.dump
Il backlog interno vive su /admin/backlog ed e' protetto lato server. La voce di menu appare solo agli utenti admin.
La sorgente dati della UI backlog e' src/lib/productBacklog.ts; il riepilogo markdown unico vive in PROJECT_SUMMARY_AND_BACKLOG.md.
Pannelli admin disponibili:
/admin/users: ricerca utenti e sblocco Free/Premium per supporto./admin/privacy: coda richieste GDPR con audit trail append-only./admin/templates: catalogo template pasti e CRUD dei template gestiti in database.Per creare l'admin rdladmin:
Opzione consigliata, script locale:
set NEXT_PUBLIC_SUPABASE_URL=https://PROJECT_REF.supabase.co
set SUPABASE_SERVICE_ROLE_KEY=service-role-key
set [email protected]
set ADMIN_USERNAME=rdladmin
npm run admin:create
Lo script chiedera' la password senza salvarla nel repository. In PowerShell usa $env:NOME_VARIABILE="valore" al posto di set.
Opzione manuale:
{
"username": "rdladmin",
"role": "admin"
}
[email protected]
ADMIN_USERNAMES=rdladmin
Non salvare password admin in codice, README o variabili pubbliche NEXT_PUBLIC_*.
Premium usa Stripe Checkout in modalita pagamento una tantum. Il bottone su /pricing crea una sessione server-side per utenti autenticati e il webhook sblocca Premium aggiornando gli app metadata Supabase (plan=premium, tier=premium, accessLevel=premium) e registrando l'acquisto in stripe_purchases.
Variabili server-only:
STRIPE_SECRET_KEY=
STRIPE_WEBHOOK_SECRET=
STRIPE_PREMIUM_PRICE_ID=
Endpoint webhook da configurare in Stripe:
https://dietsprintai.com/api/stripe/webhook
Eventi necessari:
checkout.session.completedcheckout.session.async_payment_succeededPer staging o sblocco manuale resta disponibile il fallback via app metadata Supabase (plan=premium, tier=premium o accessLevel=premium) oppure con la variabile server-only PREMIUM_EMAILS.
Il layer AI (src/lib/ai/provider.ts) e' indipendente dal provider: con AI_PROVIDER=auto usa Anthropic se ANTHROPIC_API_KEY e' presente, altrimenti OpenAI se OPENAI_API_KEY e' presente, altrimenti il fallback deterministico locale.
/api/coach: coach per utenti Premium autenticati. Il prompt resta server-side e passa dai guardrail salute prima e dopo la generazione./api/plans/generate: generazione piano AI per utenti Premium. La risposta del modello viene validata contro lo schema del planner (slot pasto, calorie entro il 12%, ingredienti esclusi, claim medici) e in caso di dubbio si torna al generatore deterministico; il campo source dice se il piano e' ai o fallback.Variabili server-only:
AI_PROVIDER=auto
ANTHROPIC_API_KEY=
ANTHROPIC_MODEL=claude-opus-5-5
OPENAI_API_KEY=
OPENAI_MODEL=gpt-5.4-mini
Il dataset di regressione vive in tests/evals/ai-coach-cases.json e si esegue con:
npm run test:ai-eval