Convex : Oublie les WebSockets, voici le futur des apps Real-Time
14/10/2025 • Melvynx
14/10/2025 • Melvynx
Tu en as marre de configurer des WebSockets, gérer des connexions, et te battre avec la synchronisation de données en temps réel ?
Convex est l'outil ultime pour créer des applications Real-Time.
Complètement. Oublie. Les. WebSockets.
Convex, c'est difficile à expliquer, mais je vais essayer de te le résumer simplement.
Convex est une base de données qui te permet de stocker des données...
Mais c'est aussi un backend.
Et une alternative aux WebSockets.
Tout en un seul outil.
Laisse-moi t'expliquer comment ça marche.
Convex est une plateforme backend et une plateforme pour stocker ton code.
Quand tu crées une application, tu vas créer des "mutations" et des "queries".
En utilisant la commande npx convex dev, ces mutations et queries vont être publiées sur un serveur distant.
Ensuite, quand tu codes avec ton app, elle va consommer ce serveur.
Donc ton backend Next.js n'est jamais utilisé.
À la place, Convex stocke toutes tes fonctions pour les livrer au client.
Voici un exemple simple :
// convex/tasks.ts
import { mutation, query } from "./_generated/server";
import { v } from "convex/values";
// Une query pour récupérer toutes les tâches
export const getTasks = query({
handler: async (ctx) => {
return await ctx.db.query("tasks").collect();
},
});
// Une mutation pour créer une tâche
export const createTask = mutation({
args: { text: v.string() },
handler: async (ctx, args) => {
const taskId = await ctx.db.insert("tasks", {
text: args.text,
completed: false,
});
return taskId;
},
});Tu vois ? C'est simple. Tu définis tes fonctions backend directement en TypeScript.
Pas besoin de créer des API routes, pas besoin de gérer les connexions à la base de données, pas besoin de configurer des WebSockets.
Tout est automatique.
L'avantage ?
Il gère le real-time.
Chaque changement de données est automatiquement publié à tous tes clients.
Et tout ça... avec une facilité déconcertante.
Imagine que tu as un chat. Dès qu'un message est envoyé, tous les utilisateurs le voient instantanément.
Pas besoin de configurer quoi que ce soit.
Convex s'occupe de tout :
Voici comment tu l'utilises côté client avec Next.js :
"use client";
import { useQuery, useMutation } from "convex/react";
import { api } from "@/convex/_generated/api";
export default function TaskList() {
// Automatiquement mis à jour en temps réel !
const tasks = useQuery(api.tasks.getTasks);
const createTask = useMutation(api.tasks.createTask);
return (
<div>
<button onClick={() => createTask({ text: "Nouvelle tâche" })}>
Ajouter une tâche
</button>
<ul>
{tasks?.map((task) => (
<li key={task._id}>{task.text}</li>
))}
</ul>
</div>
);
}Dès qu'une tâche est créée (par n'importe quel utilisateur), tous les clients voient la mise à jour instantanément.
C'est ça la magie de Convex.
Pour commencer avec Convex, c'est ridiculement simple :
npm install convex
npx convex devCette commande va :
Ensuite, tu enveloppes ton app avec le provider :
// app/ConvexClientProvider.tsx
"use client";
import { ConvexProvider, ConvexReactClient } from "convex/react";
import { ReactNode } from "react";
const convex = new ConvexReactClient(process.env.NEXT_PUBLIC_CONVEX_URL!);
export function ConvexClientProvider({ children }: { children: ReactNode }) {
return <ConvexProvider client={convex}>{children}</ConvexProvider>;
}Et c'est tout !
Ton backend est prêt.
Un truc que j'adore avec Convex, c'est le TypeScript end-to-end.
Toutes tes queries et mutations sont typées automatiquement.
Si tu modifies une fonction backend, ton frontend te dira instantanément s'il y a un problème.
// convex/messages.ts
export const sendMessage = mutation({
args: {
text: v.string(),
channel: v.string(),
},
handler: async (ctx, args) => {
await ctx.db.insert("messages", {
text: args.text,
channel: args.channel,
timestamp: Date.now(),
});
},
});
// Dans ton composant React
const send = useMutation(api.messages.sendMessage);
// TypeScript sait exactement ce dont tu as besoin !
send({ text: "Hello", channel: "general" }); // ✅
send({ text: "Hello" }); // ❌ TypeScript error: missing 'channel'Pas besoin de dupliquer tes types. Tout est généré automatiquement.
Convex est parfait pour :
Tu peux créer un chat avec l'IA où les réponses s'affichent en temps réel pour tous les utilisateurs.
Convex gère même le streaming de réponses :
export const streamAIResponse = action({
args: { prompt: v.string() },
handler: async (ctx, args) => {
const openai = new OpenAI();
const stream = await openai.chat.completions.create({
model: "gpt-4",
messages: [{ role: "user", content: args.prompt }],
stream: true,
});
for await (const chunk of stream) {
const text = chunk.choices[0]?.delta?.content || "";
// Met à jour la base en temps réel
await ctx.runMutation(api.messages.updateMessage, { text });
}
},
});Parfait pour des jeux où plusieurs joueurs interagissent en temps réel.
La position des joueurs, les scores, les actions... tout est synchronisé automatiquement.
Imagine un Google Docs, un Figma, ou un Notion.
Tous les utilisateurs voient les changements en temps réel sans aucune configuration.
Des tableaux de bord qui se mettent à jour automatiquement dès qu'il y a de nouvelles données.
Parfait pour du monitoring, de l'analytics, ou des systèmes de notification.
vs Firebase :
vs Supabase :
vs REST + WebSockets :
Convex, c'est pas magique. Il y a quelques trucs à savoir :
Mais pour la majorité des apps, ces limitations ne sont pas un problème.
Je viens de publier une vidéo où je teste Convex pour la première fois.
Je te montre comment créer une app de chat en temps réel avec Next.js et Convex, le tout en moins de 30 minutes.
Tu vas voir à quel point c'est simple et puissant.
Convex, c'est vraiment l'outil ultime pour créer des applications Real-Time.
Si tu veux créer :
Alors Convex est fait pour toi.
L'avantage principal ? Tu oublies complètement les WebSockets et tu te concentres sur ton app.
Convex gère tout le backend, le real-time, la synchronisation, et le TypeScript pour toi.
N'hésite pas à tester et à me dire ce que tu en penses sur Twitter !