TL;DR. J’ai construit Bulkmark en 3 semaines (3h/jour) avec la Claude API (Sonnet 4.5), TanStack Start, Convex et Better Auth. À 250 utilisateurs actifs, le coût d’infra par utilisateur tourne entre 1 et 2 $/mois pour une marge d’environ 77%. Le tagging par batch de 20 tweets via structured output a été la décision la plus rentable du projet.
Pourquoi Bulkmark existe
J’avais 3 000+ bookmarks sur Twitter. À vue de nez, 97% jamais rouverts. Le bouton “sauvegarder” était devenu un geste réflexe, une décharge cognitive. Pas une intention.
Le problème n’est pas de sauvegarder. C’est de retrouver. Twitter n’offre aucune recherche sur les bookmarks, aucun tag, aucun tri. Un cimetière chronologique.
J’ai cherché un outil. Rien de propre. Beaucoup d’extensions Chrome bricolées, une ou deux apps mortes depuis 2022. Alors j’ai ouvert un terminal depuis le studio à Monaco et j’ai commencé.
Bulkmark est né d’un besoin personnel : tagger automatiquement chaque tweet sauvegardé, le résumer, et recevoir un digest hebdomadaire qui se lit rapidement. Pas une app de plus. Un filtre qui transforme 3 000 tweets en une page lisible le vendredi matin.
Ce n’est pas un side project random. C’est l’outil que je voulais utiliser. Le fait qu’il intéresse d’autres personnes est venu après.
Stack et coûts en clair
Stack technique, sans fioriture :
- TanStack Start pour le front et l’API
- Claude API (Sonnet 4.5) pour le tagging, la recherche et la génération du digest
- Convex pour la DB et les jobs schedulés
- Convex Jobs pour le digest hebdomadaire (vendredi 10h)
- Better Auth pour l’authentification
- Resend pour l’envoi des emails
- X API v2 (pay-as-you-go) pour l’import des bookmarks
Pas de Redis, pas de file de jobs externe, pas de Kubernetes. Un job scheduler, une DB, une API LLM. Le reste est du TanStack Start standard.
Coûts mensuels à 250 utilisateurs actifs :
| Service | Coût mensuel |
|---|---|
| Convex | 25 $ — DB + jobs schedulés |
| Claude API (Sonnet 4.5) | Quelques euros — tagging + digest |
| X API v2 | Variable — pay-as-you-go, scale avec le volume d’imports |
| Resend | 0 € — free tier suffisant |
Coût par utilisateur : 1 à 2 $/mois, toutes infras confondues. Marge : environ 77% sur les tiers actuels.
Le pricing est en tiers à places limitées : 59 $/an (50 places, 40 dispos au moment où j’écris), 69 $/an (150 places), 79 $/an (300 places), 99 $/an (unlimited). Force la décision côté utilisateur et donne un narratif clair pour les launchs successifs.
Le ratio coût LLM / coût total est faible : Claude reste quelques euros sur l’usage actuel. La vraie variable, c’est X API en pay-as-you-go — elle scale avec le volume d’imports, pas avec le nombre d’utilisateurs actifs.
3 semaines, jour par jour
Semaine 1, fondations. Auth (Better Auth branché sur Convex), schema Convex, import des bookmarks via X API v2. Le câblage Better Auth + Convex n’est pas trivial : plusieurs heures perdues à débugger des sessions qui ne persistaient pas comme attendu. Une fois la glue en place, le reste roule.
Semaine 2, le cerveau. Tagging par Claude Sonnet 4.5 par batchs de 20 tweets. Recherche : pas de vectoriel — j’envoie à Claude la liste des tweets et la query, avec un schema JSON précis, et il renvoie les matchs structurés. Plus simple, étonnamment efficace, et zéro infra d’indexation. Obstacle : les threads Twitter font exploser le contexte. Un “tweet” peut être 30 tweets. J’ai dû ajouter une étape de fetch des threads, puis une troncature intelligente.
Semaine 3, le digest et la sortie. Convex Job le vendredi 10h, génération d’un digest HTML personnalisé via Claude, envoi par Resend. Landing page minimale, facturation annuelle, déploiement.
3 semaines, environ 3h/jour. Pas un sprint. Un rythme.
L’agent Claude qui tag, résume, classe
Le cœur de Bulkmark, c’est un agent Claude qui prend un batch de 20 tweets et sort un JSON structuré : tags, résumé court, catégorie, score d’intérêt.
J’utilise le structured output (tool use) plutôt que de parser du JSON freeform. Plus fiable, zéro retry pour cause de markdown errant.
Exemple simplifié du prompt :
const response = await anthropic.messages.create({
model: "claude-sonnet-4-5",
max_tokens: 2048,
tools: [{
name: "classify_tweets",
description: "Tag and summarize a batch of tweets",
input_schema: {
type: "object",
properties: {
tweets: { type: "array", items: tweetSchema }
}
}
}],
tool_choice: { type: "tool", name: "classify_tweets" },
messages: [{ role: "user", content: buildBatchPrompt(tweets) }]
})
Pourquoi Sonnet et pas Haiku ? Plus performant sur le tagging avec contexte nuancé, et j’ai l’habitude de travailler avec Claude au quotidien — pas envie de jongler entre providers pour gagner du marginal. Le coût Sonnet reste anecdotique dans la facture totale.
Latence : quelques secondes par batch de 20 tweets. Un digest complet — fetch X API + tagging par batchs + génération du HTML — prend quelques dizaines de secondes par utilisateur. Le fetch des tweets et le tagging tournent par batch, donc c’est plus long qu’un simple appel LLM, mais largement acceptable pour un job hebdo.
Le batch de 20 n’est pas magique : j’ai testé 10, 20, 50. À 50, la qualité du tagging chute (Claude commence à mélanger les tweets). À 10, je paie trop d’overhead par appel. 20 est le sweet spot pour Sonnet.
Pour la recherche, même logique : pas d’index vectoriel à maintenir, c’est Claude qui fait le matching à la query sur la liste de tweets, et qui renvoie un JSON structuré. Moins “scalable en théorie”, largement suffisant pour la volumétrie d’un utilisateur Bulkmark.
Ce qui a foiré
Deux galères, payées en temps et en API.
Galère 1, l’auth multi-stack. Better Auth + Convex n’est pas une intégration évidente. Les deux écosystèmes ont leurs conventions, et le pont entre les deux demande pas mal de glue code. Plusieurs heures à débugger des sessions qui ne persistaient pas comme attendu. À refaire, je passerais plus de temps à choisir et valider la stack auth dès le jour 1, plutôt que la bricoler en route.
Galère 2, le coût des tests. Chaque test d’intégration qui tape X API et Claude API coûte de vrais centimes. À multiplier par les itérations de debug, ça monte vite. J’ai fini par mocker agressivement les deux côtés, et ne lancer les tests “live” que sur des branches dédiées. Pour un dev habitué aux mocks gratuits, c’est un changement de réflexe.
FAQ
Combien coûte Claude API pour un SaaS comme Bulkmark ? Quelques euros par mois sur l’usage actuel (250 utilisateurs actifs, digest hebdo, tagging structuré). Le coût scale linéairement avec le volume de tweets traités, pas avec le nombre d’utilisateurs.
Pourquoi Claude plutôt que GPT ou Mistral ? Honnêtement, par habitude. Je travaille avec Claude au quotidien — je connais ses forces (structured output via tool use, qualité sur les tâches structurées), pas envie de jongler entre providers. Aucun benchmark rigoureux contre les concurrents : à ce niveau de coût, le ROI de switcher serait marginal.
Combien de temps pour construire un SaaS comme ça en solo ? 3 semaines à 3h/jour de code productif (~60 heures), pour un MVP qui marche en production. Comptez plus si vous apprenez la stack en même temps. La vraie variable n’est pas la complexité technique, c’est combien de fois vous changez d’avis sur la feature set.
Bulkmark est-il open source ? Non. Mais l’architecture est volontairement banale : TanStack Start + Claude API + Convex. Toute la valeur est dans les prompts, le tuning du batch, et la qualité du digest. Rien d’irreproductible.
Ce que je referais (et pas)
À refaire sans hésiter :
- Claude API pour tout ce qui touche au langage. Le ratio qualité/prix sur Sonnet 4.5 est imbattable pour du tagging structuré.
- Convex. Une seule plateforme pour la DB, les jobs, le temps réel. Zéro infra à gérer.
- Convex Jobs pour le digest hebdo. Pas besoin de Temporal ou d’une file de jobs externe pour ce cas.
- Structured output via tool use. Plus jamais de JSON parsing freeform.
- Pricing en tiers à places limitées. Force la décision côté utilisateur, et permet d’augmenter le prix progressivement sans casser les premiers acheteurs.
À refaire autrement :
- L’auth. Better Auth + Convex est puissant mais le câblage demande du temps. À refaire, je validerais l’intégration auth dès le jour 1 plutôt que de la bricoler en route.
- Les tests. Mocker dès le jour 1 les appels payants (X API, Claude API). Ne pas attendre la première facture pour ajouter un budget de tests.
Si vous voulez en discuter, le studio est joignable. Le reste du travail est ici.
Alex, depuis Monaco.
Pour citer cet article : Charbonneyre, A. (2026). J’ai construit Bulkmark en 3 semaines avec Claude. Moody Labs.