Vos posts LinkedIn, écrits à l'avance, publiés à l'heure.
linkedin-scheduler transforme des fichiers Markdown en posts LinkedIn, avec une carte image pour chacun, et les publie sur votre profil par l'API officielle. Pas de serveur, pas d'abonnement : un dossier, deux scripts et une ligne cron.
- Codex
- OpenCode
- Gemini CLI
- et tout agent de code
Collez-le dans votre agent de code : il vérifie l'outil, vous guide pour LinkedIn et programme vos posts. Le jeton reste entre vos mains.
Open source, licence MIT. Non affilié à LinkedIn.
---
date: 2026-10-27
time: 09:00
status: ready
card_title: Une règle, *écrite une fois*
card_code: images/code/zod.ts
first_comment: La doc : https://zod.dev
---
**TypeScript vous protège… jusqu'à ce que
les données viennent de l'extérieur.**
Le body d'une requête, un formulaire, une
variable d'environnement : à l'exécution,
TypeScript ne vérifie rien.
Trois gestes, puis plus rien à faire.
Vous écrivez quand vous avez le temps. La machine publie quand c'est prévu.
Écrire
Un post est un fichier Markdown : une date, une heure, le texte. Le hook entre ** passe en gras sur LinkedIn, les liens vont dans le premier commentaire.
posts/texts/2026-10-27-1-zod.mdIllustrer
Une commande crée la carte du post en 1080×1350 : titre, texte, logo de la techno, extrait de code coloré, votre signature.
python3 scripts/render_card.py posts/texts/2026-10-27-1-zod.mdProgrammer
cron lance la publication aux heures choisies, cinq essais à deux minutes d'écart. Un post manqué à 9 h part au passage suivant, jamais un autre jour.
0,2,4,6,8 9,13,18 * * 1,3,5 ~/linkedin-scheduler/scripts/run.sh
Un post, c'est un fichier que vous pouvez lire.
Pas de base de données ni d'interface : du Markdown, que vous écrivez, relisez et versionnez avec git comme votre code.
---
date: 2026-10-29
time: 13:00
status: ready
media: images/2026-10-29-1-vie-de-dev.png
first_comment: Le dépôt : https://github.com/…
card_kicker: Vie de dev
card_title: Écrire le lundi, *publier toute la semaine*
---
**Je n'aime pas LinkedIn. J'y publie quand même.**
Trois posts écrits dimanche soir, dans mon
éditeur. Le reste se fait tout seul.
Et vous, vous écrivez quand ?date et time- Le jour et le créneau. Le post part à cette heure, ou au premier passage qui suit si la machine était éteinte.
status- draft tant que vous écrivez, ready quand il peut partir. Le script le passe ensuite à posted, avec le lien du post.
media- Une image ou une vidéo MP4. Le plus souvent, la carte générée par render_card.py.
first_comment- Les liens vont ici : LinkedIn montre moins les posts qui en contiennent dans le texte.
**le hook**- Écrit en gras dans votre fichier, envoyé en gras Unicode : LinkedIn n'a pas de mise en forme.
card_*- Le titre, le texte, le logo et l'extrait de code de la carte. Les mots entre * prennent l'orange.
Une semaine type, même si vous oubliez d'allumer l'ordinateur.
cron passe à 9 h, 13 h et 18 h les jours choisis, cinq fois de suite à deux minutes d'écart. Chaque passage publie au plus un post, celui dont l'heure est venue.
Lundi
- 9 hMachine éteinte jusqu'à midi
- 13 hLe post de 9 h part, en rattrapage
- 18 hRien de prévu
Mercredi
- 9 hRéseau coupé à 9 h 00, publié à 9 h 02
- 13 hDeuxième post publié
- 18 hRien de prévu
Vendredi
- 9 hPost publié, carte et commentaire
- 13 hMême texte qu'un post passé : refusé
- 18 hRien de prévu
Votre profil n'est pas un terrain d'essai.
Tout est pensé pour qu'un post ne parte jamais deux fois, ni au mauvais moment.
- Publié, puis rangé
- Un post publié quitte la file pour posts/posted/, avec son lien.
- Jamais deux fois
- Chaque texte publié est mémorisé : une copie, même renommée, est refusée.
- Relancé, jamais à l'aveugle
- Un échec certain (réseau coupé, refus de LinkedIn) est retenté deux minutes plus tard, cinq fois au plus. Un envoi interrompu au mauvais moment n'est jamais relancé seul : vous vérifiez d'abord.
- Une exécution à la fois
- Un verrou empêche deux passages de publier en même temps.
- Voir avant d'envoyer
--dry-runmontre exactement ce qui partira, gras compris, sans rien envoyer.- Votre jeton, votre machine
- Aucun service tiers : l'API officielle de LinkedIn, depuis votre ordinateur.
Une carte pour chaque post, sans ouvrir un logiciel de design.
Les champs card_ de votre post deviennent une image 1080×1350, le format portrait qui prend le plus de place dans le fil. Vos couleurs et votre signature se règlent une fois dans config.toml. Un texte trop long est refusé, jamais coupé.
python3 scripts/render_card.py --all

Installé en un clic, avec votre agent.
Avec un agent de code
Ouvrez votre agent de code dans un clone du dépôt et collez le prompt. Il lance les tests, personnalise vos cartes, vous guide pour créer l'app LinkedIn, prépare un premier post en brouillon et installe cron avec votre accord. Rien n'est publié sans votre oui.
- Codex
- OpenCode
- Gemini CLI
- et tout agent de code
À la main, en quinze minutes
# l'outil
git clone https://github.com/cjdotdev/linkedin-scheduler.git
cd linkedin-scheduler && npm install
# votre jeton LinkedIn (voir la doc)
cp .env.example .env
python3 scripts/publish.py --checkLe guide pas à pas pour l'app LinkedIn et le jeton est dans docs/linkedin-setup.md.
Les questions qu'on se pose avant.
LinkedIn l'autorise-t-il ?
Oui. L'outil passe par « Share on LinkedIn », le produit officiel et gratuit de LinkedIn pour publier au nom d'un membre qui l'a autorisé. Aucune automatisation du navigateur. L'outil n'est pas affilié à LinkedIn.
Combien ça coûte ?
Rien. L'outil est open source sous licence MIT, l'app LinkedIn est gratuite, et tout tourne sur votre machine. Pas d'abonnement, pas de serveur à louer.
Mon jeton est-il en sécurité ?
Il reste dans un fichier .env sur votre machine, exclu de git. Avec l'installation par agent, c'est vous qui le collez dans ce fichier : l'agent ne le voit jamais.
Et si mon ordinateur est éteint ?
Chaque créneau est tenté cinq fois, de 9 h 00 à 9 h 08 : une machine qui se réveille à 9 h 03 publie à 9 h 04. Encore éteinte à 9 h 10, le post part au créneau suivant, à 13 h ou 18 h. Un post d'un jour passé n'est jamais envoyé en retard : le journal le signale pour que vous lui donniez une nouvelle date. Pour ne rien manquer, installez l'outil sur une machine toujours allumée.
Puis-je publier sur une page entreprise ?
Non, seulement sur votre profil personnel. Les pages entreprise demandent une validation de LinkedIn que l'outil n'a pas.
Combien de temps dure le jeton ?
Environ 60 jours. Le journal vous prévient une semaine avant, et le renouveler prend une minute dans le générateur de jetons de LinkedIn.
Et Reddit ou X ?
Pas pour l'instant. Seule l'API officielle de LinkedIn est utilisée, et jamais une automatisation de compte par le navigateur.