Self-hosted, pluggable generate → slice → print pipeline. Pick something to make, see it render instantly, send it to a printer — no slicer knowledge required.
SPEC.md— product spec & milestonesdocs/PLUGINS.md— stage contracts (Generator / Slicer / Transport)docs/SEQUENCE.md— a job's trip through the pipelinedocs/DATA-MODEL.md— persistence (SQLite + Redis) & storage choicedocs/adr/0001-plugin-isolation.md— in-process adapters, isolated enginesdocs/adr/0002-dual-model-preview.md— client procedural preview + server exact model
packages/ shared · api · worker · web
plugins/ generators/* · slicers/* · transports/*
profiles/ slicer profile defaults (operator-managed, editable in-app; secrets gitignored)
scad/ gridfinity-rebuilt-openscad (git submodule)
data/ job artifacts + sqlite db (gitignored)
Bun is both package manager and runtime — it runs the TypeScript directly, so
there is no tsc build step and no dist/. mise.toml pins bun + Node 20.
bun install
bun run typecheck # tsc --noEmit across the workspace
docker compose up --buildFor a no-engines local run (stub mode — no OpenSCAD/Orca needed):
CONVEYOR_ENGINE_STUB=1 bun run dev:worker # in one shell
CONVEYOR_ENGINE_STUB=1 bun run dev:api # in another (needs a local redis)Prebuilt multi-arch (amd64 + arm64) images are published to GHCR on every
v* tag by .github/workflows/release.yml (native runners per arch — no QEMU —
merged into one manifest):
ghcr.io/onlyonebyte/conveyor-webghcr.io/onlyonebyte/conveyor-apighcr.io/onlyonebyte/conveyor-worker(bakes in OpenSCAD + PrusaSlicer/OrcaSlicer)
Tags: :X.Y.Z, :X.Y, :latest, and :sha-<short>. To cut a release:
git tag v0.1.0 && git push origin v0.1.0 # triggers build + publishA deploy compose.yml can then swap the build: blocks for image: pins — e.g.
image: ghcr.io/onlyonebyte/conveyor-worker:latest — to pull instead of build.
Status. M0 (contracts + skeleton) is verified: typechecks clean and the full queue → worker → status-WS pipeline runs end-to-end in stub mode (gridfinity → slicer → moonraker/elegoo, live progress events). M1 (real worker image) is verified green on aarch64: OpenSCAD generates real STLs and both slicers — PrusaSlicer (default) and OrcaSlicer (v2.4.1 aarch64 AppImage) — slice headless; full generate→slice E2E proven in the worker image. See
docs/M1-WORKER-ENGINES.md.