Prop Pilot is your go-to solution for modern property management. We understand the complexities of managing properties, and that's why we've crafted a platform that simplifies every aspect of this process. Whether you're on your first house flipping adventure, juggling multiple properties, overseeing financials, or communicating w/ tenants, Prop Pilot has got you covered.
Managing contractors is a critical part of property management. That's why Prop Pilot includes features that make it easy to track and coordinate w/ contractors, ensuring that renovations and repairs are completed efficiently and up to standard.
Designed w/ both desktop and mobile users in mind, our platform guarantees a smooth experience, no matter where you are. It's time to take your property business to the next level w/ Prop Pilot – not just a tool, but a game changer in the world of REI property management.
- Technologies Used
- Performance Optimizations
- Security Features
- Project Setup
- Troubleshooting
- Foreclosure Listing Scraper
Prop Pilot leverages a stack of modern technologies to deliver an exceptional user experience and robust backend functionality:
- React with Vite for fast development
- Tailwind CSS for responsive design
- AG Grid for powerful data management
- JavaScript (ES6+), HTML5, CSS3
- Flask web framework
- PostgreSQL with Flask-SQLAlchemy
- Flask-JWT-Extended for authentication
- Flask-CORS for CORS handling
- Werkzeug for WSGI support
Prop Pilot employs several key optimizations to ensure fast performance and smooth user experience:
- Caching Strategy: Service worker implements tiered caching w/ varying durations
- 7 days for images
- 24 hours for static assets
- 1-24 hours for API responses
- Input Optimization: Debounced form inputs (1000ms) and throttled scroll handling (100ms)
- Resource Loading: Lazy loading for images and components, w/ intelligent preloading
- Request Handling: Network-first strategy for fresh data, cache-first for static content
- Performance Tools: Built-in monitoring and optimization utilities
Prop Pilot implements comprehensive security measures across its stack:
- Authentication: JWT-based w/ 1-hour expiration, Google OAuth 2.0 integration
- Data Protection: HTTP-only cookies, secure flags, SameSite policy
- Frontend Security: CSRF protection, secure token storage, input validation
- Backend Security: Secure environment configuration, JWT hardening
- Headers & CORS: Strict security headers (HSTS, CSP, X-Frame-Options)
- Go to Google Cloud Console → APIs & Services → Credentials.
- Create OAuth 2.0 Client ID (Application type = Web application).
- Authorized JavaScript origins:
- Authorized redirect URIs (pick the one your app actually handles):
- Backend callback (Flask): http://localhost:5000/auth/google/callback
- Or your existing route if different (e.g., /api/auth/callback)
- Scopes to request:
openid email profile - Put values in
.env(see.env.example).
- Node.js and npm
- Python 3.8+
- PostgreSQL
- Chrome (for scraper functionality)
-
Clone the repository and navigate to the project root:
git clone https://github.com/yourusername/prop_pilot.git cd prop_pilot # All following commands assume you start in the root directory
-
Install frontend dependencies:
# From root directory: cd frontend npm install cd .. # Return to root
-
Install backend dependencies:
# From root directory: python -m venv venv # Create virtual environment # Activate virtual environment: # On Windows: .\venv\Scripts\activate # On macOS/Linux: source venv/bin/activate # Install dependencies: pip install -r requirements.txt
- Go to Google Cloud Console at https://console.cloud.google.com/
- Create a new project or select an existing one
- Enable the following APIs:
- Google+ API
- Google OAuth2 API
- Configure OAuth consent screen:
- Set up your app's name, user support email, and developer contact
- Add scopes: email, profile
- Add test users if in testing mode
- Create OAuth 2.0 credentials:
- Choose "Web application" as the application type
- Set the name of your OAuth 2.0 client
- Add authorized JavaScript origins:
http://localhost:5173 - Add authorized redirect URIs:
http://localhost:5173
- Copy the generated Client ID
-
Create a
.envfile in the root directory:# From root directory: touch .env # On macOS/Linux # OR echo. > .env # On Windows
Add the following content:
# Database Configuration DB_USERNAME=postgres DB_PASSWORD=your_password DB_NAME=prop_pilot_db # JWT Configuration JWT_SECRET_KEY=your_secret_key # Google OAuth Configuration GOOGLE_CLIENT_SECRET=your_client_secret GOOGLE_REDIRECT_URI=http://localhost:5173/api/auth/callback # Frontend Configuration VITE_API_URL=http://localhost:5000/api VITE_GOOGLE_CLIENT_ID=your_google_client_id
-
Install PostgreSQL database tools:
- macOS:
Postico 2 - Windows:
pgAdmin,DBeaver, orHeidiSQL
- macOS:
-
Create the database:
# From any directory (PostgreSQL command line): # Windows: psql -U postgres -d prop_pilot_db -h localhost -p 5432 # macOS: psql -U postgres CREATE DATABASE prop_pilot_db; \q
-
Initialize migrations:
# From root directory: cd backend # Windows: python -m flask db init python -m flask db migrate -m "Initial migration" python -m flask db upgrade # macOS: flask db init flask db migrate -m "Initial migration" flask db upgrade cd .. # Return to root
-
Start the backend server:
# From root directory: cd backend # Windows: python app.py # macOS: python3 app.py # The backend will be available at http://localhost:5000 # Keep this terminal window open and running
-
Open a new terminal window and start the frontend development server:
# From root directory: cd frontend npm run dev # The frontend will be available at http://localhost:5173 # Keep this terminal window open and running
-
(Optional) Seed the database:
# From root directory: cd scripts python seed.py cd .. # Return to root
Common issues and solutions:
- CORS Issues: Verify CORS configuration in backend/app.py
- Database Connection: Check credentials and permissions
- Google OAuth: Verify client ID and redirect URIs
- Security Headers: Check browser console for COOP warnings
For detailed error messages:
- Check browser console
- Review backend/logs directory
- Verify environment variables
The scraper can be run either through the Property List Page or manually:
-
Download ChromeDriver matching your Chrome version from Chrome for Testing
-
Place the ChromeDriver in
backend/services/scraper/ -
Update permissions if needed:
# From root directory: # On macOS/Linux: chmod +x backend/services/scraper/chromedriver
-
Run manually:
# From root directory: cd backend # Windows: python services/scraper/main.py # macOS: python3 services/scraper/main.py cd .. # Return to root