Dashboard for Julia language performance: Nanosoldier benchmark reports every 2 to 3 days,
CI build/test timing, TTFX, PkgEval and
package-server downloads. The Overview tab sums up every source, the Commit tab gathers
everything recorded for one commit or PR (/commit?c=<sha or PR number>), and the other tabs go deep.
Live: https://perf.julialang.org/
Short paths open a tab directly and forward any other query parameters:
/overview,
/commit,
/diff, /history,
/timing, /builds,
/workers, /ttfx,
/downloads, /pkgeval.
Each is a small redirect page under a directory of that name; the ?tab= URLs
they resolve to keep working as before.
One EC2 host (infra/terraform/, see its README) runs everything from one
container image (Dockerfile):
- Six fetchers write a SQLite database every hour (
db/schema.sql):fetch_timing.jl: Buildkite job timings (julia-ci, plus the legacyjulia-masterandjulia-master-scheduledpipelines, which stopped receiving builds in July 2026)fetch_benchmarks.jl: Nanosoldier benchmark history, every estimate of every benchmark and Nanosoldier's own verdictsfetch_pkgeval.jl: PkgEval reports, with every package's outcomefetch_ttfx.jl: TTFX results (package precompile, load and run times of the Julia-TTFX-Snippets tasks, the load and run times also from repeats with the GC disabled) from theTTFXjob on everyjulia-cimaster build, see julia-buildkite/utilities/ttfxfetch_packages.jl: package-server download rollups, per package too, with names from the General registryfetch_agents.jl: a snapshot of the connected Buildkite agents on every run, and the queue and run times of every julia-pr and julia-ci job for the queue backlog (the token needs theread_agentsandread_buildsscopes)
db/serve.jlis the site's API (/api/): the shapes indb/Render.jl, served with a time window so the browser loads what it shows.db/export.jlrenders the same shapes to files after every run, published at/data/for scripts;analysis/fetch_data.jldownloads them.- Datasette serves the database read-only at
/db/, and/data/ci-timing.sqlite.gzis a snapshot of the whole thing.
To use the data yourself, docs/querying.md covers the API
(/api/ lists its routes), SQL and the snapshot, with example queries;
/llms.txt is the short version for agents.
Pushing to main builds the image and deploys it (.github/workflows/deploy.yml);
health.yml checks the host once a day. The plan and its history:
docs/database-migration.md.
To run the site locally, download the snapshot and serve it:
curl -O https://perf.julialang.org/data/ci-timing.sqlite.gz && gunzip ci-timing.sqlite.gz
julia --project db/serve.jl --db ci-timing.sqlite --site .The "Benchmarks" tab embeds julia-perf, a fork of rust-lang/rustc-perf adapted for Julia. Thanks to the Rust team for their work on that project.
The site counts visits with Google Analytics, one page view per tab shown
(/overview, /timing, ...). Filters and selections, which live in the query
string, are never sent. Nothing is loaded when the browser sends Do Not Track
or Global Privacy Control, or on a local checkout.
MIT, see LICENSE.