This content has been generated by GLM 5.1 AI model
Vous vous souvenez de LMGTFY ? Ce petit outil passif-agressif magnifique où t'envoyais un lien à quelqu'un et ça tapait sa question dans Google à sa place ? Ouais, c'était le bon vieux temps.
Bah, l'autre jour, quelqu'un m'a posé une question que ChatGPT aurait pu régler en 3 secondes chrono, et j'ai ressenti cette vieille envie familière... mais taper "demande juste à ChatGPT" c'était... incomplet. Manquait de panache dramatique.
Donc j'ai fait ce que tout développeur raisonnable ferait : j'ai passé nettement plus de temps que nécessaire à construire un outil pour être mesquin à sa place.
Entrez lmaafy — Let Me Ask AI For You.
Comment ça marche
Le concept est tout con :
- Tu tapes ton prompt et tu choisis un fournisseur IA
- T'appuies sur générer et tu copies le lien
- Tu l'envoies à celui ou celle qui le mérite
Quand la personne ouvre le lien, elle voit un faux curseur glisser doucement sur l'écran, cliquer dans un champ de chat, et taper le prompt caractère par caractère avec un timing randomisé (parce qu'on est pas des bêtes — la frappe doit sembler humaine). Ensuite le curseur clique sur envoyer et BAM — redirection vers le vrai fournisseur IA avec le prompt déjà rempli et prêt à dégainer.
C'est mesquin ? Oui. C'est satisfaisant ? Oh, carrément.
La tech
Construit avec TanStack Start (React 19 + Vite + routing par fichiers), Tailwind CSS v4, shadcn/ui, et TypeScript en mode strict. Monorepo avec pnpm workspaces et Turborepo parce que... bah, parce que visiblement je sais pas faire les choses à moitié.
Juste deux routes :
/— La page d'accueil avec la carte de formulaire/ask?d=<base64>— La page d'animation qui fait tout le show
Pas de backend. Pas de base de données. Pas de comptes. Tout vit dans l'URL sous forme de blob JSON encodé en base64. Le prompt et l'ID du fournisseur sont empaquetés dans { p: string, provider: string }, encodés, et fourrés dans un query param. Quand quelqu'un ouvre le lien, ça décode, ça valide, et la magie opère.
typescriptexport function encodeLinkData(data: LinkData): string { const json = JSON.stringify(data); const bytes = new TextEncoder().encode(json); let binary = ""; for (let i = 0; i < bytes.length; i++) { binary += String.fromCharCode(bytes[i]!); } return btoa(binary); }
Ouais, c'est du base64, pas du chiffrement. N'importe qui pourrait le décoder. Mais c'est pas le but — le but c'est que la chute soit pas plantée direct dans la barre d'URL. C'est pour le reveal ^^
Le moteur d'animation
Ça c'était la partie fun. L'animation tourne avec une machine à états :
init → move-to-input → click-input → typing → move-to-send → click-send → redirect
Le curseur est une flèche SVG qui se déplace avec des transitions CSS en cubic-bezier(0.16, 1, 0.3, 1) pour cette sensation de ease-out bien agréable. L'effet de frappe utilise des délais randomisés entre 30 et 80 ms par caractère :
typescriptconst delay = Math.random() * 50 + 30; setTimeout(tick, delay);
L'interface de chat factice est une UI dark générique — pas spécifique à un fournisseur — avec une barre de saisie en bas, un bouton envoyer, et un curseur clignotant pendant la frappe. L'animation complète dure entre 3 et 6 secondes selon la longueur du prompt. Assez longue pour être satisfaisante, assez courte pour être pas relou.
Fournisseurs supportés
Seuls les fournisseurs qui supportent le pré-remplissage de prompt via URL ont fait le cut :
| Fournisseur | Pattern d'URL | Notes |
|----------|-------------|-------|
| ChatGPT | chatgpt.com/?q= | Marche comme sur des roulettes |
| Claude | claude.ai/new?q= | Affiche un bandeau d'avertissement (c'est pas nous !) |
| Grok | grok.com/?q= | Se remplit nickel |
| Mistral LeChat | chat.mistral.ai/chat?q= | Tout fluide |
| T3.chat | t3.chat/new?q= | Nécessite vérification |
Kimi et DeepSeek supportent pas le pré-remplissage par URL, donc ils sont restés sur le carreau. Pas la peine de faire un truc dramatique qui finit en... rien.
Le "pourquoi"
Regardez, je sais que c'est con. C'est un outil à la blague. Mais c'est aussi un exercice étonnamment propre d'architecture côté client — pas de backend, tout dans l'URL, des animations fluides, du TypeScript bien typé, et ça marche vraiment.
Et puis, soyons honnêtes : si tu construis pas au moins un outil passif-agressif par an, t'es vraiment un développeur ?
Essaie
File sur lmaafy.app pour tester de suite, ou clone le repo GitHub, lance pnpm install && pnpm dev, et commence à générer des liens qui répondent passif-agressivement aux questions à ta place. Tes potes vont adorer. Ou te détester. Probablement les deux.
Le meilleur dans tout ça ? Le truc est 100% côté client. Pas de tracking, pas de cookies, pas de serveur. Juste de la mesquinerie pure et non filtrée livrée directement par URL.
Utilise-le sagement. Ou pas. Je suis pas ton patron.
{{% goodbye %}}