▶ Live app: https://henryabra.github.io/finsync/ — convert in your browser, nothing uploaded.
A proven, up-to-date PrusaSlicer → OrcaSlicer profile migration engine, plus a
browser UI on top. Fills the gap the existing tools leave: OrcaSlicer refuses to
import .ini natively, theophile's reference Perl script is proven but frozen at
Orca 1.6 / 2024, and the other GUI converter is stuck on Orca 1.6 too.
Two things pull in opposite directions, so they live in separate layers:
- Proven — the mapping rules (
packages/engine/src/mapping/), seeded from the battle-tested reference converter and frozen by a regression test corpus built from real exported profiles. - Up-to-date — the target schema (
packages/engine/src/schema/), regenerated from the live OrcaSlicer repo bypackages/schema-sync. New Orca releases update the schema; the engine even uses it to pass through keys that are identical in both slicers, so coverage grows as Orca evolves instead of rotting.
Working end-to-end and tested against real exported profiles:
- ✅ Ingest: single "Export Config" (flat) and "Export Config Bundle" (
[filament:…]) - ✅ Proven value transforms:
nil→inherit,bed_temperature→4 plate types, fan/cooling renames,filament_typealiasing,max_volumetric_speed=0 substitution, g-code un-escaping - ✅ Inheritance resolver: Prusa system parent → Orca preset name (best-effort, flagged when unsure)
- ✅ Live-schema validation + identity passthrough (schema-sync discovered 15 extra 1:1 keys)
- ✅ Per-profile conversion report (the trust layer — every drop/clamp is listed)
- ✅ Emits correct Orca filament JSON (single-element string arrays,
from: User)
A zero-install browser app over the engine: drag a Prusa .ini (or several) in,
get per-profile conversion cards — mapped/dropped/nil/invalid stats, the full
conversion report, inheritance status, JSON preview, and per-file or
Download all (.zip) output. The engine runs 100% client-side; nothing is
uploaded. Built with Vite + React + Tailwind, the engine imported straight from
source (no separate build step).
npm install
npm run dev --workspace @finsync/web # http://localhost:5173PrusaSlicer's export omits its built-in profiles, and a custom profile only stores
its diff over a system parent — so a naive conversion is incomplete. Load your
vendor bundle (~/Library/Application Support/PrusaSlicer/vendor/PrusaResearch.ini)
and the engine, per profile:
- re-links to the matching OrcaSlicer preset when Orca already ships the parent (emits just your overrides), else
- flattens the full inheritance chain (multi-parent + abstract
*base*profiles, PrusaSlicer merge order) into a standalone profile.
It can also bulk-convert your whole system library (e.g. every Prusament profile for
your printer), skipping abstract bases and ones Orca already has. Verified against the
real PrusaResearch.ini (6,069 nodes): a CORE One HF 0.6 filter yields 372 standalone
profiles, 0 invalid.
Next: print + printer/machine profiles, then full-bundle one-shot — all behind the same UI.
npm install
# convert a Prusa .ini's filament profiles to Orca .json + print the report
npm run convert -- path/to/PrusaSlicer_config_bundle.ini --out ./out
npm test # runs the engine suite against real fixtures
# refresh the Orca target schema from the live repo (the "up-to-date" engine):
node_modules/.bin/tsx packages/schema-sync/src/sync.ts --vendor Prusapackages/engine/ @finsync/engine — headless, pure TS, runs in Node AND browser
src/ingest/ .ini parser + IR extraction
src/mapping/ proven mapping table (data, not code)
src/schema/ Orca target schema (curated ∪ generated)
src/transform/ value transforms, g-code, inheritance
src/validate/ output checked against live Orca schema
src/emit/ report/ Orca JSON + conversion report
test/fixtures/ real exported Prusa profiles (regression corpus)
packages/schema-sync/ regenerates the Orca schema from the live OrcaSlicer repo
packages/web/ client-side browser app (Vite + React + Tailwind) importing the engine
MIT.