A static dashboard that pulls tech news (RSS), AI papers (arXiv API), and device reviews (RSS) on a schedule and displays them in one feed. No server, no database — scheduled scripts write JSON, a static page reads it.
tech-dashboard/
├── scripts/
│ ├── fetch-news.js RSS: tech news
│ ├── fetch-papers.js arXiv API: AI/ML papers
│ ├── fetch-reviews.js RSS: device reviews
│ ├── fetch-reddit.js Reddit's public .json endpoints
│ └── summarize.js optional: rewrites summaries with an LLM
├── public/
│ ├── index.html the dashboard itself (search + theme toggle built in)
│ └── data/ news.json, papers.json, reviews.json, reddit.json (generated)
└── .github/workflows/
├── update-data.yml refetches data every 6h and commits it
└── deploy-pages.yml deploys public/ to GitHub Pages on push
The dashboard now has: a card grid layout, a Latest strip (items from the last few hours), filters for category, source, date range, and hardware-only, a search box, save/bookmark with personal notes, a share button that copies a ready-to-post blurb, a ☐ theme toggle, and it quietly re-checks for new data every 5 minutes without a full page reload.
⚡ Hardware
badge and can be isolated with the "⚡ Hardware" filter pill. The keyword
list lives in HARDWARE_KEYWORDS near the top of the <script> block in
public/index.html — edit it freely to match what you actually care
about.localStorage, tied to that
one browser — it won't sync across devices, and clearing browser data will
clear it too.scripts/generate-digest.js turns the past 7 days of dashboard items into a
proper digest: an intro, highlights grouped by category with a one-line note
each, a closing line, and a parallel thread version (5-8 short numbered
posts) for X/Twitter or similar. A separate workflow
(.github/workflows/generate-digest.yml) runs this every Monday at 14:00
UTC, and you can also trigger it manually any time from the Actions tab.
Browse digests at public/digests.html on your deployed site (linked from
the main dashboard's "📰 Digests" button) — pick a week from the list, then
Copy as Markdown to paste straight into Substack, Buttondown, a blog
post, or a repo file, or Show thread version to copy something
tweet-shaped.
Like the summarizer, this uses Groq (free) by default, falling back to
Anthropic if that key is set instead, and falls back further to a
rule-based digest (using existing summaries, no new writing) if neither key
is set — it never fails to produce something, it just gets better prose
with a key. Same secrets as the summarizer (GROQ_API_KEY /
ANTHROPIC_API_KEY) — no extra setup needed if you already added one for
the "why it matters" notes.
To try it locally: npm run digest (writes into public/digests/). To
force a fresh one on GitHub right now: Actions tab → Generate Weekly
Digest → Run workflow.
Sample placeholder data ships in public/data/ so the page renders
immediately — run the fetch scripts (below) to replace it with live data.
npm install
npm run fetch:all # pulls live news, papers, and reviews into public/data/
npm run serve # serves public/ at http://localhost:8080
(npm run serve uses http-server via npx — no need to install it globally.)
FEEDS array in scripts/fetch-news.js and
scripts/fetch-reviews.js. Any RSS/Atom feed URL works — most sites expose
one at /feed, /rss, or /rss.xml even if it's not linked in the nav.CATEGORIES array in scripts/fetch-papers.js.
See the arXiv category taxonomy for
the full list (e.g. cs.CV for computer vision, stat.ML for stats/ML).SUBREDDITS array in scripts/fetch-reddit.js. Also
change the USER_AGENT string to include your actual Reddit username —
Reddit rate-limits generic/default user agents more aggressively.<style> block of
public/index.html — colors are defined once as CSS variables at the top
(a second set under :root[data-theme="light"] covers light mode).By default, summaries are the raw excerpt from each RSS feed or API, and
there's no "why it matters" note. scripts/summarize.js can generate both
using an LLM — it tries providers in this order, using whichever key is set:
Option A — Groq (free, recommended)
export GROQ_API_KEY=gsk_... before running
npm run fetch:all (or npm run summarize alone, to re-process existing
data).GROQ_API_KEY, paste the key.
The workflow already passes it through.Groq's free tier (roughly 30 requests/minute at the time of writing) is comfortably enough for a personal dashboard refreshing every few hours.
Option B — Anthropic (paid, used only if no Groq key is set)
Same steps as above but with an ANTHROPIC_API_KEY from the
Anthropic Console — this uses
paid API credits, usually a fraction of a cent per article with the small
model this script uses.
If neither key is set, scripts/summarize.js detects that and skips itself
— everything else keeps working with the raw excerpts and no "why it
matters" notes.
Option A — GitHub Pages (recommended)
deploy-pages.yml workflow will publish public/ on every
push to main.update-data.yml workflow refetches your sources every 6
hours and commits the new JSON, which triggers a redeploy automatically.workflow_dispatch).Option B — Netlify / Vercel / Cloudflare Pages
Connect the repo, set the publish directory to public, and it will deploy
on every push. Add the update-data.yml workflow as-is — it commits fresh
JSON to the repo, and your host's own auto-deploy picks it up.
Ideas, roughly in order of effort:
summary through an LLM
API call to get a tighter 1–2 sentence summary instead of the raw RSS
excerpt.fetch-reddit.js
using Reddit's public .json endpoints) and a matching filter pill in
index.html.localStorage and
dim items you've already opened.allItems by title/summary in
the existing render() function.Every source here uses RSS or a public API — not HTML scraping — because
feeds are explicitly meant for this, are far more stable, and avoid ToS gray
areas. If you add a source with no feed or API, check its robots.txt and
terms of service before scraping its HTML, and keep your fetch frequency low
(every few hours is plenty for a news dashboard).
7 commits
HTML
58.8%
JavaScript
41.2%
A static dashboard that pulls tech news (RSS), AI papers (arXiv API), and device reviews (RSS) on a schedule and displays them in one feed. No server, no database — scheduled scripts write JSON, a static page reads it.
tech-dashboard/
├── scripts/
│ ├── fetch-news.js RSS: tech news
│ ├── fetch-papers.js arXiv API: AI/ML papers
│ ├── fetch-reviews.js RSS: device reviews
│ ├── fetch-reddit.js Reddit's public .json endpoints
│ └── summarize.js optional: rewrites summaries with an LLM
├── public/
│ ├── index.html the dashboard itself (search + theme toggle built in)
│ └── data/ news.json, papers.json, reviews.json, reddit.json (generated)
└── .github/workflows/
├── update-data.yml refetches data every 6h and commits it
└── deploy-pages.yml deploys public/ to GitHub Pages on push
The dashboard now has: a card grid layout, a Latest strip (items from the last few hours), filters for category, source, date range, and hardware-only, a search box, save/bookmark with personal notes, a share button that copies a ready-to-post blurb, a ☐ theme toggle, and it quietly re-checks for new data every 5 minutes without a full page reload.
⚡ Hardware
badge and can be isolated with the "⚡ Hardware" filter pill. The keyword
list lives in HARDWARE_KEYWORDS near the top of the <script> block in
public/index.html — edit it freely to match what you actually care
about.localStorage, tied to that
one browser — it won't sync across devices, and clearing browser data will
clear it too.scripts/generate-digest.js turns the past 7 days of dashboard items into a
proper digest: an intro, highlights grouped by category with a one-line note
each, a closing line, and a parallel thread version (5-8 short numbered
posts) for X/Twitter or similar. A separate workflow
(.github/workflows/generate-digest.yml) runs this every Monday at 14:00
UTC, and you can also trigger it manually any time from the Actions tab.
Browse digests at public/digests.html on your deployed site (linked from
the main dashboard's "📰 Digests" button) — pick a week from the list, then
Copy as Markdown to paste straight into Substack, Buttondown, a blog
post, or a repo file, or Show thread version to copy something
tweet-shaped.
Like the summarizer, this uses Groq (free) by default, falling back to
Anthropic if that key is set instead, and falls back further to a
rule-based digest (using existing summaries, no new writing) if neither key
is set — it never fails to produce something, it just gets better prose
with a key. Same secrets as the summarizer (GROQ_API_KEY /
ANTHROPIC_API_KEY) — no extra setup needed if you already added one for
the "why it matters" notes.
To try it locally: npm run digest (writes into public/digests/). To
force a fresh one on GitHub right now: Actions tab → Generate Weekly
Digest → Run workflow.
Sample placeholder data ships in public/data/ so the page renders
immediately — run the fetch scripts (below) to replace it with live data.
npm install
npm run fetch:all # pulls live news, papers, and reviews into public/data/
npm run serve # serves public/ at http://localhost:8080
(npm run serve uses http-server via npx — no need to install it globally.)
FEEDS array in scripts/fetch-news.js and
scripts/fetch-reviews.js. Any RSS/Atom feed URL works — most sites expose
one at /feed, /rss, or /rss.xml even if it's not linked in the nav.CATEGORIES array in scripts/fetch-papers.js.
See the arXiv category taxonomy for
the full list (e.g. cs.CV for computer vision, stat.ML for stats/ML).SUBREDDITS array in scripts/fetch-reddit.js. Also
change the USER_AGENT string to include your actual Reddit username —
Reddit rate-limits generic/default user agents more aggressively.<style> block of
public/index.html — colors are defined once as CSS variables at the top
(a second set under :root[data-theme="light"] covers light mode).By default, summaries are the raw excerpt from each RSS feed or API, and
there's no "why it matters" note. scripts/summarize.js can generate both
using an LLM — it tries providers in this order, using whichever key is set:
Option A — Groq (free, recommended)
export GROQ_API_KEY=gsk_... before running
npm run fetch:all (or npm run summarize alone, to re-process existing
data).GROQ_API_KEY, paste the key.
The workflow already passes it through.Groq's free tier (roughly 30 requests/minute at the time of writing) is comfortably enough for a personal dashboard refreshing every few hours.
Option B — Anthropic (paid, used only if no Groq key is set)
Same steps as above but with an ANTHROPIC_API_KEY from the
Anthropic Console — this uses
paid API credits, usually a fraction of a cent per article with the small
model this script uses.
If neither key is set, scripts/summarize.js detects that and skips itself
— everything else keeps working with the raw excerpts and no "why it
matters" notes.
Option A — GitHub Pages (recommended)
deploy-pages.yml workflow will publish public/ on every
push to main.update-data.yml workflow refetches your sources every 6
hours and commits the new JSON, which triggers a redeploy automatically.workflow_dispatch).Option B — Netlify / Vercel / Cloudflare Pages
Connect the repo, set the publish directory to public, and it will deploy
on every push. Add the update-data.yml workflow as-is — it commits fresh
JSON to the repo, and your host's own auto-deploy picks it up.
Ideas, roughly in order of effort:
summary through an LLM
API call to get a tighter 1–2 sentence summary instead of the raw RSS
excerpt.fetch-reddit.js
using Reddit's public .json endpoints) and a matching filter pill in
index.html.localStorage and
dim items you've already opened.allItems by title/summary in
the existing render() function.Every source here uses RSS or a public API — not HTML scraping — because
feeds are explicitly meant for this, are far more stable, and avoid ToS gray
areas. If you add a source with no feed or API, check its robots.txt and
terms of service before scraping its HTML, and keep your fetch frequency low
(every few hours is plenty for a news dashboard).
7 commits
HTML
58.8%
JavaScript
41.2%