| title | PropAI |
|---|---|
| emoji | 🏠 |
| colorFrom | indigo |
| colorTo | blue |
| sdk | docker |
| app_port | 7860 |
| pinned | false |
| license | mit |
| short_description | Property Manager AI Agent with Gemini insights |
A full-stack property portfolio dashboard with AI-powered insights. Track properties, tenants, loans, maintenance, escrow, and appliances across your real-estate portfolio; ask Gemini for recommendations grounded in the live data.
- Portfolio dashboard — 10 seeded properties across 10 cities, with consolidated finance summary, alerts, and historical revenue/expense charts.
- Tenant + lease tracking — payment status, lease end dates, renewal pipeline, automated overdue + lease-end alerts.
- Loans & escrow — outstanding balances, EMI schedules, property tax / insurance / HOA tracking.
- Maintenance workflow — create requests, assign to contractors, track status from
pending→scheduled→complete. - AI insights via Gemini — natural-language Q&A grounded in your portfolio data.
- Single-process deployment — Express serves both the API and the prebuilt React bundle on one port.
┌─────────────────────┐ ┌──────────────────────┐
│ React + Vite SPA │────▶│ Express API │
│ (TypeScript, R19, │ │ (server.ts, :7860) │
│ Tailwind v4, │ │ │
│ Recharts, Motion) │ │ ├── /api/dashboard │
└──────────┬──────────┘ │ ├── /api/properties│
│ │ ├── /api/maintenance│
│ Gemini SDK │ └── /api/finance │
▼ └──────────┬───────────┘
ai.google.dev │
▼
┌─────────────────────┐
│ SQLite (file DB) │
│ better-sqlite3 │
│ 10 tables, seeded │
└─────────────────────┘
| Layer | Tech |
|---|---|
| Frontend | React 19, Vite 6, TypeScript 5.8, Tailwind CSS 4, Lucide, Recharts, Motion |
| Backend | Express 4, tsx (TS runner), better-sqlite3 |
| AI | @google/genai (Gemini) |
| Storage | SQLite — file-based, schema auto-created and seeded on first launch |
npm install
cp .env.example .env.local # then add your Gemini key
npm run dev # http://localhost:3000Get a free Gemini API key at https://ai.google.dev/ → "Get API key".
- Create a new Space at https://huggingface.co/new-space with
SDK = Docker. - Push this repo to the Space (or link the GitHub repo via the Spaces UI).
- In Settings → Variables and secrets, add
GEMINI_API_KEY. - The Space builds from the included
Dockerfile, exposes port7860, and serves both the API and the React bundle from/.
The Dockerfile is portable. Set PORT (most hosts inject it automatically), GEMINI_API_KEY, and NODE_ENV=production. SQLite data is ephemeral on most free tiers — the seed data re-creates itself on each cold start, which is fine for demos but not for production state.
See .env.example.
| Var | Required | Notes |
|---|---|---|
GEMINI_API_KEY |
Yes | AI features no-op without it (warning logged, app still serves) |
PORT |
No | Default 3000 locally, 7860 on HF Spaces |
NODE_ENV |
No | production skips Vite middleware and serves ./dist |
APP_URL |
No | Self-referential URL (e.g. for share links) |
- SQLite is ephemeral on serverless / free containers. Data resets on each redeploy. For persistent storage swap to Turso (libsql), Vercel Postgres, or a hosted Postgres.
- Gemini key in client bundle.
vite.config.tsinjectsprocess.env.GEMINI_API_KEYat build time, which embeds it in the shipped JS. For a public demo, use a usage-limited key. To fully secure, route Gemini calls through a server-side/api/aiendpoint instead.
MIT