Labs · le produit entier
Le web et l'app depuis un seul noyau. Une construction, un standard.
Le site que vos clients lisent et l'app que vos équipes portent ne sont pas deux projets — ce sont deux visages d'un seul système. Nous les construisons sur un unique noyau mesuré, afin qu'ils ne divergent jamais, et une seule main répond de l'ensemble.
Le site et l'app lisent la même vérité. Changez-la une fois, et les deux bougent ensemble.
Quatre chiffres d'une plateforme construite comme un tout.
Les quatre pièces qui rendent cela réel. Lisez-les dans l'ordre : la vérité, les deux
visages qui lui obéissent, et la porte qui n'en laisse passer aucun en dessous du seuil.
Le code reste en anglais — la langue universelle de la technique.
// MatchTop · the core — one definition both surfaces obey. // Written once. The portal and the field app read the same truth — they cannot drift. type Case = { id: Uuid, status: "open" | "review" | "closed", locale: Locale, // one language list, honoured by both surfaces updated: Instant, // stamped at the edge — one clock for web and app } service Portal { get case(id) -> Case list cases(for: Holder) -> Case[] }
<!-- the web surface · server-rendered at the edge, zero JS to read a case --> <article class="case" lang="{{ case.locale }}"> <h1>{{ t("case.title", case.id) }}</h1> <p class="status status--{{ case.status }}">{{ t("status." + case.status) }}</p> <time datetime="{{ case.updated }}">{{ t.date(case.updated) }}</time> </article> // same Case. same locale list. no bundle to boot before the page can be read.
// the app surface · the same contract, compiled. A wrong field will not build. #[derive(Deserialize)] struct Case { id: Uuid, status: Status, // an enum, not a loose string — the compiler holds the line locale: Locale, updated: Instant, } impl Case { /// Works offline: the last truth we fetched is still the same shape. fn is_open(&self) -> bool { matches!(self.status, Status::Open | Status::Review) } }
"""MatchTop · the gate — one standard over both surfaces. Standard library only. It runs in your pipeline, and it can say no to either face.""" import sys BUDGET = {"first_paint_ms": 100, "js_kb": 0, "a11y": "AA"} # promised, so measured def gate(surface: str, got: dict) -> None: fails = [k for k, limit in BUDGET.items() if _worse(got[k], limit)] # every promise is a test if fails: print(f"HELD · {surface} · " + ", ".join(fails)) sys.exit(1) # neither the site nor the app ships below the line print(f"GREEN · {surface} · measured, and worthy of your name on it")
Pourquoi une seule maison pour l'ensemble bat deux prestataires assemblés à la couture.
Ce n'est pas un rabais pour avoir acheté deux choses à la fois. C'est une forme différente : un seul système à deux visages, pas deux systèmes scotchés ensemble. Un prestataire qui vend le site et sous-traite l'app ne peut pas vous donner un seul noyau — il n'en a pas. C'est la partie qu'on ne peut pas sous-coter.
Avant qu'une ligne soit écrite, comment votre travail est protégé. Cette partie n'est pas négociable.
Un NDA est le standard ici, pas une option payante. Ce que vous partagez est lu par un seul ingénieur et personne d'autre — rien n'est vendu, partagé ou transmis.
Identifiants et dossiers restent dans votre maison, selon le principe du moindre privilège. Nous ne gardons aucune copie dont nous n'avons pas besoin, et rien ne quitte votre portée sans votre accord.
Ce qui tourne dans votre maison, vous pouvez le lire et l'auditer — aucune boîte noire à laquelle vous devriez faire confiance sans la voir. La salle des machines reste la nôtre ; ce que vous exploitez est le vôtre.
Le produit entier, en deux lignes. Nous les lisons nous-mêmes et répondons nous-mêmes — il n'y a aucune file derrière cette fenêtre.
C'est déjà sur un écran à Zurich — pas dans une file, pas dans un ticket. L'ingénieur qui construirait ceci le lit, et répond lui-même.
·