尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Weeko organise la semaine : menus des 7 jours, recettes, liste de courses par rayon, budget, garde-manger, programme sportif, journal alimentaire, suivi du poids, bilan hebdomadaire et coach IA. Version web (Next.js) ; les apps iOS/Android viendront dans un second temps et réutiliseront le moteur et la base. Le moteur ne dépend ni de Next.js ni de MongoDB : l'app mobile (React Native / Expo) pourra l'utiliser tel quel.檢視完整 README ↗
Sorloo organise la semaine : menus des 7 jours, recettes, liste de courses par rayon, budget, garde-manger, programme sportif, journal alimentaire, suivi du poids, bilan hebdomadaire et coach IA. Version web (Next.js) ; les apps iOS/Android viendront dans un second temps et réutiliseront le moteur et la base.
| Dossier | Contenu |
|---|---|
packages/engine | Moteur en TypeScript pur, testé : besoins (Mifflin-St Jeor), règles de sécurité santé, génération de la semaine (budget, restes, anti-gaspillage, famille), courses, adaptations, sport, bilan. Aucun appel réseau. |
packages/catalog | Données : 199 ingrédients (valeurs nutritionnelles type CIQUAL, prix moyens France, conditionnements), 1 521 recettes, 47 exercices. |
apps/web | Application Next.js 16 (App Router) : site public, espace connecté, paiement Stripe, API. |
Le moteur ne dépend ni de Next.js ni de MongoDB : l'app mobile (React Native / Expo) pourra l'utiliser tel quel.
pnpm install
cp apps/web/.env.example apps/web/.env.local # puis remplir au minimum MongoDB + secrets
pnpm dev # http://localhost:3000
pnpm test # tests du moteur, du catalogue et du web
0.0.0.0/0 (Vercel n'a pas d'IP fixe) ou utiliser l'intégration Vercel ↔ Atlas.mongodb+srv://… dans MONGODB_URI.Les collections et index sont créés automatiquement au premier lancement.
price_…) dans STRIPE_PRICE_MONTHLY et STRIPE_PRICE_YEARLY.STRIPE_SECRET_KEY et la clé publiable
dans STRIPE_PUBLISHABLE_KEY (le formulaire de carte s'affiche directement sur le site,
aux couleurs de Sorloo, sans redirection vers une page Stripe).https://sorloo.com/api/stripe/webhook
avec les événements customer.subscription.created,
customer.subscription.updated, customer.subscription.deleted.
Copier le secret de signature dans STRIPE_WEBHOOK_SECRET.Le statut Premium est enregistré dans la base (collection profiles, champ subscription) :
c'est ce champ que l'app mobile lira pour savoir si l'utilisateur est abonné.
Règle (identique à apps/web/src/lib/premium.ts) : Premium si status vaut active ou past_due,
ou trialing avec hasPaymentMethod: true, et si currentPeriodEnd n'est pas dépassé de plus de 3 jours.
L'abonnement Stripe n'est créé qu'au moment où l'utilisateur valide le formulaire avec une carte valide :
afficher la page de paiement ou changer de formule ne crée rien. Avec un essai gratuit
(STRIPE_TRIAL_DAYS > 0), la carte est d'abord enregistrée et vérifiée, puis l'essai démarre ;
l'essai n'est proposé qu'une fois par client.
La résiliation se fait sur le site (Mon compte → Résilier mon abonnement) : l'abonnement n'est pas renouvelé, Premium reste actif jusqu'à la fin de la période payée, et l'utilisateur peut le réactiver avant cette date. Le portail client Stripe n'est pas utilisé.
apps/web (Vercel détecte pnpm et le monorepo).
Framework Preset : Next.js. Laisser Build Command et Output Directory vides (valeurs par défaut).
Si l'erreur « No Output Directory named "public" » apparaît, c'est que le Root Directory
est resté à la racine du dépôt ou que le preset est sur « Other ».apps/web/.env.example dans Settings → Environment Variables.cdg1) dans apps/web/vercel.json.Photos des recettes : Unsplash (UNSPLASH_ACCESS_KEY), ou Pexels (PEXELS_API_KEY) si une clé est disponible.
La tâche planifiée /api/cron/photos (une fois par jour) en récupère par lots. Pour aller plus vite,
ouvrir dans le navigateur https://sorloo.com/api/cron/photos?key=CRON_SECRET (une fois par heure :
Unsplash limite à 50 requêtes/heure en mode démo ; après validation « Production » par Unsplash, 5 000/heure,
et on peut ajouter &max=150). La réponse indique combien de recettes restent sans photo (remaining).
Le plan gratuit Vercel (Hobby) est réservé aux projets non commerciaux : pour un lancement payant, il faut le plan Pro.
Boîte : [email protected], avec les alias bonjour@, support@, rgpd@ et noreply@
(adresses publiques dans apps/web/src/lib/contact.ts).
SMTP_HOST=smtp.hostinger.com,
SMTP_PORT=465, [email protected], SMTP_PASSWORD (mot de passe de la boîte).
Limite Hostinger : 1 000 e-mails / 24 h. Au-delà, passer à Resend (RESEND_API_KEY, utilisé si SMTP est vide).[email protected].Garder getweeko.com relié au projet Vercel : les pages redirigent vers l'adresse de
NEXT_PUBLIC_APP_URL (sorloo.com), et l'API reste joignable pour les anciennes versions de l'app.
ADMIN_EMAIL et ADMIN_PASSWORD : identifiants de l'administration, indépendants des comptes
Sorloo (mot de passe long et unique). https://sorloo.com/admin demande ces identifiants
(5 essais par quart d'heure, session de 12 h) et affiche inscrits, abonnés, revenu estimé et erreurs.ALERT_EMAIL
(par défaut [email protected]), au plus une fois par heure pour une même erreur.Les prix relevés en magasin par les utilisateurs d'Open Prices (Open Food Facts, base ouverte)
sont importés chaque nuit par /api/cron/prices (médiane sur 12 mois, France, hors promotions,
par enseigne). Lancement à la main : https://sorloo.com/api/cron/prices?key=CRON_SECRET
(chaque appel reprend là où le précédent s'est arrêté). Une enseigne n'apparaît dans la
comparaison qu'avec au moins 3 produits de la liste relevés. Correspondances ingrédient →
catégorie : apps/web/src/lib/price-sources.ts.
BETTER_AUTH_SECRET : openssl rand -base64 32HEALTH_DATA_KEY : openssl rand -base64 32 — à sauvegarder : sans cette clé, les données de santé chiffrées sont illisibles.CRON_SECRET : openssl rand -hex 24apps/web/src/content/legal.ts (raison sociale, adresse, médiateur…) et une relecture par un juriste.