← All work

Native Android · UI / UX

Interfaces built for long sessions
on real phones and tablets

Screenshots are from Stitch Counter on Google Play. Knitters and crocheters tap counters for a long time, rotate the phone, switch themes, and manage projects in bulk. The patterns below are about holding up under that use, not demo-day screenshots.

Stitch Counter is a personal project by our lead developer; it is licensed for portfolio use. It was not built for a client.

Adaptive ComposeSix themes · dark modeSwipe · multi-selectSheets · confirmations

What we build for clients

New features in your existing Android app
Responsive Compose UI across phones and tablets
Interaction patterns that keep common tasks fast (edit, delete, navigate)
Maintainable architecture (MVVM, separation of concerns)

Problem

A primary control that breaks in landscape is unusable mid-session

Rapid, repeated input is the job. Numbers get large. Devices rotate. Layouts that look fine in a portrait mock often overflow or shrink into unreadable type when the session is real.

Dynamic text · portrait
Dynamic text · landscape
Approach · UI / interaction

Adaptive counter system

How it's built

A real-time counter interaction system with dynamic text scaling so large counts stay readable in portrait and landscape on phones and tablets. Counter state is preserved across orientation changes so progress is not lost on rotate.

Why this shape

  • Input stays responsive during long counting sessions
  • Layout adapts as content changes so counts do not overflow or break the screen
  • Portrait and landscape share one adaptive approach instead of two frozen designs

Results

The primary control remains usable when numbers grow and when the device rotates, which is when real sessions happen.

Lesson

Design the primary control for the worst realistic content size and orientation first. Everything else is easier after that. We use the same test when we harden your busiest screens.

Problem

Themes feel cheap when dark mode and icons disagree with the rest of the app

Personalization is part of the product for this audience. Multiple color styles only work if every screen, dark mode, and launcher icon stay on the same system.

Approach · UI / UX

Dynamic theme system

How it's built

A theming system built by overriding Material Design 3: six shipped visual styles, dark mode for each, and custom launcher icons that match the active theme. Theme preference is stored in DataStore so it survives restarts.

Why this shape

  • Centralized styling keeps screens consistent as features grow
  • Dark mode is first-class for every theme, not a one-off
  • Per-theme icons make the choice feel complete on the home screen, not only inside the app

Results

Users can switch themes without layout breakage, and the app reads as one designed product instead of a pile of screens with mismatched colors.

Lesson

Theme work pays off when it is a system: tokens, dark variants, and icons together. Isolated palette swaps rarely survive the next feature. We bring that system mindset to brand and appearance work in your app.

Theme settings
Counter · dark
Counter · light
Library · Forest
Library · Sea

Problem

Bulk edits and deletes get clumsy when every action needs a new screen

Managing a project library means multi-select, swipe, confirmations, quick edits, and dense detail. Without shared patterns, each flow invents its own gestures and users slow down.

Approach · UI / UX

Shared interaction patterns across the app

How it's built

A set of interaction patterns used throughout the app and adapted per feature: swipe and multi-select for bulk delete, bottom sheets for quick edits without leaving the screen, expandable sections for dense settings, structured detail screens for titles, notes, images, and progress, plus modal confirmations for destructive choices.

Why this shape

  • Common tasks stay on or near the current screen instead of deep navigation chains
  • Confirmations protect against accidental deletes without hiding the action
  • Visual feedback for selection and state changes keeps bulk operations understandable

Results

Library management stays fast as the catalog grows. Users learn one gesture vocabulary and reuse it across screens.

Lesson

Interaction systems compound. Investing once in swipe, multi-select, sheets, and confirmations is cheaper than teaching a new pattern per feature. That is the same approach we use when we improve flows in your existing app.

Multi delete
Swipe to delete
Confirm delete
Project details
Expanding cards

How we work

Design-led iteration on real devices: layouts, themes, and interactions that hold up under everyday use.

1

Review

You share who uses the flow, what feels clunky today, and any references or brand rules we should match.

2

Plan

We align on navigation, responsive breakpoints, theme behavior, and key states: loading, empty, success, and destructive actions.

3

Build

Compose UI with adaptive spacing, motion where it helps, and patterns like sheets, swipes, and confirmations tuned to your content.

4

Deliver

Cohesive screens that look right in light and dark, feel fast, and give clear feedback, ready to ship to real users.

Need Android UI / UX work like this?

A fit when you need UI-focused improvements or new flows in an existing app, especially with Kotlin, Jetpack Compose, responsive layouts, theming, or clearer interaction patterns.

Feature developmentExisting appsKotlinJetpack Compose

Tell us which screens feel stuck — we will reply with scope questions and timelines before we start.