Markk116 24175dde36 Add small in-actor LRU cache for hot assets
AssetStoreServer runs on a single dedicated smarm actor thread, so a
plain HashMap+VecDeque LRU in front of the SQLite lookup needs no
locking. Capacity configurable via CCC_CACHE_CAPACITY (default 256).

Bench (bench/RPS): +42-47% RPS under a cache-sized/hot-set workload,
but a small net loss under adversarial uniform-random access with a
cache smaller than the catalog. Real traffic is hot-set skewed, so
net win in practice; capacity should be tuned to the expected hot set.
2026-08-08 22:59:57 +02:00
2026-08-08 16:36:22 +02:00

C3 - Cached Content Conduit

My super simple CDN built for distributing my own (text) content.

Running in Docker

docker compose up -d

The runtime image is distroless (no shell, no package manager, ~24MB), so managing packages happens via docker exec running the ccc binary directly rather than an interactive shell:

docker compose exec ccc /usr/local/bin/ccc create demo

To add a file, it needs to exist inside the container first. Drop it in the ./staging dir, which is bind-mounted to /staging:

cp app.js staging/
docker compose exec ccc /usr/local/bin/ccc add demo /staging/app.js 1.0.0

(Alternatively docker cp a file straight into the container if you'd rather not use the staging mount.)

See bench/RPS for an RPS bench of the store's LRU cache vs. raw SQLite.

License

AGPL-3.0-only - see LICENSE. If you run a modified version of this as a network service, you must make the modified source available to its users.

S
Description
C3 - Cached Content Conduit My super simple CDN built for distributing my own (text) content.
Readme AGPL-3.0
99 KiB
Languages
Rust 94.2%
Python 4.5%
Dockerfile 1.3%