Labs · la surface app
L'app construite sur mesure, et faite pour durer.
Pas un produit remodelé pour vous — une app construite pour le terrain où elle tourne : éducation, industrie, ou tout autre secteur que vous apportez. Un noyau Rust qui fonctionne avec zéro barre de réseau, native sur chaque écran, et une conception où vos données restent les vôtres.
Pas un modèle repeint à vos couleurs. Un logiciel façonné pour le travail auquel il sert vraiment.
Une salle de classe, une ligne d'usine, une équipe de terrain — l'app est écrite pour la façon dont ce travail se déroule réellement, pas pour une démonstration. Le secteur la façonne, pas l'inverse.
Un sous-sol, un site isolé, une zone sans réseau — le travail ne s'arrête pas. L'appareil garde la vérité, et se réconcilie avec la périphérie à l'instant même où le signal revient.
Aucun compte que vous ne pouvez quitter, aucune donnée retenue en otage. Le noyau est le vôtre, les dossiers sont les vôtres, et l'ingénieur qui l'a construite est celui qui répond.
Quatre chiffres d'une app construite pour durer.
L'art d'une app sérieuse, c'est un noyau que le compilateur garde, qui continue de
fonctionner sans signal, et qui tourne sur chaque terrain depuis une seule source de vérité.
Le code reste en anglais — la langue universelle de la technique.
// the core of the app · typed, so a wrong state cannot be reached #[derive(Clone, Deserialize)] struct Job { id: Uuid, site: SiteId, state: State, // Scheduled → OnSite → Done — nothing else is legal readings: Vec<Reading>, synced: bool, // the device knows what the edge has not yet seen } impl Job { /// A job closes only once every required reading is in. fn can_close(&self) -> bool { matches!(self.state, State::OnSite) && self.readings.iter().all(Reading::valid) } }
// works at zero bars · the floor does not wait for a signal fn record(&mut self, r: Reading) { self.readings.push(r.clone()); self.queue.push(Op::Add(r)); // kept on the device, durable self.synced = false; } /// When the signal returns, the device reconciles — in order, idempotent. async fn reconcile(&mut self, edge: &Edge) -> Result<()> { for op in self.queue.drain(..) { edge.apply(op).await?; // the edge is the record; the device, the witness } self.synced = true; Ok(()) }
# one core, every floor it must run on [targets] ios = "aarch64-apple-ios" # a thin Swift shell over the Rust core android = "aarch64-linux-android" # a thin Kotlin shell over the same core desktop = "x86_64 · aarch64" # Windows · macOS · Linux # the logic is written once, in Rust. only the shell changes per floor. # Swift and Kotlin carry the screen; Rust carries the truth.
Pourquoi une app construite pour votre terrain bat un produit remodelé pour s'y adapter.
Un produit remodelé ne peut pas être fait pour votre terrain — il existait avant même que votre terrain soit connu. Une app uniquement en ligne ne peut pas être fiable là où le signal meurt — l'attente y est intégrée. C'est pourquoi nous écrivons un seul noyau Rust, le gardons avec le compilateur, et le signons nous-mêmes — et pourquoi nous chiffrons ce que nous mesurons, pas un prix d'étagère.
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.
Deux lignes — le terrain où elle tourne, et le travail qu'elle doit porter. Nous les lisons nous-mêmes et nous répondons nous-mêmes.
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.
·