<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Crene</title>
    <description>The latest articles on DEV Community by Crene (@crene).</description>
    <link>https://dev.to/crene</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3759450%2F0bc6358c-7fbf-481d-bd54-592afd761394.jpg</url>
      <title>DEV Community: Crene</title>
      <link>https://dev.to/crene</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/crene"/>
    <language>en</language>
    <item>
      <title>I track 420 prediction sources with AI. Here's the open-source framework.</title>
      <dc:creator>Crene</dc:creator>
      <pubDate>Sun, 08 Feb 2026 04:51:18 +0000</pubDate>
      <link>https://dev.to/crene/i-track-420-prediction-sources-with-ai-heres-the-open-source-framework-1h5e</link>
      <guid>https://dev.to/crene/i-track-420-prediction-sources-with-ai-heres-the-open-source-framework-1h5e</guid>
      <description>&lt;p&gt;Everyone makes predictions. Almost nobody tracks them.&lt;br&gt;
Elon Musk has said "full self-driving next year" five years in a row. Jim Cramer's stock picks are famously inverse-correlated with outcomes. Media outlets make bold forecasts and quietly move on when they're wrong.&lt;br&gt;
I built Crene — a platform that uses 4 LLMs (Claude, GPT-4, Gemini, Grok) to track predictions from 420+ sources across tech, finance, politics, and geopolitics. Today I'm open-sourcing the core framework.&lt;br&gt;
The problem&lt;br&gt;
There's no standard infrastructure for prediction tracking. LangChain exists for agents. HuggingFace exists for models. Supabase exists for backends. But nothing exists for:&lt;br&gt;
"Who predicted what, when did they say it, and were they right?"&lt;br&gt;
That's what Signal Tracker solves.&lt;br&gt;
Install&lt;br&gt;
bashpip install signal-tracker&lt;br&gt;
Zero dependencies. Stdlib only. Python 3.10+.&lt;br&gt;
5-minute walkthrough&lt;br&gt;
Track sources and claims&lt;br&gt;
pythonfrom signal_tracker import SignalTracker&lt;br&gt;
from datetime import date&lt;/p&gt;

&lt;p&gt;tracker = SignalTracker()&lt;/p&gt;

&lt;h1&gt;
  
  
  Add sources
&lt;/h1&gt;

&lt;p&gt;elon = tracker.add_source("Elon Musk", source_type="person", category="tech")&lt;br&gt;
cramer = tracker.add_source("Jim Cramer", source_type="person", category="finance")&lt;br&gt;
imf = tracker.add_source("IMF", source_type="institution", category="economics")&lt;/p&gt;

&lt;h1&gt;
  
  
  Add predictions
&lt;/h1&gt;

&lt;p&gt;tracker.add_claim(&lt;br&gt;
    source=elon,&lt;br&gt;
    text="Tesla will achieve full self-driving by end of 2025",&lt;br&gt;
    target_date=date(2025, 12, 31),&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;tracker.add_claim(&lt;br&gt;
    source=cramer,&lt;br&gt;
    text="Netflix will hit $800 by Q2 2025",&lt;br&gt;
    target_date=date(2025, 6, 30),&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;tracker.add_claim(&lt;br&gt;
    source=imf,&lt;br&gt;
    text="Global GDP growth will reach 3.2% in 2025",&lt;br&gt;
    target_date=date(2025, 12, 31),&lt;br&gt;
)&lt;br&gt;
Verify when outcomes are known&lt;br&gt;
pythontracker.verify(claim1, outcome="wrong", reasoning="FSD not achieved by deadline")&lt;br&gt;
tracker.verify(claim2, outcome="correct", reasoning="Netflix reached $820 in May")&lt;br&gt;
tracker.verify(claim3, outcome="partial", reasoning="GDP grew 2.9%, close but below target")&lt;br&gt;
Build leaderboards&lt;br&gt;
pythonboard = tracker.leaderboard(min_claims=3)&lt;/p&gt;

&lt;p&gt;for entry in board.top_accurate:&lt;br&gt;
    print(f"{entry.rank}. {entry.source.name}: {entry.score.accuracy_score}%")&lt;/p&gt;

&lt;h1&gt;
  
  
  Also available:
&lt;/h1&gt;

&lt;p&gt;board.worst_accurate    # Bottom performers&lt;br&gt;
board.biggest_risers    # Improving fast&lt;br&gt;
board.biggest_fallers   # Getting worse&lt;br&gt;
board.notable_wrongs    # High-profile misses&lt;br&gt;
The scoring system&lt;br&gt;
Accuracy scoring&lt;br&gt;
Simple percentage-based accuracy, but with nuance:&lt;/p&gt;

&lt;p&gt;Partial correctness weighting: Configurable (default 0.5 — a partial hit counts as half)&lt;br&gt;
Minimum claim threshold: Sources need at least 3 resolved claims for a meaningful score&lt;br&gt;
Time-windowed scoring: Calculate accuracy for 30d, 90d, 12mo, and all-time separately&lt;/p&gt;

&lt;p&gt;pythonwindows = tracker.accuracy_scorer.score_windowed(claims, source_id=source.id)&lt;br&gt;
for period, snapshot in windows.items():&lt;br&gt;
    print(f"  {period}: {snapshot.accuracy_score}%")&lt;br&gt;
Recency-weighted scoring&lt;br&gt;
More recent predictions matter more. Uses exponential decay with a configurable half-life:&lt;br&gt;
pythonfrom signal_tracker.scoring import AccuracyConfig&lt;/p&gt;

&lt;p&gt;config = AccuracyConfig(recency_half_life_days=90)&lt;br&gt;
tracker = SignalTracker(accuracy_config=config)&lt;br&gt;
A prediction from last week has 8x more influence than one from a year ago. This catches sources who were historically good but have recently fallen off.&lt;br&gt;
Claim quality scoring&lt;br&gt;
Not all predictions are created equal. "Things will get better eventually" is not the same as "Bitcoin will reach $150k by Q4 2025."&lt;br&gt;
The quality scorer rates each claim 0-100 based on:&lt;br&gt;
FactorWeightWhat it checksTime-bound30%Has a specific deadline?Measurable30%Has numeric targets?Falsifiable20%Clear success/failure criteria?Recency20%How recent is the claim?&lt;br&gt;
pythonfrom signal_tracker import QualityScorer&lt;/p&gt;

&lt;p&gt;scorer = QualityScorer()&lt;br&gt;
score = scorer.score(claim)  # 87.5 — highly trackable&lt;/p&gt;

&lt;h1&gt;
  
  
  Filter your dataset to meaningful claims only
&lt;/h1&gt;

&lt;p&gt;high_quality = [c for c in claims if scorer.is_high_quality(c)]&lt;br&gt;
The scorer uses regex patterns to detect prediction language, dollar amounts, percentages, date references, and hedge words. Vague language ("might", "could", "eventually") gets penalized.&lt;br&gt;
Extracting predictions from text&lt;br&gt;
This is where it gets interesting. Feed it a transcript, article, or tweet and it pulls out the predictions.&lt;br&gt;
Rule-based (fast, no API calls)&lt;br&gt;
pythontext = """&lt;br&gt;
In his latest interview, the CEO predicted that revenue would &lt;br&gt;
exceed $10 billion by Q2 2025. He also forecast that the company &lt;br&gt;
would reach 100 million users within 18 months.&lt;br&gt;
"""&lt;/p&gt;

&lt;p&gt;claims = tracker.extract_claims(text, source=ceo)&lt;br&gt;
for claim in claims:&lt;br&gt;
    print(f"  {claim.text}")&lt;br&gt;
    print(f"  Target: {claim.target_date}")&lt;br&gt;
    print(f"  Category: {claim.category}")&lt;br&gt;
    print(f"  Quality: {claim.quality_score}")&lt;br&gt;
LLM-powered (more accurate)&lt;br&gt;
Bring your own LLM function:&lt;br&gt;
pythonimport anthropic&lt;/p&gt;

&lt;p&gt;client = anthropic.Anthropic()&lt;/p&gt;

&lt;p&gt;def my_llm(prompt: str) -&amp;gt; str:&lt;br&gt;
    response = client.messages.create(&lt;br&gt;
        model="claude-sonnet-4-20250514",&lt;br&gt;
        max_tokens=1000,&lt;br&gt;
        messages=[{"role": "user", "content": prompt}],&lt;br&gt;
    )&lt;br&gt;
    return response.content[0].text&lt;/p&gt;

&lt;p&gt;tracker = SignalTracker(llm_fn=my_llm)&lt;br&gt;
claims = tracker.extract_claims(transcript, source=analyst, use_llm=True)&lt;br&gt;
The LLM integration is completely model-agnostic. Any function with signature (str) -&amp;gt; str works — OpenAI, Anthropic, Gemini, local models, whatever.&lt;br&gt;
Multi-model consensus verification&lt;br&gt;
This is how we verify claims in production at Crene. Instead of trusting one model, run multiple:&lt;br&gt;
pythontracker.verify_with_consensus(claim, [&lt;br&gt;
    {"outcome": "correct", "verifier": "ai:claude", "confidence": 0.9},&lt;br&gt;
    {"outcome": "correct", "verifier": "ai:gpt-4", "confidence": 0.85},&lt;br&gt;
    {"outcome": "wrong", "verifier": "ai:gemini", "confidence": 0.6},&lt;br&gt;
])&lt;/p&gt;

&lt;h1&gt;
  
  
  Result: "correct" — weighted consensus wins
&lt;/h1&gt;

&lt;p&gt;Outcomes are weighted by confidence scores. If three models agree with high confidence and one disagrees with low confidence, the consensus still holds.&lt;br&gt;
Tamper detection&lt;br&gt;
Every claim gets a SHA-256 hash at creation time:&lt;br&gt;
pythonclaim = tracker.add_claim(source, "Bitcoin to $200k by 2025")&lt;br&gt;
print(claim.content_hash)  # a1b2c3d4...&lt;/p&gt;

&lt;h1&gt;
  
  
  Later, verify nothing was changed
&lt;/h1&gt;

&lt;p&gt;claim.verify_integrity()  # True&lt;/p&gt;

&lt;h1&gt;
  
  
  If someone modifies the text...
&lt;/h1&gt;

&lt;p&gt;claim.text = "I never said that"&lt;br&gt;
claim.verify_integrity()  # False — hash mismatch&lt;br&gt;
Persistence&lt;br&gt;
JSON (simple)&lt;br&gt;
pythontracker.save("my_tracker.json")&lt;br&gt;
tracker = SignalTracker.load("my_tracker.json")&lt;br&gt;
SQLite (for larger datasets)&lt;br&gt;
pythonfrom signal_tracker.storage import SQLiteBackend&lt;/p&gt;

&lt;p&gt;backend = SQLiteBackend("tracker.db")&lt;br&gt;
backend.save_source(source)&lt;br&gt;
backend.save_claim(claim)&lt;/p&gt;

&lt;h1&gt;
  
  
  Query
&lt;/h1&gt;

&lt;p&gt;all_claims = backend.list_claims(source_id="elon-musk")&lt;br&gt;
Architecture&lt;br&gt;
signal-tracker/&lt;br&gt;
├── tracker.py       # SignalTracker — main interface&lt;br&gt;
├── models.py        # Source, Claim, Verification, ScoreSnapshot&lt;br&gt;
├── scoring.py       # AccuracyScorer, QualityScorer&lt;br&gt;
├── extractors.py    # ClaimExtractor (rules + LLM)&lt;br&gt;
├── leaderboard.py   # Leaderboard engine&lt;br&gt;
└── storage.py       # SQLiteBackend&lt;br&gt;
Design principles:&lt;/p&gt;

&lt;p&gt;Zero required dependencies — stdlib only for core&lt;br&gt;
Bring your own LLM — any provider works&lt;br&gt;
Pluggable storage — JSON, SQLite, or build your own&lt;br&gt;
Plain dataclasses — no ORM dependency anywhere&lt;/p&gt;

&lt;p&gt;What's next&lt;br&gt;
The roadmap depends on what the community wants:&lt;/p&gt;

&lt;p&gt;v0.2 — REST API server (FastAPI)&lt;br&gt;
v0.3 — Auto-ingest from RSS, Twitter, YouTube transcripts&lt;br&gt;
v0.4 — Dashboard UI (React)&lt;br&gt;
v0.5 — Prediction market integrations (Polymarket, Kalshi)&lt;br&gt;
v0.6 — Blockchain anchoring for tamper-proof records&lt;/p&gt;

&lt;p&gt;Try it&lt;br&gt;
bashpip install signal-tracker&lt;/p&gt;

&lt;p&gt;GitHub: github.com/Creneinc/signal-tracker&lt;br&gt;
PyPI: pypi.org/project/signal-tracker&lt;br&gt;
Production version: crene.com (see the Signals tab)&lt;/p&gt;

&lt;p&gt;40 tests passing. MIT licensed. Contributions welcome.&lt;br&gt;
The framework is free. The data is the moat.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
