Sydney, Australia

Haokai Tan Software, Data & Automation

I turn messy data and manual workflows into software people can use. My work connects applied AI, data science and the details that make a system dependable.

From idea to everyday use.

I've worked on research, and I like building software. I start with a practical question: who will use this, and what problem will it solve?

At KOAS, my role evolved from sales management into automation and AI systems. At ISA Surveyors, I work on a casual basis, connecting project data and everyday workflows.

Master of Data Science and Decisions · UNSW

Tech Stack

React
JavaScript
TypeScript
Tailwind CSS
HTML5
CSS3
Node.js
Python
SQL
MongoDB
R/RStudio
SQLite
Git
Figma

What I work on

My work spans software development, data integration, reporting and applied research.

  • Graph attention and language-model fusion for mobility forecasting
  • Voice interfaces, text-to-speech and AI-assisted workflows
  • PyTorch, LoRA and distributed-training experiments
  • Research prototypes and practical AI integrations
Discuss Research & AI
  • Python and SQL data integration workflows
  • REST APIs and typed contracts with FastAPI
  • Scheduled synchronisation, freshness checks, and audit trails
  • SQLite-backed applications and MongoDB integrations
Discuss Software & Workflows
  • Revenue and engagement analysis grounded in operational data
  • Data validation, reconciliation and discrepancy review
  • Dashboards and role-specific operational reporting
  • AI-assisted reporting with source references and human review
Discuss Data Projects

Selected work

A voice room, a telephone booth, a surveying team and questions about human movement. These projects take different paths, each showing a part of how I build, collaborate and investigate.

Voice communities Personal project

Discord TTS Bot

I built and maintained a Discord bot that takes part in the everyday life of a voice room: it greets people by name, adds playful spoken acknowledgements to arrivals, departures and room changes, and keeps reports of time spent online and together.

The two records answer different questions. Rankings show how long each person stayed; shared-time reports show how long pairs of members shared a channel. I calculate that overlap from the later arrival to the first departure, then turn the records into heatmaps and co-presence graphs. A separate queue handles the spoken events, while MongoDB stores the statistics with rotating recovery snapshots.

Greetings, departures & room changes Personal time + shared time MongoDB + recovery snapshots
Python Discord.py MongoDB Docker TTS
Reports from the bot Real output · Synthetic data
A horizontal bar chart ranking voice-session duration for 30 synthetic members; generated by the Discord bot's plotting code.
Voice-session duration ranked across synthetic members. These are sample records, not community size or usage claims.
See the co-presence graph
A co-presence graph of synthetic members, with a connected group and isolated members. Line thickness represents shared voice-channel time.
Shared voice time connects these synthetic members. Line thickness carries the measure; distances between dots are a layout choice, not a measure of friendship.
Visual art installation Collaborative voice prototype

One in Four

One in Four is a collaborative voice prototype for a telephone-booth visual art installation. Participants talk through lateral-thinking puzzles with an AI, while the sound experiment explores using the visitor's recordings as material for its replies. I worked on that spoken exchange.

The earlier prototype kept most everyday answers on the terminal, speaking mainly when a puzzle was solved. I added spoken feedback to the ordinary back-and-forth, worked on duplicate playback and waited for each reply to finish before the next turn. I also connected browser SpeechRecognition and a spoken yes or no to the next-puzzle choice, so asking, listening and continuing could stay within the same conversation.

Spoken replies throughout SpeechRecognition input Listen, then continue
Express.js jQuery Terminal OpenAI ElevenLabs Web Speech API
Workflow integration Workplace automation

WFX Dropbox

A surveying job starts in WorkflowMax, but the team also needs a Dropbox workspace in the right place. At ISA, I built the connection around the team's existing job numbers, naming conventions and folder templates.

Each new job is routed by its number, given a consistent folder name and checked against what already exists before the service attempts to copy a template. A suffixed job may belong to an existing base-project folder; temporary and test records can be excluded altogether. I put those exceptions alongside the routine path so a new record does not automatically become another workspace.

Scheduled job checks Project templates Existing-folder checks
Node.js Express.js Dropbox API OAuth 2.0 Automation
Research publication Second author

Classical Feature Embeddings Help in BERT-Based Human Mobility Prediction

A stop on someone's route carries more context than a coordinate: the kinds of places there, the day, and the time. STaBERT brings point-of-interest and derived time features into a BERT-based model to study how that context helps predict movement.

I contributed to the shared research ideation as second author. The paper reports higher GEO-BLEU scores in normal single-city and multi-city tasks, while its emergency-scenario results also reveal limits to the added context. The analysis suggests that out-of-date place data may fail to reflect closures or changes in routine. That makes the relevance of the background data part of the research question, alongside the model itself.

ContributionResearch ideation
VenueSIGSPATIAL 2025
FocusSpatial + temporal features
STaBERT BERT Human Mobility POI Temporal Features
Project index Public repos + case studies

Additional Work

Research implementations, practical work tools and a booking prototype. Open a story for the work and choices behind it.

Research, Tools & Prototypes

GL_Fusion
Independent research implementation

I independently developed a mobility-prediction research implementation that gives the same journey two forms: relationships between places in a graph, and text describing place and time. The work explores how those representations can be used together.

How the two representations connect

Starting with trajectories and point-of-interest data, I built preprocessing that maps coordinates to graph nodes and turns place and time context into trajectory descriptions. Those inputs meet in a graph-and-language fusion model that predicts coordinates. The work also includes model adaptation, checkpoint loading and evaluation back in the original coordinate scale. On HPC resources accessed through UNSW, memory, runtime and model quality were practical constraints to investigate. This is an implementation and training exploration, separate from my shared ideation contribution to STaBERT.

PyTorch · Graph attention · LoRA · Distributed training
Timesheet Reconciliation

I built an ISA tool that places GPS trip exports beside WorkflowMax timesheets in a daily comparison. It produces discrepancy summaries and Excel follow-up sheets, keeping vehicle-based estimates visible as estimates rather than treating them as recorded work hours.

Read a day's comparison

A vehicle leaving home, arriving at a site and an employee recording work hours mark different events. I brought the two sources into a shared daily view, with likely commuting and work travel shown separately. A reviewer can compare entered hours with a span estimated from vehicle records, then open the discrepancies in Excel. Those rules organise the available evidence; the estimates still depend on incomplete inputs and do not establish time on site or payable hours.

JavaScript · Workflow · Automation
VCN
Early prototype

VCN is an early Discord service-booking prototype. I explored requests becoming order cards with simulated acceptance and cancellation, alongside a backend state model; order and payment calls are not yet connected into a real transaction flow.

Inside the simulated booking flow

The interaction starts with a member posting a service request and another member accepting it from a card in the channel. I prototyped that exchange and modelled order states including pending, active, completed and cancelled. The current bot changes the message in a simulated flow, while the API contains mock order and payment responses. In the design, Discord presents the interaction while the backend owns the order record. Bot-to-API integration, order permission checks and real payments remain unfinished.

Python · Discord · API prototype

KOAS System Case Studies

Four examples from the same KOAS role: connected systems for scheduling, training, reporting and analysis.

Roster & Leave Review

Updating a week's roster means carrying existing assignments and leave into the next plan. I worked on a KOAS workflow that previews additions, removals and unresolved names, then checks approved leave and replacement coverage before applying changes.

Follow a roster change

A pasted roster describes a proposed week, but some cells are blank and some names still need resolving. I worked on making those differences visible beside the existing plan: what to add, what to keep, what to remove and what needs attention. Updates stay within the selected week and shift, while approved leave and replacement coverage constrain what can be committed. A blank cell does not silently cancel an existing assignment, and incomplete coverage prevents a partial leave-and-replacement update.

Next.js · FastAPI · SQLite · Sheets Sync · Docker
Training Simulation Workspace

In KOAS's trainer-led simulations, a trainer plays a new or high-value customer while the trainee handles the exchange. I worked on connecting the conversation and checkpoints to End & Review, with optional AI draft scoring before the trainer's final assessment.

Inside a training review

One simulation begins with a new customer's welcome; the other tests follow-up with a high-value customer. In the trainer-led mode, the trainer plays the customer and the trainee handles the exchange. I worked on connecting those live rooms and their checkpoints to session history and End & Review. An optional AI draft can support scoring afterwards, while the trainer saves the final assessment. AI Customer is a separate practice mode, not part of every trainer-led session.

React · API · SQLite · AI Review · Docker
Message Intelligence Bot

KOAS's message-reporting service connects channel records with daily and longer-term reviews. I worked on that reporting chain: weekly reports use seven days of successful daily summaries plus longer-term context, while other tools can access structured statistics.

From daily notes to weekly reviews

Reading a week of work requires a different view from catching up on today's messages. I worked on a service that keeps those reporting horizons connected: daily reports use the previous day's messages with recent context, while weekly reports draw on seven days of successful daily summaries and a broader history. Failed summaries are not saved as inputs to the next layer. Alongside these text reports, the service exposes structured statistics so other tools can use the operational record.

Python · LLM · Scheduler · Summaries · Docker
Operations & Analytics Platform

At KOAS, my work moved from sales management into internal automation and AI systems. I connected data, reports and workflows in shared views, then refined them with staff and the Head of Sales. Management analysis is one part of that wider platform.

Comparing reply windows

One analytical workflow brings customer activity and response metrics together with relevant conversation evidence and company SOPs. I worked on making its comparisons meaningful: welcome-message trends use the same 24-hour reply window for recent and older groups, rather than giving one group weeks longer to respond. I kept calculated metrics separate from AI interpretation, with hypotheses presented alongside verification steps. Managers can inspect the reported facts, the proposed explanation and the suggested next check as distinct parts of the review.

Python · SQL · FastAPI · Next.js · TypeScript · Docker

Built through experience.

Working close to the people using a system has shaped how I build: understand the workflow, make the evidence clear, and refine it through feedback.

Download full CV

Oct 2025 – Sep 2026

Remote from Sydney

KOAS

Full-Stack Software Engineer · Automation & AI

Joined in sales management; the role evolved into building internal automation and AI systems, full-time from early 2026.

  • Connected operational data, reporting and external services into shared dashboards and department-specific workflows.
  • Built sales and engagement analysis with AI-assisted coaching grounded in company SOPs, keeping calculated metrics separate from interpretation.
  • Added duplicate, identity and missing-data checks, then refined tools with staff and the Head of Sales through day-to-day feedback.

Python · SQL · FastAPI · Next.js · TypeScript · Docker

Ongoing · Casual

Sydney, NSW

ISA Surveyors

IT & Automation Support · Previously Detail Drafter

  • Built WorkflowMax-to-Dropbox job-folder automation and timesheet/GPS discrepancy reports for human review.
  • Worked across scan-data and point-cloud processing, 3D modelling and finished drawings.
  • Trained new drafters, wrote reusable SOPs, and supported the team's everyday hardware and software needs.

Workflow automation · Leica Cyclone · REGISTER 360 · AutoCAD · Training

Education

2024 – 2026

Master of Data Science and Decisions

UNSW · Completed early 2026

2019 – 2024

Bachelor of Science

University of Sydney · Major in Data Science, Minor in Mathematics

Let's Connect

Have a role, a research question or a useful problem to solve? I'd like to hear about it.

Get in Touch

Whether you have a specific project, a question about my work, or just want to connect, I'd love to hear from you.

Location

Sydney, Australia

Email

[email protected]

Connect on Social

Start a conversation

This prepares a draft in your email app. Review it there before sending, or email me directly.