People keep asking what LLMs "think" about the issues of the day. The honest answer is that it depends on which model you ask, when you ask it, and what it just read. Silicon Pulse turns that into something you can actually watch.
It puts a fixed set of survey questions to a panel of LLMs on a schedule and tracks how their answers move over time. Same questions, same wording, run again and again. You get a running record instead of a one-off screenshot, so you can see where the models line up, where they split, and how the picture shifts as new models ship.
Two things make it more than a quiz:
- It runs by itself. A cron job asks the questions, classifies the open-ended answers, and writes up the run. Nobody is in the loop nudging the results.
- It tests for news influence. Flagship models get asked each question twice: once cold with no context, and once with recent headlines (left, balanced, or right) pasted in front. The gap between those two answers is the interesting part.
Everything on the site is model output. It is not a human poll, and it is not advice. It is a mirror held up to the models themselves.
- A baseline pass asks every model each question with no extra context.
- The flagship anchors get a second pass per news feed, so you can compare a cold answer to a headline-primed one.
- Anchors are sampled a few times per question to get a distribution rather than a single answer; the wider pool answers once.
- Open-ended answers (like "most important issue") get sorted into themes by a cheap classifier.
The full write-up, including model selection and sampling, lives on the in-app methodology page.
- A Next.js dashboard: latest run snapshot, per-question distributions, longitudinal charts, model comparison, the model registry, and the methodology page.
- Supabase (Postgres) for surveys, runs, responses, news briefs, and digests.
- OpenRouter for the model calls, with all the knobs (caps, cadence, helper models) in
src/config/survey-config.json. - A news-brief builder (NewsAPI, with GDELT as a fallback) for the three feeds.
- A backfill script to seed the dashboard with past-dated runs.
This is not legal, medical, or electoral advice. See the in-app About page.
You need Node 20+, a Supabase project, and an OpenRouter key.
git clone https://github.com/MaxMLang/silicon-pulse.git
cd silicon-pulse
npm install
cp .env.local.example .env.local
# fill in the keysRun the SQL files in supabase/migrations/ in order (001 through 008) in the Supabase SQL editor. Migration 006 turns on row-level security (public read, writes only with the secret key). Skip it and the dashboard reads zero rows.
Keys: new Supabase projects give you a publishable key (sb_publishable_...) and a secret key (sb_secret_...). Both the new env names (NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY, SUPABASE_SECRET_KEY) and the old ones (NEXT_PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY) work.
Then:
npm run update-models # sync the OpenRouter roster + flagship anchors
npm run build-briefs # balanced / left / right news briefs
npm run run-survey # baseline + (anchors-only) informed conditions
npm run classify-priority-themes
npm run generate-run-digest # optional, uses a cheap author model
npm run dev # http://localhost:3000Or npm run full-run to do all of it in order.
Fills the dashboard with past dates. It stamps each run with its date, picks the anchor models that were live then, and pulls that day's real headlines for the news conditions. Run update-models first.
npm run backfill -- --dry-run # preview the dates, write nothing
npm run backfill # default: 30 days, one run every 3 days
npm run backfill -- --days 14 # custom window
npm run backfill -- --step 1 # daily instead of every 3 days
npm run backfill -- --from 2026-05-17 --to 2026-06-16 # explicit window (handy for chunking).github/workflows/survey-run.yml runs the full pipeline (survey, classify, digest) on a cron: Mondays and Thursdays at 09:00 UTC. You can also trigger it by hand from the Actions tab with "Run workflow", which skips the gate.
The only gate on scheduled runs is bootstrap: nothing runs until the runs table has at least one row, so trigger it manually once (or do a backfill) first. The job runs on Node 24.
Add these repository secrets under Settings > Secrets and variables > Actions:
| Secret | Required | What it is |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL |
yes | Supabase project URL |
SUPABASE_SECRET_KEY |
yes | Supabase secret key (sb_secret_...) |
OPENROUTER_API_KEY |
yes | model calls |
NEWS_API_KEY |
no | NewsAPI key for briefs; falls back to GDELT if unset |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY |
no | publishable/anon key |
Import the repo in Vercel, set NEXT_PUBLIC_SUPABASE_URL and the publishable/anon key (that's all the read-only site needs), and deploy. The data pipeline runs from GitHub Actions, not from Vercel.
silicon-pulse/
├── src/app/ # Next.js pages, including /methodology
├── src/components/ # UI
├── src/lib/ # types, Supabase client, queries, config loader, anchors
├── src/config/
│ ├── anchor-models.json # one flagship per lab, with dated cutover segments
│ └── survey-config.json # cost / cadence / model knobs in one place
├── scripts/ # update-models, build-briefs, run-survey, backfill, classify, digest
├── supabase/migrations/ # 001 through 008
└── scripts/full-run.sh
MIT, see LICENSE. News text and third-party APIs keep their own terms.
Built by MaxMLang.