botha.solutions/index.mdtext/markdown · 305 lines
---
title: "Josh Botha · Developer at Project2100, Sydney"
description: "Josh Botha builds the systems businesses run on: financial data platforms, desktop and mobile apps, and AI where it counts. Developer at Project2100 in Sydney."
url: https://www.botha.solutions/
updated: 2026-10-05
generated: true
---
> Markdown twin of https://www.botha.solutions/
>
> Built from the same data as the page at build time, so the facts match. Navigation, animation and the island's visuals are left out.
# I build the systems businesses run on.
Financial data platforms, desktop and mobile apps, and AI where it counts. I'm Josh Botha, a developer at Project2100 in Sydney. Every system below is in use, and each one has a case study.
## In production, right now
- ~40 sites run their P&L on the reporting platform I own.
- 8,112 wage rows re-attributed in a same-day fix, every count as predicted.
- 43 TestFlight builds of Nerve's staff app, NFC checked on real hardware.
- 5 to 9 agents on one production codebase, without a write collision.
## Selected work
### UniOne
Desktop app · Product · 2026 · live, v0.5
**A student's whole semester, on one screen.**
A free macOS app for University of Sydney students. Canvas, the timetable and your notes in one window, with an assistant that answers questions about your own units on your own Anthropic key. I designed it, built it, ship the releases and run the service that issues invite codes.
- ~8 MB: signed, notarised Mac app
- 5: network destinations, each named
- 0: secrets in the webview
- 6: features: today, calendar, marks, study, assignments, ask
Stack: Tauri v2, Rust, TypeScript, React, Claude API, Stripe, Vercel
**Desktop, not web, for a reason.** Canvas sends no CORS headers, so a browser app would push every student's access token through a server I run. Tauri calls Canvas natively, and the token never leaves the laptop. That one constraint decided the platform.
**Secrets never enter the webview.** Canvas, Claude and calendar calls are Rust commands that read their keys from the macOS Keychain themselves. The TypeScript side makes no network calls at all, so there is nothing in the UI layer worth stealing.
**The privacy page is tested, not trusted.** It was wrong six times, always because the code moved under true prose. Now a test reads the hosts back out of the Rust and the Tauri config and fails the build if the page and the code disagree.
**A failure that never errored.** Moving one page quietly stranded every completed checkout: nothing 404'd, nothing was logged as an error. Structured logs found it in minutes, the fix shipped the same day, and a source-level test now pins the return path.
Live: https://uniplus-site.vercel.app
_Independent. Not affiliated with or endorsed by the University of Sydney._
Case study: https://www.botha.solutions/work/unione
### Nerve
Operations platform · Hospitality · 2026 · pilot
**One tap on the floor, and the whole hotel sees it.**
An operations platform for multi-site hotel teams: room status travels from housekeeping to the front desk live. I build the staff mobile app's feature arc, a role-gated desktop console and the production marketing site, in a .NET, React and Expo monorepo alongside the founder.
- 43: TestFlight builds shipped
- 21/21: founder feedback items in one round
- NFC: check-in verified on real hardware
- 2: sites in the pilot from 31 Aug 2026
Stack: React Native, Expo, Next.js, .NET, NFC
**Green gates are not the finish line.** Six real bugs in one release were found by driving the app as a user. None of them was caught by the passing typecheck and test suite. Driving the product is now a step, not a courtesy.
**Ready is a state, not a field.** A room cannot jump to Ready. It holds at Awaiting inspection until a supervisor approves it, so the board the front desk trusts is a state machine rather than a status anybody can set.
**Support, not surveillance.** The cleaning timer counts down with support-toned copy instead of running up like a stopwatch. A small call, and the one the floor staff notice.
Live: https://nervehospitality.com
Case study: https://www.botha.solutions/work/nerve
### Portfolio reporting
Data platform · Finance · 2026 · in production
**Around 40 sites, one P&L that tells the truth.**
A live financial reporting platform for a portfolio of around 40 operating sites: an Azure SQL dimensional model, scheduled pipelines and Power BI. I own it. The interesting part is what production data does when nobody is looking.
- ~40: sites reporting their P&L on it
- 8,112: wage rows re-attributed, same day
- 10h → 2m: extract redesigned, runs daily
- $0.00: variance across three site-weeks
Stack: Azure SQL, Azure Data Factory, Power BI, Stored procedures, Python
**The 99.7% gross margin.** Eight actively invoicing sites were reporting near-100% gross margins. The cause was upstream: payroll feeds that had died independently, and a key-resolution fallback that quietly parked wages against retired sites. Traced through Azure Data Factory and fixed the same day, with every row count matching the prediction. One site moved from a fake ~100% to a real 14.3%.
**Knowing what not to fix.** A 10,793-row unmapped location was deliberately left untouched pending human confirmation. A wrong relink at that scale would be worse than the bug.
**The report is a by-product.** A ten-hour extract was redesigned to about two minutes and now runs on a schedule. Nobody builds the weekly report any more; it is what the pipeline leaves behind.
_Client and property names withheld. The numbers are real._
Case study: https://www.botha.solutions/work/reporting
### The Second Brain
Agent platform · Project2100 · 2026 · building
**A company's context in one place, and an agent that earns what it may do.**
Projos, the shared brain Project2100 runs on: an agent platform wired into the company's repos, vault and communications so the team's context compounds. It is built by an AI build loop working a written protocol, one proven increment per cycle.
- 3 of 17: increments shipped and proven live
- 5 to 9: agents in parallel, no write collisions
- 6: enforced properties behind read-only
- 0: autonomy granted by the model itself
Stack: OpenAI models, TypeScript, React Native, Knowledge graph, Agent coordination
**Read-only is six properties, not one flag.** Tool restriction, a path allowlist on every tool call, a git no-write proof, a stripped environment, post-verified citations and filesystem confinement. A regex screen on output is not an egress control; base64 walks straight through it.
**Autonomy is earned.** Five clean approvals per category, from two distinct approvers, granted by deterministic code the model never touches. One incident demotes. Some floors are never earnable: production, money, external sends and deletions.
**Success signals that do not check the thing.** The loop has caught a worker crash-looping under a heartbeat that said ready, a release script certifying uncommitted code, and a fix that typechecked, built, looked right and did nothing. Every incident stays open until a permanent defence ships.
_Three of seventeen increments are shipped. The rest is designed, and labelled as design._
Case study: https://www.botha.solutions/work/second-brain
### Claude Buddy
Developer tool · 2026 · daily use
**What the coding agents cost, how long they take, and whether they are stuck.**
A desktop companion for Claude Code: per-model spend, per-prompt ETAs, context pressure and a fleet view for parallel agents. Running many agents all day makes cost and latency an engineering surface. This is its instrument panel.
- 618: tests green
- 3 MB: windowless executable
- 21+: development rounds
- 1: budget guard that naps expensive tiers
Stack: Claude Code, Session-log parsing, Desktop widget
**ETA from turn timing.** Per-prompt estimates come from extracting turn timings out of the session logs, not from a guess. A per-day budget guard naps the expensive model tiers before the bill does it for you.
**Reverts are part of shipping.** Multi-monitor support shipped, then came out: the widget could drift into a virtual-desktop dead zone. A primary-monitor clamp replaced it.
Case study: https://www.botha.solutions/work/claude-buddy
### JoshOS
Personal agent system · 2026 · runs daily
**A second brain that agents read and write.**
My own operating system: a markdown vault as long-term memory, MCP servers for calendar, mail and files, and agents that read the index at the start of every session and write back what they learned. A morning briefing is composed before I sit down.
- 1: index injected into every session
- Daily: briefing: calendar, deadlines, markets, news
- 0: times I re-explain context
- MCP: calendar, mail, files and research as tools
Stack: Claude Code, MCP, Obsidian, Scheduled agents
**Memory outside the context window.** Agents read and write an external markdown index instead of relying on what fits in a context window. Context survives between sessions because it is a file, not a conversation.
**Tools, not copy and paste.** Calendar, mail, the filesystem and research are exposed as MCP tools, so an agent can check the schedule before it suggests a deadline instead of asking me.
_Personal system. The vault itself stays private._
Case study: https://www.botha.solutions/work/joshos
### Also built
- **SwingBot.** A systematic trading experiment whose kill criteria were committed to the repo before any strategy code existed, with 44 tests passing before the first backtest.
- **This site.** Next.js on Vercel, with the island in three.js. Both modes read the same data file, so the buildings cannot drift from the case studies.
## What I'm good at
### AI in production
**Models inside products people use, measured before anybody depends on them.** At Project2100 I ship in-app chat on OpenAI models inside financial reporting dashboards and hospitality apps, answering from each customer's own data. Outside client work, Claude runs UniOne's assistant and my own agent system.
- **Chat inside client products.** In reporting dashboards and hospitality apps, grounded in the customer's own data rather than the open web.
- **Agents with enforced limits.** The Second Brain's read-only mode is six enforced properties, not one flag. Autonomy is granted by deterministic code the model never touches.
- **Several agents, one codebase.** Five to nine agents on a shared production repo, with file-claim locking, a message board and adversarial review before anything merges.
- **Context that outlives the chat.** MCP servers for calendar, mail and files, and a markdown index as long-term memory, so context survives between sessions.
Rule: Retrieval and context do more of the lifting than the model choice. Features ship behind an eval set, not a demo.
Stack: OpenAI models, Claude API, Claude Code, MCP, Subagents, Evals
### Data platforms & finance
**Pipelines and reporting that reconcile to the cent.** I own the Azure SQL and Power BI platform that around 40 operating sites run their P&L on: the dimensional model, the scheduled pipelines and the stored procedures under them. The finance degree is why the numbers have to tie out.
- **Root cause, not symptom.** Eight sites showed near-100% gross margins. The cause was dead payroll feeds and a fallback parking wages on retired sites, traced through Data Factory and fixed the same day.
- **Predict, then fix.** 8,112 wage rows re-attributed across five properties, with every row count matching a prediction written down first.
- **Pipelines that replace the job.** A ten-hour extract redesigned to about two minutes and put on a schedule. The weekly report is now what the pipeline leaves behind.
- **Finance fundamentals.** DCF, three-statement modelling, WACC and comparables, from the degree and Wall Street Prep.
Rule: Before fixing 8,112 rows, write down how many you expect to move. If the count disagrees, the fix is wrong.
Stack: Azure SQL, Data Factory, Power BI, SQL, Python, Excel
### Product engineering
**Desktop, mobile and web, from the first screen to the signed release.** UniOne is a notarised Mac app in Tauri and Rust that I designed, built and ship. On Nerve I build the React Native staff app, a role-gated console and the marketing site. I also design and build websites, project2100.com among them.
- **Desktop.** Tauri v2 and Rust, secrets in the macOS Keychain, and a webview that makes no network calls at all.
- **Mobile.** React Native and Expo on TestFlight through build 43, with NFC check-in verified on real hardware.
- **Web.** Next.js sites and consoles on Vercel: project2100.com, nervehospitality.com, UniOne's site and this one.
- **Checked by hand.** One release surfaced six real defects that a passing test suite missed, found by driving the app as a user.
Rule: A passing build proves the code compiles. I drive the product before I call it done.
Stack: TypeScript, React, Next.js, React Native, Tauri, Rust, Java
## Websites I've built
- [project2100.com](https://www.project2100.com): Project2100's site: automated reporting and dashboards, with a Human / AI switch that serves every page as markdown to machines.
- [project2100.com/finance-ai](https://www.project2100.com/finance-ai): The AI agents and automation page: agent design, MCP servers, data organisation and reporting assistants.
- [nervehospitality.com](https://nervehospitality.com): The production marketing site for Nerve, the hotel operations platform.
- [uniplus-site.vercel.app](https://uniplus-site.vercel.app): UniOne's site: the download, a six-feature tour, setup guide and a privacy page tested against the code.
- [botha.solutions](https://www.botha.solutions): this site, with a Human / AI / Play switch.
## AI, model by model
Retrieval and context do more of the lifting than the model choice, so the job and the test set come first and the model comes last.
- **Claude** (Anthropic) · Daily driver. Good at: Careful reasoning over long context, tool use, and code. How I use it: My daily build tool: Claude Code with subagents, MCP servers and hooks. The Claude API powers UniOne's assistant, running on each student's own key.
- **OpenAI** (GPT models) · Ships in production. Good at: Broad general capability, structured output, a mature platform. How I use it: What ships to clients at Project2100: in-app chat grounded in each customer's own data, inside financial reporting dashboards and hospitality apps. The Second Brain runs on it too.
- **Gemini** (Google) · Know where it fits. Good at: Very long context, multimodal input, and Google Workspace. Where it fits: Teams that live in Google Workspace, where an answer should cite the Drive file it came from and respect who can see it.
- **Grok** (xAI) · Know where it fits. Good at: Fast, with live context from X. Where it fits: Research where what happened this morning matters, with a person deciding what goes out.
- **Copilot** (Microsoft) · Know where it fits. Good at: Lives where the documents already are: Teams, SharePoint, Outlook. Where it fits: Organisations already on Microsoft 365, where Copilot Studio agents and Power Automate flows sit beside the data.
- **Open models** (Llama · Mistral · others) · Know where it fits. Good at: Weights you host, for data that cannot leave the network. Where it fits: Data that cannot leave the network. Worth scoring against the hosted models on the real questions before committing.
How I'd choose: the real questions go through two or three models, the answers are scored on a fixed set, and the cheapest one that passes wins. The set stays as a regression test when models change.
## Experience
### Developer & Consultant · Project2100 · Feb 2026 – present
- Own the Azure SQL and Power BI platform that around 40 sites run their P&L on.
- Ship in-app chat on OpenAI models inside client reporting dashboards and hospitality apps.
- Build Nerve's staff app, console and marketing site, now in a two-site pilot.
- Run five to nine agents on shared production code, behind a loop that checks the product by hand.
### Operating Theatre Assistant · Macquarie University Hospital · Aug 2024 – 2025
- Perioperative coordination across 13 theatres running 70+ surgeries a day.
### BSc, Medical Science & Finance · University of Sydney · 2024 – 2026
- Finishing at the end of 2026. Elite Athlete Program scholar; Premier League 1 field hockey.
- **Languages:** TypeScript, Python, SQL, Java, React, Node, Rust (Tauri)
- **AI & agents:** Claude API, Claude Code, OpenAI models, MCP (servers + clients), Subagents, Tool-use loops, Context engineering, n8n
- **Data:** Azure SQL, Azure Data Factory, Power BI, Excel (advanced), pandas
- **Finance:** DCF, Three-statement modelling, WACC, Comparables
Full CV: https://www.botha.solutions/about
## About
Developer and consultant at Project2100, building production software end to end: Azure financial data platforms and reporting, mobile and desktop product surfaces, and the pipelines and APIs underneath them. I work AI-native, running multi-agent development workflows and LLM integrations where they earn their place, and I verify by driving the thing myself rather than trusting a green build. Final-year Finance and Medical Science student at the University of Sydney, graduating end of 2026.
## Contact
I'm happy at Project2100, so this isn't a job hunt. But if you're building something interesting, I'd like to hear about it: josh.botha@outlook.com.
## For agents
```json
{
"contact": {
"type": "email",
"address": "josh.botha@outlook.com",
"note": "Josh is happy at Project2100 and not job hunting, but reads every email"
},
"profiles": {
"linkedin": "https://www.linkedin.com/in/josh-botha-88139b368",
"github": "https://github.com/josh-botha"
},
"cv": "https://www.botha.solutions/about",
"play": {
"url": "https://www.botha.solutions/play",
"note": "the same content as a walkable three.js island; needs WebGL"
},
"index": "https://www.botha.solutions/llms.txt"
}
```
## Limits
The same caveats close every page, so a quote lifted from one keeps them.
- **Product sketches on this site use demo data** and say so where they appear. The headline numbers in case studies (for example 8,112 wage rows, ~40 sites, TestFlight build 43) are real production figures; client and property names are withheld.
- **Website images are captures** of the live sites taken on 4 Oct 2026, not live frames.
- **Pip is scripted.** The site's guide is a keyword router with no model behind it and makes no network calls.
- **Model status means exactly what it says.** "Ships in production" and "Daily driver" describe work Josh has shipped; "Know where it fits" means he knows the model's strengths, not that he has deployed it.
- The Second Brain is partly built: three of seventeen increments are shipped; the rest is design and is labelled as design.
- The site carries no testimonials, client logos, pricing or certifications beyond the courses listed on the CV.