Les 42 blocsThe 42 blocks
Chaque ticket ci-dessous sort de l'émulateur de la TM-T88V, au point près, à partir de l'exemple JSON indiqué (données fictives). Dans l'appli, on les ajoute et on les règle sans écrire de JSON. Les blocs marqués Claude font rédiger leur texte par Claude, à l'impression seulement.
Each ticket below comes out of the TM-T88V emulator, dot for dot, from the JSON example shown (made-up data), with PRINTR_LANG=en. In the app, blocks are added and tuned without writing any JSON. Blocks marked Claude have their text written by Claude, at print time only.
Mise en pageLayout
🔠 TitreTitle#
Un grand titre centré, en gras.A big bold centered title.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "title", "text": "Bonjour Camille !" } ] }{ "blocks": [ { "type": "title", "text": "Hello Camille!" } ] }
📝 TexteText#
Un paragraphe libre : gras, souligné, inversé, petit ou agrandi, aligné où l'on veut.Free text: bold, underlined, inverted, small or large, aligned as you like.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "text", "text": "Un paragraphe libre, coupé aux mots." }, { "type": "text", "text": "En gras,", "bold": true }, { "type": "text", "text": "souligné,", "underline": true }, { "type": "text", "text": " en inversé ", "reverse": true }, { "type": "text", "text": "en petit, à droite…", "small": true, "align": "right" }, { "type": "text", "text": "ou en grand", "size": 2, "align": "center" } ] }{ "blocks": [ { "type": "text", "text": "A free paragraph, wrapped at word boundaries." }, { "type": "text", "text": "In bold,", "bold": true }, { "type": "text", "text": "underlined,", "underline": true }, { "type": "text", "text": " reversed ", "reverse": true }, { "type": "text", "text": "small, on the right…", "small": true, "align": "right" }, { "type": "text", "text": "or big", "size": 2, "align": "center" } ] }

📅 DateDate#
La date du jour, en toutes lettres.Today's date, spelled out.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "date" } ] }{ "blocks": [ { "type": "date" } ] }
➖ SéparateurSeparator#
Une ligne de séparation, avec le caractère de son choix.A separating line, with the character of your choice.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "separator", "style": "═" }, { "type": "separator", "style": "-" }, { "type": "separator", "style": "·" }, { "type": "separator", "style": "~" } ] }{ "blocks": [ { "type": "separator", "style": "═" }, { "type": "separator", "style": "-" }, { "type": "separator", "style": "·" }, { "type": "separator", "style": "~" } ] }

↕️ EspaceSpacing#
De l'air entre deux blocs.Some air between two blocks.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "text", "text": "Avant l'espace", "align": "center" }, { "type": "feed", "lines": 4 }, { "type": "text", "text": "Après quatre lignes vides", "align": "center" } ] }{ "blocks": [ { "type": "text", "text": "Before the space", "align": "center" }, { "type": "feed", "lines": 4 }, { "type": "text", "text": "After four blank lines", "align": "center" } ] }

🖼️ ImageImage#
Une photo, cadrée dans l'appli et tramée en noir et blanc.A photo, framed in the app and dithered in black and white.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "image", "path": "docs/demo/cafe.jpg" } ] }{ "blocks": [ { "type": "image", "path": "docs/demo/cafe.jpg" } ] }

🔳 QR codeQR code#
Un lien à scanner, avec sa légende.A link to scan, with a caption.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "qr", "data": "https://xninety9.github.io/Printr/", "caption": "Le site de Printr" } ] }{ "blocks": [ { "type": "qr", "data": "https://xninety9.github.io/Printr/", "caption": "The Printr website" } ] }

💖 PictogrammePictogram#
Cœur, étoile, soleil, fleur ou sourire, dessinés au point près.Heart, star, sun, flower or smile, drawn dot by dot.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "picto", "shape": "coeur", "size": "petit", "count": 3 }, { "type": "picto", "shape": "etoile", "size": "petit", "count": 3 }, { "type": "picto", "shape": "soleil", "size": "moyen" }, { "type": "picto", "shape": "fleur", "size": "petit", "count": 2 }, { "type": "picto", "shape": "sourire", "size": "petit", "count": 2 } ] }{ "blocks": [ { "type": "picto", "shape": "coeur", "size": "petit", "count": 3 }, { "type": "picto", "shape": "etoile", "size": "petit", "count": 3 }, { "type": "picto", "shape": "soleil", "size": "moyen" }, { "type": "picto", "shape": "fleur", "size": "petit", "count": 2 }, { "type": "picto", "shape": "sourire", "size": "petit", "count": 2 } ] }

Au quotidienDaily
🌤️ MétéoWeather#
Le temps du jour et des jours suivants (Open-Meteo, sans clé).Today's weather and the next days (Open-Meteo, no key).
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "weather", "location": "Lyon", "days": 3 } ] }{ "blocks": [ { "type": "weather", "location": "Lyon", "days": 3 } ] }

🌟 HoroscopeHoroscope#
Calculé sur le vrai ciel du jour par Barnum, hors ligne et gratuit.Computed from the real sky by Barnum, offline and free.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "barnum", "sign": "lion", "sky": true } ] }{ "blocks": [ { "type": "barnum", "sign": "lion", "sky": true } ] }

🔮 Horoscope ClaudeClaude horoscopeClaude#
Rédigé par Claude, sérieux, farfelu, vachard… ou insultant.Written by Claude: serious, whimsical, snarky… or insulting.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "horoscope", "sign": "lion", "tone": "farfelu" } ] }{ "blocks": [ { "type": "horoscope", "sign": "lion", "tone": "farfelu" } ] }

📖 Mot du jourWord of the dayClaude#
Un mot rare, sa définition, un exemple et son étymologie.A rare word, its definition, an example and its etymology.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "word_of_the_day" } ] }{ "blocks": [ { "type": "word_of_the_day" } ] }

😇 Saint du jourName day#
La fête du jour, du calendrier français.Today's name day, from the French calendar (in French).
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "saint" } ] }{ "blocks": [ { "type": "saint" } ] }
💬 CitationQuote#
Une citation française célèbre, différente chaque jour.A famous quote, a new one every day.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "quote" } ] }{ "blocks": [ { "type": "quote" } ] }

🌙 LuneMoon#
Phase, éclairement et prochaines lunes, calculés sur place.Phase, illumination and next moons, computed locally.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "moon" } ] }{ "blocks": [ { "type": "moon" } ] }

🌅 SoleilSun#
Lever, coucher et durée du jour.Sunrise, sunset and day length.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "sun", "location": "Lyon" } ] }{ "blocks": [ { "type": "sun", "location": "Lyon" } ] }

🍃 Qualité de l'airAir quality#
Indice européen, particules et pollens.European index, particles and pollen.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "air_quality", "location": "Lyon" } ] }{ "blocks": [ { "type": "air_quality", "location": "Lyon" } ] }

🏖️ Jours fériésHolidays#
Les prochains jours fériés, en métropole ou en Alsace-Moselle.The next French public holidays.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "holidays", "count": 3 } ] }{ "blocks": [ { "type": "holidays", "count": 3 } ] }

⏳ Compte à reboursCountdown#
« J-12 avant les vacances ».“12 days to go before the holidays”.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "countdown", "label": "les vacances de Noël", "date": "2026-12-19" } ] }{ "blocks": [ { "type": "countdown", "label": "the Christmas holidays", "date": "2026-12-19" } ] }

Jeux & défisGames & challenges
🧩 ÉnigmeRiddle#
125 énigmes, la réponse imprimée à l'envers.Riddles, charades, logic and math, the answer printed upside down.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "enigme", "number": 25 } ] }{ "blocks": [ { "type": "enigme", "number": 25 } ] }

💪 Défi sportifWorkout#
Un défi du jour sans équipement, sur trois niveaux.A daily no-equipment challenge, three levels.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "defi_sportif", "level": "moyen", "number": 3 } ] }{ "blocks": [ { "type": "defi_sportif", "level": "moyen", "number": 3 } ] }

🔢 SudokuSudoku#
Une grille à remplir au stylo ; la solution par son numéro.A grid to fill in with a pen; the solution by its number.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "sudoku", "difficulty": "moyen", "seed": 2026 } ] }{ "blocks": [ { "type": "sudoku", "difficulty": "moyen", "seed": 2026 } ] }

🌀 LabyrintheMaze#
Entrée en haut, sortie en bas.Enter at the top, exit at the bottom.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "maze", "width": 12, "height": 16, "seed": 7 } ] }{ "blocks": [ { "type": "maze", "width": 12, "height": 16, "seed": 7 } ] }

🔤 Mots mêlésWord search#
Des mots cachés par thème, ou les siens.Hidden words by theme, or your own.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "mots_meles", "difficulty": "facile", "theme": "animaux", "seed": 41082 } ] }{ "blocks": [ { "type": "mots_meles", "difficulty": "facile", "theme": "animaux", "seed": 41082 } ] }

🚂 Voie ferréeTrain tracks#
Relier A à B par une seule voie, d'après les nombres des bords.Link A to B with a single track, from the numbers on the edges.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "voie_ferree", "difficulty": "moyen", "seed": 5 } ] }{ "blocks": [ { "type": "voie_ferree", "difficulty": "moyen", "seed": 5 } ] }

✍️ Mots fléchésArrow wordsClaude#
Une grille générée par CrossWords, définitions par Claude.A grid generated by CrossWords, clues written by Claude.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "mots_fleches", "level": 2, "seed": 14 } ] }{ "blocks": [ { "type": "mots_fleches", "level": 2, "seed": 14 } ] }

🖍️ LogimageNonogram#
Noircir des cases pour révéler un dessin.Fill in cells to reveal a picture.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "logimage", "number": 8 } ] }{ "blocks": [ { "type": "logimage", "number": 8 } ] }

✏️ Petit bacCategories#
Une lettre, des catégories, une feuille par joueur.A letter, categories, one sheet per player.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "petit_bac", "players": 2, "seed": 1234 } ] }{ "blocks": [ { "type": "petit_bac", "players": 2, "seed": 1234 } ] }

➗ Calcul mentalMental math#
Une fiche d'opérations, résultats à l'envers.A sheet of sums, answers upside down.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "calcul_mental", "difficulty": "moyen", "count": 12, "seed": 2026 } ] }{ "blocks": [ { "type": "calcul_mental", "difficulty": "moyen", "count": 12, "seed": 2026 } ] }

🔀 Mot mystèreAnagram#
Des lettres mélangées à remettre dans l'ordre.Scrambled letters to put back in order.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "mot_mystere", "count": 3, "seed": 77 } ] }{ "blocks": [ { "type": "mot_mystere", "count": 3, "seed": 77 } ] }

🕵️ Message codéSecret message#
César, morse ou nombres, avec la grille pour déchiffrer.Caesar, Morse or numbers, with the key to decode.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "message_code", "message": "Le trésor est caché sous le canapé", "cipher": "cesar", "shift": 3 } ] }{ "blocks": [ { "type": "cipher", "message": "The treasure is hidden under the couch", "cipher": "caesar", "shift": 3 } ] }

🎨 ColoriageColoring#
Un mandala à colorier, toujours différent.A mandala to color, always different.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "coloriage", "seed": 2026 } ] }{ "blocks": [ { "type": "coloriage", "seed": 2026 } ] }

Petites attentionsLittle treats
🎟️ Bon à offrirGift coupon#
« Bon pour un petit-déjeuner au lit », à découper.“Good for one breakfast in bed”, to cut out.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "bon", "text": "un petit-déjeuner au lit", "from": "Alex", "to": "Camille", "valid_until": "2026-12-31" } ] }{ "blocks": [ { "type": "coupon", "text": "breakfast in bed", "from": "Alex", "to": "Camille", "valid_until": "2026-12-31" } ] }

Infos & organisationNews & to-dos
📰 Actualités (RSS)News (RSS)#
Une revue de presse depuis ses flux, sans IA, avec QR codes.A news digest from your feeds, no AI, with QR codes.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "news", "title": "France", "feeds": [ "https://www.franceinfo.fr/titres.rss", "https://www.lemonde.fr/rss/une.xml" ], "count": 3, "qr": 2 } ] }{ "blocks": [ { "type": "news", "title": "World", "feeds": [ "https://feeds.bbci.co.uk/news/world/rss.xml", "https://hackaday.com/blog/feed/" ], "count": 3, "qr": 2 } ] }

🏛️ ÉphémérideOn this day#
C'est arrivé un jour comme aujourd'hui (Wikipédia).It happened on a day like today (Wikipedia).
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "on_this_day", "count": 3 } ] }{ "blocks": [ { "type": "on_this_day", "count": 3 } ] }

🪙 CryptoCrypto#
Cours et variation sur 24 h (CoinGecko).Price and 24-hour change (CoinGecko).
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "crypto" } ] }{ "blocks": [ { "type": "crypto" } ] }

✅ À faireTo-do#
Une liste à cocher au stylo.A checklist to tick with a pen.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "todo", "items": [ "Arroser les plantes", "Appeler Léo", "Racheter du papier thermique" ] } ] }{ "blocks": [ { "type": "todo", "items": [ "Water the plants", "Call Léo", "Buy more thermal paper" ] } ] }

🛒 Liste de coursesShopping list#
La liste partagée de la famille, qui se vide une fois imprimée.The family's shared list, cleared once printed.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "courses", "clear": true } ] }{ "blocks": [ { "type": "courses", "clear": true } ] }

🗓️ AgendaCalendar#
Les rendez-vous du jour, depuis un calendrier en ligne.Today's events, from an online calendar.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "agenda", "calendars": [ "docs/exemples/famille.ics" ], "days": 2, "title": "Agenda de la famille" } ] }{ "blocks": [ { "type": "agenda", "calendars": [ "docs/exemples/en/family.ics" ], "days": 2, "title": "Family calendar" } ] }

🗑️ PoubellesBin day#
« Ce soir, on sort le bac jaune ».“Tonight, the recycling bin goes out”.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "poubelles", "collections": [ { "name": "ordures ménagères", "days": [ "lundi", "vendredi" ] }, { "name": "bac jaune", "days": [ "vendredi" ], "every": 2, "from": "2026-10-09" }, { "name": "verre", "days": [ "mercredi" ], "every": 4, "from": "2026-10-14" } ] } ] }{ "blocks": [ { "type": "bins", "collections": [ { "name": "trash", "days": [ "monday", "friday" ] }, { "name": "recycling", "days": [ "friday" ], "every": 2, "from": "2026-10-09" }, { "name": "glass", "days": [ "wednesday" ], "every": 4, "from": "2026-10-14" } ] } ] }

📶 Wi-Fi invitésGuest Wi-Fi#
Un QR code pour se connecter au réseau.A QR code to join the network.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "wifi", "ssid": "Maison-Invités", "password": "soleil-du-matin-42" } ] }{ "blocks": [ { "type": "wifi", "ssid": "Home-Guests", "password": "morning-sunshine-42" } ] }

🧾 Bilan du moisMonthly receipt#
Qui a imprimé quoi, façon ticket de caisse.Who printed what, as a till receipt.
Le ticket en JSONTicket JSON
{ "blocks": [ { "type": "bilan" } ] }{ "blocks": [ { "type": "bilan" } ] }

Page générée depuisGenerated from docs/exemples.