shiping
An interview assistant and an exam assistant that uses AI to provide solution ideas in real time during 「面试」 or 「在线考试」.
AI translation
Dis-moi qui tu es. Je te dis où tu vas. 25 questions, une IA, des écoles réelles avec leurs vrais coûts.
Translation pending
EducationGitHub @fadelndiaye5800-engOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
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 ↗Application web progressive (PWA) d'orientation par IA. 15 pages HTML, mobile d'abord, FR/EN, conforme au document maître v3.0. Version 4 : questionnaire en images, deux accueils, parrainage, offres Premium masquées, vrais avis, rétention quotidienne. Version 5 : offres revérifiées avec règles automatiques, test A/B des couleurs mesuré avec PostHog, modes clair et sombre, localisation (pays, drapeaux de la région, FCFA / euro / dollar), 3 niveaux de langue, salutations selon l'heure + pseudo, Paramètres complets, page Contact, « Comment candidater ici » et « Mon dossier », page /admin. Version 6 : couleurs claires et accueillantes (A = blanc chaud, B = crème plus présent ; sombre seulement au choix), sensation au doigt (vibration Android, retour haptique iPhone, effet d'appui et « pop »), sauvegarde avec compte obligatoire, textes des offres revus. Version 7 : logo officiel (ruban orange) partout + écran d'ouverture animé, 43 offres vérifiées, guide « Comprendre les financements », IA branchée (« Est-ce pour moi ? », « Mon projet est-il prêt ? », aide admin), coffre-fort de candidature, connexion Apple prête, « Ce que LERNA sait de toi », barre du bas corrigée.
Version 8 (oct. 2026) — modèle Premium revu : l'information est gratuite, Premium paie l'aide pour décrocher sa place.
Toutes les offres sont visibles par tous (plus d'offre masquée) ; Pack Candidature (paiement unique, 6 mois, prix prix_pack
réglé dans /admin, 25 000 FCFA) ; onglet Budget dans Mon dossier (coût réel de la 1re année + plan B, Premium) ;
alertes ciblées Premium (nouvelle offre du domaine de la personne, étiquettes OneSignal premium, d1–d3) ;
page Premium centrée sur le résultat, bouton « Envoyer à mes parents » et FAQ « Pourquoi payer si les infos sont gratuites ? ».
Explorer → onglet France · Parcoursup : les ~25 800 formations de Parcoursup (année la plus récente), lues en direct dans les données
ouvertes du ministère (fr-esr-cartographie_formations_parcoursup, API Opendatasoft, CORS ouvert ; domaine ajouté à la CSP).
Explorer → onglet Monde : annuaire mondial (≈ 37 000 établissements, ~200 pays) reconstruit chaque mois par GitHub Actions
(.github/workflows/annuaire.yml → scripts/annuaire/build.mjs → assets/annuaire/<PAYS>.json). Sources : DEQAR (Europe, ODC-PDDL),
College Scorecard (États-Unis, frais officiels, domaine public), Office for Students (Angleterre, OGL v3), CRICOS (Australie, coûts déclarés,
CC BY 2.5 AU), Wikidata (autres pays, CC0, affiché « À vérifier »). Si une source échoue, ses anciennes fiches sont gardées ; erreurs dans index.json.
Fiche école → carte Reconnaissance et accréditation (assets/js/accred.js) : marche à suivre et registres officiels
(ANAQ-Sup, CAMES, Parcoursup, RNCP), sans jamais inventer de décision.
index.html Accueil découverte (nouveaux visiteurs) : hero, stats, 3 étapes, vrais avis (dès 3 avis vérifiés)
aujourdhui.html Accueil personnel une fois le questionnaire fait : parcours de X jours, niveau, mission du jour,
bourse du jour, mot du jour, quiz, mes écoles + échéances, invitation, alertes, assistant
questionnaire.html 25 questions en images (stickers), « Autre » + champ libre, niveau par langue,
question ouverte à la fin ; ?update=1 = mise à jour mensuelle en 5 questions
loading.html Analyse IA (5 s minimum), sceau LERNA animé
resultats.html Résumé, 5 écoles : 2 visibles, n°3-4 avec 3 amis invités (ou Premium), n°5 Premium
explorer.html 32 établissements, 6 filtres, pagination, favoris
ecole.html Fiche : Présentation | Filières | Admission | Coûts | Vie étudiante | Avis (vérifiés + lien Google)
opportunites.html Stages | Bourses | Emplois | Investisseurs ; offres Premium sans titre ni organisme ; sauvegarde
espace.html Profil, recommandations, rappels, offres sauvegardées, assistant IA, comparateur, candidatures, compte
premium.html Comparatif : 4 900 FCFA (7.99$)/mois, Pack Candidature 25 000 FCFA (39.99$) pour 6 mois, 39 000 FCFA (59.99$)/an, envoi aux parents
auth.html Inscription (avec pseudo facultatif) / connexion / Google / mot de passe oublié
dossier.html « Mon dossier » par école : étapes (avec dates officielles), documents, atelier lettre de motivation,
entraînement à l'entretien, CV en PDF, demande de recommandation, visa, suivi
parametres.html Compte, apparence (thème, texte, animations), langue, notifications, sons, orientation, accueil,
confidentialité, abonnement et parrainage, aide
contact.html Formulaire (problème, ajout, retrait, question, partenariat, données) — sans téléphone ni WhatsApp
admin.html Réservé à l'équipe (/admin) : offres, signalements, messages, tests A/B, taux de change
404.html Page introuvable
assets/css/lerna.css Design system unique : couleurs par variables (--bg, --surface, --panel…), thèmes clair (A/B) et sombre
assets/js/boot.js Chargé en premier : applique le thème (A/B ou choix de la personne) avant l'affichage, sans clignotement
assets/js/guides.js Guides « Comment candidater ici » (Parcoursup, Études en France, DAP, CAQ…) et liens officiels vérifiés
assets/js/core.js Navigation, FR/EN, compte, favoris, sons, sceau LERNA, stickers,
parcours/points/niveaux, parrainage, avis, installation, notifications
assets/js/questions.js Les 25 questions (+ EN), stickers, « Autre », niveaux de langue, drapeaux des pays
assets/js/daily.js Contenu du jour : missions, 36 mots, 30 quiz, bourse du jour
assets/js/data-schools.js Établissements (frais indicatifs en USD, points forts ET faibles)
assets/js/data-opps.js Offres publiques complètes + APERÇU des offres Premium (sans nom ni titre)
assets/js/engine.js Moteur de correspondance de secours (si l'IA ne répond pas)
assets/stickers/ 115 stickers WebP (questionnaire et accueil) — générés par scripts/build-stickers.py
assets/flags/ 206 drapeaux WebP (choix du pays, écoles)
api/analyze.js Analyse Claude (claude-sonnet-4-6), 5 écoles — 1 analyse/jour/IP en gratuit
api/chat.js Assistant IA — 5 messages/jour en gratuit ; mode « lettre » et « entretien » pour Mon dossier (3/jour en gratuit)
api/profile.js Sauvegarde du questionnaire fait avant la création du compte
api/referral.js Parrainage : code, compteur d'amis, rattachement d'un nouvel inscrit
api/opps.js Fiches complètes des offres Premium (Premium payé, ou tous avant le lancement)
api/review.js Avis sur LERNA (envoi + lecture des avis validés)
api/cron-daily.js Notification quotidienne (OneSignal), lancée chaque jour par Vercel Cron
api/config.js Configuration publique (aucune clé secrète) + pays vu par Vercel + réglages A/B et taux décidés dans /admin
api/message.js « Signaler une offre expirée » et formulaire Contact (transfert privé par email avec Resend)
api/webhook.js Lemon Squeezy → statut Premium (signature HMAC vérifiée)
api/account.js Suppression définitive du compte
supabase/schema.sql Tables + règles RLS + parrainage + avis + limitation de débit
supabase/seed.sql Écoles et opportunités (généré par `npm run seed`)
supabase/opps-premium.cjs Fiches complètes des offres Premium (jamais publié sur le site)
Sans aucune clé, l'app fonctionne en « mode aperçu » : comptes dans le navigateur, recommandations calculées par le moteur local, offres Premium en aperçu flouté.
python3 -m http.server 8000 # puis ouvre http://localhost:8000
Crée un dépôt privé, puis pousse ce dossier. Le .gitignore empêche d'envoyer un fichier .env.
Le fichier .vercelignore empêche de publier sur le site supabase/, scripts/ et la documentation
(sinon les fiches des offres Premium seraient lisibles à l'adresse du fichier).
supabase/schema.sql → Run. Puis supabase/seed.sql → Run. (Les deux peuvent être relancés sans risque.)https://ton-domaine, Redirect URLs : https://ton-domaine/**.anon et la clé service_role.sw.js), qui charge OneSignal tout seul..env.example./api/config répond, l'app passe du mode aperçu au mode réel.vercel.json (9 h UTC, livrée à 18 h heure locale de chaque personne). Elle n'envoie rien tant que CRON_SECRET et OneSignal ne sont pas configurés.LEMON_SQUEEZY_CHECKOUT_MONTHLY / _YEARLY.https://ton-domaine/premium.html?payment=success.https://ton-domaine/api/webhook, événements subscription_*, « signing secret » dans LEMON_SQUEEZY_WEBHOOK_SECRET.Crée la clé sur console.anthropic.com, mets-la dans ANTHROPIC_API_KEY sur Vercel et fixe une limite de dépense mensuelle.
Rien d'autre à changer : tout est déjà branché. Sans clé, chaque bouton IA affiche « disponible dès la mise en ligne ».
Tout passe par deux fonctions : /api/analyze (analyse du questionnaire) et /api/chat, avec un « mode » :
| Mode | Où | Gratuit / jour | Premium |
|---|---|---|---|
chat | Assistant de Mon espace | 5 | illimité (garde-fou 300) |
lettre, entretien | Mon dossier | 3 chacun | illimité |
offre | « Est-ce pour moi ? » sur chaque offre | 3 | illimité |
projet | « Mon projet est-il prêt ? » (onglet Investisseurs) | 2 | illimité |
admin_offre | /admin → Nouvelle offre → « Préparer avec l'IA » (lit la page officielle et prépare la fiche, à relire) | admins seulement (100) | — |
Avant le lancement du Premium (PREMIUM_ENABLED=false), tout est ouvert (garde-fou anti-abus seulement).
Le bouton « Continuer avec Apple » est codé mais caché tant que APPLE_LOGIN_ENABLED n'est pas à true (aperçu : auth.html?apple=1).
world.lerna.web).
Dans le Services ID : domaine lerna.world et adresse de retour https://<projet>.supabase.co/auth/v1/callback..p8 (une seule fois !) et note le Key ID et le Team ID..p8
(Supabase indique comment). Cette clé expire tous les 6 mois : note la date et refais l'étape 4 avant.APPLE_LOGIN_ENABLED=true, puis Redeploy.
Apple peut cacher l'email de la personne (adresse relais) et n'envoie son nom qu'à la première connexion : LERNA lui demande alors
son avatar et sa date de naissance une seule fois (2 appuis).Mets le lien « Laisser un avis » de ta fiche Google Business dans GOOGLE_REVIEW_URL. Il apparaît alors après chaque avis donné dans l'app et sur l'accueil.
PREMIUM_ENABLED=false, les n°3, 4 et 5 se débloquent toutes par parrainage.valide. Les avis d'écoles se valident pareil dans la table avis.Lerna.mark() dans core.js) et utilisé partout ; icônes de l'app, favicon et image de
partage dans assets/icons/. L'original est dans _brand/. Écran d'ouverture : une fois par session (?splash=1 pour le revoir).dossier.html?coffre=1, code dans assets/js/coffre.js) : fiche remplie une fois, rangée dans l'ordre
d'Études en France / Parcoursup, bouton « Copier » sur chaque champ ; documents réduits au bon poids (photo < 50 Ko, fichiers < 500 Ko,
règles de Campus France Sénégal) et renommés NOM_Prenom_Document. Fichiers dans Supabase Storage, compartiment privé coffre
(créé par schema.sql, chaque compte ne voit que son dossier). LERNA n'est pas un agent : rien n'est déposé à la place de l'étudiant.ageMin / ageMax) ou réservées aux femmes (pourQui: 'f') s'adaptent. Jamais : religion, origine, santé, revenus.genre, equity (true = prend des parts, false = sans prise de parts) et stade (idee, produit, clients).seed.sql désactive les anciennes offres retirées.POSTHOG_KEY) avec la propriété ab_couleurs. Règle : au moins 2 semaines et
≈ 300 personnes par version. Dans /admin : arrêter le test, donner la gagnante à tout le monde ou le relancer. Chacun peut changer de thème
dans Paramètres (le changement est mesuré : theme_change).update public.users set role = 'admin' where email = 'ton-adresse'; puis ouvre /admin.x-vercel-ip-country (aucune autorisation, aucun GPS), sinon du fuseau horaire.
La personne confirme (« Tu es au Sénégal ? ») ou change. Montants convertis depuis le dollar (taux modifiables dans /admin).CONTACT_PUBLIC_EMAIL est vide (mets [email protected] une fois le domaine acheté).
Les messages arrivent dans /admin et, si Resend est configuré, dans ta boîte perso (CONTACT_FORWARD_TO, jamais affichée).
Réseaux sociaux : SOCIAL_* + SHOW_SOCIALS=true./api/config ne renvoie que des valeurs publiques.role = 'admin' (fonction is_admin(), testé)./api/opps.CRON_SECRET.vercel.json.assets/js/data-opps.js. Offres Premium : supabase/opps-premium.cjs (et leur aperçu dans data-opps.js, avec masked: true).assets/js/data-schools.js.npm run seed pour régénérer supabase/seed.sql, et relance-le dans Supabase.python3 scripts/build-stickers.py (police Noto Color Emoji). Quand les stickers officiels du léopard existeront, remplace les fichiers de assets/stickers/ en gardant les mêmes noms.Stickers et drapeaux dessinés à partir de Noto Color Emoji (Google, licence SIL Open Font License 1.1 / Apache 2.0).
PREMIUM_ENABLED=false ouvre les fonctions Premium (phase de lancement), sauf les écoles n°3 à 5 qui se débloquent par parrainage.