SDK Elements

Embed individual screens and sheets one at a time. Each element ships with props, an Appearance override, and a callback API. Mix any combination — your nav stack, our flows.

Preview release. Elements ship as a separate sdk-elements artifact in 2026 Q3. Today these screens are also reachable via OlikSplitView — this page is the design contract for the upcoming standalone API.
GroupsList screenshot
(coming soon)
Navigation

GroupsList

Every group the end-user belongs to. Search, swipe-to-archive, create-new. Tap a row to open GroupDetail — or hand the click off to your own router via onGroupSelected.

PropTypeEffect
showCreateButtonBooleanShow / hide the floating "New group" CTA
onGroupSelected(groupId) →Your handler. Return true to consume; false falls back to default navigation
filterGroupFilterALL / ACTIVE / ARCHIVED
appearanceAppearance?Override colors, radius, typography for this element only
// Kotlin / Compose
GroupsList(
    showCreateButton = true,
    onGroupSelected = { groupId -> myRouter.push("split/$groupId"); true },
)
AddExpenseSheet screenshot
(coming soon)
Modal

AddExpenseSheet

The full add-expense flow as a single bottom sheet: amount, payer, currency, split mode (equal / shares / exact), receipt photo. Drop this into a chat thread, a checkout, or a "split this charge" button on a transaction row.

PropTypeEffect
groupIdString?Pre-select the target group. If null, the user picks
seedAmountMoney?Pre-fill the amount + currency (e.g. from a transaction)
seedParticipantsList<UserId>?Pre-select who's in
onSaved(Expense) →Fires after the expense is created. Use to dismiss your host UI
onDismissed() →User cancelled
// Pre-fill from a bank-feed transaction
AddExpenseSheet(
    groupId = "grp_flat4b",
    seedAmount = Money("36.72", "USD"),
    onSaved = { dismissBottomSheet() },
)
ReceiptScanFlow screenshot
(coming soon)
Flow

ReceiptScanFlow

Camera → OCR → per-item assignment → save. Three OCR tiers (Quick / Sharp / Pro) chosen per-scan or fallback chained. Camera permission is the host app's responsibility.

PropTypeEffect
defaultEngineOcrEngineQUICK (free, on-device) / SHARP / PRO
fallbackChainList<OcrEngine>Auto-retry next tier on low-confidence
onScanned(ReceiptDraft) →You get items + total before assignment
onSaved(Expense) →Final saved expense
ReceiptScanFlow(
    defaultEngine = OcrEngine.QUICK,
    fallbackChain = listOf(OcrEngine.SHARP),
    onSaved = { exp -> myFeed.prepend(exp) },
)
SettleSheet screenshot
(coming soon)
Modal

SettleSheet

The "who pays whom" UI with debt simplification, suggested amounts, and mark-paid actions. Hook it into your in-app payments by intercepting onSettlePressed with your own payment provider.

PropTypeEffect
groupIdStringRequired
simplifyBooleanRun debt simplification (defaults true)
onSettlePressed(Settlement) →Return HANDLED to skip our in-app mark-paid (you'll trigger payment yourself)
BalancesCard screenshot
(coming soon)
Widget

BalancesCard

A compact one-line widget: "Marco owes you $24.50 across 2 groups". Drop on a dashboard, a transaction footer, or a chat sidebar.

PropTypeEffect
scopeBalanceScopeALL / GROUP(groupId) / USER(userId)
compactBooleanSingle-line vs multi-row layout
onTapped() →Open your own destination (defaults to SettleSheet)

Want an element that's not here?

Elements are the design contract — if you need a screen we haven't catalogued, the answer is probably "use the headless API and ship it." Tell us what you'd embed and we'll consider promoting it.

Request the SDK