How it Works
PMFriend is an ops layer that sits beside your existing property management system (PropertyMe, PropertyTree, Console). It doesn't replace trust accounting. It takes the work that drains a PM's week — maintenance triage, compliance tracking, owner comms, contractor dispatch — and compresses it with a Claude-powered workflow.
The principle: sit beside, never replace
Your PMS holds the money. It's where rent lands, where statements are run, where trust account reconciliation happens. We don't touch any of that. Nothing in PMFriend can debit an owner, credit a tenant, or issue a statement. That's a deliberate moat — it means no PM ever loses sleep that adopting us will break audit compliance.
What we do handle:
| Work | Who does it today | What PMFriend does |
|---|---|---|
| Tenant reports a burst pipe at 11pm | PM's phone rings | /report/{token} QR link captures it in 30 sec; AI triages before PM reads it |
| Quarterly compliance check | Spreadsheet in someone's head | Auto-scheduled per property per jurisdiction; reminders 14d before due |
| Owner "what did you spend my $400 on?" | PM writes an email | Fortnightly digest: prose, warm tone, PM-reviewed before send |
| "Find me a plumber with current insurance" | Phone tree | Ranked picker: trade match + preferred + insurance status in one view |
| "Is this a duplicate of last week's report?" | Memory + guesswork | Semantic duplicate detection across same-property requests (14d window) |
The data model in one page
Agency (you)
├─ Properties
│ ├─ Owners (1..N)
│ ├─ Tenants (via Leases)
│ ├─ ComplianceTasks (auto-generated from state rules)
│ └─ MaintenanceRequests
│ ├─ TriageSuggestion (AI output, PM-editable)
│ └─ WorkOrder
│ ├─ Scope (raw or AI-drafted)
│ ├─ CostCeiling (AI-suggested or manual)
│ ├─ ContractorDispatch (magic-link token)
│ └─ StatusTransitions (ASSIGNED → ACCEPTED → SCHEDULED → ON_SITE → COMPLETED)
├─ Contractors (agency-wide directory, reusable across properties)
└─ Notifications (agency-wide feed)
Every row is scoped to your Agency via PostgreSQL row-level security. No code path can leak a row to another agency — the database itself blocks it. See Legal & Compliance for detail.
What we intentionally do NOT do
- Trust accounting. No receipts, no deposits, no statements, no reconciliation. Your existing PMS owns that.
- Advertising / listings. Realestate.com.au integrations, vacancy advertising — not our lane.
- Rent roll valuation / sales CRM. No buyer pipeline, no sales agent workflow.
- Legal advice. Our compliance register reminds you when things are due. It is not a legal certification and we say so in the UI.
- Autonomous action. Nothing sends without a PM reviewing it. Claude drafts — PMs approve.
Architecture at 30,000 ft
- Backend: Spring Boot 3.4 modular monolith (domain → application → infrastructure → web → bootstrap), Java 21, Gradle.
- Database: PostgreSQL 16 with FORCE ROW LEVEL SECURITY per tenant.
- AI: Anthropic Claude Haiku via direct JDK
HttpClient(no SDK). Every integration has a prompt-version tag (e.g.claude-haiku-4-5@prompt-v2) and a deterministic heuristic fallback. - Frontend: React / Vite / Tailwind / TanStack Query, served as static files from the backend JAR.
- Auth: email+password (BCrypt), Google SSO, session cookie (HS384 JWT, 14-day TTL, Partitioned for the sandbox iframe).
- Hosting: AWS App Runner (Frankfurt, eu-central-1), RDS PostgreSQL, S3 for documents, Lightsail Sydney for the landing + docs.
Full architecture diagram in ARCHITECTURE.md.
Why Australia
The founder (Dim) is based in Melbourne. PM domain is extremely state-specific in AU — the difference between a QLD Form 11 and a NSW Notice to Remedy Breach is not cosmetic, it's legal. A generic US SaaS cannot get this right without rebuilding from scratch for each state. PMFriend's compliance rules ship with all 8 jurisdictions on day one.