Un petit quotidien personnel A4, généré le matin pour remplacer le premier scroll du téléphone. Il assemble uniquement les sources choisies, compose un vrai journal monochrome et peut produire un PDF ou l'envoyer à l'imprimante.
Pour essayer, aucune API, aucun compte et aucune imprimante ne sont nécessaires. Le mode démo fonctionne avec des données fictives.
- météo, agenda, priorités, tâches et rappels ;
- actualités générales avec brèves, articles développés et pages focus ;
- actualités IA / tech, flux RSS, veille et recommandations ;
- mot français, vocabulaire tech, quiz, calcul mental et mots croisés ;
- trois densités :
compact,standardetextended; - pagination adaptative : si une rubrique est plus longue, une vraie page de suite est créée au lieu de couper le texte ou de tout rapetisser ;
- aperçu navigateur, PDF A4, impression facultative et recto verso ;
- édition liseuse EPUB reformatable et PDF e-ink à fort contraste ;
- lancement quotidien sous Windows, macOS ou Linux.
La méthode sans Git :
- clique sur le bouton vert Code en haut de cette page ;
- choisis Download ZIP ;
- décompresse le ZIP ;
- ouvre le dossier
signal-matinobtenu.
Ou, si Git est déjà installé :
git clone https://github.com/sosoj92/signal-matin.git
cd signal-matinInstalle Python 3.11 ou plus récent.
Sous Windows, coche Add Python to PATH dans la première fenêtre de l'installateur. Pour vérifier :
python --versionLe résultat doit commencer par Python 3.11, 3.12, 3.13 ou une version
plus récente. Sous Windows, si python n'est pas reconnu, essaie py.
Ouvre un terminal dans le dossier signal-matin :
- Windows 11 : clique dans la barre d'adresse de l'Explorateur, écris
powershell, puis appuie sur Entrée ; - macOS / Linux : ouvre Terminal, écris
cdavec un espace, glisse le dossier dans la fenêtre, puis appuie sur Entrée.
Lance ensuite :
python scripts/setup.pySous Windows, tu peux utiliser ceci si nécessaire :
py scripts/setup.pyLe programme :
- crée un environnement Python isolé dans
.venv; - installe les dépendances ;
- installe Chromium pour fabriquer les PDF ;
- crée un
config.yamllocal de démonstration ; - vérifie l'installation ;
- ouvre un vrai journal fictif dans le navigateur.
Il ne lance jamais d'impression pendant l'installation.
# Windows
.\.venv\Scripts\python.exe scripts\doctor.py
# macOS / Linux
./.venv/bin/python scripts/doctor.pyChaque ligne indique OK, INFO ou l'action exacte à effectuer.
Pour INSTALLER, aucune connaissance technique n'est requise. Ouvre la version gratuite de ChatGPT, Claude ou Gemini, colle le contenu de INSTALL_WITH_AI.md, puis laisse l'assistant te guider une étape à la fois. Les offres gratuites ont des limites variables, mais l'installation de démonstration est suffisamment courte pour ce type d'accompagnement.
Pour MODIFIER ou bidouiller le code, plusieurs choix existent :
- Cline + Ollama — assistant de code avec un modèle local, sans facturation d'API cloud ; il faut toutefois un ordinateur assez puissant pour le modèle choisi ;
- GitHub Copilot Free — palier gratuit et limité, disponible notamment dans VS Code ;
- Cursor Hobby — offre gratuite avec un volume d'utilisation limité ;
- Codex ou Claude Code — si tu y as déjà accès avec ton abonnement ou ton organisation.
Aucun outil n'est imposé : prends celui qui te convient. Ne colle jamais dans
un chatbot le contenu de .env, config.yaml, credentials.json, token.json
ou une URL de calendrier privée. Le guide explique où placer ces informations
localement sans les exposer dans la conversation.
git clone https://github.com/sosoj92/signal-matin.git
cd signal-matin
python -m venv .venvActive l'environnement avec .\.venv\Scripts\Activate.ps1 sous Windows ou
source .venv/bin/activate sous macOS/Linux, puis lance :
pip install -e .
playwright install chromiumEnfin, copie la configuration d'exemple et ouvre la démo :
# Windows PowerShell
Copy-Item config.example.yaml config.yaml
python main.py --preview --demo# macOS / Linux
cp config.example.yaml config.yaml
python main.py --preview --demoLes commandes ci-dessous supposent que l'environnement est activé. Pour l'activer :
# Windows PowerShell
.\.venv\Scripts\Activate.ps1
# macOS / Linux
source .venv/bin/activatePuis :
python main.py --preview # ouvre l'aperçu HTML
python main.py --generate # crée JSON + HTML + PDF
python main.py --print # prépare l'impression, sans l'envoyerLa CLI installée propose les mêmes opérations :
signal-matin preview --demo
signal-matin generate --demo --mode standard
signal-matin ereader --demo --format both
signal-matin print --live --printer "Nom exact" --duplex --confirmprint n'envoie rien sans --confirm.
Les fichiers sont rangés par date :
output/data/2026-09-26-signal-matin.json
output/preview/2026-09-26-signal-matin.html
output/pdf/2026-09-26-signal-matin.pdf
output/ereader/2026-09-26-signal-matin.epub
output/ereader/2026-09-26-signal-matin-eink.pdf
Le format recommandé est l'EPUB : le texte se réorganise selon l'écran et la taille de police choisie sur la liseuse. Un PDF e-ink en ratio 3:4 est également disponible pour les appareils qui préfèrent une mise en page fixe.
signal-matin ereader --demo # EPUB reformatable
signal-matin ereader --demo --format pdf # PDF e-ink
signal-matin ereader --demo --format both # génère les deux pour comparerLe guide Lire Signal Matin sur une liseuse explique les profils d'écran et trois modes de livraison : USB, Send-to-PocketBook lorsque le firmware l'intègre, ou une page privée sur le Wi-Fi local lorsqu'il ne l'intègre pas. Cette page peut renouveler l'EPUB chaque matin sur un ordinateur allumé en permanence, sans exposer la configuration ni les clés API.
Toute la configuration tient dans un seul fichier local config.yaml, créée à
partir de config.example.yaml. Ce fichier n'est jamais
versionné : chacun peut donc brancher ses propres sources sans les publier sur
GitHub.
| Intégration | Ce qu'il faut | Guide |
|---|---|---|
| Édition de démonstration | Rien | Installation ultra simple |
| Météo Open-Meteo | Ville et coordonnées, aucune clé | Météo |
| Actualités et veille RSS | URLs de flux publics | RSS et actualités |
| Agenda ICS | Fichier local ou URL privée | Agenda ICS |
| Google Calendar | Client OAuth local en lecture seule | Google Calendar |
| Priorités et rappels | Quelques lignes YAML locales | Priorités |
| Impression | Une imprimante configurée, facultative | Impression |
| Lancement quotidien | Planificateur Windows ou cron | Automatisation |
Ouvre config.yaml dans un éditeur de texte, remplace demo: true par
demo: false, puis active uniquement les modules souhaités :
modules:
weather: true
calendar: true
tasks: true
news: true
tech: true
rss: true
games: true
tech_vocabulary: true
recommendations: trueTout est facultatif. Une source absente ou en panne ne bloque pas le reste du journal. Signal Matin n'invente pas une actualité pour remplir un trou.
Open-Meteo fonctionne gratuitement et sans compte :
weather:
location: "Lyon"
latitude: 45.7640
longitude: 4.8357news:
limit: 12
max_age_hours: 72
feeds:
- name: "Nom du média"
category: "Monde"
url: "https://media.example/rss.xml"
tech:
limit: 6
feeds:
- name: "Veille tech"
category: "Tech"
url: "https://tech.example/rss.xml"Les titres, résumés, dates, URLs et médias restent associés à chaque article, mais le journal imprimé ne montre pas les détails techniques du connecteur.
Un fichier .ics local ou une URL ICS fonctionne :
calendar:
ics:
- name: "Agenda personnel"
source: "calendars/agenda.ics"Une URL ICS peut donner accès à ton agenda : ne la publie jamais.
Installe d'abord l'option Google :
pip install -e ".[google]"Dans Google Cloud Console, crée un client OAuth de type application de
bureau, télécharge-le sous credentials.json, puis configure :
calendar:
google:
enabled: true
calendar_id: "primary"
credentials_file: "credentials.json"
token_file: "token.json"Connecte ensuite le compte une seule fois :
signal-matin auth-googleL'accès est en lecture seule. Les fichiers OAuth sont ignorés par Git.
tasks:
priorities:
- title: "Finaliser le dossier principal"
importance: "high"
- "Faire le point avant midi"
reminders:
- title: "Envoyer le compte rendu"
due: "2026-09-26T16:00:00+02:00"
context: "Travail"Le fichier config.example.yaml documente toutes les options avec des exemples génériques.
La plupart des personnalisations se font dans config.yaml, sans modifier le
code. Commence par dupliquer config.example.yaml, puis
change seulement les valeurs dont tu as besoin.
| Je veux... | Je modifie... |
|---|---|
| Renommer le journal | paper.title, paper.subtitle et paper.motto |
| Afficher ou masquer une rubrique | les interrupteurs true / false de modules |
| Changer la ville de la météo | weather.location, latitude et longitude |
| Ajouter mes priorités | tasks.priorities et tasks.reminders |
| Ajouter une phrase personnelle | personal.greeting, note, free_window ou quote |
| Choisir mes médias | news.feeds et tech.feeds |
| Ajouter mes recommandations | recommendations |
| Faire une édition plus courte ou plus riche | l'option --mode de la commande |
paper:
title: "Le Petit Matin"
subtitle: "Mon quotidien personnel"
motto: "Commencer informé, continuer léger."Le titre peut contenir un ou plusieurs mots. Le moteur adapte automatiquement le masthead, les en-têtes et les pieds de page.
Passe une option à false pour retirer complètement la rubrique correspondante :
modules:
weather: true
calendar: true
tasks: true
news: true
tech: true
rss: false
games: true
tech_vocabulary: true
recommendations: falseToutes les sources restent facultatives. Une rubrique vide ou désactivée ne laisse pas un grand encadré blanc : la composition se rééquilibre et la pagination s'adapte au contenu restant.
personal:
greeting: "Bonjour, voici l'essentiel pour commencer la journée."
note: "Garder une heure sans notifications ce matin."
free_window: "14 h - 15 h 30"
quote:
text: "La clarté précède l'action."
author: "Note personnelle"
recommendations:
- title: "Relire le chapitre commencé hier"
kind: "Lecture"
reason: "Dix minutes suffisent pour reprendre le fil."Ces textes restent dans le config.yaml local et ne sont jamais inclus dans le
dépôt Git.
signal-matin preview --mode compact # bref et rapide
signal-matin preview --mode standard # équilibre
signal-matin preview --mode extended # davantage de développements
signal-matin preview --mode auto # Signal Matin choisit selon le contenuUtilise toujours preview avant d'imprimer : tu peux modifier config.yaml,
relancer la commande et comparer immédiatement le résultat.
Pour une personnalisation visuelle simple, les réglages principaux sont réunis
au début de web/signal_matin.css :
:root {
--ink: #151515;
--paper: #fbfaf6;
--display: Georgia, Cambria, "Times New Roman", serif;
--serif: Cambria, Georgia, "Times New Roman", serif;
--sans: Arial, "Helvetica Neue", sans-serif;
}Garde un contraste fort pour l'impression et ne change pas les dimensions A4 si tu souhaites conserver la pagination automatique.
Tu peux aussi donner ce prompt à l'assistant de ton choix :
Lis le README et config.example.yaml du projet Signal Matin. Aide-moi à
personnaliser uniquement mon fichier local config.yaml, une étape à la fois.
Commence par me demander le nom du journal, les rubriques souhaitées et mes
sources. Ne me demande jamais de coller une clé API, un token OAuth, une URL ICS
privée ou le contenu complet de config.yaml dans la conversation.
signal-matin generate --demo --mode compact
signal-matin generate --demo --mode standard
signal-matin generate --demo --mode extended| Mode | Pour quoi faire |
|---|---|
compact |
Brief rapide, peu de contenu, environ quatre pages. |
standard |
Édition quotidienne équilibrée. |
extended |
Plus de développements et de cahiers. |
auto |
Choix d'après la quantité de contenu. |
Le nombre final n'est pas rigide. Le moteur mesure les vraies pages dans Chromium. Si un article, une liste ou une rubrique déborde, il crée une page de suite, renumérote le journal et conserve un A4 lisible.
Teste d'abord sans envoyer de papier :
signal-matin print --demo --printer "Nom exact"Puis confirme explicitement :
signal-matin print --live --printer "Nom exact" --duplex --confirm- Windows utilise le pilote sélectionné et un rendu plein A4 ;
- macOS et Linux utilisent CUPS (
lp) ; - aucune impression n'est lancée pendant l'installation ou les tests.
Génération seule à 8 h :
powershell -ExecutionPolicy Bypass -File .\scripts\install_windows_task.ps1 -Time "08:00"Impression recto verso :
powershell -ExecutionPolicy Bypass -File .\scripts\install_windows_task.ps1 `
-Time "08:00" -Print -Duplex -Printer "Nom exact de l'imprimante"Le script mémorise le Python de .venv, le dossier du projet et l'imprimante.
L'heure choisie est l'heure de démarrage de la collecte : avec beaucoup de
sources, le papier peut sortir quelques minutes plus tard.
Pour faire un essai dans une minute sans laisser Codex ou un terminal ouvert :
powershell -ExecutionPolicy Bypass -File .\scripts\programmer_impression_signal_matin.ps1 -DansMinutes 1Ou pour la prochaine occurrence d'une heure précise :
powershell -ExecutionPolicy Bypass -File .\scripts\programmer_impression_signal_matin.ps1 -Heure "18:30"Le test réutilise exactement l'action de la tâche quotidienne Signal Matin.
Il refuse de continuer si cette tâche a été installée sans l'option -Print.
Le script affiche la ligne à ajouter, sans modifier la crontab tout seul :
sh scripts/install_cron.sh 08:00 generate
sh scripts/install_cron.sh 08:00 printSources facultatives
RSS / Open-Meteo / ICS / Google Calendar / YAML
|
v
Connectors / Adapters
|
v
Normalisation Pydantic stricte
|
v
MorningEdition JSON
|
v
Règles éditoriales
|
v
Renderer HTML/CSS autonome
|
v
Playwright / Chromium -> PDF A4
|
v
Impression facultative
Les données et le design restent séparés :
src/signal_matin/connectors/lit les sources ;models.pydéfinit le contrat JSON ;pipeline.pyorchestre et hiérarchise ;renderer.pyne connaît aucune clé ni API ;web/signal_matin.cssporte la direction artistique ;signal_matin_pagination.jscrée les pages de suite si nécessaire ;pdf.pymesure chaque A4 avant l'export ;printer.pyexige une confirmation explicite.
- Ajoute un module dans
src/signal_matin/connectors/. - Retourne des modèles normalisés et un
DataSourceStatus. - Branche-le dans
pipeline.py, jamais dans le renderer. - Ajoute un exemple générique dans
config.example.yaml. - Écris un test avec des données fictives, sans appel réseau réel.
Un connecteur ne doit jamais écrire de secret dans le JSON ou les logs. Une erreur ne doit dégrader que sa propre section.
La feuille web/signal_matin.css est conçue pour @page { size: A4 }. Conserve
les marges physiques et lance les tests de débordement après chaque changement :
signal-matin preview --demo --mode standard
pytest tests/test_renderer.pypip install -e ".[dev]"
playwright install chromium
pytestLa CI vérifie les modèles, les sections absentes, le HTML, les trois densités, la pagination dynamique, les débordements et le format A4. Voir aussi CONTRIBUTING.md.
.env,config.yaml, OAuth, calendriers et sorties sont ignorés par Git ;- les URLs privées restent uniquement sur la machine de l'utilisateur ;
- aucune donnée personnelle n'est nécessaire pour le mode démo ;
- l'impression demande toujours une action volontaire ;
- ce dépôt est autonome et ne dépend d'aucun assistant personnel.
python n'est pas reconnu sous Windows
Réinstalle Python en cochant Add Python to PATH, ou essaie
py scripts/setup.py.
PowerShell refuse Activate.ps1
Tu n'as pas besoin d'activer l'environnement : utilise directement
.\.venv\Scripts\python.exe main.py --preview --demo.
Chromium est introuvable
Lance .\.venv\Scripts\python.exe -m playwright install chromium sous Windows,
ou ./.venv/bin/python -m playwright install chromium sous macOS/Linux.
Une source ne s'affiche pas
Vérifie qu'elle est activée dans modules, puis lance python scripts/doctor.py.
Les autres rubriques continueront de fonctionner.
L'impression quotidienne ne part pas
Ouvre le Planificateur de tâches et consulte l'historique de Signal Matin.
Réinstalle la tâche avec -Print, puis fais un essai avec -DansMinutes 1.
Une page est plus longue que d'habitude
C'est normal : le moteur ajoute une page de suite lorsque la quantité de texte l'exige, au lieu de tronquer l'information.
MIT. Voir LICENSE.
