Case study

Karay Suchi

Workspace management platform

Role
Full stack engineer
Timeline
2025
Context
Independent product
The Karay Suchi dashboard, showing workspaces alongside a task list

Overview

Karay Suchi started from a simple frustration: most productivity tools ask you to maintain the tool almost as much as the work inside it. The goal was a workspace where capturing a task costs nothing, and where the structure only appears once you actually need it.

The problem

Create a workspace experience that keeps tasks, notes and to-dos close without becoming another noisy productivity dashboard.

The approach

  1. Modelled the data before designing a screen

    Workspaces, lists, tasks and notes were mapped as a single ownership tree in MongoDB first. Getting that hierarchy right up front meant permissions and cascading deletes fell out of the schema rather than being patched in later.

  2. Kept server state out of component state

    React Query owns everything that comes from the API; Zustand owns only what is genuinely local, like panel and filter state. Separating the two removed an entire class of stale-cache bugs that had been showing up during early testing.

  3. Made the API predictable on purpose

    Every resource follows the same verb set, the same error envelope and the same pagination contract. Consistency mattered more than cleverness — a new endpoint takes minutes to add because there is nothing to decide.

  4. Built the deployment path first

    GitHub Actions to AWS Lightsail was wired up in the first week, before there was much to deploy. Shipping was never a separate phase after that, and every change since has gone out the same way.

By the numbers

  • 40+REST endpoints
  • <120msMedian API response
  • 97Lighthouse performance
  • 100%Deploys via CI

What shipped

  • Multi-workspace organization
  • JWT-protected API
  • AWS Lightsail deployment
  • GitHub Actions CI/CD

Built with

  • TypeScript
  • React
  • Node.js
  • MongoDB
  • Zustand
  • React Query

What I took from it

The most useful decision was refusing to add features until the data model could carry them. Everything that felt slow to build early — the schema, the error contract, the deploy pipeline — is what made the later work fast.