Growing the business, refining the service offering, and building the AI chatbot service. Currently completing first client projects.
AstroClaude APINetlify FunctionsRAG
Kaggle competitions
Planning first competition entries to build practical ML portfolio. Starting with tabular data and NLP competitions.
PyTorchKaggleMLNLP
Background
Builder at heart
Maths and Linguistics graduate who pivoted into software. Brings practical background experience from manufacturing, freight, and logistics operations.
2+
Years building production tools at SnapCore
A+
AI, Mobile Dev, Programming Languages & Concurrency
NZ
Rolleston, Canterbury. Open to remote & on-site.
Technical skills
What I work with
Languages
JavaKotlinPythonC/C++TypeScriptBashSQL
Mobile & Android
Android DevelopmentJetpack ComposeGradleMaven
Web & Backend
AstroReact.jsSpring BootFastAPIREST APIsBack-End Web Development
RAGPyTorchNLPDeep LearningTransfer LearningSoftware Development
Work
Projects I've built
🔧
AquaWatch Tool
Internal automation platform for SnapCore manufacturing. Automated CRM entry creation via GraphQL, report generation for returned devices, real-time sensor dashboards, Bluetooth pairing automation. Native installer via JPackage, auto-updates via GitHub Actions.
Cross-platform desktop app for Yosemitech Y510 turbidity sensors. Real-time Modbus RTU over serial. Qt GUI. Runs on Linux and Windows. Built for lab and field deployment.
C++Qt FrameworklibmodbusCMakeModbus RTU
📱
Kotlin Compose Modbus Sensor App
Android app for Modbus sensor interfacing via Bluetooth or USB serial. Jetpack Compose UI. Real-world deployment of Android + industrial protocols.
Founded and built SouthStack web development studio. Company website with embedded RAG AI chatbot using Claude API + Netlify Functions. Serving Canterbury businesses and churches.
Coursework: AI (A+), Mobile App Dev (A+), Algorithms & Data Structures (A-), OS & Networks (A-), Software Engineering Design (A), Programming Languages/Concurrency (A+). Projects include ML models, Android apps, OS concepts, data analysis.
Current skills I'm actively developing and what's planned next.
FastAI — Practical Deep LearningActive
Working through fast.ai course. PyTorch foundations already in place from AI paper (A+).
AWS Developer AssociateActive
Building on Cloud Practitioner cert. Lambda, DynamoDB, API Gateway, CodePipeline.
Spring BootActive
Building on strong Java foundations. Working through a dedicated Spring Boot course.
NLP / Transfer LearningPlanned
Foundations from AI paper. Planning to go deeper through Kaggle NLP competitions.
Writing
Notes & learnings
Short posts on things I've built, figured out, or found interesting. Powered by Sanity CMS — no redeploy needed to add new posts.
Loading posts...
RAG / AI
How I built a RAG chatbot for a static website
No vector database needed — the entire knowledge base fits in a system prompt. What I learned building the SouthStack and portfolio chatbots.
When people talk about RAG they usually picture a vector database, embeddings, and a complex pipeline. For small-to-medium knowledge bases, none of that is needed.
For both SouthStack and my portfolio the "RAG" is just: write a well-structured text file with everything the bot should know, paste it into the system prompt, and let Claude figure out what's relevant. Works fine up to ~50-100KB of text.
The trickier part was API key security. GitHub Pages can't store secrets, so I built a Cloudflare Worker proxy — 30 lines of JS that sits between the browser and Anthropic's API, reads the key from an environment variable, and forwards the request. Free tier covers 100k requests/day.
When you'd actually need a vector DB: hundreds of PDFs, a full documentation site, or a product catalogue with thousands of items. At that point Supabase pgvector or GCP Vertex AI Search become worth the complexity.
Read more ↓
Embedded Systems
Modbus RTU over serial — lessons from building a sensor interface
Building a C++/Qt app to talk to industrial turbidity sensors taught me more about serial communication than any tutorial.
Modbus RTU is a serial protocol used in industrial sensors and PLCs. Simple in concept — master sends a request, slave responds — but getting it working reliably has a few gotchas.
The biggest issue was baud rate mismatch. Yosemitech Y510 sensors default to 9600 baud but the docs weren't clear. Getting libmodbus to connect required matching the baud rate exactly in modbus_new_rtu().
Cross-platform serial port handling in Qt was fiddlier than expected — Windows uses COM3 style names while Linux uses /dev/ttyUSB0. QSerialPort handles this but you need to enumerate available ports at runtime.
Read more ↓
Android
Jetpack Compose for Modbus — modern Android meets industrial protocols
Why use a declarative UI framework for an app that reads sensor data? Because the code is dramatically cleaner.
The traditional View-based approach for a live-updating sensor display means ViewModels, LiveData, RecyclerViews, and a lot of boilerplate. With Compose the entire sensor reading UI is maybe 60 lines.
A State object holds the current readings, a coroutine polls the sensor every 2 seconds, and the UI recomposes automatically. No notifyDataSetChanged(), no adapter pattern.
The Bluetooth/USB serial piece was harder — Android's USB Host API is verbose and the permissions model needs careful handling. The Modbus protocol itself runs fine over a USB-to-serial adapter using usb-serial-for-android.
Read more ↓
Get in touch
Let's talk
Open to software development, data engineering, and electronics roles in NZ. Remote or on-site. Nelson, Marlborough, Canterbury preferred.