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.
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.
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.
[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) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| 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 |
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.
| 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 |
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'environnementpython -m unittest discover tests/ # tests
coverage run && coverage xml # tests + couverture (junittest.xml)
ruff format . && ruff check src/ # format + lint
mypy src/ # typage strictpre-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.
cp .env.example .env # puis renseigner POSTGRES_PASSWORD et DATABASE_URL
docker compose up -d # PostgreSQL 16, schรฉma chargรฉ depuis sql/schema.sqlL'application ne lit pas .env toute seule : set -a; . ./.env; set +a le charge dans
le shell.
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.