Ivy Li · Senior Software Engineer Co-founder of Nitrox (opens in a new tab)

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

Senior software engineer with 6+ years of experience building SaaS platforms and web applications. I've worked on complex analytics systems, improved established products, and built new ones from the ground up. My experience spans frontend and backend engineering, with a focus on solving real product challenges and delivering software that works well in production.

Case studies

Full-stack products I built, and production work on a B2B analytics platform. Each case opens into its engineering details.

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

01 · Independent product Pre-launch

Sited: a geospatial site-analysis platform for architects

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.

ScopeProduct, frontend, database, API, deployment

  • 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
  • Security enforced in Postgres: Row Level Security on every table, roles in the JWT, plan limits in triggers
  • Geo API in Fastify and DuckDB that queries Overture Maps data on S3, now in staging
  • Angular
  • TypeScript
  • NgRx
  • MapLibre
  • Konva
  • Supabase
  • PostgreSQL
  • Fastify
  • DuckDB
Engineering details: Sited

Architecture

Angular client on Cloudflare Workers Canvas editor, MapLibre maps, and export generated in the browser
Supabase Auth, PostgreSQL with Row Level Security, Storage
Open data, from the browser OpenStreetMap through Overpass, NASA POWER wind, place search
Geo API Staging Node.js and Fastify on Railway
DuckDB Overture Maps GeoParquet on S3

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 CI/CD to Cloudflare and Railway through GitLab.

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 & data

  • Supabase PostgreSQL with Row Level Security on every table and access checks in security-definer functions
  • Roles carried in the JWT by a custom access token hook; plan limits enforced by database triggers
  • 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 GeoParquet, Supabase JWTs verified against JWKS, per-user rate limits, OpenAPI generated from route schemas, and an automated test suite in CI

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
  • One DuckDB connection per query, three at most and cancellable, after a shared connection timed out under concurrent cold 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

  • Overture buildings from the Geo API, in staging
  • Roads, places, vegetation, transit and land-use routes, not yet used by the app
  • Payment provider, feedback email and legal pages before launch

02 · Smart Apartment Data

Smart Apartment Data: From map selection to market report

Users of a B2B multifamily analytics platform search and compare markets by geography. I built the frontend tools that let them define exactly the area and markets they need, on a map engine I migrated from Mapbox to MapLibre, and the report views that compare them.

ScopeAngular frontend and API integration

  • Freehand area drawing, which MapLibre has no native support for
  • Multi-market search, proposed, built and shipped
  • Reports that compare submarket, metro and national series on one chart
  • Angular
  • TypeScript
  • NgRx
  • RxJS
  • MapLibre
  • Mapbox
  • REST APIs
Engineering details: map selection and market reports

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 & 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

03 · Smart Apartment Data

Smart Apartment Data: Performance, build speed and Angular upgrades on a large production platform

A large Angular application on a weekly release cycle. I cut its CI/CD build time by about two-thirds, fixed a slowdown that built up over long sessions, and led its upgrades from Angular 8 to 22.

ScopeFrontend architecture, performance, build and CI/CD

  • Traced a progressive slowdown to leaked subscriptions and processes that were not terminated properly
  • Cut build time by removing heavy dependencies and improving component imports, routing and build configuration
  • Led the Angular upgrades from version 8 to 22
  • Angular
  • TypeScript
  • RxJS
  • NgRx
  • CI/CD
Engineering details: platform performance and upgrades

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 22
WorkHacka service search on desktop and mobile

04 · Service marketplace

WorkHacka: a two-sided service marketplace

Marketplace connecting customers with local service providers. I built it independently, from architecture through implementation: the Angular frontend, Firebase authentication and role-based access, and the backend logic in Cloud Functions.

ScopeArchitecture, frontend, backend, authentication

  • Customer and provider roles carried in Firebase custom claims
  • Backend business logic and workflows in Cloud Functions
  • Service discovery, booking and in-app messaging
  • Angular
  • TypeScript
  • Firebase Auth
  • Cloud Functions
  • Firebase
Engineering details: WorkHacka

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 & 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.

Wizygbe Tours home page on desktop and mobile

05 · Travel bookings and payments

Wizygbe Tours: Paystack payments confirmed on the server

A travel agency’s platform where customers booked and paid for travel consultation packages. I built the booking and payment workflow across the stack: an Angular frontend, a Node.js and Express backend with Firebase, Paystack payments verified on the server, and the dashboards the agency used to manage orders.

ScopeFrontend, backend, payments, administration

  • Booking and checkout for travel consultation packages
  • Paystack payments verified on the server, with webhooks handled by the Express backend
  • Order management and administration dashboards
  • Angular
  • TypeScript
  • Node.js
  • Express
  • Firebase
  • Paystack
Engineering details: Wizygbe Tours

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 & 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.

Other work

Client work on Upwork

13 clients between 2020 and 2023, including returning clients.

View Upwork profile (opens in a new tab)
  • 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.”
  • Real-estate analytics application. Improvements that contributed to a reported 50% increase in user engagement.
  • School administration portal. Recurring feature work for a returning client, including optimization and student-management data visualization.
  • Trading platform integrations. Helped integrate platform bots and the Alpaca trading API into a client application, adding automated workflows and trading-related functionality.
  • Slack integration. Node.js integration between a client’s forms and Slack, built on the Slack API.

Experience

Senior Software Engineer

Smart Apartment Data · 2023–2026

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 22

    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 PAT-based auto-sign-in, token refresh, magic-link navigation and authenticated API requests
  • 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.

Full-Stack Developer

Freelance · 2020–2023

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.

Front-End Developer

Solar Bankers · 2020

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.

B.Eng. Software Engineering

Eastern Mediterranean University

Recognition

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

Skills

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

Core languages
  • TypeScript
  • JavaScript
  • SQL
  • HTML
  • CSS/SCSS
Frontend
  • Angular
  • RxJS
  • NgRx
  • Signals
  • React
  • Vue
  • Angular Material
  • Component architecture
  • State management
Backend & APIs
  • Node.js
  • Express
  • Fastify
  • Java
  • REST
  • OpenAPI
  • GraphQL
  • Authentication (JWT, OAuth)
  • Webhooks
  • Cloud Functions
Databases & data
  • PostgreSQL
  • Supabase
  • Row Level Security
  • DuckDB
  • Firebase
  • Data modeling
Cloud & 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

Get in touch

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