new-term-radar
Daily radar for new AI terms: names of new models, products and repos, caught on X, Hugging Face, GitHub and sitemaps before keyword tools list them.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
LeadPilot repère les prospects oubliés dans un export CRM, estime le chiffre d'affaires récupérable et rédige la relance à envoyer. Ce n'est pas un CRM. Stack : Next.js 15 (App Router) · TypeScript · Tailwind CSS v4 · shadcn/ui · Supabase. En développement uniquement (404 en production) : catalogue des composants sur /ui, aperçus sans connexion remplis avec des données d'exemple sur /ui/apercu (dashboard), /ui/apercu/prospect, /ui/apercu/priorites, /ui/apercu/dossiers et /ui/apercu/dossiers-a-risque.檢視完整 README ↗
LeadPilot repère les prospects oubliés dans un export CRM, estime le chiffre d'affaires récupérable et rédige la relance à envoyer. Ce n'est pas un CRM.
Stack : Next.js 15 (App Router) · TypeScript · Tailwind CSS v4 · shadcn/ui · Supabase.
npm install
cp .env.example .env.local # URL, clé publishable Supabase et URL du site
npm run dev # http://localhost:3000
| Commande | Rôle |
|---|---|
npm run dev | Serveur de développement (Turbopack) |
npm run build | Build de production |
npm run lint | ESLint |
npx tsc --noEmit | Vérification des types |
npm test | Tests unitaires (lecture des CSV : montants, dates, étapes, colonnes) |
npm run test:db | Tests du schéma, du calcul et de la Row Level Security (Postgres embarqué, sans Docker) |
npm run db:push | Applique les migrations au projet Supabase lié |
npm run db:types | Régénère src/types/database.ts depuis le projet lié |
En développement uniquement (404 en production) : catalogue des composants sur /ui, aperçus sans connexion remplis avec des données d'exemple sur /ui/apercu (dashboard), /ui/apercu/prospect, /ui/apercu/priorites, /ui/apercu/dossiers et /ui/apercu/dossiers-a-risque.
npx supabase login
npx supabase link --project-ref <ref-du-projet>
npm run db:push
npm run db:types
npx supabase config diff # toujours relire : en non-interactif, config push applique sans demander
npx supabase config push
En production, remplacer site_url et additional_redirect_urls dans supabase/config.toml par l'URL publique.supabase/templates/) : nécessitent un SMTP personnalisé. Sur l'offre gratuite avec l'envoi par défaut, Supabase refuse toute modification des modèles ; l'email reste en anglais et son lien (flux PKCE, ?code=) doit être ouvert dans le navigateur qui a demandé la connexion. Une fois le SMTP configuré (Authentication > SMTP Settings), décommenter les sections [auth.email.template.*] de supabase/config.toml et refaire config push : le lien passe alors en token_hash et fonctionne depuis n'importe quel navigateur..env.local (ou les variables de l'hébergeur) : NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY, NEXT_PUBLIC_SITE_URL.cdg1, vercel.json), à côté de la base Supabase (eu-west-3).NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY, NEXT_PUBLIC_SITE_URL (URL publique exacte, sans / final) ; pour l'envoi par e-mail, BREVO_API_KEY (secrète), BREVO_SENDER_EMAIL, BREVO_SENDER_NAME. La seule clé secrète est BREVO_API_KEY, lue côté serveur ; la clé service_role / sb_secret_ de Supabase n'est jamais utilisée par l'application. Les variables NEXT_PUBLIC_ sont figées au build : après une modification, redéployer.https://<domaine>/** (garder http://localhost:3000/** pour le développement). À faire dans le tableau de bord plutôt qu'avec config push, dont le fichier local pointe vers localhost.npm run test:db.L'écran Importer accepte un CSV (10 Mo, 5 000 lignes max), séparé par virgules ou points-virgules, en UTF-8 ou en encodage Excel français. Colonnes reconnues automatiquement (noms FR/EN, HubSpot, Pipedrive, Salesforce) : entreprise, contact, email, téléphone, montant, date dernier contact, statut, notes (* obligatoires). Voir public/exemple-prospects.csv.
recalculer_prospects() calcule oubli, probabilité, CA récupérable et score (formule de l'architecture produit). Un recalcul de tous les comptes tourne chaque nuit à 3 h UTC (pg_cron).Le score (0 à 100) compare le CA récupérable d'un prospect à celui de la meilleure affaire ouverte du compte (= 100). Le CA récupérable vaut montant × poids de l'étape × fraîcheur du contact. La fiche prospect l'explique : un verdict en une phrase, les facteurs (montant, étape, silence) classés par influence avec leurs points, et une cascade « prospect moyen du compte → score ». Les points sont des valeurs de Shapley : chaque facteur est comparé au prospect moyen du compte et la somme retombe exactement sur le score. Sur le dashboard, survoler un anneau de score affiche le même résumé.
Sur la fiche d'un prospect, « Préparer la relance » complète un modèle rédigé à l'avance (src/lib/followups/templates.ts), sans aucun appel à une API d'IA ni coût par relance :
direct, formel, chaleureux), soit 15 variantes.prepareFollowup, données relues en base) et enregistrée dans relances (modele_ia = modele:<scénario>). Tant qu'elle n'a été ni copiée ni ouverte dans Gmail, changer de modèle ou de ton réécrit le même brouillon. Le texte reste modifiable avant envoi.mail.google.com/mail/?view=cm) : aucune connexion Google, aucun OAuth, aucune API. LeadPilot n'envoie rien : le message part quand l'utilisateur clique sur « Envoyer » dans Gmail. « Copier le message » reste disponible pour tout autre client mail. Ouvrir ou copier horodate la relance (copiee_le) ; l'interface parle alors de relance « copiée ou ouverte », jamais « envoyée ».En plus de Gmail, une relance peut être envoyée depuis LeadPilot via l'API transactionnelle officielle de Brevo (POST https://api.brevo.com/v3/smtp/email, clé dans l'en-tête api-key).
POST /api/relances/envoyer (src/app/api/relances/envoyer/route.ts) : vérifie l'origine de la requête, la session, la configuration, que la relance et le prospect appartiennent au compte (RLS + filtre explicite), l'opposition à la prospection, l'adresse du destinataire, que le texte est identique à l'aperçu, la limite de 30 envois par heure et par compte, et que l'expéditeur est déclaré et actif dans Brevo (GET /v3/senders, jamais supposé). La relance est ensuite réservée de façon atomique (envoi_statut = 'en_cours') : un double clic ou deux onglets ne peuvent pas l'envoyer deux fois.envoi_statut = 'envoyee', date, adresse et identifiant Brevo (brevo_message_id) enregistrés ; le message n'est plus modifiable et le dossier passe en « Relancé ». En cas d'échec, envoi_statut = 'echec' avec un message sans détail technique ni clé ; on peut réessayer.BREVO_SENDER_NAME <BREVO_SENDER_EMAIL> ; les réponses vont à l'adresse du compte LeadPilot (replyTo).prospects.opposition_prospection_le) bloque tout contact depuis LeadPilot, Gmail compris, et passe le dossier en « Ignoré ».BREVO_API_KEY, BREVO_SENDER_EMAIL, BREVO_SENDER_NAME. Sans elles, le bouton reste désactivé.supabase/migrations/20261009120000_envoi_email_brevo.sql (colonnes ajoutées, aucune donnée modifiée).Pour essayer l'application sans fichier : se connecter une fois, remplacer l'adresse dans supabase/demo-data.sql puis l'exécuter dans le SQL Editor.
| Écran | Route |
|---|---|
| E1 Connexion | /connexion |
| E2 Import et réglages | /import |
| E3 Tableau de bord | /tableau-de-bord |
| E4 Liste des prospects | /prospects |
| E5 Fiche prospect et relance | /prospects/[id] |