Omnigraph
그래프 엔진으로 컨텍스트를 조립하고, 객체 저장소 기반에서 에이전트가 코드처럼 그래프 데이터를 분기·타입·검토·병합·감사·거버넌스합니다
ITRDB·PANGAEA·Zenodo의 123,910개 개별 화석·역사적 나무 기록을 연대별로, 분류별 색상으로 표시
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온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Interactive timeline of individual tree ring logs from the ITRDB dendrochronology database
README 전체를 불러오는 중입니다.
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:
pytest tests/ — the parser fixtures are the files that broke earlier parsers.python -m ehd.validate — 100.0000% span agreement with dplR across 76,397
series, 0 disagreements, 0 invariant failures, and 0 series found by dplR
that this parser misses. It additionally reads 12,349 series dplR cannot
(run 2026-11-01, dplR 1.7.9). This covers ITRDB only: PANGAEA's bars have no
ring widths to read.ehd.emit asserts the packing is overlap-free before writing.The two files first paint waits on are written brotli-compressed at quality 11
and served with Content-Encoding: br. logs.bin is application/octet-stream,
which Cloudflare's auto-compression allowlist excludes, so it shipped raw at 84%
of first load; index.json was compressed, but by an edge encoder tuned for
speed rather than ratio. Pre-compressing both takes first load from 2,192,561 to
678,710 bytes — 2.09 MiB to 0.64 MiB, 69% smaller — measured live rather than
locally, since the ratio a CDN serves is not the ratio a build produces
(2026-08-20, on that day's build). The current build's first load is
1,263,649 bytes: logs.bin 740,181, index.json 497,736, and the page, app.js
and style.css 25,732, measured live the same way. (The 2026-10-22 build,
73,390 logs, was 655,918 bytes.) The map's
coastline file (438 KB raw, 177 KB as served) is not part of first load; it is
fetched the first time the map is opened.
Clients that do not accept brotli are not stranded: Cloudflare decodes and
re-encodes at the edge, so an Accept-Encoding: gzip request still gets gzip and
one with no Accept-Encoding gets the raw bytes.
The compression and the _headers rule break the site if separated, so
tests/test_headers.py pins them together and app.js checks logs.bin's
length against n_logs and names the likely cause if it ever mismatches.
Logs are labelled rather than silently mixed:
Logs from studies NCEI has withdrawn are parsed and validated but never drawn (3,424 logs, 25 studies).
The Swiss Late Glacial pines have been placed on the calendar in the literature by radiocarbon wiggle-matching, but no per-file anchor appears anywhere in the archive, so they stay floating until a placement can be tied to each file.
Ring widths come from the NOAA/NCEI International Tree-Ring Data Bank, and the bars without curves from the public metadata of the Hohenheim archive on PANGAEA. The 540 Neolithic oaks are from Zenodo. All of it was contributed by the many investigators credited in each site record and reachable through the study links in the viewer. This project neither collected nor re-measured any rings; it parses, reconciles, and displays their published data.
Metadata defects found during reconciliation have been reported to NCEI, which
has been correcting them — see docs/ncei-metadata-report.md and the
study-by-study sweep in docs/ncei-sweep-2026-08.txt (python -m ehd.sweep
reruns it).
Code: MIT. The underlying ITRDB measurements are NOAA public-domain
data and are not redistributed by this repository — ehd.fetch downloads them.
The 540 Main-region oaks are from Land, Remmele & Küppers 2018
(10.5281/zenodo.1326474), CC BY 4.0;
python -m ehd.zenodo downloads them, and ehd.emit stops if they are missing.