|
| 1 | +# Open Property |
| 2 | + |
| 3 | +Open-source **property management software** — a self-hosted, cloud-based alternative to TenantCloud, AppFolio, Buildium, and Propertyware for landlords, small property managers, and apartment / multi-family back-office teams. |
| 4 | + |
| 5 | +Rental property management with everything you need to run a portfolio: properties and units, tenants and leases, rent collection and a ledger, maintenance work orders, and a vendor directory. |
| 6 | + |
| 7 | +> Built on the [Clawnify](https://clawnify.com) template format. Deploy your own copy in minutes, customize freely, own the data. |
| 8 | +
|
| 9 | +## Features |
| 10 | + |
| 11 | +### Dashboard |
| 12 | +- **At-a-glance KPIs** — occupancy rate, active leases, outstanding rent, open work orders |
| 13 | +- **This month's rent** — collected, outstanding, overdue at a glance |
| 14 | +- **Open work orders** + **upcoming lease expirations** — what to act on this week |
| 15 | + |
| 16 | +### Properties & units |
| 17 | +- Property cards with type, address, color tag, occupancy snapshot |
| 18 | +- Per-property page with summary tiles, unit grid, and the property's open work orders |
| 19 | +- Units track bedrooms, bathrooms, square footage, market rent, and status (vacant / occupied / turnover / unavailable) |
| 20 | + |
| 21 | +### Tenants |
| 22 | +- Searchable list showing each tenant's active unit and contact info |
| 23 | +- Detail page with active lease, contact, employer, income, emergency contact, lease history |
| 24 | + |
| 25 | +### Leases |
| 26 | +- One row per lease with tenant, property · unit, term, monthly rent, and status |
| 27 | +- Filters for active / upcoming / ended / all |
| 28 | +- Edit-in-dialog with start / end / rent / deposit / due day / late fee / status |
| 29 | + |
| 30 | +### Rent ledger |
| 31 | +- One charge per active lease per month, generated idempotently with one click |
| 32 | +- Period navigator (◀ / today / ▶) and totals: charged, collected, outstanding, overdue |
| 33 | +- Record payments by amount, method, date, and reference. Status auto-updates as payments roll in |
| 34 | +- Past payments visible per charge with one-click removal |
| 35 | + |
| 36 | +### Maintenance |
| 37 | +- Work orders with title, description, priority (urgent / high / normal / low), and status (open / assigned / in progress / completed / cancelled) |
| 38 | +- Tabs: open / unassigned / assigned / in progress / completed / all |
| 39 | +- Link work orders to a property, unit, and vendor; track scheduled date and cost |
| 40 | + |
| 41 | +### Vendors & policy |
| 42 | +- Vendor directory by category (plumber / electrician / HVAC / handyman / cleaning / landscaping / general) |
| 43 | +- Rent policy defaults: due day, late fee, grace days, currency |
| 44 | + |
| 45 | +## Stack |
| 46 | + |
| 47 | +- React 19 + Vite + TypeScript |
| 48 | +- Tailwind CSS v4 + shadcn/ui (Radix primitives) |
| 49 | +- Hono on Cloudflare Workers (D1-native — same code locally and in production) |
| 50 | +- `lucide-react` for icons |
| 51 | +- pushState URL routing |
| 52 | + |
| 53 | +## Develop |
| 54 | + |
| 55 | +```bash |
| 56 | +pnpm install |
| 57 | +pnpm dev # Vite at :5173, Wrangler at :8787 (D1 schema applied automatically) |
| 58 | +pnpm typecheck |
| 59 | +pnpm build |
| 60 | +``` |
| 61 | + |
| 62 | +The dev script applies `src/server/schema.sql` to the local D1 database, then runs Vite and Wrangler in parallel. The schema seeds 3 sample properties, 5 units, and 3 vendors so the app is usable on first boot. |
| 63 | + |
| 64 | +## Deploy |
| 65 | + |
| 66 | +If you have the Clawnify CLI installed: |
| 67 | + |
| 68 | +```bash |
| 69 | +clawnify deploy |
| 70 | +``` |
| 71 | + |
| 72 | +Or wire it up to Cloudflare Workers + D1 directly using the bindings in `wrangler.toml` (binding `DB`, database name `open-property-db`). |
| 73 | + |
| 74 | +## Project layout |
| 75 | + |
| 76 | +``` |
| 77 | +src/ |
| 78 | + server/ |
| 79 | + index.ts Hono routes for every entity |
| 80 | + db.ts D1 adapter (query / get / run) |
| 81 | + schema.sql Tables + seed data |
| 82 | + client/ |
| 83 | + app.tsx Shell + routing |
| 84 | + components/ |
| 85 | + dashboard/ Portfolio + month-at-a-glance |
| 86 | + properties/ List, property detail, property + unit dialogs |
| 87 | + tenants/ List, tenant detail, tenant dialog |
| 88 | + leases/ Leases page + lease dialog |
| 89 | + rent/ Rent ledger + payment dialog |
| 90 | + maintenance/ Work orders board + work-order dialog |
| 91 | + settings/ Vendors + rent policy defaults |
| 92 | + ui/ Vendored shadcn primitives |
| 93 | + hooks/ use-router, use-app-state |
| 94 | + lib/utils.ts cn helper, color palette, date / money / period helpers |
| 95 | +``` |
| 96 | + |
| 97 | +## What's intentionally not included |
| 98 | + |
| 99 | +To keep this template self-hostable with no third-party SaaS dependencies and no public-facing endpoints, these features are out of scope: |
| 100 | + |
| 101 | +- Listing syndication to external rental sites |
| 102 | +- Real credit / background screening (placeholder application records only) |
| 103 | +- 2-way SMS, email blasts, automated texting |
| 104 | +- Online card / ACH payment processing |
| 105 | +- Public tenant or owner portals |
| 106 | + |
| 107 | +These can all be layered on top once you fork the template. |
| 108 | + |
| 109 | +## License |
| 110 | + |
| 111 | +MIT |
0 commit comments