1. The short version
WeCare is a managed marketplace, not an open one. The admin owns the business, sets the rates, and decides which partner attends which job. That single decision shapes everything below — it is simpler to build than an open marketplace, it is far easier to keep compliant, and it matches how the business actually operates.
hours to a working POC
One focused week, full time, coding with Claude. Day-by-day breakdown in §12.
user roles
Admin, Service Partner, Client — each with its own registration, evidence and permissions.
PostgreSQL database
Roughly 20 tables. No second datastore is justified at this size.
services at full scope
We recommend launching with four and adding the rest once the engine is proven.
The three things that matter most
- Compliance is the product, not a feature. Seven of the eleven services are legally gated in Australia, and the gates differ by state. The credential engine — what each partner must hold, for which service, in which state, and when it expires — is the core of the system. Build it first.
- Privacy law applies from day one. Because WeCare delivers elderly care and nursing, it is a health service provider under the Privacy Act and the small-business exemption does not apply, whatever the turnover. This is not a "later" item. See §4.
- Whether partners are contractors or employees is a business decision with a six-figure tail. It changes superannuation, leave, payroll tax and workers' compensation, and it must be settled with an Australian employment lawyer before launch, not after. See §14.
2. How we proceed
Build the POC first, in one week. Show it to your friend working, not as slides. Everything else is then a decision made against something real.
Settle four questions
A conversation, not a workshop. Which state, which services, contractors or employees, NDIS or not. Details in §15. The other five questions can wait.
Build the POC
One focused week. Every screen in this document, working end to end, on real data — registration, credential gating, booking, allocation, live tracking, completion codes, ratings, payables and the daily report.
Demo and iterate
Your friend drives it himself as all three roles. What he changes after using it is worth more than anything decided before it existed.
Harden to pilot-ready
Security and privacy review, document encryption, rate limiting, audit logging, accessibility, real error handling, backups and a restore that has actually been tested.
The external track
Runs in parallel from day one, owned by your friend. Employment-law opinion, insurance, privacy policy, and NDIS or Aged Care registration if needed.
The honest constraint: the code is the fast part. A POC is one week and pilot-ready is about two more. Neither is what gates go-live. An employment-law opinion, an insurance policy and — if it is needed — NDIS or Aged Care provider registration are external processes measured in weeks to months, and no amount of coding speed compresses them. Start that track on day one, in parallel with the build, not after the demo.
3. Scope — roles & services
The three registrations
| Role | Registers with | Can do |
|---|---|---|
| Admin the business owner |
Invite-only. Email + password with mandatory two-factor. Photo required. | Approve partners, verify credentials, allocate jobs, set and override rates, view all hours and payables, receive the daily report. |
| Service Partner does the work |
Self-registers, then is approved by an admin. Photo, identity documents and per-service credentials required. | Set availability, see an allocated calendar, navigate to jobs, record travel and arrival, close jobs with the client's code, view earnings. |
| Client books the service |
Self-registers via Google or email + password. Photo required. Address verified. | Request a service, see who is coming and how far away, hold the completion code, rate and comment. |
Sign-in: both Google and email + password, for clients and partners, as you asked. Google reduces drop-off and gives a verified email for free; password sign-in matters because a meaningful share of older clients do not have — or do not want to use — a Google account. Admin accounts are password + two-factor only, never social sign-in.
The eleven services
"Regulated" below means a partner cannot legally perform that service in Australia without a specific credential, and WeCare must therefore refuse to allocate it.
| Service | Gate | Billing shape | Suggested launch |
|---|---|---|---|
| Elderly Care | Regulated | Hourly | Wave 1 |
| Children's Care | Regulated | Hourly | Wave 2 |
| Nursing | Regulated | Hourly / per visit | Wave 3 |
| Plumbing | Regulated | Call-out + hourly | Wave 2 |
| Electrician | Regulated | Call-out + hourly | Wave 2 |
| Chauffeur | Regulated | Per trip / hourly | Wave 3 |
| Cooking | Conditional | Per service | Wave 3 |
| Cleaning | Standard | Hourly / per job | Wave 1 |
| Gardening | Standard | Hourly / per job | Wave 1 |
| Guest Servicing | Standard | Per turnover | Wave 1 |
| Events & Decorations | Standard | Quoted | Wave 3 |
A recommendation you should push back on if you disagree. Launch with Wave 1 — cleaning, gardening, guest servicing and elderly care. Those four exercise every mechanism in the platform (hourly billing, a regulated credential, recurring bookings, completion codes) without requiring trade-licence verification, AHPRA lookups and driver accreditation to all be correct on day one. Adding a service afterwards is configuration, not a rebuild — the credential engine is designed for exactly that.
4. Australian compliance
This section is the reason the project is more than a booking app. Everything below was checked against current Australian sources in September 2026; sources are listed at the end of the section. Treat it as a well-researched starting point for your lawyer, not as legal advice.
4.1 What every partner provides, regardless of service
| Item | Why | Expires |
|---|---|---|
| Photo (headshot) | Shown to the client before arrival — your explicit requirement | Refresh every 2 years |
| 100-point identity check | Identity assurance before any home visit | Once |
| Right to work in Australia | Citizenship, PR or a visa with work rights — verified via VEVO | With the visa |
| Nationally Coordinated Criminal History Check | Baseline for anyone entering a home | Re-check every 3 years |
| ABN | Required if engaged as a contractor | Ongoing |
| Bank account + superannuation details | Payment and, depending on classification, super | Ongoing |
| Public liability insurance | Certificate of currency, in the partner's own name | Annually |
A subcontractor cannot work under someone else's policy. Each partner must hold their own ABN and their own certificate of currency. The platform should store the certificate, read its expiry, and stop allocating work when it lapses.
4.2 What changes by service
| Service | Additional mandatory credential |
|---|---|
| Elderly Care | Under the Aged Care Act 2024, in force since 1 November 2025: a police certificate issued within 3 years, or an NDIS worker screening clearance (5 years). A police check older than three years no longer satisfies the obligation. First aid and CPR strongly expected. |
| Children's Care | A state Working With Children Check. These are not portable: a NSW check is not valid in Victoria, and Queensland does not recognise interstate checks. NSW ≈ $112 / 5 yrs · VIC ≈ $139.20 / 5 yrs · QLD Blue Card ≈ $108.30 / 3 yrs. NSW issues no physical card — employers verify online. |
| Nursing | Current AHPRA registration, verified against the public register — not from a certificate or a CV — including division, endorsements and any conditions. There is no official AHPRA API; approved employers can use the Practitioner Information Exchange, otherwise verification is a manual register lookup. Professional indemnity cover. |
| Plumbing | State plumbing licence. Public liability is effectively mandatory: Victoria will not issue or renew a plumbing licence without a certificate showing at least $5 million. |
| Electrician | State electrical licence. Queensland will not issue or renew an electrical contractor licence without public liability, and is the only state that also requires consumer protection insurance. Victoria requires $5 million minimum. |
| Chauffeur | State driver accreditation — in NSW a passenger transport licence code plus individual Driver Authorisation; in Victoria commercial passenger vehicle driver accreditation, which itself requires a working with children check and a police check. Plus vehicle registration and CTP. |
| Cooking | Food handler training, and a Food Safety Supervisor where the state or council requires one. |
| Cleaning, Gardening, Guest Servicing and Events carry no service-specific licence — the universal set in §4.1 applies. | |
4.3 If WeCare serves NDIS participants
An NDIS Worker Screening Check is mandatory for risk-assessed roles — which includes anyone delivering personal care, transport or daily living support. It costs roughly $85–$130, takes two to six weeks, and is valid for five years. Unlike a WWCC it is portable: a clearance issued in one state works in an NDIS role anywhere in Australia.
Timing worth knowing: the first cohort of checks issued in 2021 began expiring from 1 February 2026, so a renewal wave is running right now. Renewals can be lodged up to 90 days early and must be in at least 7 days before expiry to avoid a gap. The platform should warn at 90 days, escalate at 30, and hard-stop allocation at expiry.
4.4 Privacy — the part that is easy to get wrong
The small-business exemption does not apply to WeCare. The Privacy Act 1988 exempts most businesses under $3 million turnover — but not health service providers, and the Act's definition of a health service expressly includes activities carried out in the course of providing aged care, palliative care or care for a person with a disability. Offering elderly care or nursing puts WeCare inside the Privacy Act from its first client, at any turnover.
What follows from that:
- Health information is sensitive information and attracts a higher standard than ordinary personal data. A client's care needs, mobility and medications all qualify.
- The Australian Privacy Principles apply in full — collection notices, purpose limitation, access and correction rights, and a published privacy policy.
- The Notifiable Data Breach scheme applies. An eligible breach must be assessed and, if serious, reported to the OAIC and to affected individuals.
- A statutory tort for serious invasions of privacy commenced on 10 June 2025, and it applies regardless of whether an entity is covered by the Privacy Act. Individuals can sue directly.
- The small-business exemption is being removed generally, with final phase-in scheduled for December 2026 — so even the non-care services would be captured soon.
Design consequences, which we build in rather than bolt on:
- Identity and credential documents encrypted at rest, never in a public bucket, served only through an authenticated, audited endpoint.
- Location history retained only for the life of the job plus a short dispute window, then deleted — not accumulated indefinitely.
- A partner's location is captured only while they are en route to an accepted job, never continuously. This is both a privacy position and a worker-surveillance one.
- Explicit, separately-recorded consent for photographs, location sharing and health information.
- Every read of a client's sensitive record written to an append-only audit log.
- A documented retention and deletion schedule, because "we kept everything forever" is itself a breach risk.
4.5 Sources
NDIS worker screening — NDIS Quality and Safeguards Commission · 2026 guide. Working With Children Checks — Queensland Government on interstate checks · state-by-state comparison. Aged Care Act 2024 — Aged Care Quality and Safety Commission · MinterEllison technical update. Nursing registration — AHPRA. Privacy — OAIC Guide to health privacy · OAIC on the small business exemption · Norton Rose Fulbright on the reforms. Gig-work regulation — Fair Work Ombudsman on employee-like workers · Fair Work Commission minimum standards order. Trade licensing and insurance — Trade Risk. Driver accreditation — Safe Transport Victoria · Service NSW.
5. Technology
The stack below is chosen for one overriding reason: it is the same stack already running five production applications on your VPS. That means no new deployment pattern, no new database engine, no new auth model, and a developer who already knows the operational shape of the box.
| Layer | Choice | Why this one |
|---|---|---|
| Framework | Next.js 15 (App Router) + TypeScript | One codebase serves the marketing site, all three role portals and the API. Server components keep the client bundle small on phones. |
| Language | TypeScript, strict mode | Rates, hours and payables are money. Types catch a whole class of error before runtime. |
| Database | PostgreSQL 16 | Already on the box. Relational, transactional, with PostGIS available if proximity search is needed later. |
| ORM / migrations | Drizzle | Same as TaxPro. Migrations are versioned files, reviewable in a pull request. |
| Auth | Auth.js v5 — Google OAuth + credentials | Its own instance with its own allowlist, deliberately not wired into the shared proxy. Isolated blast radius. |
| UI | Tailwind CSS + shadcn/ui | Accessible primitives, responsive by default, no design-system build-out. |
| Maps | Google Maps Platform | You asked for Google specifically. Maps JS, Places Autocomplete, Geocoding and Routes. See §8. |
| Resend | Already used for TaxPro and ProductPro on the same box, with a verified sending domain. | |
| Files | Encrypted volume on the VPS, served via authenticated routes | Identity and credential documents must never sit behind a guessable URL. |
| Background jobs | systemd timer + a job table | Credential-expiry sweeps and the daily report. No queue infrastructure justified at this size. |
| Hosting | Your Hostinger VPS, port 3012, behind the shared nginx | Verified free on the box, not taken from a list. TLS via the existing certbot. |
Why not React Native or a native app? Because you specifically want Chrome to work for clients and partners, and a well-built responsive web app delivers that on day one with no app-store review, no release cycle and one codebase. If push notifications or background location later prove essential, the same codebase can be wrapped — but we should not pay that cost before we know we need it.
6. Databases & data model
One PostgreSQL database named wecare, with its own role,
on the existing cluster. Roughly twenty tables. Nothing here justifies a second
datastore, a document database or a cache layer — and each one we avoid is one fewer
thing to secure, back up and keep consistent.
6.1 The tables that matter
| Group | Tables | Holds |
|---|---|---|
| Identity | users, accounts, sessions, admin_profiles, partner_profiles, client_profiles |
One users row per person with a role; a profile table per role. Google and password logins both resolve to the same user. |
| Places | addresses |
Line, suburb, state, postcode, plus latitude, longitude and the Google place_id captured at entry so we never re-geocode. |
| Compliance | credential_types, service_credential_rules, partner_credentials |
The heart of the system. Which credential is required, for which service, in which state — and what each partner actually holds, with issue date, expiry, document and verification record. |
| Catalogue | services, partner_services, partner_availability |
What is offered, who can perform it, and when they are willing to work. |
| Pricing | rate_cards, rate_modifiers |
A base rate per service with effective dates, plus stacking modifiers for peak hours, weekends, public holidays, after-hours and urgency. |
| Work | jobs, job_events, job_locations, completion_codes |
The docket, its full append-only history, en-route location pings, and the one-time code. |
| Money | timesheets, job_charges, payables |
Minutes worked, what the client was charged, and what the partner is owed. |
| Feedback | ratings |
Stars and comments, one per completed job, tied to the docket. |
| Plumbing | notifications, audit_log, background_jobs |
Delivery records, an append-only access trail for sensitive reads, and scheduled work. |
6.2 The credential engine, concretely
This is the piece worth getting right, so here it is in full. Requirements are data, not code — adding a service or a state is an insert, not a deploy.
-- What the law requires: service × state → credential
service_credential_rules
service_id -> services.id -- 'childrens_care'
state text -- 'NSW' | 'VIC' | 'QLD' | ...
credential_type -> credential_types -- 'wwcc'
is_mandatory boolean
max_age_months integer -- e.g. 36 for an aged-care police check
notes text
-- What a partner actually holds
partner_credentials
partner_id -> partner_profiles.id
credential_type -> credential_types
identifier text -- licence / clearance number
issuing_state text
issued_on date
expires_on date
document_key text -- encrypted object key, never a public URL
verified_by -> users.id -- which admin sighted it
verified_at timestamptz
status enum('pending','verified','rejected','expired','suspended')
Allocation then reduces to a single question the database can answer:
-- Can this partner legally take this job, in this state, today?
SELECT NOT EXISTS (
SELECT 1
FROM service_credential_rules r
LEFT JOIN partner_credentials c
ON c.credential_type = r.credential_type
AND c.partner_id = $partner_id
AND c.status = 'verified'
AND c.expires_on > current_date
WHERE r.service_id = $service_id
AND r.state = $job_state
AND r.is_mandatory
AND c.id IS NULL -- a mandatory credential is missing or expired
) AS is_eligible;
Why this shape earns its keep. A partner cleared for children's care in NSW who takes a Victorian job fails this check automatically, because the rule is keyed on state and a NSW WWCC is not valid in Victoria. That is a real legal trap, and it is caught by the data model rather than by someone remembering.
6.3 Two deliberate choices
-
job_eventsis append-only. Every transition — created, allocated, accepted, en route, arrived, completed, closed — is a row, never an update. When a client disputes a charge or a regulator asks what happened, the answer is a query, not a reconstruction. -
Rates are versioned, never edited. Changing a rate inserts a new
rate_cardwith a new effective date. A job permanently records the rate card it was priced under, so last month's invoice never silently changes when the admin updates this month's pricing.
7. The job lifecycle
Every request gets a single human-readable reference used everywhere — in the app, in emails and on the phone. One identifier, not three.
WC-2026-014377
| # | State | Who acts | What happens |
|---|---|---|---|
| 1 | REQUESTED | Client | Picks service, address, date and time window. Docket issued. Indicative price shown from the live rate card. |
| 2 | ALLOCATED | Admin | Admin allocates a partner. Only partners who are eligible (§6.2), available, and within range are offered. |
| 3 | ACCEPTED | Partner | Partner confirms. The job lands in their calendar; the client is notified with the partner's name, photo and rating. |
| 4 | EN_ROUTE | Partner | Partner taps "on my way". Location sharing starts here and nowhere earlier. Client sees position and ETA. |
| 5 | ON_SITE | Partner | Arrival recorded with a geofence check against the job address. The billing clock starts. |
| 6 | WORK_DONE | Partner | Partner marks the work finished. The clock stops. The job is not closed. |
| 7 | CLOSED | Client → Partner | A 6-digit code appears in the client's app. The client reads it out; the partner enters it. Only a correct code closes the docket. |
| 8 | RATED | Client | Stars plus an optional comment. Prompted immediately and again next morning if skipped. |
How the completion code actually works
- Generated only when the partner marks
WORK_DONE— it cannot exist earlier, so it cannot leak earlier. - Six digits, random, shown only in the client's own session.
- Stored hashed. A database read does not reveal live codes.
- Five attempts, then it locks and an admin must intervene — this stops a partner guessing their way to a close.
- Expires after 24 hours; an unclosed job escalates to the admin rather than sitting silently.
Worth being clear-eyed about what this control does and does not prove. The code proves the partner was with the client at the end of the visit and the client was willing to release it. It does not prove the work was done well, and it fails in the exact case you most need it — a client with dementia, or one who is asleep when the visit ends. So we pair it with the geofenced arrival, the timestamped event trail and, for care services, an optional photo or visit note. And we build the admin override from the start, because it will be needed in week one.
8. Maps, tracking & ETA
| Need | How |
|---|---|
| Address entry | Places Autocomplete, restricted to Australia. We store the place_id, latitude and longitude at entry — so we geocode once, never repeatedly. |
| Partner navigation | A deep link that hands off to the Google Maps app the partner already uses. We do not rebuild turn-by-turn navigation — it would be worse and cost more. |
| "Where is he, how far?" | The partner's browser reports position while EN_ROUTE. The client sees a live marker and an ETA. |
| Travel time between jobs | Routes API, computed when the calendar is built and when a job is allocated — warning the admin before they book someone who cannot physically get there. |
Two engineering decisions that control the cost
- Do not call the Routes API on every location ping. The naive build recalculates the ETA on each update and the bill scales with the number of pings. Instead: recompute a real route every 60–90 seconds, and between recomputes update the displayed distance from straight-line movement. The client cannot tell the difference, and the call volume drops by more than an order of magnitude.
- Always complete an Autocomplete session. Google bills autocomplete by session, and a session that ends in a Place Details call is currently free — while an abandoned session is charged. Wiring the flow so every address selection finishes properly is worth real money at volume.
Tracking a worker is surveillance, and should be designed as such. Location is captured only between "on my way" and arrival, and only for the job in hand. It is never collected while a partner is off-shift, it is visible only to that job's client and the admin, and it is deleted on a short schedule. Beyond the legal exposure, continuous tracking is one of the fastest ways to lose good partners — and good partners are the scarce resource in this business.
Infrastructure note. Live tracking is the one requirement none of the eleven existing applications on your VPS have. It needs either polling or a streaming connection through nginx, and a streaming connection requires specific vhost configuration. Recommendation: start with polling every 15 seconds. "How far away is he" does not need sub-second precision, polling needs no nginx change at all, and it is trivially debuggable. Add streaming only if the polling genuinely proves inadequate.
9. Rates, hours & payments
How the admin controls pricing
A base rate per service, then modifiers that stack in a defined order:
| Modifier | Trigger | Example |
|---|---|---|
| Peak hours | Time-of-day window | ×1.25 before 7am or after 7pm |
| Weekend | Saturday / Sunday | ×1.5 Sunday |
| Public holiday | State holiday calendar | ×2.0 |
| Urgency | Booked under N hours notice | ×1.3 inside 4 hours |
| Scarcity | Few eligible partners available | ×1.15, capped |
| Minimum call-out | Trades | First hour charged in full |
Public holidays are state-specific in Australia, so the holiday calendar is keyed by state — a Melbourne Cup surcharge should not fire in Perth.
How hours are measured
The billing clock runs from geofenced ON_SITE to WORK_DONE,
rounded to a configurable increment (15 minutes by default). Travel time is tracked
separately and is not billed to the client unless the admin enables it for a
service. The admin can adjust any timesheet, and every adjustment is logged with who
made it and why.
What the admin sees
- Hours by partner, by service, by day, week or month
- Jobs completed per partner and the revenue against each
- Amount payable per partner for the period, net of any platform commission
- Average rating and any job that fell below a threshold
Out of scope for v1, deliberately. Taking card payments from clients, and paying partners automatically. Both are achievable — Stripe handles them — but each brings its own compliance surface, and neither is needed to prove the business works. v1 calculates what is owed and produces the figures; money moves through your friend's existing accounting process. We can add payments once the operation is real.
10. Alerts & the daily report
| Event | Client | Partner | Admin |
|---|---|---|---|
| Request received | ✓ email + in-app | — | ✓ in-app |
| Partner allocated | ✓ name, photo, rating | ✓ job offered | — |
| Partner en route | ✓ with live ETA | — | — |
| Arrived on site | ✓ | — | — |
| Work marked done | ✓ with the code | ✓ awaiting code | — |
| Job closed | ✓ rate prompt | ✓ earnings updated | — |
| Credential expiring | — | ✓ 90 / 30 / 7 days | ✓ 30 days |
| Job unclosed after 24h | — | ✓ | ✓ escalation |
The end-of-day report
Sent to the admin by email at a configurable time — proposed 7:00 pm local time, so the trading day is genuinely finished. It is a real email with the numbers in the body, not a link to a dashboard, because it needs to be readable on a phone without signing in.
- Per partner — jobs completed, hours worked, revenue generated, amount payable
- Totals — jobs, hours, revenue, total payable
- Exceptions — jobs not closed, codes that locked, ratings of 3 stars or below, partners who did not arrive
- Tomorrow — jobs booked, and any that are still unallocated
- Compliance — credentials expiring within 30 days
The exceptions block is the point. A report of what went well gets skimmed after a fortnight. A report that leads with what needs attention keeps getting read — and it doubles as the daily compliance check.
11. One app, every device
You asked for the app to know whether it is on a computer or a phone and size itself accordingly. Here is how we do that, and one place where I would push back slightly.
| Device | What it gets |
|---|---|
| Phone (< 768px) | Single column, bottom tab bar, large touch targets, camera-first photo capture, one-tap navigation. This is the primary design target for partners — they work from a phone. |
| Tablet | Two-column layouts, side navigation. Comfortable for a client browsing services. |
| Desktop (≥ 1024px) | The admin surface: multi-column allocation board, dense tables, keyboard shortcuts, side-by-side map and job list. This is where the admin actually works. |
The push-back. "Detect the device and serve a different app" is the intuitive approach and it is the wrong one — it means two interfaces to build, test and keep in step, and device detection is guesswork that gets a tablet or a large phone wrong often enough to matter. Responsive layout gets you everything you actually asked for, from one codebase, and it is correct at every width rather than at three guessed ones. Where the experience genuinely differs — the admin's allocation board is not useful on a phone — we build that as a distinct screen, chosen by the role and the viewport, not by sniffing the user agent.
It is installable from Chrome on both Android and iOS — the partner gets a home-screen icon and a full-screen app without an app store. Offline handling is limited but deliberate: a partner in a basement with no signal can still see today's jobs and addresses from cache, and any action they take is queued and sent when signal returns.
12. Timeline & effort
Built with Claude, full time. The estimate is in hours, because that is the unit that matters when one person can sit down and close the whole thing in a week.
POC — one focused week
Every flow working end to end on real data. Demonstrable to your friend.
POC → pilot-ready
Security, privacy, encryption, audit, accessibility, backups, real error handling.
The external track
Lawyer, insurer, registrations. Not code, not ours, and not compressible.
The POC week, day by day
| Day | Hrs | Build |
|---|---|---|
| 1 | 12 | Next.js + Postgres + Drizzle scaffold. Auth.js with Google and email/password. Three roles, route guards, profiles, photo upload. Deployed to the VPS by end of day — deploy on day one, not day six. |
| 2 | 12 | The credential engine (§6.2): credential types, per-state rules, document upload, admin verification queue, expiry sweep, and the eligibility query that gates allocation. |
| 3 | 12 | Service catalogue, partner capabilities and availability. Rate cards with stacking modifiers. Client booking flow → docket number. Admin allocation board filtered by eligibility. |
| 4 | 12 | Partner calendar with travel time. Google Maps: Places Autocomplete, navigation hand-off, en-route tracking, client-facing live ETA. |
| 5 | 12 | Completion codes with geofenced arrival. Ratings and comments. Timesheets, charges, payables. The end-of-day email report. |
| 6 | 8 | Responsive pass on real phones, installable PWA, seed data, a demo walkthrough script, and the deploy verified by served bytes. |
| ≈ 68 h | A POC your friend can drive himself, as all three roles. | |
What the POC deliberately will not have
Saying this up front is what keeps the week to a week. None of it is hard; all of it is the second block of ~60 hours.
- Automated credential verification. The admin sights the document and ticks it. There is no AHPRA API to call anyway.
- Card payments. The POC calculates what is owed; money moves outside it.
- Encryption at rest for documents, and full audit logging. Required before a single real client, not before a demo.
- SMS and push. Email and in-app only.
- Load and penetration testing.
The one thing that must not slip into "later". A POC holding invented data is fine. The moment it holds one real elderly client's details or one partner's passport scan, the Privacy Act obligations in §4.4 apply in full — because WeCare is a health service provider and the small-business exemption does not reach it. Demo on seed data. Do not let a real client's record into the POC before the hardening block is done.
13. What it costs to run
13.1 Bluehost VPS — real prices
Self-managed VPS, taken from Bluehost's Australian pricing page in September 2026. Prices are AUD per month on a 24-month term, which is what the advertised rate requires.
| Plan | vCPU | RAM | NVMe | Intro /mo | Renewal /mo | 2-yr intro total |
|---|---|---|---|---|---|---|
| NVMe 2 | 1 | 2 GB | 50 GB | A$6.55 | A$7.94 | ≈ A$157 |
| NVMe 4 ← recommended | 2 | 4 GB | 100 GB | A$13.24 | A$16.73 | ≈ A$318 |
| NVMe 8 | 4 | 8 GB | 200 GB | A$18.13 | A$40.46 | ≈ A$435 |
| NVMe 16 | 8 | 16 GB | 450 GB | A$36.27 | A$69.77 | ≈ A$871 |
NVMe 4 at A$13.24/month is the right size. For comparison, the VPS already running eleven production applications is an 8 vCPU / 31 GB box sitting at about 3% disk use. WeCare alone — Next.js plus Postgres — will not trouble 2 vCPU and 4 GB at POC or early-production volume.
Two things to check before you commit to 24 months.
1 · Sydney may not actually be selectable yet. Bluehost announced Sydney self-managed VPS on 31 August 2026, but when I read their live Australian VPS page the location picker offered only USA (Virginia), USA (Arizona), London, Toronto and Amsterdam — no Sydney. I could not confirm it is purchasable. Verify it appears at checkout before paying for two years, because a Sydney-hosted app serving Australian clients from Virginia adds roughly 200 ms to every request.
2 · The renewal price is not the headline price. NVMe 8 goes from A$18.13 to A$40.46 — it more than doubles. NVMe 4 is the gentlest step up (A$13.24 → A$16.73), which is a second reason to prefer it.
13.2 If Sydney is not available — confirmed Australian alternatives
All of these have had a Sydney region for years, and all are self-managed in the same way, so nothing about the build changes.
| Provider | Sydney | Comparable plan | Indicative /mo |
|---|---|---|---|
| Vultr | Yes | 2 vCPU / 4 GB NVMe | ≈ US$24 |
| DigitalOcean | Yes (SYD1) | 2 vCPU / 4 GB | ≈ US$24 |
| Linode / Akamai | Yes | 2 vCPU / 4 GB | ≈ US$24 |
| AWS Lightsail | Yes (ap-southeast-2) | 2 vCPU / 4 GB | ≈ US$24 |
Entry-level plans at all four start around A$6–9/month. Bluehost's NVMe 4 is genuinely cheaper than the US$24 tier — if Sydney is available. If it is not, the latency is worth more than the saving.
13.3 Everything else
| Item | Cost | Note |
|---|---|---|
| TLS certificate | A$0 | Let's Encrypt via certbot, auto-renewing. |
Domain .com | ≈ A$20–30/yr | No residency requirement. |
Domain .com.au | ≈ A$20–40/yr | ⚠ Requires an ABN or ACN — an Australian presence. Your friend has one; you would not be able to register it yourself. |
| Email (Resend) | A$0 → ≈ US$20/mo | Free tier covers POC and early production comfortably. |
| PostgreSQL | A$0 | Runs on the same VPS. A managed database is not justified at this size. |
| Backups | A$0–5/mo | Nightly pg_dump plus off-box copy. Bluehost charges separately for snapshots. |
| Google Maps | The real variable | See below. |
Google Maps is the one bill that can run away, and I have not verified current rates closely enough to give you a confident monthly figure. Google restructured Maps Platform pricing across 2025–26 and the SKUs moved. What is stable enough to plan against: Autocomplete is billed per session and a session completed with a Place Details call is currently free while an abandoned one is charged; Place Details runs around US$17 per 1,000 calls; and Route Matrix is billed per origin-destination element (about US$0.008 each). The two design decisions in §8 exist purely to hold this down. Model your expected call volume against Google's live pricing page and set a hard billing cap before launch.
13.4 Realistic monthly running cost
POC / demo
NVMe 4 VPS, free TLS, free email tier, near-zero Maps usage on seed data.
Early production
Same VPS, paid email tier, and real but modest Maps usage. Maps is most of the variance.
Right now
This site is on your existing VPS as its twelfth app — no new hosting spend to show your friend.
Build cost is your time — roughly one week for the POC and two more to pilot-ready. The costs your friend carries directly, and which dwarf the hosting, are legal advice, insurance premiums, any NDIS or Aged Care registration, and each partner's own screening checks.
14. Risks
| Risk | Severity | What we do about it |
|---|---|---|
| Partners are found to be employees, not contractors | Critical | Superannuation, leave, payroll tax and workers' compensation would apply retrospectively. Get a written employment-law opinion in week one. Note that the Fair Work Act already recognises employee-like workers on digital labour platforms, with unfair-deactivation protection since 26 August 2024, and the Commission made its first binding minimum standards order — for on-demand delivery — effective 17 August 2026, with further applications under consideration. The direction of travel is one way. |
| A privacy breach involving health or identity data | Critical | Encryption at rest, authenticated document access, audited reads, short retention, and a written breach-response plan before launch. The Notifiable Data Breach scheme applies, and the new statutory tort lets individuals sue directly. |
| An unscreened partner attends a vulnerable client | Critical | Eligibility enforced in the database at allocation (§6.2), not in the interface. No admin override on a mandatory credential — the override exists for timesheets, not for screening. |
| Deactivating a partner triggers a Fair Work claim | High | Employee-like workers who have worked through a platform regularly for six months can challenge unfair deactivation. Build a documented process — warning, reason recorded, right of reply — rather than a delete button. |
| Maps costs scale faster than revenue | High | Cache geocodes, throttle route recomputation, complete every autocomplete session, set a hard billing cap with alerting. |
| Credentials lapse quietly | High | Daily expiry sweep, escalating reminders at 90 / 30 / 7 days, automatic suspension at expiry, and expiring credentials surfaced in the daily report. |
| Eleven services at once | Medium | Launch Wave 1. Each regulated service adds a distinct verification path, and doing six of them badly is worse than four well. |
| Twelfth app on a single production box | Low | Resource headroom is ample. The real risk is operational — a shared nginx and one Postgres. Mitigated by the existing rules: own port, own database, own auth, never restart nginx. |
15. Decisions owed before code starts
These are your friend's calls, not ours. Each one changes what gets built.
| # | Question | Why it matters |
|---|---|---|
| 1 | Which state(s) at launch? | Screening, licensing and driver accreditation are all state-administered. One state first is materially cheaper. |
| 2 | Contractors or employees? | Changes payables, contracts, onboarding, insurance and tax. Needs a lawyer, not an opinion. |
| 3 | Will WeCare serve NDIS participants or funded aged care? | If yes, provider registration is an external process measured in months and must start now. |
| 4 | Which services at launch? | We propose Wave 1 — cleaning, gardening, guest servicing, elderly care. |
| 5 | Who carries insurance — WeCare, or each partner? | Determines what we verify and store, and who is exposed when something goes wrong. |
| 6 | Does WeCare take payment, or just calculate it? | We propose calculate-only for v1. Taking card payments adds a compliance surface. |
| 7 | Commission model? | Percentage, flat fee per job, or partner-pays-subscription. Drives the payables calculation. |
| 8 | How many admins, and can they all see everything? | One owner is simple. Several with different permissions is a role model we should design now rather than retrofit. |
| 9 | Is the business name "WeCare" cleared for use in Australia? | Worth a business-name and trade-mark search before we print it on uniforms. It is a common name. |
What we need from you to start: answers to 1, 2, 3 and 4. Those four determine the shape of the build. The rest can be settled during Phase 1 without holding anything up.
16. Who owns what
Your friend owns the business, the VPS, the domain and the data. We build the proof of concept. That is the right structure — it puts the obligations in §4 where they belong, with the person operating the business, rather than with the person who wrote the code. Three things make it actually hold, and none of them are expensive.
1 · Everything in his name from day one — not "transferred later"
| Asset | In whose name | Why it matters |
|---|---|---|
| Domain | His | A .com.au requires an ABN or ACN — an Australian presence — so it has to be registered to him regardless. A domain in your name is a negotiation later. |
| VPS account & billing | His | Whoever's card is on the server owns the server, and is the one the host talks to. |
| Google Cloud / Maps key | His | The single most important one. Maps is the bill that can run away (§13) — it must hit his card, with his quota cap, not yours. |
| Email sending account | His | Mail sent about his clients should come from his account and his domain. |
| Code repository | Yours to build, his on handover | Agree this up front. Transferring a repo takes a minute; arguing about it later does not. |
| The data | His, always | He is the entity collecting personal and health information. You are never the one holding it. |
2 · Never let real client data into the POC
This is the one that actually matters, and it is entirely within your control. Demonstrate on invented data — the names and addresses in the screen designs are exactly that. The moment one real elderly client's care notes or one partner's passport scan lands in a database on a box you control, you are handling sensitive information under the Privacy Act, on infrastructure you own, for a business that is not yours. Seed data costs nothing and removes the entire question. Real records go in only after the hardening block, and only on his infrastructure.
3 · One page in writing — not a contract, just a record
You are not incorporating anything or hiring a lawyer. You just want it on record that you delivered a proof of concept, that the compliance research is research and not legal advice, and that operating the business — licences, insurance, screening, privacy obligations — is his. Something like this, by email, acknowledged with a "yes agreed", is enough:
Hi [name], Before I start, just so we are both clear on what this is. I am building a proof of concept for WeCare — working software to demonstrate the idea and get feedback. It is not a finished, production-ready or legally compliant system, and it should not be used with real client information until it has been through a proper security and privacy review. The build plan I have put together includes research on Australian requirements — worker screening, licensing, privacy, insurance. That is research to give you a head start, not legal advice. You will need your own lawyer and insurer to confirm all of it before you operate. Everything operational goes in your name from the start: the domain, the server, the Google Maps billing account and the email account. You own the business, the data and the infrastructure. I will hand over the code and all access when we are done. I will demo on made-up data only. No real client or worker records go into the system while I am building it. Happy to start on that basis — just reply and confirm. [you]
So — is your structure OK? Yes. Building a POC for someone who owns the business, the infrastructure and the data is an ordinary contracting arrangement, and the obligations in §4 land on the operator, not on the developer. The two things that would erode it are keeping the infrastructure in your name and putting real client records into a demo. Avoid both and you are in a clean position. This is a practical view, not legal advice — but it is the same arrangement most contract developers work under.
A note on this document. The compliance research in §4 was gathered from current Australian government and industry sources in September 2026 and is cited so it can be checked. It is not legal advice, fees and thresholds change, and several of the rules cited are actively being reformed. Every item in §4 should be confirmed with an Australian lawyer before launch — but it should mean that conversation starts from a well-informed position rather than a blank page.