artlu.ai
100 days. 100 features. Still building.
Just AI and an internet connection.
day 226 · 119 shipped
← all projects
day 178 · sep 11, 2026 · launched

several copies of the app now share one job list — spoolcast

The job list moved out of a file on one machine and into a database with row locks and a lease, so more than one copy of the app can claim work without ever taking the same job twice.

What is it?
The job list moved out of a file on one machine and into a database, which is what lets more than one copy of the app run at the same time.

What it does
- Every engine copy and every render worker claims work from one shared job list
- A claim takes a row lock and holds a lease, so two copies never take the same job
- Cancelling is a flag the runner polls, so a job stops wherever it is running
- Each account gets one turn at a time, so a busy account cannot starve the others
- A busy server answers "please wait" and the app retries, instead of leaving an account dead
- A load test anyone can rerun with one command

How it works
Claims use a row lock that skips rows another copy already holds, with a lease so a copy that dies releases its work. Writes to cloud storage compare and set, so a stale copy's push is refused rather than landing over newer work.

What is not done yet
Today the copies are separate processes on one server sharing one disk. Running on two machines is still ahead, and a read-only audit on 2026-09-11 listed sixteen places where something kept in one copy's memory or on its disk would not be seen by a second copy or a second person. Three of those were live bugs the night the audit was written, including an admin jobs view that showed every account's jobs rather than your own. The shared job list and the compare-and-set writes are the parts the audit confirmed were already right.

Built with
Python, Postgres, Docker on Railway, Cloudflare R2.

stack

PythonPostgresDockerRailwayCloudflare R2

screenshots