All projects

Personal Project

biblelinked · Interactive gospel map

The four gospels as a graph you can explore: 526 sections and 133 sets of parallels, curated by hand.

Status
Live
Period
2026 · ongoing
Stack
Next.js · React · TypeScript
526
hand-curated sections
133
sets of parallels
2
languages published
1
rule that holds it all together

How it started

It started while watching The Chosen. I wanted a better grasp of what was happening in each episode and kept going back and forth between the gospels. I leaned on the cross-references of R. A. Torrey's Treasury of Scripture Knowledge, which is in the public domain, to build my own cross-reference, but visual, and made it public so anyone can use it.

The problem

The four gospels tell overlapping stories, and the overlaps are the interesting part. Harmonies that map those parallels have existed on paper for centuries, but on paper you cannot follow one thread: you look up a table, find a reference, turn to it, lose your place. The relationships are the content, and a list of verse numbers is a bad way to show relationships.

The approach

The gospels laid out as a graph you can explore: 526 sections and 133 sets of parallels, curated by hand, where clicking a passage shows you what it connects to across the other three. The text is the Reina-Valera 1909, in the public domain.

One rule keeps a hand-made dataset honest

526 sections written by a person will drift: a verse gets skipped, two sections claim the same passage. So the build checks one invariant, that every verse of every gospel belongs to exactly one section, and a gap or an overlap fails the build. That single rule is what makes a hand-curated dataset trustworthy, and it is why the sections are authored in plain text rather than JSON. Nobody can proofread 526 JSON entries. Everybody can proofread a line that reads 1:1-8 followed by a title.

Mt 1:1Mt 2:231:1-171:18-252:1-122:13-152:16-182:19-23EVERY VERSE IN EXACTLY ONE SECTIONgapoverlapWHAT FAILS THE BUILD
Matthew 1 and 2 as the dataset partitions them. The check is one rule, run on every build: each verse belongs to exactly one section. A gap or an overlap fails it before anything is published.

526 nodes and no animation

The graph camera moves instantly, with no easing and no CSS transitions over the nodes. That is not a shortcut, it is the fix. A background tab delivers no animation frames, so a camera driven by requestAnimationFrame simply never arrives when a link opens behind the current tab. And a transition applied across 526 nodes saturates the main thread and freezes mid-flight. Three separate bugs, one root cause.

On screen · tap to enlarge

Opening a passage brings up its text and marks its parallels across the other gospels.
The four gospels as columns. Every arc is a curated parallel.
Harmony mode lines the parallels up side by side instead of by book.

Try it here

A working miniature of the map: tap a section and its parallels light up in the other gospels.

MatthewMarkLukeMt 3:1-12The preaching of JohnMk 1:1-8The preaching of JohnLk 3:1-20The preaching of JohnMt 3:13-17The baptism of JesusMk 1:9-11The baptism of JesusLk 3:21-22The baptism of JesusMt 4:1-11The temptationMk 1:12-13The temptationLk 4:1-13The temptation
3 of 526 sections · 1 of 133 parallelsOpen the full map

What's next

The project is still moving. The gospel map is the first diagram; the next ones are already drafted: Kings and prophets, with Israel and Judah on parallel tracks against one timeline and each prophet placed over the reign he spoke in; Paul's missionary journeys, with each letter anchored to where and when it was written; and the visions of Revelation, with seals, trumpets and bowls side by side. And the dataset of references keeps growing.

Stack

  • Next.js
  • React
  • TypeScript
  • Tailwind CSS
  • React Flow
  • Zod