Skip to content

yava-code/AirEstate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

2 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

AirEstate Command Center β€” Π΄Π°ΡˆΠ±ΠΎΡ€Π΄ ΠΈ ARIA

β—ˆ AirEstate

Enterprise AI Property Sales Platform

Automating 500+ hours of manual real estate operations β€” powered by conversational AI, intelligent lead matching, and one-click multi-channel outreach.


Vision

Real estate agencies lose hundreds of hours every month to manual lead qualification, property-client matching, and outreach drafting. AirEstate replaces that workflow with a single, AI-native platform:

Manual Process AirEstate Automation
Agent spends 20 min qualifying a call ARIA qualifies in 5 conversational turns
Analyst manually matches clients to listings Matching engine runs in < 1s on every new ingestion
BDR drafts 30 personalised WhatsApp messages Batch outreach drafted and dispatched in one click
Property data entry from 10+ listing portals Paste URL β†’ AI extracts structured JSON in seconds

Features

πŸ€– ARIA β€” Conversational Lead Qualification

Inspired by Intercom, built with Groq

  • Collects Name, Phone, Budget, Location & Urgency through natural dialogue
  • Auto-qualifies leads against a $1M threshold (server-side enforced β€” AI label is advisory only)
  • Fires a Telegram alert for High-Value leads (β‰₯ $3M) in real-time
  • Beautiful WhatsApp/Intercom-style chat UI with animated typing indicator

Chat Demo GIF


πŸ“Š Live CRM Dashboard

Real-time metrics, lead cards, AI buyer profiles

  • 4 live metrics: Total Leads Β· Qualified Β· Pipeline Value Β· Avg. Budget
  • SVG donut chart for Lead Source Distribution (no external chart library)
  • Clickable lead rows β†’ AI-generated 2-sentence buyer profile (cached, API called once per lead)
  • Perfect Match pulse badge highlights leads matched to newly ingested properties
  • Follow-up email generator with one click

CRM Demo GIF


🏠 Property Ingestion

Paste a URL, get structured JSON β€” powered by LLM scraping simulation

  • Bulk URL input (one per line)
  • 4-stage animated progress bar: Fetching β†’ Parsing β†’ Matching β†’ Saving
  • Toast notification on success: "Property added to inventory"
  • Extracted fields: Title Β· Price Β· Location Β· SQFT Β· Beds/Baths Β· Amenities Β· Type

Ingest Demo GIF


πŸ“€ Outreach Center β€” Mass Campaign

The "money shot" of the demo

  1. Ingest a property β†’ matching engine automatically identifies qualified buyers
  2. Perfect Match badge pulses on matched leads in the CRM
  3. Navigate to Outreach Center β†’ collapsible match rows with WhatsApp-style message previews
  4. Click Confirm & Send All β†’ animated per-name progress bar β†’ Telegram summary alert
  5. Lead statuses update to Followed-up across the entire platform

Outreach Demo GIF


πŸ”Œ Service Layer with Demo Mode

Every integration is optional β€” the app never crashes due to missing credentials

Service Provider Fallback
AI Chat Groq (qwen-qwq-32b / llama-3.1-8b) Hardcoded demo response
Email Resend REST API console.log with full payload
WhatsApp Twilio / Meta Graph API Simulated success, logged
Telegram Bot API Simulated success, logged

Architecture

web/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ layout.tsx          β€” Root shell + ErrorBoundary
β”‚   β”œβ”€β”€ page.tsx            β€” Main orchestrator (all React state)
β”‚   β”œβ”€β”€ error.tsx           β€” Segment error boundary (Next.js)
β”‚   β”œβ”€β”€ global-error.tsx    β€” Critical error boundary
β”‚   └── api/
β”‚       β”œβ”€β”€ chat/           β€” ARIA conversation + lead extraction
β”‚       β”œβ”€β”€ ingest/         β€” URL β†’ Groq β†’ Property JSON + matching
β”‚       β”œβ”€β”€ leads/          β€” GET / POST / DELETE (seed reset)
β”‚       β”œβ”€β”€ properties/     β€” GET
β”‚       β”œβ”€β”€ profile/        β€” AI buyer profile generation
β”‚       └── outreach/       β€” Batch status update + WhatsApp dispatch
β”œβ”€β”€ components/
β”‚   β”œβ”€β”€ Header.tsx          β€” Fixed topbar (logo Β· status Β· user)
β”‚   β”œβ”€β”€ Footer.tsx          β€” Version Β· status Β· links
β”‚   β”œβ”€β”€ ChatWidget.tsx      β€” ARIA chat interface
β”‚   β”œβ”€β”€ LeadDashboard.tsx   β€” CRM panel with metrics + lead table
β”‚   β”œβ”€β”€ PropertyIngestor.tsxβ€” URL input + progress + property cards
β”‚   β”œβ”€β”€ TutorialModal.tsx   β€” 3-step Framer Motion modal
β”‚   β”œβ”€β”€ OutreachPreview.tsx β€” Batch outreach UI
β”‚   β”œβ”€β”€ ErrorBoundary.tsx   β€” Reusable class-based boundary
β”‚   └── SkeletonLoader.tsx  β€” Shimmer placeholders (5 variants)
β”œβ”€β”€ services/
β”‚   β”œβ”€β”€ email.ts            β€” Resend + demo fallback
β”‚   β”œβ”€β”€ whatsapp.ts         β€” Twilio / Meta + demo fallback
β”‚   └── telegram.ts         β€” Bot API + demo fallback
β”œβ”€β”€ hooks/
β”‚   └── useLeads.ts         β€” Data fetching hook with optimistic updates
β”œβ”€β”€ utils/
β”‚   └── format.ts           β€” formatCurrency Β· parseBudget Β· cx Β· etc.
β”œβ”€β”€ lib/
β”‚   β”œβ”€β”€ types.ts            β€” All TypeScript interfaces
β”‚   β”œβ”€β”€ db.ts               β€” File-backed JSON database
β”‚   β”œβ”€β”€ groq.ts             β€” Groq client + stripThink()
β”‚   β”œβ”€β”€ matching.ts         β€” matchLeads Β· draftWhatsApp Β· buildBatch
β”‚   β”œβ”€β”€ mockData.ts         β€” 5 seed leads + 2 seed properties
β”‚   └── prompts.ts          β€” ARIA_SYSTEM Β· PROPERTY_PARSE Β· PROFILE
└── tests/
    β”œβ”€β”€ __tests__/
    β”‚   β”œβ”€β”€ matching.test.ts        β€” Vitest: matching engine
    β”‚   β”œβ”€β”€ TutorialModal.test.tsx  β€” Vitest: component rendering
    β”‚   └── demo-mode.test.ts       β€” Vitest: graceful fallback
    └── python/
        β”œβ”€β”€ matching.py             β€” Python mirror of TypeScript logic
        β”œβ”€β”€ conftest.py             β€” Shared pytest fixtures
        β”œβ”€β”€ test_matching.py        β€” pytest: lead-property matching
        β”œβ”€β”€ test_extraction.py      β€” pytest: Groq JSON extraction
        └── test_demo_mode.py       β€” pytest: demo mode + boundaries

Quick Start

Prerequisites

  • Node.js 20+
  • Python 3.11+ (for pytest suite)
  • A free Groq API key (optional β€” app runs in Demo Mode without it)

1. Clone & install

git clone https://github.com/your-username/airestate.git
cd airestate/web
npm install

2. Configure environment

cp .env.local.example .env.local
# Edit .env.local β€” only GROQ_API_KEY is needed for full AI functionality

3. Start development server

npm run dev
# β†’ http://localhost:3000

4. Run the test suite

# TypeScript / Vitest
npm run test

# Python / pytest (from repo root)
cd tests/python && pip install pytest pytest-cov && pytest -v

Environment Variables

Variable Required Description
GROQ_API_KEY Recommended Powers ARIA chat + property parsing
GROQ_MODEL Optional Model ID (default: llama-3.1-8b-instant)
RESEND_API_KEY Optional Real email dispatch via Resend
RESEND_FROM_ADDRESS Optional Sender address (default: aria@airestate.com)
TWILIO_ACCOUNT_SID Optional WhatsApp via Twilio
TWILIO_AUTH_TOKEN Optional Twilio authentication
TWILIO_WHATSAPP_FROM Optional Twilio sandbox number
WHATSAPP_PROVIDER Optional twilio (default) or meta
META_WHATSAPP_TOKEN Optional Meta Business API token
META_WHATSAPP_PHONE_ID Optional Meta phone number ID
TELEGRAM_BOT_TOKEN Optional Telegram bot for HV lead alerts
TELEGRAM_CHAT_ID Optional Chat/channel for notifications

All variables are optional. When unset, the relevant service logs to console and returns { ok: true, mode: 'demo' } β€” the UI remains fully functional.


CI/CD

GitHub Actions runs on every push to main and every pull request:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  frontend                               β”‚
β”‚  β”œβ”€β”€ npm ci                             β”‚
β”‚  β”œβ”€β”€ ESLint                             β”‚
β”‚  β”œβ”€β”€ TypeScript typecheck (tsc --noEmit)β”‚
β”‚  β”œβ”€β”€ Vitest (demo mode β€” no API keys)   β”‚
β”‚  └── next build                         β”‚
β”‚                                         β”‚
β”‚  python                                 β”‚
β”‚  β”œβ”€β”€ pip install pytest pytest-cov      β”‚
β”‚  └── pytest -v (matching + extraction)  β”‚
β”‚                                         β”‚
β”‚  ci-pass (gate β€” requires both above)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Tech Stack

Layer Technology
Framework Next.js 15 (App Router)
Language TypeScript 5.5
Styling Tailwind CSS 3.4 β€” custom design tokens
Animations Framer Motion 11
Icons Lucide React
Toasts react-hot-toast
AI Groq SDK (qwen-qwq-32b / llama-3.1-8b-instant)
Email Resend REST API
WhatsApp Twilio Business API / Meta Graph API
Telegram Bot API (webhooks)
Database File-backed JSON (zero-dependency, swap-ready)
TS Tests Vitest + Testing Library + jsdom
Python Tests pytest + pytest-cov
CI/CD GitHub Actions

Contributing

  1. Fork the repository
  2. Create a feature branch: git checkout -b feat/your-feature
  3. Run tests before committing: npm run test && cd tests/python && pytest
  4. Open a pull request β€” the CI gate must pass

License

MIT Β© AirEstate. Built as a portfolio demonstration of AI-native SaaS architecture.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors