Pack
Shared capability unit
A directory or archive that describes a printer class, instance or fleet policy.
Appearance
Product architecture
A unified API and package format for printer properties, firmware/slicer mappings, macros, checks, calibration routines, sample jobs and proof artifacts.
Dry should normalize fragmented printer data into a versioned, testable capability layer:
The existing dry-profile-v1 remains the runtime profile used by review, verify, rewrite and upload. The new library adds packaging, provenance, APIs and proofs around that profile.
This is the first vertical of the broader G-code Machine SaaS: printers use the same registry, proof and edge-agent model as CNC, laser and other G-code-driven machines, but with printer-specific fields for build volume, heaters, filament, slicer profiles and macros.
dry-printer-pack/
manifest.json
machine.json
firmware/
klipper.cfg
moonraker.objects.json
slicers/
prusa.ini
cura.def.json
orca.json
profiles/
abs-0.4.json
pla-0.4.json
macros/
start_print.klipper.cfg
flow_test.klipper.cfg
checks/
bounds.json
max-flow.json
first-layer.json
samples/
flow-test.gcode
pressure-advance.gcode
proofs/
manifest.proof.json
flow-test.review.json
provenance.jsonPack
A directory or archive that describes a printer class, instance or fleet policy.
Profile
A resolved `dry-profile-v1` for one material/process/nozzle combination.
Proof
Schema, adapter, sample, macro and optional hardware-observed validation reports.
dry printer list --source ./printer-packs
dry printer search voron --source https://registry.dry.dev
dry printer inspect voron-2.4-350-klipper
dry printer validate ./packs/voron-2.4-350-klipper
dry printer pack ./packs/voron-2.4-350-klipper -o voron-2.4-350-klipper.drypackdry printer import klipper printer.cfg --id voron-2.4-350-klipper -o ./packs/voron/
dry printer import moonraker http://printer.local --id voron-live -o ./packs/voron-live/
dry printer import octoprint http://octopi.local --id mk3-octoprint -o ./packs/mk3/
dry printer import cura fdmprinter.def.json --id custom-cura -o ./packs/custom/
dry printer import prusa bundle.ini --id prusa-bundle -o ./packs/prusa/dry printer resolve voron-2.4-350-klipper --material ABS --nozzle 0.4 -o profile.json
dry printer diff old-pack/ new-pack/
dry printer checks voron-2.4-350-klipper
dry printer run-check voron-2.4-350-klipper max-flow
dry printer run-sample voron-2.4-350-klipper flow-test
dry printer prove voron-2.4-350-klipper --cidry review-gcode part.gcode --printer voron-2.4-350-klipper --material ABS --nozzle 0.4
dry upload part.gcode --printer voron-2.4-350-klipper --moonraker http://printer.local
dry compare baseline.gcode candidate.gcode --printer voron-2.4-350-klipper--printer resolves to a profile and passes the resulting dry-profile-v1 into existing flows. --profile remains the explicit low-level option.
import { PrinterRegistry } from "@dry/sdk/printers";
const registry = await PrinterRegistry.open({
sources: ["./printer-packs", "https://registry.dry.dev"],
});
const printer = await registry.get("voron-2.4-350-klipper");
const caps = await printer.capabilities();
const profile = await printer.resolveProfile({
material: "ABS",
nozzleDiameter: 0.4,
});
const report = await printer.reviewGcode("part.gcode", { profile });
const proof = await printer.runProofs();from dry.printers import PrinterRegistry
registry = PrinterRegistry.open(
sources=["./printer-packs", "https://registry.dry.dev"]
)
printer = registry.get("voron-2.4-350-klipper")
profile = printer.resolve_profile(material="ABS", nozzle_diameter=0.4)
report = printer.review_gcode("part.gcode", profile=profile)
proof = printer.run_proofs()| Registry | Best for | Notes |
|---|---|---|
| Local directory | users, offline labs, CI | simplest implementation path |
| Git registry | community sharing, version pinning | reviewable provenance and pull requests |
| HTTP registry | private teams, commercial distribution | search, signed downloads, support tiers |
Trust levels:
| Level | Meaning | Can gate production? |
|---|---|---|
draft | manually authored, schema-valid only | no |
imported | generated from firmware/slicer source | no |
dry-verified | Dry proofs pass against samples | maybe |
hardware-observed | live API/hardware observation included | yes, with review |
maintained | versioned, reviewed, signed, regression-tested | yes |
Promote current `import-printer-cfg` into pack import, keep raw config, import macros and optionally query live printer objects.
Import printer profile data, G-code scripts and physical properties for review/upload workflows.
Import machine and extruder definitions and preserve unknown Cura keys as provenance.
Parse config bundles into printer, filament and process candidates for Dry profiles.
Parse `config.g` enough to extract kinematics, bounds, heaters and toolheads.
{
"pack": "voron-2.4-350-klipper",
"version": "0.1.0",
"ok": true,
"trust_level": "dry-verified",
"checks": [
{ "id": "schema", "status": "pass" },
{
"id": "flow-test-review",
"status": "pass",
"sample": "samples/flow-test.gcode",
"expected": "proofs/flow-test.review.json"
}
],
"warnings": [
"pressure advance declared but not modeled by dry-profile-v1"
]
}| Phase | Deliverables | Exit |
|---|---|---|
| 0. Spec foundation | draft schemas and one example pack | one pack validates and resolves to dry-profile-v1 |
| 1. Local CLI/library | loader, validate, inspect, resolve, prove | one Klipper pack produces a profile and runs sample proofs |
| 2. Importers | Klipper, Cura, Prusa/Orca/SuperSlicer, OctoPrint | imports preserve raw source and normalized fields |
| 3. Registry/signing | local index, Git registry, hashes/signatures | CI can pin pack version and reproduce proofs |
| 4. Live self-checks | Moonraker/OctoPrint live adapters | live printer is compared to declared pack before upload |
Proprietary product core:
Paid team/enterprise:
The full implementation plan is maintained with the private product source.