What's in it

Everything in the box — including the parts nobody advertises.

This is the long page. It is one page rather than eight, because what somebody actually wants to know is whether the thing they have in mind is in here at all — and that question is answered by scanning, not by navigating.

Controls

What you can put on a screen.

The ordinary form controls, and then eight controls that each draw a table — a list, a calendar, a chart, a grid of pictures, a map, a floor plan, a 3D assembly, a schedule. That is the idea the product is built around: your data, drawn as the thing it actually is.

ControlWhat it is
The form
LabelFour voices — body, heading, the big number somebody came to see, and the quiet line under it saying what that number is. Not a font picker: four, so two screens still match.
Text fieldTyped like a column is: text, whole number, decimal, money, date, time, timestamp, yes/no, picture, file, id. A quantity gets the number keyboard; an amount is drawn with its currency and swaps to the plain number the moment you tap it.
Text areaA note on a form. It scrolls only once it has outgrown its box — otherwise it hands the drag back to the page.
Button, switch, slider, stepper, picker, segments, search barStyles of the same few controls rather than a palette of near-duplicates. A picker's options can be the unique values of a column, so next year's rates update the list rather than a copy of it.
Date picker, image view, timerThe timer's face reads 7:30 and its value reads 7.50 — a person reads the first, a timesheet adds up the second.
Controls that draw a table
List boxColumns, headings that sort, grouping under a heading, pull to refresh, a search box, and an honest row count when the table is bigger than the window.
CalendarMonth, week and day — all three always offered. A record whose time cannot be read becomes an all-day entry rather than disappearing.
ChartBars or a line, drawn with Swift Charts in the designer, on the phone and in the export alike.
Photo gridA column of picture names as a grid of tiles. A tile is a row, so tapping one picks that record.
MapEvery row with a coordinate — or just an address — is a pin. Routes, radius searches, follow-me, a geofence that fires once on the way in, and pins you drag, which write their new coordinates back into the row.
CanvasEvery row is a shape on a 1000 × 1000 board: a warehouse floor, a kanban board, a site plan, a seating chart. Hold the empty board and a step puts a shape down there; drag a shape and its coordinates are written back. A row the board cannot read is drawn grey with its tag — never dropped.
3D modelEvery row is a part: an imported STL or USDZ, placed in a box in space, coloured by a value. Tap a part and you have picked its row. Pull the assembly apart with a slider, show one part, or put it in the room with AR.
Gantt chartBars you drag. Releasing one writes Start and End back into the record. Lanes, predecessors drawn as arrows, red when a successor now starts before the thing it waits for.
CameraThe one control that fills its table: every barcode, line of text, date, object, document or face it recognises becomes a row. Point it at a receipt and the fields fill themselves.
Document viewerPDF, HTML, Markdown, plain text, a picture, and Word/Excel/Pages through QuickLook — hung on a column of the selected row, so a list beside it is a filing cabinet.
Getting around
TabsUp to five, because that is what the bottom edge of a phone holds.
AreasThe level in front of the tab bar, because a business app does not have five things in it. You land on a hub of tiles, pick one, and inside it get its own two-to-four tabs. The tile you press becomes the area.
An iPhone showing a warehouse floor plan drawn from a table: twelve shelves coloured green to red
The canvasOne row per shelf, green where it is full. Tap a shelf, you have picked that row.
An iPhone showing a map of Germany with numbered pins for every customer
The mapEvery customer as a pin, drawn from the same table the list beside it shows.
An iPhone showing a long list of invoices sorted by total
The listTwo hundred thousand invoices, sorted by total — the sort reads the file, not the window.
An iPhone showing a detail screen filled from the row that was tapped
The detailFilled from the row that was tapped — one step, and it brings the related rows with it.

Fourteen objects, twenty seconds each

Watch each one do its thing.

One short film per control, silent, on the phone where it lives. Like the three-minute film these are not screen recordings somebody made: the program drives itself over its own remote channel while the screen is filmed, so a dragged bar is a dragged bar and a signature is signed. Press one to play it; nothing loads until you do.

MailboxA mail account is a control. Drop it on a screen, press the button that makes its table, type the servers — and every message that arrives is a row, searchable, filterable, printable like any other. The password never enters the project.
ModelA table drawn as parts in space. Every row is an STL or USDZ file placed in a box; a value colours it, so the pump shows what is out of stock before anybody reads a number. A slider pulls it apart; a tap picks the row.
MapEvery row with an address is a pin — the phone geocodes it. Tap a pin and its record fills the page; come back and the customers are drawn again — a thousand of sixty thousand, the rest stays on disk. Follow-me, a radius search, and a geofence that fires once on the way in.
Gantt chartThe bar is the row. Drag one and its start and end are written into the record on release; stretch its end; an arrow turns red when a job now starts before the one it waits for. The chart schedules nothing by itself — it shows, you move.
CanvasA table drawn as shapes on a 1000 × 1000 board: the warehouse floor, a kanban board, a site plan. Every rack is a row and its colour is how full it is. Pick a table, a pallet or a forklift, hold the plan where it goes and it is put down as a new row; drag it and its coordinates go back into the table; tap it and it is picked; Remove takes it off.
CalendarMonth, week and day over one table — here the tickets, by their due date. Every entry is a record: tap it and the ticket opens. A row whose time cannot be read becomes an all-day entry rather than disappearing.
SheetThe paper an app prints. Open an invoice and its PDF is made before you can read the page: head band, the positions as a table, the tax breakdown, a payment square the bank app scans. One switch, and it goes out as an e-invoice a validator accepts.
SignatureA pad on the form. Sign, and the mark becomes a picture whose name goes into the record — so a list draws it, a grid draws it, and the delivery note prints it. The moment is written beside it, and the status flips to Delivered.
List boxColumns, headings that sort, grouping, pull to refresh, a search box, and an honest count under it. On a table of two hundred thousand rows the search and the sort read the file, not the window the phone holds — a filtered window would look like an answer and not be one.
Photo gridA column of picture names as a grid of tiles, with a caption each. A tile is a row: tapping one picks that record, and a step can narrow the grid to the rows that belong to something — a claim's receipts, a contact's photos.
ChartBars or a line over a table: a label column and a value column, nothing else to configure. Drawn with Swift Charts on the canvas, on the phone and in the exported app alike, so the three cannot disagree.
Document viewerPDF, HTML, Markdown, a picture, or Word, Excel and Pages through QuickLook — hung on a column of the selected row, or on a file a step just made. Steps turn to a page, find a word and print; a tapped link can be the app's to answer.
TimerA control that keeps time on a screen: leaving stops it, coming back starts it. Its face reads 7:30 while its value reads 7.50, which is what a timesheet adds up. Kontor's stamping clock writes a row per press and the balance is worked out at night.
AreasA hub of tiles in front of the tab bar. Press one and it becomes the area, with two to four tabs of its own; the way out is the way you came in. Two levels and no more — the third is the settings page nobody finds twice.

The form controls — button, label, field, picker, switch — have no film of their own. They do what they do everywhere; the fourteen above do something you may not have seen a no-code tool do. The camera waits for a phone with a lens.

Flows

About forty verbs, and no forty-first that is really a language.

A flow is an ordered list of steps. Each step is a verb, a thing it points at, an optional guard and an optional wired value. There are branches, one loop and a case — and deliberately no jumps, no while, and no expression grammar beyond arithmetic.

FamilyWhat is in it
DataSave, update, delete, add a row, load records, load the related rows, filter, sort, look a value up, add up (total, count, average, smallest, largest), calculate a formula, fetch a URL, remember in a variable.
Which wayIf … otherwise; for each row — the only loop, and it walks the rows of a control, so it cannot run for ever; and a case with its arms side by side rather than five nested branches marching off the right edge.
NavigationOpen a screen, present a sheet, go back, dismiss, go to a tab, open an area, leave it.
FormFill the form from a row, clear it, show, hide, enable, disable, set a text, put the time in.
FeedbackShow a message, buzz, play a sound, copy, share text, share a picture of a board, share a file, make a PDF, set a preference.
AccessPick a photo, pick a contact, add to the calendar, read the calendar, use the location, open directions, read an NFC tag, schedule a reminder, take a photo, start and stop scanning.
IntelligenceTranslate, summarise, rewrite, extract into a form, classify into a picker, ask, sentiment, detect the language, find similar rows, dictate, speak.
Maps and boardsSet a pin, remove pins, zoom, search places, follow me, watch a radius, centre; explode the model, show one part, colour a part, place it in the room.
A guard is what a step has instead of an if in a script. “Only if the field is empty”, “only if this row's Kind is Link”, “only if the app is offline”. And a step that is refused — a required field left empty — stops the rest of the flow, rather than letting the Clear Form and the Dismiss Modal after it throw the typing away and close the sheet as though it had worked.

The phone itself

The things a phone has that a Mac does not.

Camera, photos, contacts, calendar

Each one asks iOS for permission and explains itself in a sentence you write — and the step that needs it does not appear in the catalogue until the access is declared, so a crash-on-a-real-phone tap cannot be built by accident.

Where the phone is

Coordinates or a street address into a field, a distance to the selected row, directions handed to Apple Maps, and a geofence that fires once as you arrive.

NFC tags, reminders, Face ID

Read a tag's text, link or serial into a field. Ring a local notification at a date the app worked out. Put Face ID over the whole app on launch and after the background.

Nine things that happen to the app

Launched, put away, came back, turned, appearance changed, network changed, battery low, memory low, ended. “Save the half-filled form when it is put away” was not expressible before these, and that is where a form is actually lost.

On the device, and nowhere else

Intelligence with no prompt to write and no key to buy.

Eleven steps that read, translate and understand — and every one of them runs on the phone, through Apple's own models. There is no prompt box anywhere, on purpose: a step takes a text, a target and at most one option (a language, how long a summary, what tone), and that is the whole surface.

Kontor's inbox is the demonstration: opening a message detects its language, translates it into English and takes one sentence of what it is about. Three steps. No prompt, no account, no network.

Half the phones in a company have no Apple Intelligence, so availability is a setting rather than an error: skip the step, stop and say so, or use the simple way — the data detectors fill the phone number and the date, the first sentence becomes the summary, and the step's notice says it did.

The class overview window: every class the palette offers, with what it is, what it fires, and every step it can carry out
What can what — every class, what it fires and every step it can do, folded by family. The answer to “is the thing I have in mind in here”.

The parts nobody advertises

Where a program of this kind is usually quietly wrong.

Money is not a floating-point number

An amount is an exact decimal, computed through whole minor units in base ten. (1.005 × 100).rounded() is 100 in binary floating point — it rounds down — and a credit note is not a rounding gift. Every line total of every bill goes through the same arithmetic in the designer, on the phone and in the exported app.

Anything a cell draws, a person can retype

A date shown as 18.03.2025 and then refused when typed back into that same cell is the classic fault of typed columns. The reader's spelling and the file's spelling are two functions with a tested contract between them.

The currency belongs to the business, not the reader

An invoice app must not show dollars because the phone is set to English. The project names its currency; the reader does not get a vote.

A search that lies is worse than no search

Filtering the twenty thousand rows in memory and calling that the answer looks like a result — and the row somebody wanted is simply not in it. Search and sort walk the file on disk, with a progress bar, and say how many they really found.

A control inside a screen does not own the vertical drag

A list, a grid, a calendar or a text area with a scroll view of its own swallows the page's drag wherever it happens to sit — so a form scrolls in some places and not others, which reads as broken rather than as a rule. Each of them hands the drag back unless it genuinely has something of its own to move.

Does it fit on the small phone?

Thirteen distinct iPhone screens, and a check that measures rather than calculates — it renders each control at that device's width and reads the height back. A taller phone does not always mean more room: an iPhone 8 Plus out-rooms a 12 mini once you take the notch and the home indicator off.

Papers, tests and the way out

Three things you would otherwise have to build yourself.

An A4 invoice produced by the app: header, address, the line items as a table, and the total
Made by the app when the page opened — the screen is the description of the record, so a second description would be a second thing to keep in step with the first.

A PDF of what is on the screen. The title, the fields as label-and-value rows, and a list on the screen as a table on the paper — so an invoice with line items needs nothing designing. Deliberately not a screenshot of a phone: rounded fields are a picture of an app, not something anybody files for ten years. The step hands over the file's name, so it composes with the document viewer, with Share and with Print.

Tests written as sentences. “A contact without a name must not be saved.” The sentence is stored with the steps it became, and it runs on the same interpreter the preview and the phone use — so a green test proves what the app does, not what a parser thought the sentence meant. Every test runs before an export.

An Xcode project. Views, methods, structs, an asset catalogue, an .xcodeproj, and a README that describes every flow in sentences. The export refuses rather than half-generates: it names every step it cannot express, because a project that builds only halfway is worse than none.

Where the data lives

Local, a file, a web endpoint — or iCloud.

A table says where its rows come from, and everything else works the same way whichever answer it gives.

In the project

Rows you typed in or imported. In the exported app they save themselves to the phone's own Documents folder, so what somebody enters is still there next week.

A file beside the project

CSV or JSON, for the tables that are too big to carry — read in chunks, so a million delivery notes cost a window of memory rather than a crash with no report.

A web endpoint — both ways

Load from a JSON endpoint, and write back: a new row is POSTed, a changed one PUT, a deleted one DELETEd. If the server says no, the change is put back and the flow stops — keeping the local row and carrying on is the worst of the three answers.

iCloud

Turn it on in App ▸ Cloud and a table lives in the user's own private CloudKit database — their data, on their devices, under their Apple Account. Nothing of it passes through us; we run no server for your app, and we do not intend to.

The credential is a name here and a value in the Keychain. Never in the project file — a project is copied onto phones and handed over with an export, and a password in it would travel with both.