Ivy Li · Full stack software engineer

Cofounder of Nitrox (opens in a new tab)

I build production software for complex, data‑heavy products.

6+ years designing, building and shipping production SaaS, from interfaces and APIs to databases and cloud infrastructure.

01

Featured case

Sited: a geospatial site analysis platform for architects

Independent productPrelaunch

Built for architecture students and practices: pin a site, and Sited draws its buildings, streets, green space, land use and wind from open data, plus a sun path for its latitude, onto an A4 to A0 board they can edit and export. I built the whole product: the Angular client and canvas editor, a Supabase PostgreSQL backend secured with Row Level Security, and a Fastify and DuckDB geospatial API.

Key highlights

  • Ten site studies built from OpenStreetMap, NASA POWER and the site’s latitude, exported to PDF, PNG or SVG, with maps also as DXF or GeoJSON
  • Access control enforced in PostgreSQL, with Row Level Security on every table
  • Geo API in Fastify and DuckDB over Overture Maps data, now in staging
Site analysis board exported from Sited for a sample site: figure-ground, circulation, green and blue space, land use and sun maps, each with a key, scale bar and north arrow, a wind rose, and a title block
02

Selected work

03

Other work

  1. P.06

    ETP

    Energy trading platform built at Solar Bankers, where prosumers sell surplus electricity to neighbors. Angular frontend work on a platform with market, analytics and history views, charts, access privileges, payment methods and localization, integrated with a microservices backend.

    Solar Bankers

    Angular, Data visualization

  2. P.08

    Sharpy

    Frontend engineering for a product marketplace.

    Product marketplace

    Frontend

Client work on Upwork

13 clients between 2020 and 2023, including returning clients.

View Upwork profile (opens in a new tab)
  1. C.01

    Remote solar design tool

    Homeowners lay out panels on a satellite view of their roof and get an instant installation cost estimate, built with Angular and Google Maps. The client returned for three engagements and called me “a technical genius.”

  2. C.02

    Real-estate analytics application

    Improvements that contributed to a reported 50% increase in user engagement.

  3. C.03

    School administration portal

    Recurring feature work for a returning client, including optimization and student-management data visualization.

  4. C.04

    Trading platform integrations

    Helped integrate platform bots and the Alpaca trading API into a client application, adding automated workflows and trading-related functionality.

  5. C.05

    Slack integration

    Node.js integration between a client’s forms and Slack, built on the Slack API.

04

How I work

I build software that stays fast and correct long after launch, through long sessions, weekly releases and major upgrades.

05

Experience

  1. 2023 – 2026

    Smart Apartment Data

    Senior Software Engineer

    B2B SaaS platform providing property, market, ownership, management and rental intelligence for the U.S. multifamily real-estate industry.

    I owned the Angular architecture and complex feature development: NgRx state management, maps and geospatial search, reporting and data visualization, authentication and routing, performance and the CI/CD build. I worked closely with the backend engineers, integrating the frontend with their services and with external systems, and partnered with backend, product and QA to validate releases.

    Joined as a contractor in 2023 and was promoted every year, reaching Senior Software Engineer.

    Platform scale

    • 10,000+industry professionals served
    • 220K+properties in the platform’s data
    • Weeklyrelease cadence

    Selected impact

    • CI/CD pipeline

      15+ min to ~5 min

      Cut pipeline runtime by about two-thirds, speeding up build validation and release feedback.

    • Angular upgrades

      Angular 8 to 21

      Led the platform’s upgrades across major versions, resolving breaking changes, dependency conflicts and regressions.

    • Map engine

      Mapbox to MapLibre

      Led the migration from Mapbox and built custom freehand area selection, which MapLibre doesn’t support natively.

    • Market search

      One market to many

      Proposed, built and shipped multi-market search. Users were previously limited to one metro, one state or the whole country.

    Key contributions

    • Established the NgRx state-management pattern used for new features
    • Built and improved IDX website-builder flows, including multi-step setup, theme customization, form validation, visitor access settings and configuration persistence, and supported fixes after launch
    • Strengthened frontend authentication flows, including automatic sign-in, token refresh and magic-link navigation
    • Improved reliability by diagnosing performance bottlenecks, memory issues, routing failures and request/response errors, then shipping targeted fixes with regression safeguards
    • Integrated the frontend with CRM systems and data services
    • Standardized confirmation and alert flows with reusable components
    • Reviewed pull requests, onboarded new developers, and served as a technical escalation point for complex Angular, architecture, debugging and performance issues
    • Worked directly with Product, Design, QA and Sales

    Product areas: reporting and analytics, property and market intelligence, search, geospatial tools, market surveys and report sharing.

  2. 2020 – 2023

    Freelance

    Full-Stack Developer

    Owned client projects end to end, from requirements and technical decisions through deployment and maintenance: Angular frontends, Node.js and Express APIs, REST and GraphQL integrations, Firebase, payments and maps, using Docker, Google Cloud, Azure and CI/CD.

    13 clients on Upwork, including returning clients. Smart Apartment Data started as one of these contracts.

  3. 2020

    Solar Bankers

    Front-End Developer

    Angular frontend work, including ETP, an energy trading platform: reusable UI components, responsive and localized sites, animated power-flow visualizations and energy-saving calculators, built with the backend engineers behind its microservices.

  4. Education

    Eastern Mediterranean University

    B.Eng. Software Engineering

    • Best Graduation Project
    • Golden Award, OLX Group Challenge (Codility)
    • Angular Expert (Pluralsight)
06

Skills

Core languages
  • TypeScript
  • JavaScript
  • SQL
  • HTML
  • CSS/SCSS
Frontend
  • Angular
  • RxJS
  • NgRx
  • Signals
  • React
  • Vue
  • Angular Material
  • Component architecture
  • State management
Backend and APIs
  • Node.js
  • Express
  • Fastify
  • Java
  • REST
  • OpenAPI
  • GraphQL
  • Authentication (JWT, OAuth)
  • Webhooks
  • Cloud Functions
Databases and data
  • PostgreSQL
  • Supabase
  • Row Level Security
  • DuckDB
  • Firebase
  • Data modeling
Cloud and DevOps
  • Google Cloud
  • Azure
  • Azure DevOps
  • Docker
  • Kubernetes
  • GitLab CI/CD
  • Cloudflare
  • Railway
  • Git
Specialized
  • Maps (MapLibre, Mapbox, Google Maps)
  • Geospatial data (OpenStreetMap, Overture, GeoJSON)
  • Canvas editors (Konva)
  • Data visualization
  • Payment integrations (Paystack)
  • CRM integrations (Salesforce, HubSpot)
  • Performance optimization
  • Automated testing (Jasmine, node:test)
  • Production troubleshooting

Technologies I have used in production or in the products above.

Get in touch

Have a role or a project in mind?

I’m open to senior full stack and frontend roles, and to select product collaborations.

Write to me

Independent product

Sited

Scope
Product, frontend, database, API, deployment
Stack
Angular, TypeScript, NgRx, MapLibre, Konva, Supabase, PostgreSQL, Fastify, DuckDB

Architecture

Angular client Canvas editor, MapLibre maps, and export generated in the browser
Supabase Auth and PostgreSQL with Row Level Security
Open data OpenStreetMap and NASA POWER, fetched in the browser
Geo API Staging Node.js, Fastify and DuckDB over Overture Maps data

Product

A planning and document editor for architectural site analysis boards: what architecture students pin up at crits and practices make for competitions and early feasibility studies. Users pin a site, draw its boundary, add generated studies to a sheet, edit everything and export.

What I owned

All of it, built independently: product design, the Angular client and canvas editor, the Supabase schema and security, the Geo API, and the CI/CD pipeline and deployment.

Frontend

  • Angular 21 with signals and zoneless change detection; NgRx stores cache data from Supabase and external APIs
  • Konva canvas editor on a framework-free core, where every edit is a command with an inverse for undo
  • MapLibre site setup with place search, boundary drawing and Turf measurements
  • OpenStreetMap and NASA POWER data fetched and summarized in the browser
  • Export to PDF, PNG, SVG, DXF and GeoJSON, generated client-side

Backend and data

  • Supabase PostgreSQL with Row Level Security on every table
  • Roles and plan limits enforced in the database
  • Autosave through one RPC that checks the base revision, so a conflicting save is raised, never silently overwritten
  • Geo API (staging build): Fastify and DuckDB over Overture Maps data, with authenticated requests, OpenAPI documentation and an automated test suite

Challenges and decisions

  • Read only the Overture files that overlap a site, using committed per-release manifests, instead of scanning every file in the release
  • Reject oversized areas instead of truncating them, so partial data never looks complete
  • A separate, cancellable DuckDB connection for each query, after a shared connection timed out under concurrent requests
  • The database, not route guards, is the security boundary

Status

Working today

  • Accounts, projects and documents with autosave
  • Site setup and ten generated studies
  • Canvas editor, templates and export
  • Plan limits enforced in the database

In progress

  • Geo API data in the app, now in staging
  • Payments and legal pages, before launch

Smart Apartment Data

From map selection to market report

Scope
Angular frontend and API integration
Stack
Angular, TypeScript, NgRx, RxJS, MapLibre, Mapbox, REST APIs
Smart Apartment Data map with a freehand area drawn around a set of Houston submarkets, and the menu for the selected properties open at Create Report, listing rent comp, executive, market survey, historical and floorplan historical analysis. Property details are blurred.
A drawn area and the reports it feeds, in production. Property details are blurred.

Product

Property, market and rent data for the U.S. multifamily industry, covering 220K+ properties. Users search it and analyze it by geography: by metro, by state, nationally, or by an area they define themselves.

What I owned

The frontend of these features: the Mapbox to MapLibre migration, the freehand selection tool, multi-market search from proposal to release, and the reporting views. The APIs behind them were built by the backend team.

Frontend

  • Freehand geographic selection on the map
  • Property search across metro, state and national scopes, and combinations of markets
  • Survey and reporting tools around selected properties and markets
  • Report charts and report sharing

Backend and data

I integrated these features with the platform’s REST/JSON APIs and data services, which the backend team built.

Challenges and decisions

  • MapLibre has no native freehand drawing, so I built it rather than limit users to predefined boundaries
  • Preserve existing map behavior through the migration first, then extend it
  • Submarket, metro and national series differ in scale and broke the charting library’s scaling, so I normalized them to a common baseline for display without altering the underlying values
  • Let users combine markets, rather than choose between one market and a national search

Outcome

  • Users draw any area and analyze the properties and rents inside it
  • Searches are scoped to the markets needed, instead of falling back to national searches
  • Submarket, metro and national trends read on one chart
  • The platform’s maps run on MapLibre

Smart Apartment Data

Performance, build speed and Angular upgrades

Scope
Frontend architecture, performance, build and CI/CD
Stack
Angular, TypeScript, RxJS, NgRx, CI/CD

Problem

Production builds took more than 15 minutes, which slowed every release. Separately, the application became slower the longer someone used it, and no single screen explained why.

What I owned

The build and CI/CD optimization, the performance investigation and its fix, and the Angular upgrades across major versions.

Frontend architecture

  • Simplified the filter, sort and search flows
  • Made subscription teardown explicit, with take(1) for one-shot streams
  • Corrected lifecycle handling and terminated leftover processes
  • Reworked component imports and routing

Build and delivery

  • Removed heavy and unnecessary dependencies
  • Improved build configuration
  • Angular major-version upgrades

Challenges and decisions

  • The slowdown had no single cause: it ran through component lifecycles, RxJS subscriptions, routing, and the filtering and search architecture
  • Custom directive and routing abstractions (consumer/mountable patterns) caused lifecycle and subscription leaks, so I simplified the filter, sort and search flows and cleaned up routing and subscriptions

Outcome

  • Cut build pipeline runtime from 15+ min to ~5 min
  • Fixed the subscription and lifecycle leaks behind the long-session slowdown
  • Application running on Angular 21

Service marketplace

WorkHacka

Scope
Architecture, frontend, backend, authentication
Stack
Angular, TypeScript, Firebase Auth, Cloud Functions, Firebase
WorkHacka home page with service search by keyword, location, category and price
Service search on the WorkHacka home page.

Product

Two kinds of accounts, customers and service providers (Hackas), each with their own experience and permissions, and a way for customers to find, message and book providers.

What I owned

The whole product: architecture, the Angular application, the Firebase backend and Cloud Functions.

Frontend

  • Separate customer and provider experiences
  • Service search and discovery
  • Booking and in-app messaging interfaces

Backend and data

  • Firebase Authentication, with each account’s role in custom claims
  • Role-based access for the two account types
  • Backend business logic and workflows in Cloud Functions

Challenges and decisions

  • Carry each account’s role in Firebase custom claims and base role-based access on it
  • Run the backend business logic and workflows in Cloud Functions
  • Design booking and messaging workflows that involve both sides

Outcome

A complete marketplace covering both sides, from search to messaging and booking. The product has since been discontinued by its owners.

Travel bookings and payments

Wizygbe Tours

Scope
Frontend, backend, payments, administration
Stack
Angular, TypeScript, Node.js, Express, Firebase, Paystack
Wizygbe Tours home page
The Wizygbe Tours home page.

Product

Wizygbe Tours’ platform served customers looking for holidays and tours, visa applications and college admission applications. Customers booked and paid for travel consultation packages online, and the agency managed the orders through its administration dashboards.

What I owned

The Angular frontend, the Node.js and Express backend, the Paystack integration, and the order management and administration workflows.

Frontend

  • Consultation package booking and checkout flows
  • Authentication
  • Blog and announcements with comments, and a gallery

Backend and data

  • Node.js and Express API alongside Firebase
  • Server-side verification of each Paystack transaction
  • Webhook handling that updates orders from Paystack’s events
  • Order data behind the administration dashboards

Why it mattered

  • Payment status comes from the server: each Paystack transaction is verified server-side rather than trusted from the browser
  • Webhook handling lets Paystack report payment events to the backend directly, not through the customer’s browser

Outcome

Customers booked and paid for consultation packages online, and the agency managed the orders from its dashboards.