cantine
Où déjeuner avec tes titres-restaurant, depuis ton terminal.
CLI non officielle pour Swile — en lecture seule, sans mot de passe.
$ cantine places --near "place Mejane, Valbonne" --radius 400m --category restaurant
Place Mejane 06560 Valbonne · 43.6226, 7.0467 · rayon 400 m
LE RESTO MINUT 5 place Mejane, 06560 VALBONNE 22 m Restaurant
LA BRASSERIE 3 place Mejane, 06560 VALBONNE 22 m Restaurant
RESTAURANT LES AMOURIERS 1 pl Deis Amouriers, 06560 VALBONNE 28 m Restaurant
NAMASTE INDIA 2 pl Mejane, 06560 VALBONNE 30 m Restaurant
LE COIN GOURMAND 7 rue de la Bastide Vieille, 06560 VALBONNE 98 m Restaurant
$ cantine balance
Meal vouchers 272.82 € 25.00 € dispo aujourd'hui
Personal wallet 0.00 €
Installation
brew install DnzzL/tap/cantine # macOS · Linux (Homebrew ≥ 4.5)
go install github.com/DnzzL/cantine@latest # partout
Binaires macOS / Linux / Windows, en amd64 et arm64, également disponibles dans
les releases.
Le binaire n'est ni signé ni notarisé — pas de certificat Apple Developer.
Le cask lève lui-même la quarantaine Gatekeeper à l'installation ; pour un
téléchargement manuel sur macOS, il faut faire
xattr -dr com.apple.quarantine ./cantine.
Démarrage
Connecte-toi sur team.swile.co dans ton navigateur,
puis :
cantine auth import --browser chrome
cantine places --near "35 rue de Rivoli, Paris"
C'est tout. cantine ne demande jamais ton mot de passe et ne touche jamais
à la double authentification : il emprunte la session que ton navigateur
détient déjà, la stocke dans le trousseau de ton système, et renouvelle le
jeton automatiquement. Ta session navigateur n'est pas affectée.
Ton système demandera l'autorisation de lire la clé de chiffrement des cookies
(« Chrome Safe Storage » sur macOS) — sans elle, ils restent illisibles.
Autres navigateurs, profil non standard
Chrome, Firefox, Safari, Edge, Brave, Chromium, Opera, Vivaldi. Sans
--browser, cantine cherche partout et prend la session la plus récente.
cantine auth import --profile ~/chemin/vers/le/profil
cantine auth status # qui suis-je, jusqu'à quand
cantine auth logout # oublier la session
Machine sans navigateur (VPS, conteneur, SSH)
Là où il n'y a aucun navigateur dont emprunter la session, le jeton arrive
d'ailleurs : d'une machine qui en a un, ou de ton presse-papier.
cantine auth export | ssh vps cantine auth paste # depuis une machine déjà connectée
cantine auth paste # ou à la main : colle, Entrée
auth export sort le jeton sur stdout et refuse de s'exécuter si stdout est un
terminal : un refresh token vaut pour tout le compte, il n'a rien à faire dans
un scrollback ni dans un log de CI.
À la main, la valeur se lit dans devtools › Application › Cookies ›
lunchr:rt : 43 caractères, sans point. Si tu en as ~800 avec deux points,
c'est lunchr:jwt, l'access token — /oauth/token le refuse.
cantine valide le jeton immédiatement et le stocke — dans le trousseau s'il y
en a un, sinon dans ~/.config/cantine/session.json en 0600. Ensuite il se
renouvelle tout seul ; un cantine auth status de temps en temps (cron)
suffit à garder la session vivante.
Swile ne propose ni device authorization grant ni découverte OIDC : il n'y a
donc pas de « ouvre cette URL sur ton téléphone » à implémenter. Coller le
jeton, c'est tout le protocole.
Commandes
places — où dépenser
cantine places --near "Châtelet, Paris"
cantine places --near "Valbonne" --radius 2km --category restaurant
cantine places --lat 43.6252 --lng 7.0483 --radius 500m
cantine places --near "Lyon" --name "brasserie"
cantine categories # les codes de --category
Le géocodage passe par la Base Adresse Nationale :
--near ne fonctionne donc qu'en France. Ailleurs, --lat / --lng.
--name filtre localement. L'API Swile ne sait pas chercher par nom : elle
ne répond qu'à des zones géographiques. En zone dense, elle ne renvoie qu'une
fraction des commerçants présents — cantine te dit toujours laquelle :
! zone dense : Swile a renvoyé 178 commerçants sur 4304 présents dans la zone.
Une absence de résultat n'est jamais une preuve d'absence.
balance — tes soldes
cantine balance
cantine balance --json | jq '.[] | select(.type=="meal_voucher") | .balance.value'
tx — ton historique
cantine tx
cantine tx --since 2026-01-01 --limit 500 --csv > titres-resto-2026.csv
Sortie
| Option |
Pour |
| (défaut) |
lecture humaine, colonnes alignées, couleurs |
--json |
jq, scripts, agents |
--plain |
awk, cut — colonnes séparées par des tabulations |
--csv |
tx uniquement — tableur, note de frais |
NO_COLOR et TERM=dumb sont respectés, et la couleur disparaît dès que la
sortie n'est pas un terminal. Les avertissements partent sur stderr : un pipe
ne reçoit que des données.
Ce que cantine ne fait pas, et ne fera pas
Lecture seule. Aucun endpoint d'écriture n'est appelé — ni commande, ni
carte, ni opération bancaire. C'est une règle du projet, inscrite dans le code :
un outil qu'on lance depuis un shell ne doit jamais pouvoir dépenser d'argent.
Pas d'extraction massive. Rayon plafonné à 10 km, throttle à 1 requête par
seconde sans moyen de le désactiver, ni commande de dump, ni tuilage
automatique. cantine sert à trouver où déjeuner. La base des commerçants agréés
appartient à Swile et relève du droit du producteur de bases de données
(art. L341-1 CPI) : son extraction en volume n'est pas un usage que ce projet
entend rendre possible.
Pas de contournement d'authentification. Ni flow mot de passe, ni 2FA, ni
signature d'appareil de confiance. cantine emprunte une session que tu as
ouverte toi-même.
cantine parle aux mêmes endpoints que l'application web team.swile.co :
| Service |
Usage |
directory.swile.co/oauth/token |
renouvellement du jeton |
places-api.swile.co |
commerçants et catégories |
employee-bff-api.swile.co |
soldes |
neobank-api.swile.co |
historique |
Aucun n'est documenté ni supporté par Swile. Ils peuvent changer sans préavis
et casser cet outil : c'est le contrat.
Contribuer
Les issues et les PR sont bienvenues — voir CONTRIBUTING.md.
Le périmètre est volontairement étroit ; lis-le avant de proposer une
fonctionnalité.
Licence
MIT — voir LICENSE.
[!NOTE]
Projet indépendant, sans aucun lien avec Swile SAS. « Swile » est une marque
de son propriétaire, employée ici uniquement pour désigner le service avec
lequel cet outil interopère.
In English
cantine is an unofficial command-line client for Swile,
the French meal-voucher and employee-benefits card. It finds nearby merchants
that accept your card, shows your balances, and exports your transaction
history as CSV.
It authenticates by borrowing the session cookies your browser already holds —
no password, no two-factor flow, no app registration — in the spirit of
spogo. It is strictly read-only, rate-limited, and
deliberately incapable of bulk-extracting Swile's merchant directory.
Address lookup uses France's official open address database, so --near is
France-only; use --lat / --lng elsewhere. Install with
brew install DnzzL/tap/cantine.