Skip to content

Latest commit

 

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cantine

Où déjeuner avec tes titres-restaurant, depuis ton terminal.
CLI non officielle pour Swile — en lecture seule, sans mot de passe.

Release Licence MIT Go Plateformes

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

Comment ça marche

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.

About

CLI non officielle pour Swile : trouve les restaurants qui acceptent tes titres-restaurant, consulte tes soldes et exporte tes transactions, depuis ton terminal. Go, lecture seule, sans mot de passe.

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages