[{"data":1,"prerenderedAt":130},["ShallowReactive",2],{"doc-\u002Fabout\u002Fprinciples":3},{"id":4,"title":5,"body":6,"description":120,"edit":121,"extension":122,"meta":123,"navigation":124,"path":125,"seo":126,"stem":127,"vertical":121,"weight":128,"__hash__":129},"content\u002Fabout\u002Fprinciples.md","Principles",{"type":7,"value":8,"toc":105},"minimark",[9,13,18,21,24,28,31,34,38,41,44,48,51,55,58,62,65,68,72,75,79,82,86,89,92,96,99,102],[10,11,12],"p",{},"A small set of rules we lean on when there is a real product\ndecision to make. Not aspirational; they are how decisions actually\nget made today.",[14,15,17],"h2",{"id":16},"_1-the-page-is-the-dashboard","1 · The page is the dashboard",[10,19,20],{},"The product is honest about what it shows. The dashboard does not\nhave decorative animations, marketing copy, or whimsical empty\nstates. A thermometer reading is a number with a unit; an alarm is\nan event with a timestamp; a chart is a chart. We took inspiration\nfrom cockpit instruments, refrigeration panels, and Bloomberg\nterminals — places where the operator's life or money depends on\nthe display being unambiguous.",[10,22,23],{},"The corollary: when we cannot show something honestly, we do not\nshow it. A \"trend arrow\" requires a trend; one reading is not a\ntrend. We omit it.",[14,25,27],{"id":26},"_2-no-vendor-lock-in-we-cannot-justify","2 · No vendor lock-in we cannot justify",[10,29,30],{},"Customer data should be portable. The export ZIP works. The audit\ntrail is externally verifiable. The HTTP API is bidirectional —\nread everything you wrote.",[10,32,33],{},"We will introduce vendor-locked features only when the alternative\nis operationally untenable. The MQTT bridge using our own broker\naddresses is one example; the alternative (per-tenant DNS) is more\nexpensive than worth.",[14,35,37],{"id":36},"_3-honest-about-our-limits","3 · Honest about our limits",[10,39,40],{},"We will not market ourselves as something we are not. We do not\nship calibration certificates; we do not have SOC 2; we are not GxP.\nCustomers ask, we say so, we point them to vendors who do.",[10,42,43],{},"A near-miss looks like victory in marketing. We are not playing that\ngame.",[14,45,47],{"id":46},"_4-boring-infrastructure","4 · Boring infrastructure",[10,49,50],{},"Postgres + TimescaleDB. Caddy. Postmark. Hetzner. EMQX. There is no\nmicroservice mesh, no Kubernetes, no service-discovery layer. The\nboring choices are correct for the customer base. We will move\nif the load requires it; the load does not require it.",[14,52,54],{"id":53},"_5-audit-trail-first","5 · Audit trail first",[10,56,57],{},"Every customer-facing piece of state has an audit entry. Every\nchange is reversible (by adding a correction row, not by editing\nhistory). The cost of this discipline is paid by us in development\ntime; it is the product feature that earns customer trust.",[14,59,61],{"id":60},"_6-one-operator-can-run-a-site","6 · One operator can run a site",[10,63,64],{},"The product must be operable by a single café manager, with no\ntraining and no special vocabulary. The dashboard's primary verbs are\n\"acknowledge\", \"render report\", \"rotate token\". A senior systems\nengineer should not be required.",[10,66,67],{},"The corollary: when we have a complex feature it is in the API, not\nin the dashboard.",[14,69,71],{"id":70},"_7-slow-rollouts","7 · Slow rollouts",[10,73,74],{},"We do not run experiments on customer accounts. There are no A\u002FB\ntests of ingest behaviour. There are no \"rollout buckets\" for\nfeatures that affect compliance evidence. When we ship a change to\nthe alarm engine, it ships for everyone after testing — not for\n35 % of accounts.",[14,76,78],{"id":77},"_8-eu-sovereignty-by-default","8 · EU sovereignty by default",[10,80,81],{},"Our data lives in Germany. Our company is in Slovakia. Our backups\nare in Germany. We will deploy in a non-EU region when a customer\nasks and pays for it; we will not move existing customers without\npermission.",[14,83,85],{"id":84},"_9-pricing-pre-set","9 · Pricing pre-set",[10,87,88],{},"We do not negotiate Solo-tier pricing. €29 \u002F month \u002F site is €29 \u002F\nmonth \u002F site regardless of whether you are a single café or a\nhospital. Volume discounts kick in at the second site (€19 \u002F\nmonth) and are not negotiable beyond that. This is a small SaaS;\nthe pricing is the pricing.",[10,90,91],{},"Enterprise tier is custom because Enterprise is custom. Solo and\nTeam will never be.",[14,93,95],{"id":94},"_10-the-product-is-the-documentation-is-the-product","10 · The product is the documentation is the product",[10,97,98],{},"If a feature is not documented, it does not exist for support\npurposes. If a feature changes, the docs change in the same\ndeploy. If the docs lie, customers do not trust the product;\nhence this site, hence the labour of writing it.",[10,100,101],{},"The corollary: we will not over-promise on the docs. If a feature\nis \"coming Q3\", we say so. If a feature is dropped from the\nroadmap, we say so.",[10,103,104],{},"— These principles are not law. When one of them is wrong, we will\nchange it openly, not silently.",{"title":106,"searchDepth":107,"depth":107,"links":108},"",3,[109,111,112,113,114,115,116,117,118,119],{"id":16,"depth":110,"text":17},2,{"id":26,"depth":110,"text":27},{"id":36,"depth":110,"text":37},{"id":46,"depth":110,"text":47},{"id":53,"depth":110,"text":54},{"id":60,"depth":110,"text":61},{"id":70,"depth":110,"text":71},{"id":77,"depth":110,"text":78},{"id":84,"depth":110,"text":85},{"id":94,"depth":110,"text":95},"How we make product decisions",null,"md",{},true,"\u002Fabout\u002Fprinciples",{"title":5,"description":120},"about\u002Fprinciples",985,"SX33nd-lNj9Utazycm0XdkWWZqmGGmcfFyWDjpUCyKM",1779022956488]