What we build
We build the software,then we keep it running.
We build one system for your phone, your website, and your back office. Storefronts, marketplaces, delivery, stock, payments, maps, AI, whatever the job needs. Open any group below for the full list, and where we stop.
Cross-platform systemsOne system that works on the phone, on the web, and in your back office.26 things included
One backend, many appsMost agencies build you an app, then a separate website. We build one database and put every app on top of it. Nothing has to be kept in sync, because there is only one copy.6 things, open
- One database behind a phone app, a website, and a staff console.
- We have run six separate apps on a single backend.
- Roles set in the database, so each app sees only its own rows.
- A change made in the back office reaches the app straight away.
- One login that works across every part of the system.
- New apps added later without moving the data.
The app and the web agreeA customer who pays in your app expects the website to know. That only works if the purchase is checked with Apple on a server and written to one account record.5 things, open
- A purchase in the app unlocks the same account on the web.
- Receipts checked with Apple, never trusted from the phone.
- One account record, whether they joined on the phone or the web.
- Apple's renewal and cancellation alerts handled automatically.
- Push notifications sent to the right device.
A back office for your staffEvery system where the public can post needs someone to say yes first. So we build the queue your staff work from, and we log every decision.5 things, open
- A review queue, so staff approve before anything goes public.
- A record of who did what, in order, that cannot be edited later.
- A takedown control, so staff can pull something down fast.
- Separate roles for owner, manager, moderator, and viewer.
- Consoles that read from several products in one place.
Safety and verificationIf strangers meet through your product, safety is the product. We check who people are before they get access, and we give your team the tools to act.6 things, open
- Identity checked through a background-check provider.
- Photo ID uploaded, reviewed, and approved or rejected.
- Age checks before someone can use a feature.
- A report button for the public, and a queue for your staff.
- Blocking, strikes, and a per-venue do-not-admit list.
- Waivers signed on a phone and stored against the job.
iPhone and Android togetherOne codebase can cover both phones, which is cheaper. Native Swift costs more but reaches the sensors properly. Which one a product needs comes down to whether it touches the hardware.4 things, open
- One React Native codebase building for iPhone and Android.
- Native Swift instead, when the phone's hardware matters.
- The same database behind either choice.
- A second app for a different job, on the same data.
What we do not do here
We don't build a second app just to have one. If a website does the job, that is what you get. Every extra app doubles the testing, and you pay for that twice.
App buildingAn app people can download from the App Store and use.21 things included
Swift
one app, four stagesThe briefOne screen. A person opens it, sees what is near them, and picks. Nothing else on the screen.
Near youPick in one tapWhat is near you, ranked. Nothing else on the screen.- BriefWhat it is for, in one paragraph, before anything is drawn.
- WireframeEvery screen drawn before a line of code, while it is still cheap to change.
- BuiltNative, on a device, with your content wired in.
- On the storeScreenshots, listing, review, live.
The same screen, from the paragraph that described it to the listing on the store.
On the phoneWe build the app itself, in Apple's own tools. That means it feels like an iPhone app rather than a website in a shell.5 things, open
- iPhone apps in Swift and SwiftUI.
- One app that runs on iPhone and Android.
- Push notifications, and links that open the app.
- Apple Wallet and Google Wallet passes.
- Video recording, trimming, and colour grading in the app.
Sensors and the cameraThis is the hard end of app work and very few studios do it. We read the motion sensors and the camera directly, then filter the noise out. The app can act on it in the same instant.7 things, open
- Motion sensors read one hundred times a second.
- Body and hand tracking from the camera, on the phone itself.
- Audio set up for the shortest delay the phone allows.
- Beat detection from the microphone, tuned to the room it is in.
- Step, rep, and gesture detection that ignores small shakes.
- The camera and the motion sensors covering for each other.
- Health data, GPS routes, and Apple Music playback.
Getting it liveGetting through App Review is its own job. We have taken apps through it and answered the notes that come back.5 things, open
- We submit it to Apple and answer the review notes.
- Test builds you and your team can try first.
- Store text, keywords, and screenshots.
- The delete-my-account flow Apple now requires.
- A data export, for customers who ask for their records.
Paid featuresIn-app purchase is easy to get wrong in a way that costs you. Every receipt is checked on our server against Apple before anything unlocks.4 things, open
- Subscriptions and one-off purchases inside the app.
- Receipts checked with Apple, never trusted from the phone.
- One subscription that works in the app and on the web.
- Free and paid tiers, with limits enforced on the server.
What we do not do here
We don't start with Android. iPhone comes first. Android costs more and is quoted separately.
Web apps and websitesOne team builds the front end and the back end.18 things included
Design
one layout, two phasesa page being designed01 Sketch02 DesignThe structure is decided first, then the design arrives on top of it. Nothing moves between the two.
Sites and appsThe same people build what your customers see and what sits behind it. Nothing gets lost in a handover, because there isn't one.5 things, open
- Marketing sites, landing pages, and blogs.
- Customer dashboards and staff admin consoles.
- Built in Next.js, and it works on a phone.
- Maps that show your own live data.
- Pages built from your data, not typed out one by one.
Your team edits itA site you cannot change yourself is a site you have to pay someone to change. So your team gets the controls, with limits on who can touch what.5 things, open
- A CMS for pages, posts, images, and menus.
- Page titles, descriptions, and redirects your team controls.
- Roles, so an editor cannot touch billing.
- Uploads that go straight to storage, not through email.
- Publishing rebuilds the public pages by itself.
Numbers and reportingWe collect your visitor numbers ourselves rather than handing them to an outside tracker. You get the figures, and your customers get fewer cookies.4 things, open
- Dashboards for the numbers you actually check.
- Visitor counts we collect ourselves, with no outside tracker.
- Reports you can download and send on.
- Sales totals checked against what the bank received.
SpeedSlow pages lose customers before they read anything. We cache what can be cached and send less code to the browser.4 things, open
- Caching headers, so a repeat visit costs almost nothing.
- Images sized properly and loaded only when needed.
- Less code sent to the browser up front.
- Pages rebuilt when the content changes, not on every visit.
What we do not do here
We don't hand over a folder of code and vanish. We keep running what we build. If your own team wants to take it over, we write down how.
Online stores, payments, and marketplacesYou sell, you get paid, and the numbers match your bank.43 things included
Stripe
PaymentIntentcreatedmethodattachedrequiresactionprocessingsucceededcard declined, retry with a new method- payment_intent.created · created
- payment_method.attached · requires_confirmation
- payment_intent.requires_action · requires_action · 3-D Secure
- payment_intent.payment_failed · card_declined
- payment_method.attached · retry · new payment method
- charge.pending · processing
- payment_intent.succeeded · succeeded
- event
- payment_intent.succeeded
- CAD
- status
- succeeded
- live
Every third run declines. A payment that only ever succeeds hides the part that costs money.
A store without ShopifyYou do not need Shopify to sell online. We build the product page around your actual product, and Stripe handles the card, so card details never touch our servers. No monthly platform charge, and no template to fight.7 things, open
- A product page built for your product, not a template.
- Card checkout hosted by Stripe.
- Colour and size options, quantity, and shipping address.
- Sales tax worked out and recorded at checkout.
- Discount codes you create and switch off yourself.
- Bot checks and rate limits on the checkout itself.
- Digital goods, with a download link that expires.
Shopify, when you already have itPlenty of businesses are already on Shopify and are not leaving. We work there too, and we have written a full theme from scratch rather than editing someone else's.5 things, open
- A complete custom Shopify theme, written from scratch.
- Product, cart, collection, search, and blog templates.
- Customer accounts, past orders, and saved addresses.
- Your order, shipping, and refund emails, branded.
- New sections added to a theme you already bought.
Print on demand and fulfilmentOrders go straight to your supplier with no one retyping anything. The hard part is sending each order once and only once. Alerts arrive twice, so most of this code exists to stop a double order.6 things, open
- Orders sent straight to your print-on-demand supplier.
- Each order sent once, even if an alert arrives twice.
- Tracking number and carrier written back to the order.
- Holds, cancellations, and returns handled, not ignored.
- A refund cancels the print order too.
- A job every fifteen minutes that repairs anything dropped.
Subscriptions and billingRecurring billing goes wrong quietly, months later. We treat the alert from Stripe as the only truth, and we never unlock anything on the browser's word.6 things, open
- Subscriptions, plan changes, and cancellations.
- Tiers, with what each one unlocks held on the server.
- A billing page where customers manage their own plan.
- Cards saved for later, and invoices paid by card.
- Failed payments retried and chased in a set order.
- More than one currency.
Receipts, invoices, and emailThe email after the purchase is part of the purchase. Ours send from your own address and are sent exactly once, with a retry if sending failed.6 things, open
- Receipt, processing, shipping, delivery, and refund emails.
- Sent from your own address, not a shared one.
- Each email sent once, and retried if it failed.
- Real PDF invoices, not a printed web page.
- Overdue invoices chased on a schedule.
- An invoice left as a draft for a person to check first.
Marketplaces and payoutsA marketplace means paying other people, which is the part that has to be right. Sellers sign themselves up with Stripe, your commission comes off each sale, and funds wait before they move.7 things, open
- Sellers sign themselves up and manage their own listings.
- Each seller sees only their own rows.
- Your commission taken automatically from each sale.
- Payouts into each seller's own bank account.
- A hold period before a payout leaves.
- Earnings pages, so sellers check their own totals.
- A dry run first, so nothing moves until you say go.
Getting the numbers rightAn order status that can go backwards is a refund you cannot explain. So the status list only moves forward, and every alert is checked before we trust it.6 things, open
- An order status list that cannot skip a step or go back.
- Every payment alert signature-checked before we trust it.
- A retry that cannot charge or count the same sale twice.
- Order revenue matched against what the bank received.
- Where each sale came from, recorded on the order.
- A code that only tracks, without giving a discount.
What we do not do here
We don't rush a payment path live. Every one gets checked. A payment that fails has to fail loudly, which makes this the slowest part of a build.
Warehousing, stock, and deliveryYou know what you have, where it is, and where it went.23 things included
Postgres
supabase migration listmigration6 / 6 applied- 0001_init.sql
- 0002_profiles.sql
- 0003_bookings.sql
- 0004_indexes.sql
- 0005_rls.sql
- 0006_audit_log.sql
In order, one at a time, and the same order on every copy of the database.
Stock and storageKnowing the total is not enough. Staff need to know which shelf, and the system needs to hold stock back the moment an order is placed.6 things, open
- Stock levels per product and per location.
- Racks, shelves, and bins, so staff know where it is.
- Stock held back when an order is placed, released if cancelled.
- A low-stock alert before you run out.
- A record of every stock movement.
- Stock brought in and taken out by file, not by hand.
Receiving and put-awayGoods arriving is where the count goes wrong. We log the carton, scan what is inside it, and record where it was put.4 things, open
- Inbound cartons logged with what is inside them.
- Barcode scanning on a phone or a handheld scanner.
- Scan an item and place it in a location.
- Photos taken at intake, kept with the record.
Pick, pack, and shipThe floor runs on lists and stations, not on memory. Staff get the pick list, the packing station records what was used, and the label prints.5 things, open
- Pick lists for staff to work from.
- Packing stations that record the materials used.
- Shipping labels bought and printed.
- Carrier rates compared before you buy one.
- Prep work for Amazon fulfilment centres.
Tracking and deliveryOnce it leaves, the carrier knows more than you do. We take their updates and write them onto the order so your customer can see it too.4 things, open
- Carrier tracking events written onto the order.
- Picked up, in transit, out for delivery, delivered, exception.
- Proof of delivery, including a signature.
- The customer emailed when it goes out.
Charging for the workIf you store and pack for other businesses, the billing is the business. Charges are counted as the work happens, then billed through Stripe.4 things, open
- A rate card for storage, pick and pack, receiving, and prep.
- Charges added up per client, per period.
- Those charges billed through Stripe.
- A portal where your client sees their own stock.
What we do not do here
We haven't built driver dispatch or live driver tracking, and we don't run last-mile couriers. That part goes to a company that does it every day.
Databases, logins, and rolesYour data is organised, and only the right people see it.16 things included
Postgres
select * from bookingscreate policy bookings_own on bookings for select using (user_id = auth.uid() or public.is_admin());
user_idclientslotstatus0 rows, the policy denied every row to this caller.
8f2cClinic, Bloor WestTue 09:00held8f2cClinic, Bloor WestTue 11:30paidb104Realtor, YongeWed 14:00openc37eStorefront, Queen WThu 10:00paidc37eStorefront, Queen WThu 16:00heldd9a1Studio, Dundas WFri 13:00paid2 of 6 rows returned · signed in, sees only rows whose user_id is their own
The policy runs in the database, not in the app. Change who is asking and the rows leave.
The databaseWe design the database around how your business actually works, not around a form. Every change is a tracked step, so we can always go back.4 things, open
- Postgres, designed around how your business actually works.
- Every change is a tracked step, never a hand edit.
- Backups, and a written plan for restoring them.
- One database per product, so one fault stays small.
Who can see whatPermission checks written only in the app can be walked around. Ours sit inside the database, so a row a person may not see is a row they cannot fetch.7 things, open
- Rules inside the database itself, not just in the app.
- Each person sees only their own rows.
- Roles like owner, manager, staff, and client.
- Nobody can promote themselves to admin.
- Sign in with Google, limited to your company domain.
- Sign in with Apple, and sign in by phone code.
- A delete-my-account flow that really deletes.
Work that runs on its ownThe jobs nobody remembers to do are the ones to automate. Totals, reminders, and clean-up run on a schedule, and a failed send is retried rather than lost.5 things, open
- Nightly totals and reminder emails, on a schedule.
- A queue, so nothing is lost when a send fails.
- Old records cleaned up without anyone remembering to.
- Email that sends from your own address.
- Data pulled in from other services overnight.
What we do not do here
Every database change gets a way back before it runs. We don't test on your live data either. Both cost a little more time.
Search, maps, and being foundPeople find you on Google, and on the map.22 things included
Being found on GoogleMost of this is plumbing that either exists or does not. Sitemaps, structured data and clean titles are what let Google show your page properly.6 things, open
- Sitemaps that update themselves as you add pages.
- Structured data, so a result shows more than a link.
- News sitemaps, if you publish articles.
- Robots rules, including which AI crawlers you allow.
- Moving a site over without losing your rankings.
- Titles and descriptions checked against real limits.
Getting your business onto the mapBeing on Google Maps is separate work from your website, and it is done by hand in Google's own tools. We have done it: listing a business, verifying it, and running the Ads alongside it.5 things, open
- Your business listed on Google Maps.
- The listing verified, so you control what it says.
- Categories, hours, and the areas you serve.
- Photos and details kept current.
- Google Ads campaigns set up and managed.
Maps inside your app or siteA map is only useful when it shows your own data. We put your places on it, keep it readable when there are hundreds, and draw real area outlines rather than guessing.6 things, open
- A map with your own markers on it.
- Busy areas grouped, so the map stays readable.
- Area outlines drawn from public map data.
- Place search and venue details from Google's own data.
- Address search that finds a place as you type.
- Native maps inside an iPhone app.
Location in the databaseAnything on a map has to be a coordinate first. We store and index positions properly, and turn addresses into coordinates automatically.5 things, open
- Positions stored and indexed for fast lookup.
- Addresses turned into coordinates automatically.
- Distance between two points worked out.
- Live position from a phone written to the database.
- Public data feeds put onto one map together.
What we do not do here
We don't sell rankings. We fix what is broken and write clear pages. Nobody can promise you a place on Google, and anyone who does is guessing.
Hosting, domains, and APIsYour app talks to Google, to Cloudflare, and to whatever else you use.24 things included
Server
one day00:0006:0012:0018:0024:00send-remindersreconcile-payoutsrefresh-feedsnightly-backupexpire-holds24:00 · five scheduled functions, one full day
Five functions, one full day, nobody watching.
Google CloudGoogle work is mostly about credentials, and getting them wrong leaks data. We set up one account per app with the smallest permissions that work.7 things, open
- Sign-in clients, and the consent screen your users see.
- Service accounts with the smallest permissions that work.
- Email sent from your own address through Gmail.
- Files written straight into your Google Drive.
- Search Console and site verification, set up and checked.
- AdSense, with the consent banner Europe requires.
- Google Wallet passes, signed by your own account.
Cloudflare and domainsCloudflare sits in front of the site and does the boring jobs well. We use it for the records, the caching, the bot checks, and live video.5 things, open
- DNS records, so the site and the mail both work.
- Caching, so a repeat visit loads almost instantly.
- Turnstile bot checks on your forms.
- Custom domains for your own customers, verified automatically.
- Live video carried through Cloudflare Stream.
Hosting and releasesYou should see a change before your customers do, and you should be able to undo it. Every release has a preview link and a way back.5 things, open
- Hosting, releases, and a way back to the last good version.
- A preview link, so you see a change before it goes live.
- Checks that run on every change before it can go live.
- Bug reports from inside the app, straight to us.
- A written plan for when it breaks, and who does what.
Other systems you already useYou already pay for tools, and they should talk to each other. We connect them properly, with a cap so a busy day cannot run up a bill.4 things, open
- Ticketing, email, and analytics tools you already pay for.
- Alerts from them that stay correct when they retry.
- A rate limit and a cost cap on anything we call.
- Errors and slow pages reported to one place.
An API of your ownWhen partners want your data, an API stops them asking you for it. Keys and limits mean one partner cannot slow the others down.3 things, open
- An API we build for you, so your partners can plug in.
- Keys and limits, so one partner cannot flood it.
- Written docs, so they can start without calling you.
What we do not do here
We only connect to a tool through a real API. Reading the screen instead breaks the first time they change the page, so a tool without one is a tool we leave out.
AI featuresAI that still works when real customers use it.10 things included
What it can doAI is useful when it is pointed at your own material. We use more than one provider, so you are not tied to one company's pricing.6 things, open
- Answers pulled from your own documents.
- Assistants that can do tasks, inside limits you set.
- Drafting, summarising, and sorting what comes in.
- Photos read and turned into data you can use.
- Speech turned into text, on the device.
- Models that run on your own machines.
Keeping it saneAn AI feature with no cap is a bill waiting to happen. Every call we make has a limit per person and a ceiling on spend.4 things, open
- A hard spending cap, so a busy day stays cheap.
- A limit per person, so one user cannot drain it.
- What it costs to run, before you commit.
- A plain answer when AI is the wrong tool.
What we do not do here
We add AI only where it's needed. Plenty of problems don't need it.
More on ai features
How it runs
A consultation costs nothing, and we want the hard projects.
No long discovery phase. No contract to get out of.
A call, then a straight answer
You tell us the problem. We say yes or no. If it is not for us, we point you at someone better. It is free and it takes half an hour.
A small first piece, at a fixed price
We pick the smallest version that proves the idea works. That piece gets a fixed price. Your first payment buys something you can open and try.
You watch it get built
You get a link in the first week. It updates as we work. Nothing is saved up for a big reveal at the end.
It goes live, then you choose
The first piece goes live. Then you pick: keep going, take it over yourself, or stop. There is no contract to get out of.
Tell us what you are trying to build.
Half an hour on a call. You get a straight yes or no.

