ROADMAP
What is built, and what comes next.
Every item starts as a design proposal: what it is for, a sketch of its API, the options weighed and the questions still open. Code follows once it is agreed. Each item names the version it comes in; a planned version is a plan, not a promise.
Shipped
7
In 0.1.0, the first release.
Library
0.1.0
A bridge to Material 3
Each theme gives its colours, type and shapes to the other, both ways.
Docs
0.1.0
An analytics sample
The components’ events connected to an analytics product, with a tracking plan.
Library
0.1.0
Test helpers
com.pantrixui:testing: finding by tag, PantrixTestTheme and doubles of the platform’s services.
Library
0.1.0
Diagnostics
Duplicate tags, unreadable colours, squeezed targets and blank names, on a running screen.
Tooling
0.1.0
Rules for detekt
The library’s rules, and the ones an app keeps, published as com.pantrixui:detekt-rules.
Docs
0.1.0
Changelog, contributing and security
How a change comes in, what it carries, and how to report a vulnerability.
Building
1
Being made now.
Next
1
Planned for 0.2.0, waiting to start.
Later
5
Decided, or being weighed; no version number yet.
Tooling
Considered
Design tokens as JSON
One file a brand’s look is written in, with Kotlin, Swift and CSS made from it.
Components
Considered
New components
Slider, Stepper, ListItem, EmptyState, a linear progress, FAB, Drawer, KeyValue.
Tooling
Considered
A BOM, previews and benchmarks
One version for every artifact, a module of previews and measured performance.
Next · 0.2.0, planned · Server-driven UI
Screens a server describes, drawn safely with Pantrix
Change a form, a campaign card or a settings page without shipping a new version, with the app's own components. The description is data the app checks, never code it runs.
From the server
A sketch: the format is not designed yet
{
"screen": "offers",
"body": [
{ "component": "Card",
"image": "asset://campaign/delivery",
"tag": "Ends Sunday",
"title": "Free delivery on every order",
"text": "For orders over €40 until Sunday night.",
"action": { "button": "Shop now", "navigate": "catalogue" } },
{ "component": "Button", "variant": "Outline",
"text": "Not now", "action": { "dismiss": true } }
]
}
// signed by shop.example, checked before it is drawn
checked, then drawn
✓ signed
✓ allowed
✓ data only
Its sender is known
The app checks where a description came from before it draws it, with cryptography measured on all six targets first, the browser's Wasm and JavaScript too.
It runs no code
A description carries text, numbers, colours and lists. A button's press is a named action the app decides on: a navigation, a request, a change of state.
Only what the app allows
Components and addresses come from the app's own list. A description is outside input: its depth, length and size are bounded, and reading it never crashes.
The steps
1.
Measure the cryptography on all six targets
2.
A design proposal, and the answers to its questions
3.
The modules, each with its tests
4.
A page in the demo
5.
What assistants and tools need
6.
The guide
7.
Publishing, the API dumps and the README
For assistants, being considered
A JSON Schema of the description, made from pantrix-ui.json, and two tools on the MCP server:
validate_screen checks a description against the schema and the app's list
get_sdui_component says what a component accepts in a description
One design system, three libraries
Take the Pantrix your project is written in
A Compose Multiplatform project takes today's library. A native Android project will take Pantrix for Jetpack Compose, and a native iOS project Pantrix for SwiftUI. The three are the same library: the same components under the same names, the same tokens and presets, the same tags. What differs is the language and the toolkit.
A Compose Multiplatform project
Available · 0.1.0
Pantrix UI
Today’s library: one Kotlin codebase for every platform.
Android
iOS
Desktop
Web
commonMain · Kotlin
Today
PantrixTheme(preset = PantrixPreset) {
PantrixTextArea(
state = note,
label = stringResource(Res.string.note),
maxLength = 120,
tagKey = "courierNote"
)
}
A native Android project
Later
Pantrix for Jetpack Compose
The same library written again for an Android-only app, on Google’s Jetpack Compose libraries.
Android
app · Kotlin
A sketch
PantrixTheme(preset = PantrixPreset) {
PantrixTextArea(
state = note,
label = stringResource(R.string.note),
maxLength = 120,
tagKey = "courierNote"
)
}
A native iOS project
Later
Pantrix for SwiftUI
The same library written again in Swift, as SwiftUI views.
iOS
Checkout.swift · Swift
A sketch
PantrixTheme(preset: .pantrix) {
PantrixTextArea(
"Note to the courier",
text: $note,
maxLength: 120
)
.tagKey("courierNote")
}
What is the same, and what differs
Compose Multiplatform
Jetpack Compose
SwiftUI
Components
Same · every component under the same name: PantrixTextArea, PantrixButton, PantrixDatePicker…
The look
Same · the same tokens and presets, Pantrix’s among them
Tags
Same · TextArea_courierNote in all three, so one Maestro flow tests the Android and the iOS app
Accessibility
Same · each platform’s own: TalkBack, VoiceOver, the keyboard, the touch targets
Documents
Same · one site and one MCP server, every page with each library’s code
Language and toolkit
Kotlin, Compose Multiplatform
Kotlin, Jetpack Compose
Swift, SwiftUI
Platforms
Android, iOS, desktop, web
Android
iOS
Being weighed, one source of tokens:
pantrix.tokens.json
→
PantrixPreset.kt
PantrixPreset.swift
pantrix.css
Versions
0.1.0 · the first release
The whole library
100 components on six targets, adaptive layouts and folds, three languages, the test helpers, diagnostics, the detekt rules, the Material 3 bridge and the documents for assistants. This website comes with it.
0.2.0 · planned
Server-driven UI
Screens a server describes, checked and drawn with Pantrix’s components.
Later
Jetpack Compose and SwiftUI
The library for Android alone and for iOS alone, each a project of its own; design tokens as JSON are weighed with them.
Apache License 2.0
English
·