Busabase
Busabase is an open-source (MIT) database and workspace for AI agents — data, docs, skills, and apps in one place. Run it locally, self-host it inside your network, or use Busabase Cloud, and turn age
翻訳待ち
123,910 individual subfossil and historical tree logs from the ITRDB, PANGAEA and Zenodo on one time axis, 12,429 BC to 2025 CE, coloured by taxon.
翻訳待ち
データPython · JavaScriptGitHub @HowardALandmanオンライン所有者未確認
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Interactive timeline of individual tree ring logs from the ITRDB dendrochronology database
翻訳待ち
Loading the full README.
Read the full README ↗An interactive view of individual subfossil and historical tree logs on a shared time axis. One rectangle per log, greedily packed into rows, coloured by taxon, with hover tooltips and click-through to each log's measured ring-width curve where the widths are open. A map view shows where the collections were taken, one pie per published coordinate, linked to the timeline.
The site draws expanded Europe from three sources: 123,910 logs · 8,498 sites · 12429 BC – 2025 CE (85,186 ITRDB, 38,184 PANGAEA, 540 Zenodo). A PANGAEA "site" is usually one object, and those logs are bars only: their dates are public, their ring widths restricted. Europe is where this started, not the limit of what it handles; see Scope.
Most tree-ring resources publish site chronologies — averaged curves. This shows the underlying measured series individually, which is what makes the overlapping ladder of chronologies visible: you can see how the record is assembled from them.
What a "log" is. One bar is one measured ring-width series — a core or a radius — not necessarily one tree. A tree sampled with two cores is two bars, because the archive has no field recording which series belong to the same tree. The count also includes redundant copies: an audit of an earlier build found about 2,000 series deposited byte-identically in more than one collection, and about 600 in blue-intensity files that remeasure trees already present. Merging both is planned but not done.
The corpus is overwhelmingly modern: 85 logs alive in 5000 BC, 81 at 1 CE, and 69,428 in 1971. Packed together that is a ~70,000-row wedge, so the viewer zooms on both axes and offers era filters. The "Before 1 CE" + "Packed together" view is the classic overlapping-chronology ladder, and the most legible entry point.
It also has a hole. No log is alive between 11746 BC and 6228 BC: before it there are only the anchored French Late Glacial pines, after it continuous coverage. The long Central European oak and pine chronology (Hohenheim) covers most of that interval, but its per-log measurements for those years are not publicly available.
ITRDB publishes measurements under regional directories: africa, asia,
atlantic, australia, centralamerica, europe, northamerica, and
southamerica. All can be mirrored for study (python -m ehd.fetch --all). The
web build uses expanded Europe, the Western Palearctic, defined on site
coordinates in ehd/region.py: all of europe, and africa, asia and
atlantic by position.
The .rwl parser, the duplicate reconciliation, the dating classifier, the
packing, and the viewer all operate on logs without reference to region. Going
global means choosing the scope in corpus.scoped_files, and deciding how the
viewer should present a corpus large enough that a single packed timeline stops
being legible.
The pipeline is also source-agnostic beyond ITRDB: any per-log corpus that can be expressed as series with ring widths and a dating status drops in as another input.
uv venv --python 3.12 && uv pip install pytest brotli # once
python -m ehd.fetch --templates # download the corpus to the data root
python -m ehd.pangaea # PANGAEA's public tree-ring metadata
python -m ehd.zenodo # the Zenodo oaks, checked against their MD5
python -m ehd.harvest # study metadata + corpus reconciliation report
python -m ehd.emit # build web/data payloads
python -m ehd.basemap # map outlines from Natural Earth (pinned, checksummed)
python -m ehd.validate # cross-check parser against dplR + invariants
python scripts/serve.py # view at localhost:8777
scripts/serve.py rather than python -m http.server, because ehd.emit
writes the two first-paint payloads brotli-compressed under their plain names
and web/_headers is what declares that to the browser; the dev server reads
the same file, so local and deployed behaviour match. A plain static server
hands the viewer compressed bytes and it draws nothing.
Data root resolves to $EHD_DATA, else /Volumes/Expansion/EHD, else ./data.
ehd.validate additionally needs R with dplR.
The pipeline is source-agnostic: a new per-log corpus drops in as another input.
The .rwl format has traps that silently corrupt results rather than failing
loudly. Each of the following was found in real corpus files, and each has a
regression test in tests/:
0003401Q1890); a
whitespace parser fails on ~32% of the corpus.C002 -2894).-999 is a missing ring, not a terminator. It appears mid-series in long
runs; treating it as terminal truncated one 1854–2010 log to 1854–1864.999 is a real 0.999 mm
ring, so terminators are trimmed from series ends rather than acted on inline.-8) must not extend
a span; interior ones are real zero-width rings.-noaa.rwl re-encodings, per-variable suffixes
measured on the same trees, and series IDs repeated across sites. Left alone
these inflate the log count by ~36%..rwl file. Disagreements are common, though (the
first sweep found 152 files), so dating classification tests overlap rather
than endpoint agreement, and ehd.sweep reports the mismatches upstream.Verification:
This is the beginning of the README. Read the rest at the original. Read the full README ↗