Date : 23/01/2026 15:51 Status : EN ATTENTE VALIDATION
Transformer NeedFinder en outil complet de détection d'opportunités :
| Source | API | Limite actuelle |
|---|---|---|
/r/{sub}/new.json?limit=100 |
~100 posts récents | |
| HackerNews | askstories.json + topstories.json |
~200 stories actuelles |
| Source | Fichier | Table requise |
|---|---|---|
| arXiv | collectors/arxiv.ts |
discoveries, discovery_sources |
| HuggingFace | collectors/huggingface.ts |
discoveries, discovery_sources |
| GitHub Trending | collectors/github-trending.ts |
discoveries, discovery_sources |
| Source | Type | API | Couverture |
|---|---|---|---|
| PubMed | Papers médicaux | NCBI E-utilities | Santé, pharma, bio |
| medRxiv/bioRxiv | Preprints santé | API REST | Santé/Bio avant peer-review |
| Nature News | Publications majeures | RSS/Scraping | Toutes sciences |
| ScienceDaily | Vulgarisation | RSS | Grand public |
| WHO News | Santé publique | RSS/API | Annonces OMS |
| ProductHunt | Startups/Produits | API GraphQL | Nouveaux services |
| SSRN | Papers sociales | RSS/API | Économie, droit, sciences sociales |
| Google Scholar | Papers tous domaines | SerpAPI/Scraping | Multi-domaines |
sources, posts, needs, mentions, need_mentions, detected_needs, raw_posts, collection_logs
discoveries, discovery_sources, need_discovery_matches
1.1 Reddit via Pullpush.io
// Nouveau endpoint avec paramètre since
POST /api/backfill/reddit
{
"since": "2025-07-23", // 6 mois
"subreddits": ["SomebodyMakeThis", "AppIdeas", ...]
}
// API Pullpush
https://api.pullpush.io/reddit/search/submission?subreddit={sub}&after={timestamp}&size=500
1.2 HackerNews via Algolia
// Nouveau endpoint
POST /api/backfill/hn
{
"since": "2025-07-23"
}
// API Algolia HN
https://hn.algolia.com/api/v1/search_by_date?tags=ask_hn&numericFilters=created_at_i>{timestamp}
2.1 Nouveaux subreddits par domaine
| Domaine | Subreddits |
|---|---|
| Santé | HealthIT, diabetes, ChronicPain, mentalhealth, Supplements, Biohackers |
| Finance | personalfinance, FinancialPlanning, povertyfinance, UKPersonalFinance, smallbusiness |
| Éducation | learnprogramming, languagelearning, GetStudying, HomeschoolRecovery, Teachers |
| Productivité | productivity, GetMotivated, DecidingToBeBetter, selfimprovement |
| Parents | Parenting, beyondthebump, Mommit, daddit |
| Seniors | AgingParents, eldercare, retirement |
| Accessibilité | disability, deaf, Blind, accessibility |
| Environnement | ZeroWaste, sustainability, homestead |
2.2 Nouveaux patterns de détection
const HEALTH_PATTERNS = [
/is there (a|an) app for (tracking|managing|monitoring)/i,
/how do (you|people) (manage|track|deal with)/i,
/wish (my doctor|there was a way)/i,
/frustrated with (my|the) (insurance|healthcare|medication)/i,
];
const FINANCE_PATTERNS = [
/is there (a|an) (app|tool|way) to (budget|track|save)/i,
/how do you (save|invest|budget)/i,
/looking for (a|an) (financial|budgeting|investment)/i,
];
// etc. pour chaque domaine
3.1 Créer les tables manquantes
-- Sources de découvertes
CREATE TABLE discovery_sources (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(50) UNIQUE NOT NULL, -- 'arxiv', 'huggingface', 'github'
description TEXT,
api_url TEXT,
last_collected_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Découvertes (papers, modèles, repos)
CREATE TABLE discoveries (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
source_id UUID REFERENCES discovery_sources(id),
external_id VARCHAR(255) NOT NULL,
external_url TEXT,
title TEXT NOT NULL,
description TEXT,
category VARCHAR(100),
tags TEXT[],
tech_stack TEXT[],
downloads INTEGER DEFAULT 0,
upvotes INTEGER DEFAULT 0,
impact_score INTEGER,
novelty_score INTEGER,
accessibility_score INTEGER,
published_at TIMESTAMPTZ,
last_seen_at TIMESTAMPTZ DEFAULT NOW(),
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(source_id, external_id)
);
-- Matching besoins ↔ découvertes
CREATE TABLE need_discovery_matches (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
need_id UUID REFERENCES needs(id),
discovery_id UUID REFERENCES discoveries(id),
match_score INTEGER, -- 0-100
match_reason TEXT,
is_validated BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(need_id, discovery_id)
);
-- Insérer les sources
INSERT INTO discovery_sources (name, description, api_url) VALUES
('arxiv', 'Papers scientifiques', 'https://export.arxiv.org/api/query'),
('huggingface', 'Modèles ML open source', 'https://huggingface.co/api'),
('github', 'Repos trending', 'https://api.github.com');
3.2 Étendre arXiv au-delà de l'informatique
const ARXIV_CATEGORIES = [
// Existants (CS)
'cs.AI', 'cs.LG', 'cs.CL', 'cs.CV', 'cs.CR', 'cs.DB', 'cs.SE',
// Santé
'q-bio.QM', // Quantitative Methods
'q-bio.NC', // Neurons and Cognition
'stat.ML', // Machine Learning (stats)
// Finance
'q-fin.PM', // Portfolio Management
'q-fin.RM', // Risk Management
'econ.GN', // General Economics
];
3.3 Modifier le scheduler
// scheduler.ts - Ajouter au cycle
import { collectArxiv } from '../collectors/arxiv';
import { collectHuggingFace } from '../collectors/huggingface';
import { collectGitHubTrending } from '../collectors/github-trending';
import { matchNeedsToDiscoveries } from '../services/matcher';
async function runFullCycle() {
// 1. Collect needs (Reddit + HN)
await runCollection();
// 2. Analyze needs (Ollama)
await runAnalysis();
// 3. Collect discoveries (arXiv + HF + GitHub)
await collectArxiv();
await collectHuggingFace();
await collectGitHubTrending();
// 4. Match needs to discoveries (Ollama)
await matchNeedsToDiscoveries();
}
Nouveau service matcher.ts
export async function matchNeedsToDiscoveries(): Promise<void> {
// 1. Récupérer les besoins non matchés (score > 50)
const needs = await sql`
SELECT * FROM needs
WHERE opportunity_score >= 50
AND id NOT IN (SELECT need_id FROM need_discovery_matches)
LIMIT 20
`;
// 2. Récupérer les découvertes récentes
const discoveries = await sql`
SELECT * FROM discoveries
WHERE created_at > NOW() - INTERVAL '30 days'
`;
// 3. Pour chaque besoin, demander à Ollama de trouver les découvertes pertinentes
for (const need of needs) {
const prompt = `
Besoin utilisateur: "${need.need_statement}"
Catégorie: ${need.category}
Découvertes récentes:
${discoveries.map(d => `- ${d.title}: ${d.description}`).join('\n')}
Quelles découvertes pourraient répondre à ce besoin ?
Répondre en JSON: [{"discovery_id": "...", "score": 0-100, "reason": "..."}]
`;
// Envoyer à ai-orchestrator
const matches = await analyzeWithOllama(prompt);
// Sauvegarder les matches
for (const match of matches) {
await sql`
INSERT INTO need_discovery_matches (need_id, discovery_id, match_score, match_reason)
VALUES (${need.id}, ${match.discovery_id}, ${match.score}, ${match.reason})
`;
}
}
}
Nouvelles pages
/discoveries - Liste des découvertes par source/matches - Besoins avec solutions potentielles/opportunities - Vue combinée (besoin + score + solution)Nouveaux endpoints API
GET /api/discoveries?source=arxiv&category=health&limit=50
GET /api/matches?minScore=70
GET /api/opportunities (besoins avec matches)
| Fichier | Action |
|---|---|
src/collectors/reddit.ts |
Ajouter subreddits multi-domaines |
src/collectors/hackernews.ts |
Pas de changement |
src/collectors/arxiv.ts |
Étendre catégories |
src/collectors/huggingface.ts |
Pas de changement |
src/collectors/github-trending.ts |
Pas de changement |
src/collectors/backfill.ts |
NOUVEAU - Pullpush + Algolia |
src/services/matcher.ts |
NOUVEAU - Matching IA |
src/cron/scheduler.ts |
Ajouter discoveries + matching |
src/index.ts |
Nouveaux endpoints |
migrations/003_discoveries.sql |
NOUVEAU - Tables discoveries |
| Phase | Complexité |
|---|---|
| 1. Backfill | Moyenne (API externes) |
| 2. Multi-domaines | Faible (config) |
| 3. Discoveries | Moyenne (tables + scheduler) |
| 4. Matching | Élevée (prompts IA) |
| 5. Dashboard | Faible (pages HTML) |