← All work
News platform · Hebrew NLP · Data design Product, design & full-stack engineering

HaMapa

Every Israeli news story on one political map: who covered it, from which side, and how they headlined it.

hamapa · /
HaMapa home page — the most-covered story of the day with its red-to-blue coverage bar and three headlines from left, center and right outlets
Screens use the app's built-in sample dataset. The headlines are illustrative.
Overview

HaMapa is Ground News for Israel, in Hebrew.

/story/:id
Story page — sticky coverage panel with outlet count, left/center/right split and lean gauge; headlines grouped by side with a segmented control
The coverage panel on the right, every outlet's headline grouped by side.
The story page

One event. Every headline.

Each story gets a coverage panel.

◇Coverage panel: count, split, lean in words
◇Segmented control: Left · Center · Right · All
◇Every outlet's headline, in its own words
◇Read the summary here, then open the original
12 outlets on one story Lean in words, not just color Links to every original
/ · blindspots
Blindspots — two columns: stories the left isn't reporting and stories the right isn't reporting
Blindspots: stories only one side of the map is covering.
Blindspots

What one side isn't telling you.

The home page calls out stories only one side is reporting.

◇Two columns: left blindspots, right blindspots
◇Rule: 3+ outlets, none from one side, 2+ from the other
◇The day's most-covered story as the hero
◇Topic filters and an infinite-scroll feed
/outlets
The media map — every outlet's logo on one red-to-blue bar, with most-active and most-balanced rankings
Every outlet on one bar, plus the activity and balance rankings.
The media map

Who's actually balanced? We measure it.

Fourteen outlets on one bar, and a balance score out of 100.

◇14 outlets, 5 positions, one bar
◇Balance = min(L, R) ÷ max(L, R) × 100
◇Leave-one-out lean, so no outlet grades itself
◇Plain-language methodology, on the page
14 outlets tracked 10-story minimum to be ranked Methodology fully public
Story page on a phone — the coverage panel stacks above the headlines
On a phone, the coverage panel stacks above the headlines.
Design language

Red is left. Blue is right. Nothing else gets a color.

The spectrum is the only color on the site, and it always means politics.

◇OKLCH spectrum, checked for colorblind readers
◇Right-to-left page, physical Left → Right axis
◇Light and dark, reduced motion, higher contrast
◇Apple-style press feedback and segmented control
How stories get grouped

Grouping articles into stories has to be automatic, free and local.

sim = T(Δt) · ( 0.60·Smeaning + 0.25·Sentities + 0.15·Swords ) → cluster at θ

◇Every 10 min: fetch, normalize, embed, cluster, score
◇Hebrew models from Dicta, running on the machine
◇Hebrew-aware words: niqqud, quote marks, ו/ה/ב/ל prefixes
◇Story links stay stable when stories re-group
◇Accuracy scored against hand-labeled days
◇Zero paid APIs. It all runs on one machine
Under the hood

Two processes. One contract.

The site and the worker never talk to each other. MongoDB is the only contract between them.

Site

Node.js 20ExpressEJS (server-rendered)Vanilla JS

Data

MongoDBMongooseRead-only modelsTargeted indexes

Hebrew NLP

Python 3.11NeoDictaBERT embeddingsDictaBERT NERscikit-learnPyTorch (Apple MPS)

Ingestion

RSSGoogle News sitemapsURL canonicalization14 outlets

Quality

node:test · 37 passingpytestReview on every taskF1 accuracy harness

Design

OKLCH paletteHebrew / RTLRubik + Frank Ruhl LibreDark modeReduced motion

Built and tested today: the complete Hebrew site.

14 Israeli outlets RSS · Google News sitemaps Worker · Python, every 10 min fetch · NLP · cluster · score MongoDB outlets · articles · stories Accuracy harness F1 vs hand labels → tuned weights Site · Node / Express / EJS read-only · server-rendered · Hebrew, right-to-left / hero · blindspots · feed /story/:id coverage panel · headlines /search topic · date range /outlets map · rankings · method the site never calls the worker. MongoDB is the only contract.
Trust & integrity

A site that grades the press has to hold itself to a higher bar.

◇Never stores an article's full text
◇Every story links back to every original
◇Positions and methodology published openly
◇Filters hardened against NoSQL injection
◇XSS-safe links: http(s) only
◇Free, local models. No reader data leaves

Want something like this?

Start a project