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!"
    }
  ]
}
TitreTitle

📝 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"
    }
  ]
}
TexteText

📅 DateDate#

La date du jour, en toutes lettres.Today's date, spelled out.

Le ticket en JSONTicket JSON
{
  "blocks": [
    {
      "type": "date"
    }
  ]
}{
  "blocks": [
    {
      "type": "date"
    }
  ]
}
DateDate

➖ 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": "~"
    }
  ]
}
SéparateurSeparator

↕️ 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"
    }
  ]
}
EspaceSpacing

🖼️ 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"
    }
  ]
}
ImageImage

🔳 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"
    }
  ]
}
QR codeQR code

💖 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
    }
  ]
}
PictogrammePictogram

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
    }
  ]
}
MétéoWeather

🌟 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
    }
  ]
}
HoroscopeHoroscope

🔮 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"
    }
  ]
}
Horoscope ClaudeClaude horoscope

📖 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"
    }
  ]
}
Mot du jourWord 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"
    }
  ]
}
Saint du jourName day

💬 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"
    }
  ]
}
CitationQuote

🌙 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"
    }
  ]
}
LuneMoon

🌅 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"
    }
  ]
}
SoleilSun

🍃 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"
    }
  ]
}
Qualité de l'airAir quality

🏖️ 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
    }
  ]
}
Jours fériésHolidays

⏳ 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"
    }
  ]
}
Compte à reboursCountdown

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
    }
  ]
}
ÉnigmeRiddle

💪 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
    }
  ]
}
Défi sportifWorkout

🔢 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
    }
  ]
}
SudokuSudoku

🌀 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
    }
  ]
}
LabyrintheMaze

🔤 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
    }
  ]
}
Mots mêlésWord search

🚂 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
    }
  ]
}
Voie ferréeTrain tracks

✍️ 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
    }
  ]
}
Mots fléchésArrow words

🖍️ 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
    }
  ]
}
LogimageNonogram

✏️ 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
    }
  ]
}
Petit bacCategories

➗ 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
    }
  ]
}
Calcul mentalMental math

🔀 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
    }
  ]
}
Mot mystèreAnagram

🕵️ 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
    }
  ]
}
Message codéSecret message

🎨 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
    }
  ]
}
ColoriageColoring

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"
    }
  ]
}
Bon à offrirGift coupon

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
    }
  ]
}
Actualités (RSS)News (RSS)

🏛️ É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
    }
  ]
}
ÉphémérideOn this day

🪙 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"
    }
  ]
}
CryptoCrypto

✅ À 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"
      ]
    }
  ]
}
À faireTo-do

🛒 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
    }
  ]
}
Liste de coursesShopping list

🗓️ 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"
    }
  ]
}
AgendaCalendar

🗑️ 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"
        }
      ]
    }
  ]
}
PoubellesBin day

📶 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"
    }
  ]
}
Wi-Fi invitésGuest Wi-Fi

🧾 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"
    }
  ]
}
Bilan du moisMonthly receipt

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