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
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.