Greek for mirrors. Bytes here are closer than they appear.
Each repository is one mirror: an upstream, a bucket, and a pipeline that syncs the two on a schedule from GitHub Actions. The mirrors are served from Cloudflare R2 and listed with live status at mirrors.ijosh.com.
| Mirror | Upstream | Cadence | Repository |
|---|---|---|---|
| ctan.ijosh.com | CTAN, all of it | hourly | ctan |
| tlnet.ijosh.com | CTAN systems/texlive/tlnet, what tlmgr installs from |
daily | tlnet |
More are on the way.
- I built these for myself. They live here so the pipelines are namespaced and share one toolbox.
- Open source in the sense that you can fork and run it. Or just use these published mirrors like I do.
listthe upstream,diffit against thestatethe last run left behind, thenpublishthe delta andcheckpointthe state.verifydata and signatures whenever upstream provides them.- Works in batches, sized for a GitHub Actions runner.
- Pings a healthcheck after each run if you give it one.
- Keeps its state and checkpoints in R2 or any S3-compatible bucket. Cloudflare is the default for its versatility and free egress.
- I preferentially use 1Password for secrets, but GitHub secrets work too.
- Fork a mirror.
- Set three vars in its Taskfile:
SOURCE(the upstream rsync URL),BUCKET(your bucket name) andHOST(the domain in front of it). - Point the workflow at your vault, or your repository secret.
- A full CTAN mirror costs under two dollars a month.
- Pull requests are welcome. CONTRIBUTING has the ground rules.
- Found a way to serve altered bytes? SECURITY explains how to report it privately.
MIT licensed. Built by Josh Vaughen.