Elio Darras
FreelancePreuve de concept

PitStop

Le droit d'entrer aux toilettes des cafés, par abonnement

Captures de l'app
Captures réelles de l'app.

Écran par écran

  • 01La carte : le pass est actif, huit toilettes autour de soi, et « La plus proche » calcule l'itinéraire.

  • 02L'itinéraire piéton tracé sur la carte, avec la durée et la distance.

  • 03Le pass qu'on tend au comptoir : QR tournant, horloge à la seconde, validité.

  • 04Ouvrir l'itinéraire dans Plans ou Google Maps.

Rôle

Freelance

Une app qui vend le droit d'entrer : un pass à 1 € par mois donne accès aux toilettes d'un réseau de cafés partenaires, avec la carte, l'itinéraire à pied, la consigne d'accès et un pass qu'on tend au comptoir. Trois preuves de passage, un espace restaurateur sans app ni compte, et un paiement simulé annoncé comme tel.

Ce qu'il y a dedans

  • Carte et liste des partenaires, itinéraire piéton, fiches avec horaires structurés et consigne d'accès.
  • Pass plein écran avec horloge à la seconde, et un code QR tournant toutes les 15 secondes, signé HMAC, à usage unique.
  • Autocollant QR scanné avec l'appareil photo natif, sans permission caméra, et code de secours à 4 chiffres.
  • Espace restaurateur en HTML pur, identifié par jeton d'URL : fréquentation, scanner, pause, kit imprimable.
  • Identité device-first : on paie et on utilise l'app sans compte. Hors ligne complet.
  • NestJS, MongoDB, Expo, TanStack Query, Zustand. 26 pages de documentation, six décisions d'architecture.

En détail

01L'idée

Les toilettes propres existent déjà, dans les cafés. Ce qui manque n'est pas un lieu, c'est le droit d'y aller sans commander un café ni négocier au comptoir. PitStop vend ce droit à l'avance, sous forme d'abonnement : un pass mensuel à 1 €, ou un pass visiteur de 72 heures à 1,50 €.

Trois acteurs, un seul paie. L'abonné reçoit une carte, un pass et des consignes d'accès. Le restaurateur donne l'accès à ses toilettes et reçoit du passage, sans contrainte et sans coût. PitStop fait la mise en relation.

Le paiement est simulé, et l'app le dit : la route s'appelle littéralement mock-subscribe. Le réseau est une démonstration de huit établissements parisiens.

02Le parcours de l'abonné

La carte montre les partenaires autour de soi, floutée derrière un bandeau tant qu'on n'a pas de pass. Un bouton « La plus proche » calcule l'itinéraire piéton via OSRM, plafonné à 10 km. La liste, triée par distance, n'accepte qu'un filtre à la fois : en situation d'urgence on ne compose pas une requête, on tape une fois.

La fiche porte l'essentiel : horaires structurés avec un badge « Ouvert · ferme à 23h », distance à pied, accessibilité, photo de l'entrée, et surtout la consigne d'accès, « Toilettes au sous-sol, montrez l'app au comptoir ». C'est le champ le plus important.

Le pass est l'écran qu'on tend au comptoir : teal plein écran, comme une carte d'embarquement, avec deux preuves de vie contre la capture d'écran, l'horloge qui défile à la seconde et un badge animé en continu.

Tout fonctionne hors ligne : TanStack Query persiste les partenaires, leurs consignes et leurs horaires, et la session avec eux, sinon un abonné sans réseau retomberait sur le paywall. Le code tournant, lui, n'est jamais persisté : un code périmé ne servirait qu'à se faire refuser.

03Trois preuves de passage

L'autocollant : un QR statique collé près de la caisse, scanné avec l'appareil photo natif d'iOS. L'app s'ouvre par lien profond, vérifie le pass, enregistre le passage. Aucun lecteur QR embarqué, aucune permission caméra, donc livrable par mise à jour à distance. Limite assumée : il identifie l'établissement, pas la personne.

Le code tournant : l'abonné affiche un QR qui change toutes les 15 secondes et le comptoir le scanne. Le jeton est signé en HMAC-SHA256 avec un secret dérivé, vit 20 secondes, est à usage unique, et ne demande aucun stockage entre l'émission et le scan. Quatre refus distincts, chacun avec son message pour que le comptoir sache quoi dire.

Le filet : un code à 4 chiffres par partenaire, que le patron tape sur le téléphone de l'abonné, limité à 10 tentatives par minute. Et un dédoublonnage : un même abonné n'est compté qu'une fois par heure chez un même partenaire.

04Le restaurateur et l'équipe

Pas d'app restaurateur, et c'est délibéré : aucun commerçant n'installera une application pour signaler que ses toilettes sont en nettoyage. Il reçoit une page web, sans compte ni mot de passe, le jeton dans l'adresse est son identification, rendue en HTML pur pour s'ouvrir sur un téléphone de 2015 posé à côté de la caisse.

Sur cette page : sa fréquentation, un scanner du code de l'abonné dans le navigateur, la mise en pause plafonnée à 24 heures pendant laquelle il disparaît de la carte, son code de secours, et un formulaire de signalement. Un kit imprimable A4 fournit l'autocollant, le code et quatre lignes d'explication.

Côté équipe : un écran d'administration avec statistiques, signalements, partenaires et derniers inscrits, l'ajout d'un lieu par Google Places, et un scanner intégré qui tape la vraie route du restaurateur.

NestJS 10 et MongoDB en TypeScript strict, Expo SDK 52 et React Native 0.76 en nouvelle architecture, expo-router, TanStack Query, Zustand. Identité device-first : on peut payer et utiliser l'app sans compte. Jetons d'accès de 15 minutes, jetons de rafraîchissement en cookie HttpOnly avec rotation, bcrypt, Helmet, throttling. 34 tests backend, 33 frontend, 26 pages de documentation avec six décisions d'architecture. Distribution par EAS Update sur trois canaux.