F1ReplayTiming
F1 리플레이와 실시간 트랙 데이터·텔레메트리를 시각화
날씨 레이더·물의 상변화도·심전도·조위계·GitHub 캘린더·펄서 그래프 등 6가지 차트를 3D로 시각화
Six familiar charts, each opened into the dimension it flattened: a weather radar scan, the phase diagram of water, an ECG, a tide gauge, a GitHub calendar and a pulsar plot, in 3D.
데이터JavaScript · PythonGitHub @Qiao527온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗The Hidden Dimension — six familiar charts, each opened back into the dimension it flattened.
Live: datascape-5of.pages.dev
Every chart on a page is flat because something was folded away: height, density, time, the ground under the water. Each piece here starts from a chart you have seen before, built from real measurements, and opens it into the space it came from. Three.js and Vite, no framework.
| Piece | The flat chart | What it opens into | Data |
|---|---|---|---|
| Storm Chamber | Weather radar map | The fourteen cones of one radar volume scan, filled into a box of sky that can be cut open, 13 minutes before the 2013 Rozel tornado | NOAA NEXRAD Level II (KDDC); NCEI Storm Events |
| The Shadow of Water | Phase diagram of water | The pressure–temperature–density surface that casts it | IAPWS-95 (CoolProp), IAPWS R10-06 and R14-08 (iapws) |
| The Electric Heart | 12-lead ECG | The loop the heart's electrical vector draws in space | PTB Diagnostic ECG Database (PhysioNet) |
| Between Tides | Tide gauge curve | A month of measured tide laid over the surveyed ground it floods | NOAA CO-OPS 8410140; NOAA NCEI CUDEM |
| Commit City | GitHub contribution calendar | A city at night, or a contour terrain, one building a day | GitHub, for any username |
| PSR B1919+21 | The stacked pulsar plot | White ridges driven by music, a microphone or a built-in synth | Your audio |
The four stories are guided in chapters, with a "Hidden dimension" control that folds each scene
back to its flat chart. Every figure on screen comes from the data it cites, and each piece has an
"About the data" panel. docs/storm-chamber.md documents Storm Chamber's
method, verification and limitations in full.
Requires Node.js 20 or later (CI uses the version in .nvmrc). The stories need WebGL 2.
npm install
npm run dev # http://localhost:5173
npm run build # static site in dist/
npm run preview # serve dist/, with /api/contributions
Commit City reads the calendar through /api/contributions?user=<name>&year=<year>, because a
browser cannot fetch it directly. With a GITHUB_TOKEN (any read-only token) the server uses
GitHub's GraphQL API. Without one it parses the public github.com/users/<name>/contributions
page, which needs no setup but can break when GitHub changes the page. Results are cached in memory
for ten minutes.
npm run lint # ESLint
npm test # Vitest: data integrity, beam geometry, physical reference values, every figure in the prose
npm run test:e2e # Playwright on the production build: every chapter, interactions, layout, accessibility
The unit tests read the committed data the way the pages do. They check:
Locally the browser tests drive your installed Google Chrome with the real GPU. In CI they run on Chromium with WebGL in SwiftShader, split across two runners. They check:
DecompressionStream or JavaScript, and recovery from a lost GPU
context;Everything in public/data/ is generated by the scripts in scripts/ and can be rebuilt byte for
byte from public sources:
python3.12 -m venv .venv && .venv/bin/pip install -r scripts/requirements.txt
PYTHON=.venv/bin/python scripts/check_reproducible.sh # all four stories
PYTHON=.venv/bin/python scripts/check_reproducible.sh storm tides # or some of them
The script downloads about 300 MB of sources: the radar volume, the PTB record and two CUDEM tiles.
Set DATASCAPE_CACHE=<dir> to keep them between runs. It checks each source against the SHA-256 it
had when the data were made, reruns the unmodified generators, and compares every output with the
committed file. CI does the same whenever a generator or the data change, and weekly.
index.html, storm.html, water.html, one page per piece; Vite builds them as a multi-page app
heart.html, tides.html,
skyline.html, pulsar.html
src/shared/ renderer and post-processing, the chapter card and camera rig, scene labels,
the dimension control, the About panel, self-hosted fonts, series styles
src/storm/ radar beam model, sweeps, ray-marched volume with precomputed sunlight, section
src/water/ IAPWS surface, coexistence walls, processes, the diagrams it casts
src/heart/ ECG paper, vectorcardiogram trace and its shadows
src/tides/ terrain, water plane, tide timeline and recorder
src/skyline/ instanced city, contour terrain, plinth, hover and snapshot
src/pulsar/ ring-buffer ridges, audio sources, the demo synth
server/ contribution calendar fetch and parse (runs in Node and Workers)
functions/ Cloudflare Pages Function: /api/contributions
scripts/ Python generators for public/data/, and the reproducibility check
tests/unit/ Vitest
tests/e2e/ Playwright
Storm Chamber adapts its resolution to keep frames on time. It counts frames that miss the display's interval and trades pixel ratio for a steady 60 fps (measurements are in the Storm Chamber notes).
The site is static, plus one Cloudflare Pages Function:
npm run builddist.nvmrcfunctions/ serves /api/contributions.GITHUB_TOKEN (a fine-grained token with read-only access to public
repositories is enough) to avoid GitHub's limits on page scraping.public/_headers makes hashed assets immutable and caches the data for a day.To check a build under the Pages runtime before deploying, or a deployed preview:
npm run build && npx wrangler pages dev dist --port 8788
BASE_URL=http://localhost:8788 npm run test:e2e