PORTFOLIO / 2026

Echo Shih .

Product Engineer · Taipei

Chun-Yu (Echo) Shih · Taipei, Taiwan

Product engineer · UTC+8 · Remote from Taiwan · APAC hours or async

Products from 0 → 1, and the part after.

Project platforms, applicant tracking, client histories: the software a business runs on. I build the frontend, and the delivery path under it: the module template a team builds against, the release a non-engineer runs in five minutes.

I secure it, keep it running after ship, and write down what broke.

  • React 19 UI
  • Postgres RLS
  • Offline-first sync
  • Architecture tests in CI
  • GHCR image deploys

Experience

Where I've worked

  1. Taipei, Taiwan · Dec 2024 – Jul 2026

    Full-Stack Engineer, Internal Platform

    Lockerbie Technology

    Built and operated an early-stage internal platform for the UK construction sector, as one of two engineers. Brought the other to shipping independently in two months by pairing on the conventions and the review flow first. A backend task went from a week to two days.

    Frontend and backend stay separate, neither reaching the other directly. A BFF between them: the browser talks to the frontend's own server, and it talks to the backend, so no backend credential ever reaches browser JavaScript.

    Next.js App Router · TanStack Query · FastAPI · ArangoDB · RabbitMQ · Docker · GHCR

  2. Singapore · Remote · Aug 2024 – Oct 2024

    Full Stack Engineer & Founding Partner

    SPIN.FASHION by Lablaco

    Co-ran the team's scrum with the CTO on the in-store desktop app, working remotely across time zones.

    The macOS build couldn't ship. Fixed code-signing, notarisation and auto-update. The desktop app shipped, and the release steps are written down.

    React · Redux-Saga · Electron

  3. Taipei, Taiwan · Aug 2022 – May 2024

    Software Engineer

    Find Recruiter

    Led frontend delivery on a recruiting and ATS platform used by employers, agencies and individual headhunters, on a two-engineer product team reporting to the CTO.

    A large production React codebase kept regressing on types. Migrated a large React codebase to TypeScript incrementally, while it kept shipping.

    React · TypeScript · Redux-Saga · Firebase · Server-Sent Events · Google Analytics · Sentry

  4. Remote · 2020 – 2024 · side projects and short contracts

    Software Engineer

    Independent / Freelance Engineering

    Shipped frontends and fixed UX for clients in fintech and e-commerce, remote, 2020 to 2024.

    A Bitcoin coin-selection research tool needed a frontend. Built the frontend in Next.js alongside a BDK core maintainer: UTXO coin-control, fee scenarios, selection metrics.

    Next.js · TypeScript · BDK

Case studies

What I've built

Each one the same way: the constraint, the decisions, what happened. Open a study for the rest of the decisions and the screenshots.

Clio

Salon operations software, in daily use at a Tainan salon since May 2025

Status
Live
Role
Founder
Stack
React 19TypeScriptSupabasePostgresTanStack QueryTailwind

Constraint

A friend's hard drive died and took years of salon records with it. She'd tried the existing software and found all of it too complicated. She didn't need more features. She needed the two minutes before a client sits down: who they are, what was done last time, what it cost.

Decisions

  1. No booking, no payments, no inventory, no marketing. The products she rejected had all of it. Clio covers the two minutes before a client sits down, and stops
  2. Each salon is isolated in the database itself. The app doesn't have to remember to filter
  3. Tightened the permission defaults without locking out existing staff. The migration writes the intended values before the code stops assuming them

+4 more in the full study

Outcome

The owner typed a year of past appointments in by hand. People don't migrate their own history into software they're still evaluating. In daily use at the salon since May 2025, with 603 clients, 2,694 service records, and history entered back to September 2024. What I'd do differently: write the permission model down before building it, not after.

Live

Financial Runway

Personal finance measured the way a company measures itself: how many months does your money cover?

Status
In Progress
Role
Founder
Stack
FlutterDartRiverpodDriftSQLCipherRevenueCat

Constraint

I was planning a study trip and couldn't answer the one question it rested on: how many months would my money cover? Budget apps tell you where the money went. I needed to know how much time was left. A person has an opening balance, monthly costs and months remaining, the same as a company.

Decisions

  1. A goal is a number of months, not an amount of money. The question was never how much I had, it was how many months it covers
  2. Logged spending uses up its budget instead of adding to it. Monthly costs only rise when a budget is overspent, so a lunch never counts twice
  3. Runway counts from today. The rest of this month costs what's left of its budget, not a whole month that's already partly paid

+2 more in the full study

Outcome

I use it. Built solo, in six languages and six currencies. One user isn't validation. I built the model before I knew whether anyone else wanted it, which is the wrong order, so the work since has been the other half: a landing page, store screenshots, and getting it into the App Store.

See the app

Echology

A demo wallet for studying how Bitcoin coin-selection algorithms behave

Status
Archived
Role
UI/UX designer and frontend engineer
Stack
Next.jsTypeScriptTailwind CSS

Constraint

Coin selection is the algorithm that decides which coins a transaction spends, and it sets the fee. Its trade-offs only show up as numbers (waste, fee, feerate deviation), and only for one exact set of inputs. If you hold the inputs still, you can compare the algorithms.

Decisions

  1. You pick the UTXOs by hand, so the input set is a controlled variable instead of whatever the wallet happened to hold
  2. Spend scenarios and fee rates are adjustable, because selection behaviour diverges at the extremes
  3. Waste, fee and feerate deviation are shown as separate figures. One combined total hides which trade-off moved

Outcome

Built the frontend with a core maintainer of the Bitcoin Dev Kit. You construct a UTXO set, run it against a spend scenario, and read the metrics side by side. Archived.

Source Code

Toolkit

What I work with

Frontend
  • React
  • TypeScript
  • Next.js
  • Tailwind CSS
  • SvelteKit
UI & design
  • Design systems
  • UI patterns
  • Responsive & accessible
Mobile
  • Flutter
  • Dart
  • Riverpod
State & data
  • TanStack Query
  • Zustand
  • Redux
Backend & Data
  • FastAPI
  • Node.js
  • Postgres
  • ArangoDB (document + graph)
  • RabbitMQ
Infra & CI/CD
  • Docker
  • CI/CD
  • GitHub Actions
  • GHCR
  • AWS
Testing
  • Vitest
  • React Testing Library
  • pytest
AI & Automation
  • Claude Code
  • Skills
  • Hooks
  • Plugins

Who I am

Just me.

BA in Italian language and culture. Mandarin and Taiwanese are native, English at work. Then restaurants, customer relations.

The software we used could've been better, and I could see how. So I started writing it. I like software you don't have to be taught.

I paint too, since 2012. At my desk, on trains and planes, a few months in Florence. One part logic, one part emotion.

I like to untangle things. Give me the part nobody's scoped yet and I'll work out what it should be, build it, and stay with it after it ships. Remote, from Taiwan.

Echo Shih, a studio portrait against a dark background.

Available for a role or a project.

  • Employment

    Join your team

    One engineer who owns the interface, the boundaries under it and the release path, and stays with it after it ships.

  • Contract or partnership

    Hire me for a project

    A scoped piece of work on the product you have, something new from zero, or a founding-partner seat. Clio and SPIN.FASHION are the two ends of that range.