Skip to content
Selected work

01 · AppsCode · Product Design

KubeDB Console

KubeDB (opens in a new tab) runs production databases on Kubernetes, and it’s AppsCode (opens in a new tab)’s busiest product. Its console is where teams create those databases and keep them healthy. I own its UI: the structure, every flow and screen, and the Vue code behind them.

Deploy support issues, down from about 20–25
≈0Deploy support issues, down from about 20–25
Database engines, one structure
25+Database engines, one structure
Operations on every database page
12Operations on every database page
Designer
Mohin Uddin
Role
Product Design, Information Architecture, UI Engineering
Timeline
AppsCode · ongoing
Technology
Vue 3, Nuxt, Tailwind CSS v4, Figma, AppsCode Design System

My role

What I did
I own the console’s UI end to end, from research to the Vue UI code: how 25+ engines share one structure, the create wizard, the database page and every operation. I also act as its product owner, setting priorities with the CEO and the platform team.
Team
Me, with 3–4 engineers who connect the APIs and data
Duration
Ongoing, day by day, across my 7 years at AppsCode

At a glance

  1. 01 · The problem

    A production database on Kubernetes meant a long manifest, the right versions and quotas, and no second chance when an upgrade went wrong.

    Read the problem
  2. 02 · The approach

    Twenty-five engines, one structure: each decision rests on a UX principle I could defend.

    See the approach
  3. 03 · The result

    Teams now create and run production databases from the browser, and every change is previewed and recorded.

    See the result

01 · Challenge

A production database on Kubernetes meant a long manifest, the right versions and quotas, and no second chance when an upgrade went wrong.

  • Every engine has its own versions, modes and settings, and one wrong field only shows up after the database is running.
  • TLS, backups and monitoring were separate objects to wire by hand, so they were easy to forget.
  • Day-2 work like upgrades, restarts and resizing is where outages happen, and none of it showed who changed what.
  • The result was a steady flow of support issues about routine work: about 20–25 on deploying databases alone.

BeforeA MongoDB replica set, by hand

apiVersion: kubedb.com/v1
kind: MongoDB
metadata: { name: sam-test, namespace: demo }
spec:
  version: "7.0.28"
  replicaSet: { name: rs0 }
  replicas: 3
  storage: { … }
  tls: { issuerRef: { … } }
  monitor: { agent: prometheus.io/operator }
# + BackupConfiguration, Repository,
#   RetentionPolicy, ServiceMonitor …

AfterThe same database, in the console

Create MongoDB
  1  Namespace and name
  2  Version and mode     only valid ones
  3  Machine and storage  checked against quota
  4  Monitoring · Backup · TLS · Gateway
  5  Preview              every file, before submit
Creating one database, before and after: a manifest and its companion objects written by hand, or a wizard that offers only valid choices and shows every file before it applies them.

02 · Users

The console serves the people who run databases and the people who only need to use one.

  • DBAs

    Create production databases and run their upgrades, scaling, backups and restores.

    What got in the way Writing and checking manifests by hand, with nothing to preview before an upgrade.

  • App developers

    Get a database for their service, connect to it and check it’s healthy.

    What got in the way Digging through Secrets and Services just to build a connection string.

  • Platform admins

    Decide which versions, sizes and options teams may choose, and who can change what.

    What got in the way Databases created outside the team’s standards, found only after they caused trouble.

03 · Research

Before designing, I looked at where database work actually went wrong.

  • People didn’t need every YAML field. They needed a few common jobs done safely: create, scale, upgrade, back up, restore, monitor, fail over.
  • They needed to see at a glance whether a database was healthy.
  • When something broke, the slow part was finding the right logs or shell, not the fix itself.
  1. 01 · Listen

    Interviewed customers and our own developers about where database operations went wrong.

  2. 02 · Review

    Went through recurring support questions to find the operations that confused people most.

  3. 03 · Audit

    Ran a detailed UX review of the scaling, networking and secret management flows.

  4. 04 · Hand off

    Turned the findings into a Figma annotation checklist the engineers could act on.

04 · Thinking

Twenty-five engines, one structure: each decision rests on a UX principle I could defend.

  1. Rule 01

    Guided forms, not YAML

    Recognition over recall: people pick from the versions and modes an engine supports, within the team’s presets and quota, instead of remembering field names.

  2. Rule 02

    Few choices per step

    Hick’s law and progressive disclosure: sensible defaults first, advanced options folded away for the experts who need them.

  3. Rule 03

    One shape for every engine

    Jakob’s law: Postgres, MongoDB or Kafka, every database has the same page, menu and operations, so learning one teaches all of them.

  4. Rule 04

    Status first

    Visibility of system status: overviews lead with the databases that need attention, and each state names its cause.

  5. Rule 05

    One click to logs or a shell

    Shorten the critical path: the slowest part of an incident is getting to the right place, so every node has Logs and Exec beside it.

  6. Rule 06

    Preview, then change

    Error prevention: creating a database and every operation on it end with a preview of exactly what will be applied, in plain words.

05 · Overview

One page answers “which databases do we run, are they healthy, and what do they use?” across every engine.

Datastore Overview: every database in the cluster, with an Attention card for the one that is not ready
Datastore Overview: every database in the cluster, with an Attention card for the one that is not ready

06 · Create

The create wizard asks only the questions that matter, and checks the answers before anything is applied.

  • It starts from the organisation’s presets, so every new database follows the standard without anyone remembering it.
  • Monitoring, backup, TLS and gateway access are switches on one step, and a switch that can’t work says why.
  • The last step shows every file the wizard will create, and nothing is submitted until then.
Create MongoDB, additional options: monitoring, backup and TLS in one place, and a switch that explains why it’s off
Create MongoDB, additional options: monitoring, backup and TLS in one place, and a switch that explains why it’s off
Create MongoDB, last step: every file the wizard will create, shown before anything is submitted
Create MongoDB, last step: every file the wizard will create, shown before anything is submitted

07 · Database

Everything about one database is on one page, and the vital facts never scroll away.

A database page: every operation in the side menu, a ready-made connection string and live insights
A database page: every operation in the side menu, a ready-made connection string and live insights

08 · Operations

Upgrades, restarts and resizing are where outages happen, so each one runs as a reviewed, tracked request.

  • Each operation shows the current and new values side by side, then a preview, before anything runs.
  • KubeDB carries it out safely, one node at a time, and the Operations tab records every change.
  • Recommended updates wait for approval and can be scheduled into a maintenance window.
  • Restore and an instant backup sit in the same menu, so a backup before a risky change is one click.
  • Operations: recent changes, and a recommended version update waiting for approval
  • Vertical Scale: current and new resources side by side, applied as a tracked ops request
  • Restart: every node, one at a time, applied only once the database is ready
  • Restore: pick a repository and a snapshot, then preview before anything changes

09 · Outcome

Teams now create and run production databases from the browser, and every change is previewed and recorded.

  • Support issues about deploying databases fell from about 20–25 to almost none, which freed the support and platform teams for harder problems.
  • Create, scale, monitor, back up, restore and fail over moved from the terminal into the browser.
  • 25+ engines share one structure, so adding an engine doesn’t mean designing a new console.
  • What I learned: with data at stake, trust comes from showing exactly what will happen before it does.

10 · Next

Fewer tickets is a good sign, but I want to measure the flows directly.

  • Add simple product analytics to the key flows, to see task completion and drop-off for each operation.
  • Run a short usability round on restore and failover, where mistakes cost the most.

From the person who managed this work

“Mohin is not only a talented UI/UX engineer, but also a team player and communicator. He used various tools and methods to conduct user research, create wireframes and prototypes, test usability, and implement feedback.”
M. A. Muhaimin SakibEngineering Manager, now at Anwar Group · Managed Mohin directly at AppsCodeRead it on LinkedIn(opens in a new tab)