Yuelin Liu

Morning. Software engineer in Melbourne.

I build full-stack tools with clear workflows and dependable data boundaries.

My work spans self-hosted applications, deterministic finance tools and AI integrations. I design the workflow, build the UI and backend, and test what happens when requests or assumptions fail.

A jacaranda in full flower on a city lawn, people sitting in the sun, office towers behind
Jacaranda season, Flagstaff Gardens.Same window, later.
Now
Independent DeveloperProspective-client demos for a Melbourne consultancy, Sep 2025 to present.
Before
Full-Stack DeveloperByteCroniX, an early-stage AI SaaS, Mar to Jun 2025.
Works in
TypeScript, end to endReact and Next.js, Node.js and Express, with tests around the boundaries.
Open to
Early-career rolesSoftware engineering, full-stack, backend and AI implementation, in Australia.

Midday. The work.

Work

I start with the workflow, not the feature.

Marshal Self-hosted application workspace for laptop and phone. Personal project, 2026, pre-alpha. MIT-licensed, source private while pre-alpha.

The useful change was removing steps.

Applying with a chat assistant meant the same loop for every job: paste in a job ad that arrives garbled, paste my prompts, paste my résumé and background, then ask for a fit analysis, a résumé and a cover letter. Marshal keeps the job, my confirmed background and both documents in one workspace, so most of that repetition is gone. It is still being refined.

Its first workflow repeated the mistake in a new form: an assessment, a pursuit decision, a letter plan, an audit or waiver, and acceptance before export. I removed the mandatory chain. A cover letter and a résumé can each be generated directly from the saved job description and permitted background.

Each person runs their own instance: on one machine, with Docker, or on a server reached over a private Tailscale network from a laptop and a phone. Data is plain files and the model key stays on the server. Model calls still send the selected input to the provider you choose.

TypeScript, React / Vite, Node.js, Docker. Designed and built end to end.

One job, with the edits shown

Struck lines were removed. Marked lines were added. Open a line to read why.

  1. The confirmed background stays in the workspace. Before a prompt is assembled, the server removes unconfirmed, expired and out-of-scope claims.

Six steps by hand, for every job, struck.

An illustration of the change, not the product interface.
  • Prospective-client demosDemonstration applications for a specialty coffee retailer and a drone training provider, built from informal briefs with Next.js 15 App Router, Clerk OAuth and Convex.Sep 2025 to present

I measure before I optimise.

ByteCroniX Full-Stack Developer at an early-stage AI SaaS, Mar to Jun 2025.

From 26.7 seconds to 5.6.

I worked across the BFF routes and REST integrations behind the web, Android and iOS clients, implemented OpenAI function-calling flows in Node.js/Express, and worked across API testing and delivery workflows using Postman, Jest/Supertest, NGINX and multi-service CI/CD.

One inherited path shows how I work. I added timing instrumentation to a points-summary request and identified the current and proposed scoring services as the dominant latency contributors, then parallelised the independent service calls. The observed local integration-test response went from 26.7s to 5.6s.

Node.js, Express, BFF and REST integrations, OpenAI Function Calling, Postman, Jest/Supertest, NGINX, Docker.

One request, opened up

Totals are to scale. The spans inside them are a sketch.

  1. One request I had not written, the points summary, answered slowly in local integration tests. I measured it before touching it.

  2. Timing logs separated orchestration, mapping and downstream service time.

  3. The logs showed that the current and proposed scoring services dominated the wait.

  4. I changed the smallest layer that explained the problem: independent calls were started together with Promise.all, at the orchestration layer and inside the two scoring services. A change is not a result until it is measured.

  5. The same request in the same local Postman and Docker setup. An observed result, not a production benchmark.

Step 1 of 5: An inherited path. Points-summary request: 26.7s.

Totals are the observed local integration-test responses; the spans inside them are a sketch. Nothing else is measured here.
  • Melbourne University Ultimate Club PlatformTraced silent session-role failures to fragmented authentication usage, and centralised session reads behind one database-verified guard.Case study, not currently maintained

I turn assumptions into enforceable boundaries.

MoneyGuard Wage planning for hourly workers: an OCR and audit pipeline, then a local-first web workspace. Personal project, 2026. Web source private, pipeline public.

Keep the financial answer in code.

MoneyGuard reads a photographed timecard with a vision model, validates what comes back, computes pay, weekly burn and surplus in local code, and streams an AI-written audit into a report the code lays out. A web workspace builds on that pipeline to answer what is left from this week's work, how much work a purchase costs, and whether cash lasts if payday moves.

Model output is treated as untrusted input. Reviewed inputs feed pure calculation functions, and the optional AI path can explain selected figures; it does not calculate the financial result.

TypeScript, Next.js / React, IndexedDB, Zod, Gemini and DeepSeek providers, Vitest / Playwright. Designed and built.

Who wrote each line of the report?

Choose a line to trace it back. Solid is code, dashed is a model, outlined is you.

Wage Audit (2026-W26)

Surplus: $397.62 AUD | STABLE

  1. CodeCalculationGross pay minus weekly burn, then classified by the same pure function. No model takes part.
  2. CodeSchema checkGross pay comes from hours that passed the check; burn comes from the local ledger.
  3. The model boundary
  4. ModelVision OCRThe hours began as a vision model's reading of the photo.
  5. YouPhoto arrivesSent from a phone, through a Telegram bot or the CLI.
Sample figures are the pipeline's own mock run on a sample ledger. An illustration, not the product interface.
  • Job Search DispatchRestricted drafting to confirmed, permitted evidence, with validation, bounded repair and failure diagnostics before a generated letter replaces saved work.Case study
  • DSH Conversation ExporterExports full conversations as clean Markdown, and excludes reasoning, tool activity and runtime metadata from the export.Case study, source
  • Client Data Delivery ValidatorPython/pandas validation workflow for synthetic client-delivery CSV data, with structured validation results and 12 pytest regression cases.Source
Product UI
React 19, Next.js 15/16, TypeScript, Tailwind CSS
APIs and data
Node.js, Express, REST APIs, MongoDB, Convex
Auth and delivery
Clerk OAuth, NextAuth, GitHub Actions, Docker, Vitest
AI and validation
OpenAI Function Calling, Gemini, DeepSeek, Zod

Golden hour. Laptop closed.

Further out

Most of what I build starts at a desk by a window. The rest of the day happens a little further from it each time.

  1. Yuelin mid-throw on a grass field at golden hour, releasing a white disc
    On the fieldAbout ten years of ultimate frisbee, and the friends that came with it.
  2. An ultimate team in a huddle on a tournament field, seen from behind
    AwayTournaments that turned into travel.
  3. A green Melbourne tram passing a park lawn where people sit in the shade
    In townA camera in the gardens, a pool table, and Hawthorn at the footy.
  4. A tabby cat sitting upright on a windowsill, city towers behind the glass
    On the sillThree cats and three houseplants, all thriving.
  5. A bottle of Katnook Estate Odyssey Cabernet Sauvignon 2013, cut out from its Wine Log entry
    At the tableA bottle is how an evening gets kept. The evenings go into a small Wine Log I built.

Late. Still light out.Late. The lamp is on.

Contact

Based in Melbourne and open to junior and early-career software engineering, full-stack, backend and AI implementation roles in Australia. Email me for role details or to discuss the engineering behind these projects.

liuyuelintop@gmail.com
Phone
+61 451 690 105
Location
Melbourne, VIC, Australia
Elsewhere
LinkedInGitHubWriting

Prepare a role note

This opens a pre-filled email draft to liuyuelintop@gmail.com. Nothing is sent from this page.

Message focus