A written spec first. Gates before every release.
Four products, one studio, the same loop for each of them. Every repository keeps its specs, plans and task lists beside the code, so anyone can see why something exists.
Six steps, every change.
New products and new features go through all six. Small fixes inside a feature still get a task in that feature's list first.
- 01SpecifyWrite what the change does for a person, as user stories with acceptance criteria.
- 02ClarifyAsk the awkward questions up front and write the answers into the spec.
- 03PlanPick the design and the stack, and name the risks before any code.
- 04TasksBreak the plan into small, numbered tasks that each leave the product working.
- 05ImplementBuild task by task, ticking each one off in the same repository.
- 06ConvergeCompare what shipped with the spec, and fix the drift in one direction or the other.
Nothing ships until these pass.
These are the gates for twistorlabs.com. Each product repository adds its own tests, lint and type checks.
Build is green
A clean production build, plus the product's own tests and type checks where it has them. A red build blocks the release.
Identity check
The built output is searched for personal names, personal domains and old company names. Any hit blocks the release.
Accessibility AA
Contrast checked in both themes, keyboard paths walked, labels on every control.
Lighthouse
Performance, accessibility, best practices and SEO measured on the home page and a product page before release. Layout shift stays under 0.05.
Reduced motion and small screens
With reduced motion on, everything renders still. No horizontal scroll at 320, 375, 768 or 1280 pixels wide.
No invented claims
Every number on a page traces to code or a spec. No fake logos, customers, quotes or usage figures.
What a release check looks like.
A sample run of the site's release gates, trimmed for reading. Contrast and narrow widths are checked by hand.
The right tool for each job.
| Product | Runs on | Built with | Data and platform | AI |
|---|---|---|---|---|
| Allmount | macOS 26, iOS 26 (iPhone, iPad) | Swift 6, SwiftUI, Liquid Glass | Apple File Provider extension, Keychain, SigV4 with CryptoKit. RevenueCat is the only dependency. | None |
| Vettly | Web | Next.js on Cloudflare Workers | D1, R2, Workflows, Sandbox containers, Browser Rendering. Razorpay for UPI and card. | Workers AI, swappable |
| AI Nutrition Scanner | Android first, iOS configured | Expo, React Native | On-device SQLite. A Cloudflare Worker for the cloud check. | EfficientNet-Lite0 (TFLite) and Gemma 4 E2B via LiteRT-LM, on device |
| Drawloom | Web | Cloudflare Workers | D1, R2, Durable Objects, Yjs for live editing. elkjs layout, rough.js drawing, Excalifont. | Workers AI through AI Gateway, or your own key |
| twistorlabs.com | Web | Astro, static HTML | Served by Cloudflare. Almost no client-side JavaScript. | None |
What we hold every product to.
One job per product
Each product does one thing a person needs and refuses the rest.
On the device first
Keys, meals and files stay with you unless sending them is the point of the feature.
Signals with evidence
When software judges something, it shows its work and leaves the decision to people.
Small changes
Every change maps to a numbered task, and every task leaves the product working.
Honest status
In build means in build. Unbuilt features carry a Coming marker everywhere they appear.
Dated in public
Releases go on the changelog with the day they happened, plans on the roadmap without dates.
Curious how a product works inside?
Ask us. We would rather explain the real mechanism than a slogan.
- Allmount keys stay on your device
- Scanner models run on your phone
- Every release dated in public