A small edge cache you can run on one box.
Cache sits in front of an origin server, keeps a hot set of objects on local disk, serves byte ranges and revalidates with ETags. One binary, one config file, no separate CDN account.
Pulls from origin on first miss, honours Cache-Control and stale-while-revalidate, never hits the origin twice for the same still-valid object.
Byte-range and conditional GET (If-None-Match) straight from local disk, gzip/zstd negotiated per client.
Single-key or prefix purge over the API, applied to disk immediately, no background invalidation queue to wait on.
Quick start
curl -sSL https://cache.rucdn.pro/get | sh
cache init --data /var/lib/cache
cache serve --listen 127.0.0.1:8080
Put your own TLS terminator in front. Cache deliberately does not speak TLS.
Push one object through it
# store an object
curl -X PUT https://cache.rucdn.pro/v1/objects/obj_e371bd33 \
-H 'Authorization: Bearer $TOKEN' \
--data-binary @report.pdf
# fetch it back
curl https://cache.rucdn.pro/o/obj_e371bd33
# -> 200 with the cached bytes, ETag and Cache-Control set
# purge it
curl -X DELETE https://cache.rucdn.pro/v1/objects/obj_e371bd33 \
-H 'Authorization: Bearer $TOKEN'
Why it exists
Every CDN quote for a low-traffic side project came with a monthly minimum and a dashboard I did not need. This is the boring 20% of a CDN — cache, purge, byte ranges — running on the same box as the origin.
It is not a global anycast network, not a WAF and not an image transformer. If you need edge points of presence on five continents, this is the wrong tool. If you need one box to stop hammering your database with the same GET request, it does that and stops there.
Status
Used in production for exactly one thing: fronting the origin this domain was set up for. The API is stable within a minor version; the on-disk layout is not yet. Read the API reference before wiring anything permanent to it, and the changelog before upgrading.