UI/UX Designer

TrivialLife is an end-to-end gym management platform that unifies memberships, scheduling, payments, and debt collection into one seamless experience. Designed to replace fragmented tools, the platform simplifies complex workflows, reduces operational friction, and enables gym administrators to manage their operations more efficiently.
I worked as both the UI/UX Designer and UI Developer, owning the product from concept to implementation. I led the end-to-end design process, including user research, workflow definition, wireframing, prototyping, and high-fidelity UI design in Figma.
I collaborated closely with Business Analysts, Product Owners, and engineers to translate complex gym operations into intuitive user experiences. I also contributed to front-end development using React, ensuring design consistency and smooth handoff. Through continuous feedback and iteration, I refined the product to meet both user needs and business goals.
Gym offices in Norway were getting by on a patchwork of tools that weren't built to work together. A member's personal details might live in one system, their payment plan in a spreadsheet, their class bookings in a calendar app, and any payment issues escalated through a completely separate debt platform. Every time an admin needed the full picture on a member, they had to pull it together themselves.
This wasn't just inefficient and it caused real mistakes. Payment data entered in one place didn't automatically update another. Class capacity had no connection to membership status. When a member's card failed at the door, no one knew until the member complained. And when a payment lapsed, there was no natural path from 'overdue' to 'pre-collection' without leaving the main system entirely.
"Build one platform where gym staff can register members, configure contracts, schedule classes, track payments, and chase debt without switching tools, re-entering data, or losing context mid-task and make it fast enough that the person at the front desk can get through it while a member is standing in front of them."
That translated into a few non-negotiable design goals. Common tasks had to be genuinely fast and not just faster than before, but fast enough that admins stopped dreading them. Every module had to share data, so a change in one place reflected everywhere else automatically. The payment and debt workflows had to feel like one continuous flow, not two separate products. And the whole thing had to flex across different gym setups without requiring custom configuration for every client.
"The person at the front desk isn't a software specialist. They're juggling contracts, angry members, class changes, and payment queries, often at the same time. So speed and clarity mattered more than anything else."
I mapped the IA around the mental models that came up in interviews. Gym receptionist organised their work around members, instructors and not around features. So the navigation followed that: member profiles as the central hub, with contracts, payments, and class history all accessible from one place.
The member registration flow was the first thing I wireframed in detail. On the surface it looked like a sign-up form. It wasn't. It was five distinct decisions with downstream consequences: personal details, payment setup, referral tracking, contract signing, and payment confirmation. I sketched it as a stepped wizard early on, before any visual work, just to see if the logic held. A persistent sidebar showing where you were in the flow, and a cost summary pinned at the bottom that updated as you made choices. those two things came out of wireframe testing, not visual design.
Those decisions were real problems that had specific design responses I can point to.
The member registration flow had five distinct stages and each one affected the others. Done badly, it would have felt like five separate forms. I structured it as a stepped wizard with a progress indicator on the left so admins always knew how far they were and what was coming. The floating cost summary at the bottom updated live as package choices and add-ons were selected. So by the time you reached the payment step, there were no surprises. That one detail eliminated a whole category of errors we'd seen in testing.
I didn't design the dashboard around metrics. I designed it around urgency. The first thing at the top: door access failures, surfaced as real-time reminders rather than waiting in a log. Below that: today's visit count against the monthly target, because that's what drives staffing decisions. Then the morning and evening class grid. Then today's instructors. Everything visible in the first scroll is something an admin might need to act on within the next hour. The package promotions sit lower and their business priorities, not operational ones.
The old way: create a class, pick a date, save, repeat for the next 24 weeks. The new way: pick the days of the week, set the time, assign the instructor, set the capacity, and the system handles the rest. Day toggles with time pickers made the weekly pattern immediately readable. Instructors were assigned per class rather than globally, which gave admins flexibility to mix instructors across sessions without creating roster management overhead they didn't need.
A full installment table with twelve rows, with due dates, amounts, add-on costs, and a payer name could easily become a wall of numbers. The split-panel layout kept the package list on the left for quick switching and put everything about the selected contract on the right: the installment table, add-ons, gym access tiers, ATG toggle, auto-renewal and all on one scrollable surface. Change the payer, the due date, or an add-on, and the table updated immediately. No save-and-refresh, no recalculating by hand.
With this many screens, visual drift was a real risk. I built a component library in Figma covering every repeating pattern: form fields, card layouts, step indicators, toggles, badges, status pills, data tables. Every module used the same components. This meant the admin config screens and the member registration wizard felt like parts of the same product rather than features that grew up separately. It also made the React implementation cleaner and components were named and documented to match their code counterparts.
Build a real component library before designing any high-fidelity screen. With this many surfaces and this much data density, I knew that designing screens individually was a recipe for visual drift. Every toggle a slightly different shape. Every form field a slightly different padding.
So I started with brand and basic variables. Boring foundational stuff that nobody sees. Then I built the components on top of those variables, with every state mapped out: default, hover, focus, disabled, error. After that, I moved on to more custom layout components, like section headers with actions, labelled toggles, and list items with actions.
Every screen came with its own complexity that components alone couldn’t solve, so I had to think through the design before even starting prototypes. My approach stayed the same: I had to figure out what the admin is trying to do, then design the UI to make that process clear as it happens.
The thread running through all screens isn't visual. It's that every decision was about closing the gap between what the user was doing and what the system was telling them about it.
I ran small A/B tests with separate participant groups from the project team who currently work in gyms, working section by section across complete user flows. To save time, I created two design variations only for the more complex cases. After the sessions, I went back into Figma and fixed what wasn’t working: I introduced a blue notification banner that confirms a payment date change inline rather than hiding it behind a modal; added a “Preview” label to the class card so its draft state was unambiguous; kept the full installment table open by default instead of collapsed; and moved the add-ons panel into a split layout alongside the installments so admins didn’t lose their place while editing.
My involvement didn't stop at handoff. I implemented the Design System and user interfaces in React with HTML/SCSS, which meant I was the bridge between design intent and production output. Building what I had designed gave me a precise understanding of where design decisions needed to flex to accommodate component constraints and where the code needed to be pushed to match the design vision. The result was a tighter gap between spec and shipped product than is common when design and development are fully separated
The hard part of this project wasn't the screens. It was getting all the moving parts to play nice together. Change one thing in the registration wizard and you'd see it ripple through payments, contracts, and gym access. That kind of quiet, behind-the-scenes work took a lot longer than getting the visuals right and it's the work I'm proudest of.
The bigger takeaway for me is how much I like working close to code. Doing the Figma design and the React build on the same project gave me a much better sense of what's actually hard to build versus what just looks hard. That changed how I make design decisions now. The gap between what's in the spec and what ends up shipping is the thing that frustrates everyone in this industry, and it shrinks a lot when one person is watching both sides of it.

Charitha Surenaka
UI/UX Designer & UI Developer
Available for full-time roles in Australia or remote positions globally.