Skip to content
Julien-haePublic

About

๐Ÿ  Real-time Swiss real estate alerts โ€” Faster than portals, smarter than Comparis, 10x cheaper than MieterPlus

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

ย 

History

79 Commits

Folders and files

Repository files navigation

FlatPulse ๐Ÿ โšก

Alertes immobiliรจres en temps rรฉel pour le marchรฉ suisse โ€” Plus rapide que les portails, plus intelligent que Comparis, 10x moins cher que MieterPlus.

CI Security License: MIT


Le problรจme

En Suisse, un bon appartement part en heures. Les locataires paient CHF 30+/mois pour MieterPlus (qui donne accรจs ร  23 annonces sur 863 ร  Zรผrich). Comparis agrรจge les portails, mais lentement et sans filtres intelligents.

La solution

FlatPulse scrape les agences directement ร  la source (Naef, Burger, Comptoir, etc.) pour dรฉtecter les annonces avant qu'elles n'apparaissent sur les portails. Un LLM gratuit extrait les donnรฉes structurรฉes des descriptions (machine ร  laver, animaux, balcon...), un moteur de matching score chaque annonce, et les notifications arrivent sur Telegram en < 3 minutes.


Architecture

[Sites d'agences]                [Utilisateurs]
  Naef, Burger,                    Telegram, Email
  Comptoir, ...                         โ†‘
       โ†“                               |
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚ Scrapers โ”‚โ”€โ”€โ†’โ”‚ Dedup โ”‚โ”€โ”€โ†’โ”‚ LLM     โ”‚โ”€โ”€โ†’โ”‚ Matching   โ”‚โ”€โ”€โ†’ Notifications
  โ”‚ httpx +  โ”‚   โ”‚ SHA-  โ”‚   โ”‚ Groq /  โ”‚   โ”‚ Hard+Soft  โ”‚
  โ”‚ parsel   โ”‚   โ”‚ 256   โ”‚   โ”‚ Gemini  โ”‚   โ”‚ Score 0-100โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ†“                          โ†“              โ†“
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚       PostgreSQL 16 (+ Redis 7, post-MVP)            โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ†“
  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  โ”‚           Prometheus + Grafana (monitoring)          โ”‚
  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Stack technique

Composant Technologie Pourquoi
Langage Python 3.14 ร‰cosystรจme scraping mature, async natif
Scraping httpx + parsel Async HTTP + parsing CSS/XPath rapide (lxml-based)
LLM Groq (Llama 3.3 70B), Gemini Flash Gratuit, rapide, fallback chain
Base de donnรฉes PostgreSQL 16 JSONB pour donnรฉes flexibles, GIN index
Cache dict en mรฉmoire (Redis 7 post-MVP) Rate limiting, dedup ; KISS d'abord
Notifications python-telegram-bot, aiosmtplib Telegram temps rรฉel, email fallback
Monitoring Prometheus + Grafana Mรฉtriques, dashboards, alertes
Logging logging (JSON structurรฉ) Debug en prod
Tests unittest Bibliothรจque standard, contract tests
Hosting Infomaniak VPS Lite Suisse, ~CHF 7/mois

ร‰tat du projet

Side project en cours de construction. Ce qui existe aujourd'hui : les scrapers de trois rรฉgies (Naef, Burger, Comptoir), le limiteur de dรฉbit, la dรฉduplication, le schรฉma PostgreSQL et la couche d'accรจs aux donnรฉes. L'enrichissement LLM, le matching, les notifications Telegram et le pipeline qui les relie sont dรฉcrits par les issues GitHub et pas encore รฉcrits : rien ne tourne de bout en bout.

Documentation

Question Oรน
Quoi construire, dans quel ordre, avec quels tests Les issues GitHub
Comment le systรจme est architecturรฉ docs/architecture.md
Comment scraper une rรฉgie prรฉcise docs/spike-agencies.md
Ce que les scrapers extraient vraiment docs/live-audit.md

Installation

Prรฉrequis : pyenv, Poetry et, pour la base locale, Docker.

make          # installe Python 3.14, l'environnement Poetry et les hooks pre-commit
make clean    # supprime l'environnement

Commandes

python -m unittest discover tests/   # tests
coverage run && coverage xml         # tests + couverture (junittest.xml)
ruff format . && ruff check src/     # format + lint
mypy src/                            # typage strict

pre-commit enchaรฎne poetry-check, ruff (format + lint), mypy et les tests ร  chaque commit ; la CI rejoue les mรชmes รฉtapes.

Les tests de tests/integration/ qui ont besoin d'un PostgreSQL sont ignorรฉs sans FLATPULSE_TEST_DATABASE_URL (la CI la fournit). L'audit en direct des rรฉgies (FLATPULSE_LIVE=1) interroge les vrais sites : voir docs/architecture.md ยง8.

Base de donnรฉes locale

cp .env.example .env        # puis renseigner POSTGRES_PASSWORD et DATABASE_URL
docker compose up -d        # PostgreSQL 16, schรฉma chargรฉ depuis sql/schema.sql

L'application ne lit pas .env toute seule : set -a; . ./.env; set +a le charge dans le shell.

Configuration

Les variables d'environnement, leurs valeurs par dรฉfaut et celles qui sont obligatoires sont dรฉcrites dans .env.example. La configuration est validรฉe au dรฉmarrage (flatpulse.config.Config) : une variable manquante ou invalide arrรชte le programme avec un message qui la nomme.

Licence

MIT

About

๐Ÿ  Real-time Swiss real estate alerts โ€” Faster than portals, smarter than Comparis, 10x cheaper than MieterPlus

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages