An open-source real estate marketplace. List properties, search and filter listings, and browse rich detail pages with photo galleries.
Built with Ruby on Rails 8 (API) and React + Vite + TypeScript (SPA), backed by PostgreSQL.
🌐 Live demo: https://openreal.getprixite.com
- 🔎 Search & filter listings by location, price range, bedrooms, bathrooms, property type and listing type (sale/rent)
- 🏡 Property detail pages with an image gallery and full specs
- 📝 List a property — authenticated users create, edit and delete their own listings
- 🖼️ Multi-image uploads per listing (Active Storage)
- ❤️ Favorites — save listings to your account
- 👤 Accounts — JWT-based signup / login
- 📊 My listings dashboard
| Layer | Technology |
|---|---|
| Backend | Ruby on Rails 8 (API-only), Puma, Active Storage |
| Frontend | React 18, Vite, TypeScript, Tailwind CSS, React Router, TanStack Query |
| Database | PostgreSQL 16 |
| Auth | JWT (bcrypt has_secure_password) |
| Tests | RSpec (request specs) |
| Linting | RuboCop + Brakeman (Ruby), ESLint + Prettier (TS) |
| CI/CD | GitHub Actions → Docker Compose on server |
| Deploy | Docker Compose, nginx, systemd, Let's Encrypt |
openreal/
├── backend/ # Rails 8 API-only app
├── frontend/ # React + Vite + TS SPA
├── deploy/ # nginx + systemd templates for the server
├── docker-compose.yml # local development
├── docker-compose.prod.yml # production (db + backend + web)
└── .github/workflows/ # CI (lint+test) and CD (deploy)
Requires Docker + Docker Compose.
git clone https://github.com/umairwaheed/openreal.git
cd openreal
cp .env.example .env # adjust secrets if you like
docker compose up --build- Frontend: http://localhost:5173
- API: http://localhost:3000/api
Seed sample data:
docker compose exec backend bin/rails db:seedBackend:
cd backend && bundle install && bin/rails db:setup && bin/rails sFrontend:
cd frontend && npm install && npm run dev| Method | Path | Auth | Description |
|---|---|---|---|
| POST | /api/auth/signup |
– | Create account |
| POST | /api/auth/login |
– | Log in, returns JWT |
| GET | /api/auth/me |
✓ | Current user |
| GET | /api/properties |
– | Search / filter listings |
| GET | /api/properties/:id |
– | Listing detail |
| POST | /api/properties |
✓ | Create listing |
| PATCH | /api/properties/:id |
✓ | Update own listing |
| DELETE | /api/properties/:id |
✓ | Delete own listing |
| POST | /api/properties/:id/images |
✓ | Attach images |
| GET | /api/me/properties |
✓ | My listings |
| GET | /api/favorites |
✓ | My favorites |
| POST | /api/properties/:id/favorite |
✓ | Save to favorites |
| DELETE | /api/properties/:id/favorite |
✓ | Remove from favorites |
# Backend
cd backend && bundle exec rubocop && bundle exec brakeman && bundle exec rspec
# Frontend
cd frontend && npm run lint && npm run format:check && npm run build