Recursivity
All projects
Open source

ohf@#k

A self-hosted news, markets, and OSINT dashboard

View on GitHub
LanguageTypeScript
InterfaceWeb
DeployDocker — NAS or Raspberry Pi
LicenseMIT
  • The overview tab: a composite mood score built from headlines, markets, and energy, cross-signal predictions with confidence, and a feed tagged by source.
    The overview tab: a composite mood score built from headlines, markets, and energy, cross-signal predictions with confidence, and a feed tagged by source.

ohf@#k puts markets and news on one screen: indices, futures, crude, retail gas, safe havens and treasuries alongside RSS headlines, Reddit, breaking-news clustering, prediction markets, and a set of geopolitical risk panels.

It is built for hardware you already own — a NAS, a Raspberry Pi, a spare box in a closet — and it fetches everything on a background schedule rather than per request. The panels stay warm, and the upstreams stay unbothered no matter how often you reload.

The dashboard has a point of view, and says so. The composite “mood” score is explicitly left-leaning and anti-incumbent, and the polarity is baked into the arithmetic rather than hidden behind a setting: falling markets score as good, rising energy prices score as good, and the keyword lists are frankly partisan.

That is documented at the top of the README rather than buried, because someone deploying it deserves to know before the numbers look broken. Everything else — markets, threats, prediction markets, the security and refugee panels — is stance-neutral, and the four functions that carry the bias are named so they can be edited or neutralised.

It boots with an empty .env

Every API key is optional. Each one you add lights up one more panel; each one you leave out disables exactly that panel and nothing else. There are no NEXT_PUBLIC_* variables and no build arguments, so one image is valid for every deployment and no key is ever inlined into the browser bundle. Change a value, docker compose up -d, done — no rebuild.

Sources that admit what they are

Roughly eighteen sources are polled in the background by a named Source in a registry. Each retains its last good value and flags itself stale on failure, rather than showing a zero that looks like data. /api/health reports per-source freshness, so “why is the safe-haven panel showing dashes?” is one curl away.

The unofficial ones are marked with a warning in the source table, along with the reasoning: that was a defensible trade-off for one person's private dashboard, and it is a different proposition once the code is public and every fork adds load. The advice in the README is to disable what you do not need and lengthen the cadences before adding instances.

Stack

FrameworkNext.js with TypeScript
FetchingNamed background sources on independent cadences, from 30 s to 24 h
AIClaude for headline sentiment, breaking-news summaries, and the prediction briefing — with a keyword fallback when no key is set
NotificationsWeb Push (VAPID) for breaking news
AuthOptional password gate; documented as required for anything outside a LAN
DeployDocker Compose, runtime-only configuration