Skip to content

Repository files navigation

MissionPulse

Extension Chrome pour freelances tech. Feed de missions centralisé avec scoring IA et analyse TJM.

Votre radar freelance. 4 plateformes distribuées par défaut, un seul panneau, scoré pour vous.

Monorepo Structure

pulse/
├── apps/
│ ├── extension/ # Extension Chrome (Svelte 5 + Vite + MV3)
│ ├── landing/ # Landing page statique (missionpulse.app)
│ └── dashboard/ # Dashboard connecte optionnel
├── packages/
│ ├── design/ # Tokens et reference design system
│ ├── domain/ # Types et logique metier partagee
│ ├── tsconfig/ # Shared TypeScript config
│ └── ui/ # Composants UI partages
├── turbo.json # Turborepo pipeline
└── pnpm-workspace.yaml

Features

  • Feed centralisé — Agrège les missions des plateformes incluses au build
  • Scoring IA — Gemini Nano (Chrome built-in AI) analyse la pertinence sémantique
  • Scoring multi-critères — Stack, TJM, localisation, remote, séniorité, urgence (startDate)
  • Dashboard TJM — Tendances du taux journalier par stack et par source
  • Déduplication intelligente — Fusionne les missions en préférant les sources directes (CherryPick > LeHibou > Hiway/Collective > Free-Work), détecte les proxy clients, URL normalisée avec validation de chemin
  • Scan parallèle — Connecteurs inclus lancés avec un pool de 3
  • Freemium — Socle gratuit; Premium à 10 € TTC/an pour le multi-compte et l'assistance IA locale de formulaire
  • Smart notifications — Alertes configurables par stack + TJM + score
  • Comparaison — Comparez jusqu'à 3 missions côte à côte
  • Export — JSON, CSV, Markdown avec label de filtres appliqués
  • Favoris & masquage — Bookmark ou cache des missions
  • Offline — Fonctionne sans réseau grâce au cache local (IndexedDB + chrome.storage)
  • Raccourcis clavier — Navigation rapide sans quitter le clavier
  • Backup & Restore — Export/import du profil et des données
  • Local-first — Scraping et IA dans Chrome; dashboard connecté optionnel et autorité d'abonnement côté serveur

Plateformes supportées

PlateformeStatusNotes
Free-Work✅ OpérationnelAPI publique, header Accept-Language: fr requis
LeHibou✅ OpérationnelSession cookie requise
Hiway✅ OpérationnelAPI Supabase publique
Collective⏸️ Exclu du build par défautConnecteur disponible dans le catalogue
Cherry Pick✅ OpérationnelSession cookie requise
Malt⏸️ Exclu du build par défautConnecteur disponible dans le catalogue

Compatibilité navigateurs

NavigateurStatus
Chrome✅ Testé
Brave✅ Compatible
Edge✅ Compatible
Arc✅ Compatible
Dia✅ Compatible (fix Accept-Language)

Quick Start

# Prérequis: Node.js >= 22, pnpm >= 10
pnpm install
pnpm dev:local # Supabase local + variables .env.local + dev servers
pnpm test# Tests unitaires
pnpm build # Build extension

Inclure / exclure des connecteurs au build

Certains connecteurs peuvent être instables (DOM cassé, faux positifs). Vous pouvez choisir à build-time quels connecteurs embarquer dans le package. Les connecteurs exclus disparaissent du host_permissions du manifest, du catalogue UI, du registry scanner, et des réglages par défaut.

Fichier de config (apps/extension/connectors.config.json, versionné) — source de vérité par défaut :

{ "exclude": ["malt", "collective"] }

Variables d'environnement (override, l'env gagne sur le fichier) :

# Exclure à la volée
CONNECTORS_EXCLUDE=malt,collective pnpm build
# Ou n'inclure que certains connecteurs (les autres sont exclus)
CONNECTORS_INCLUDE=free-work,lehibou pnpm build

Résolution : CONNECTORS_INCLUDE > include du fichier > CONNECTORS_EXCLUDE > exclude du fichier > tout inclure. En dev et test le fichier est ignoré (le catalogue complet reste visible pour des assertions déterministes) ; seules les variables d'environnement s'appliquent.

Détails : apps/extension/src/models/connector-build-config.model.md.

Tech Stack

CoucheTechnologieVersion
UISvelte 5 (runes)^5.x
StylingTailwindCSS 4 (CSS-first)^4.x
StateSvelte 5 runes ($state, $derived, $effect)^5.x
LanguageTypeScript (strict)^5.x
BuildVite + @crxjs/vite-plugin^6.x
MonorepoTurborepo^2.x
TestingVitest + Playwrightlatest
RuntimeChrome Extension Manifest V3MV3
IAGemini Nano (Chrome built-in AI)
ValidationZod^3.23
IconsLucide Svelte^0.460

Architecture

Functional Core & Imperative Shell (FC&IS) — le code métier pur est séparé des side effects.

apps/extension/src/lib/
├── core/ # FONCTIONS PURES — zéro I/O, zéro async
│ ├── scoring/ # Relevance, final-score (fusion), dedup (multi-field), notification-filter, sort
│ ├── connectors/ # Parsers purs (HTML/JSON → Mission[])
│ ├── types/ # Types + barrel exports (index.ts)
│ ├── errors/ # Result<T,E> + erreurs typées
│ ├── export/ # Formatage export (JSON/CSV/MD)
│ └── ...
│
└── shell/ # I/O, async, orchestration
├── connectors/ # Catalogue filtré au build (fetch + cookies + declarativeNetRequest)
├── scan/ # Scanner parallèle (pool de 3)
├── ai/ # Gemini Nano scoring sémantique
├── storage/ # IndexedDB, chrome.storage, caches
├── facades/ # Feed controller, settings facade
└── ...

Règle fondamentale : Shell → Core. Core ne connaît pas Shell.

UI (Atomic Design)

apps/extension/src/ui/
├── atoms/ # Button, Badge, Chip, Toast, Skeleton, ConnectionIndicator
├── molecules/ # MissionCard, SearchInput, LastScanInfo, ConnectorStatus
├── organisms/ # MissionFeed, FilterBar, ProfileSection, ScanSettings, MissionComparison, DangerZone
├── templates/ # FeedLayout, SettingsLayout, OnboardingLayout
└── pages/ # FeedPage, TJMPage, SettingsPage, OnboardingPage

State (Svelte 5 runes)

ModuleFichierRôle
App Navigationapp-navigation.svelte.tsRouting, transitions, onboarding
Feedfeed.svelte.tsMissions, recherche, filtrage
Feed Pagefeed-page.svelte.tsÉtat complet du FeedPage (seen, favoris, filtres, comparaison)
Settingssettings-page.svelte.tsProfil, export, backup, reset
Connectionconnection.svelte.tsDétection réseau
Toasttoast.svelte.tsNotifications UI

Development

pnpm dev:local # Supabase local + dev server avec mocks Chrome
pnpm dev # Dev server seul, sans démarrer Supabase
pnpm supabase:start # Démarre Supabase local (Docker) + active les passkeys locales
pnpm dev:env # Écrit apps/landing/.env.local et apps/dashboard/.env.local
pnpm supabase:status # Affiche les URLs/keys locales
pnpm supabase:reset # Rejoue les migrations + supabase/seed.sql
pnpm supabase:stop # Arrête la stack Supabase
pnpm test# Tests unitaires
pnpm test:watch # Watch mode
pnpm test:coverage # Coverage (seuil 70% sur core/)
pnpm test:e2e # Playwright E2E
pnpm typecheck # TypeScript strict
pnpm lint # ESLint

Supabase local est configuré dans apps/landing/supabase/. Les migrations existantes sont appliquées par le CLI, puis pnpm dev:env récupère les clés locales via supabase status et écrit les .env.local ignorés par Git pour apps/landing et apps/dashboard.

Les passkeys locales utilisent localhost comme relying party ID. Le script pnpm supabase:start relance le conteneur Auth local avec les variables WebAuthn nécessaires, car le CLI Supabase ne les injecte pas encore toutes depuis apps/landing/supabase/config.toml.

Dev Panel

Ctrl+Shift+D ouvre le panneau de dev : injection de missions mock, toggle états, logs bridge.

Documentation

Chrome Web Store

Assets disponibles

apps/extension/store-assets/
├── screenshot-1-feed.png # 1280×800 — Feed avec missions scorées
├── screenshot-2-tjm.png # 1280×800 — Dashboard TJM
├── screenshot-3-privacy.png # 1280×800 — Architecture local-first
├── promo-tile-440x280.png # 440×280 — Tile promotionnelle
└── *.svg # Sources éditables

Description courte (132 car.)

Radar freelance : 4 plateformes par défaut, scoring IA, analyse TJM. Local-first, gratuit avec Premium annuel optionnel.

Landing page

apps/landing/ — site statique déployé sur missionpulse.app. L'URL Chrome Store est configurable dans config.js.

Contributing

  • Conventional commits : feat:, fix:, refactor:, test:, docs:, chore:
  • FC&IS strict : jamais d'import shell depuis core
  • Svelte 5 only : runes, pas de stores, pas de Svelte 4
  • TypeScript strict : pas de any
  • Tests : toute feature core a ses tests purs (sans mocks)
  • Guide contributeur : .github/CONTRIBUTING.md

License

MIT

About

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages