Labs · das ganze Produkt
Web und App aus einem Kern. Ein Bau, ein Massstab.
Die Website, die Ihre Kunden lesen, und die App, die Ihre Leute tragen, sind nicht zwei Projekte — sie sind zwei Gesichter eines Systems. Wir bauen sie auf einem einzigen gemessenen Kern, damit sie nie auseinanderdriften, und eine Hand verantwortet das Ganze.
Website und App lesen dieselbe Wahrheit. Ändern Sie sie einmal, und beide bewegen sich zusammen.
Vier Zahlen von einer Plattform, als Einheit gebaut.
Die vier Teile, die das real machen. Lesen Sie sie der Reihe nach: die Wahrheit, die
zwei Gesichter, die ihr gehorchen, und das Tor, das keines langsam live gehen lässt.
Der Code bleibt in Englisch — der universellen Sprache der Technik.
// 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")
Warum ein Haus für das Ganze zwei an einer Naht zusammengeflickte Dienstleister schlägt.
Das ist kein Rabatt fürs Bündeln. Es ist eine andere Gestalt: ein System mit zwei Gesichtern, nicht zwei zusammengeklebte Systeme. Ein Betrieb, der die Website verkauft und die App weitervergibt, kann Ihnen keinen gemeinsamen Kern geben — er hat keinen. Genau das lässt sich nicht unterbieten.
Bevor eine Zeile geschrieben wird, wie Ihre Arbeit gehütet wird. Dieser Teil ist nicht verhandelbar.
Ein NDA ist hier der Standard, kein Aufpreis. Was Sie teilen, liest ein Ingenieur und sonst niemand — nichts wird verkauft, geteilt oder weitergegeben.
Zugangsdaten und Datensätze bleiben in Ihrem Haus, nach dem Prinzip der geringsten Rechte. Wir halten keine Kopie, die wir nicht brauchen, und nichts verlässt Ihre Reichweite ohne Ihr Wort.
Was in Ihrem Haus läuft, können Sie lesen und prüfen — keine Blackbox, der Sie blind vertrauen müssen. Der Maschinenraum bleibt unser; was Sie betreiben, ist Ihres.
Das ganze Produkt, in zwei Zeilen. Wir lesen sie selbst und antworten selbst — hinter diesem Fenster steht keine Warteschlange.
Es liegt bereits auf einem Bildschirm in Zürich — nicht in einer Warteschlange, nicht in einem Ticket. Der Ingenieur, der das bauen würde, liest es und antwortet selbst.
·