Materializr
오픈소스 파라메트릭 3D CAD로 제약 스케치·솔리드 모델·나사·SVG·텍스트 조각·STL/STEP 내보내기를 지원합니다
Creator에서 편집을 매크로로 저장하고 선택이나 파일에 재생한다. 키프레임·채우기·구조가 자동 적용된다
Record your edits in Creator as a named macro and replay them on any selection or file. Keyframes, fills, and structure all adapt.
디자인TypeScript · JavaScriptGitHub @inerds온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Macro Recorder for LottieFiles Creator - records your edits as replay-able macros.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Macro Recorder records the edits you make in Creator — transform changes,
fills, keyframes, structure, and more — as a named, replayable macro. It
replays those steps onto whatever you select.
It is published in the Creator Extensions marketplace:
extensions.lottiefiles.com/plugin/inerds/macro-recorder.
Install it from there to use it; read on to build it, run it without Creator,
or use it as a reference.
The user guide is published on the
project wiki, a
read-only mirror of docs/user-guide.md that a push to main regenerates. The
other documents stay in docs/.README 전문 보기 ↗Macro Recorder records the edits you make in Creator — transform changes, fills, keyframes, structure, and more — as a named, replayable macro. It replays those steps onto whatever you select.
It is published in the Creator Extensions marketplace: extensions.lottiefiles.com/plugin/inerds/macro-recorder. Install it from there to use it; read on to build it, run it without Creator, or use it as a reference.
The user guide is published on the
project wiki, a
read-only mirror of docs/user-guide.md that a push to main regenerates. The
other documents stay in docs/.
This repository is also an open-source reference for Creator plugin developers. Beyond the product, it documents patterns that any Creator plugin needs:
ui/gateways/, engine/protocol.ts).pnpm test:quickjs enforces it).docs/runtime-api.md), and confirmed host limits with evidence
(docs/limitations.md).engine/testing/fakeScene.ts, dev/harness/host-harness.html).Inside Creator, the real engine runs. The panel polls the plugin sandbox
every 500ms over a small RPC protocol. The sandbox snapshots the scene, diffs
it against the previous snapshot, and returns human-labeled steps. Macros
persist in creator.clientStorage. Standalone, in a plain browser tab, the
handshake times out and the panel falls back to mock gateways and the dev
strip.
Document map:
docs/user-guide.md — the end-user walkthrough of every
feature.docs/architecture.md — the invariants behind the
code's shape: the three TypeScript projects, the sandbox constraints, the
proxy boundary, the recording engine, and the gateway seam.docs/design-system.md — the panel's skin, deck, and
rack rules.docs/runtime-api.md — the host API's real runtime
surface. Read it before you extend the engine; the published typings still
diverge from the runtime in the places that file lists.docs/limitations.md — confirmed host limits, with
evidence.CONTRIBUTING.md — setup, the checks a change must pass,
and how a release is cut.docs/contributing/ — the writing style standard, the
trace-triage workflow, and the ENGINE_REV rule.docs/history/ — the engineering log, the 2026-08-24 UI
audit, and the v3.1 roadmap.docs/releases/ — the release notes per shared build.CHANGELOG.md — user-visible changes per version.engine/ holds the pure, fully unit-tested logic both sides use: protocol,
snapshot model, structural differ, labels, relative-playback math,
simplification, and value editing.sandbox/ is the QuickJS sandbox: RPC dispatcher, defensive
proxy-to-snapshot serializer, step applier, and the clientStorage store.
The sandbox has no timers — the panel owns all timing.ui/gateways/rpc/ is the panel side: the RPC bridge, the tick-loop
recorder gateway, and the paced step-by-step playback orchestrator.What you select before you press Record decides what the recorder watches. Select one or more layers, and it records those layers only: their subtrees, paints, masks, trims, plain flags, and structure. A selected shape counts as its layer. Layers that appear while you record, such as duplicates and new layers, join the recording. Select nothing, and it records the whole scene, the scene settings included. The deck shows which one Record will do. An edit outside the recorded layers is dropped and counted on the recording screen, never dropped in silence. While you record, selecting one keyframed recorded layer offers to capture its keyframes and current style into the macro. Hold Option (macOS) or Alt (Windows) while you press Record, and the recording stores every layer-transform step as the value it ended at rather than as a delta.
Replay picks one of two modes. A macro that touched at most one layer applies
to every selected layer: the layer's own position, rotation, and skew
shift each target from its own start, scale multiplies, and everything else
applies exactly. Each transform step carries a formula on the target's
current value, and the pencil opens it as a verb and a number — Set to, Add,
Subtract, Multiply, Divide, or Formula… for a whole expression such as
v * 2 + 10, where v is that current value. Only layers are targets — a
selected shape is dropped with a note, because every step addresses its layer
by path. A macro that touched several layers, or that restructured the scene,
replays as a scene rebuild: each step finds its layer by recorded id,
then by name, then skips with a note.
Two rules govern every step:
Pro tools are client-side data transforms: Simplify, per-step disable and edit, parameters (pinned values asked for on play), and the play options — at playhead, stagger, and repeat ×N.
Install Macro Recorder from the Creator Extensions marketplace and open it from Creator's plugins menu. That is the released build; the two ways below are for developing it.
You need Node.js 22.12 or later and pnpm (the repository pins [email protected]
through packageManager).
pnpm install
pnpm dev
Open http://localhost:5173 and size the viewport to about 320×560, the
size the plugin asks Creator for in sandbox/plugin.ts. The
Dev settings strip at the panel foot (dev builds only) loads the ten demo
macros, clears the store, controls the mock recorder and playback scenarios,
and shows captured traces.
Run pnpm dev, then add the plugin in Creator:
http://localhost:5173 and click Continue.After any change under sandbox/ or engine/, remove and re-add the
plugin. Creator evaluates plugin.js once and never re-fetches it, while
Vite serves the panel fresh. Bump ENGINE_REV in engine/protocol.ts with
every sandbox-side change; the handshake compares revisions and logs a loud
plugin engine is STALE warning on mismatch.
http://localhost:5173/host-harness.html emulates the host: a fake creator
global, fake scene nodes, the plugin bundle, and the real panel iframe. The
dev server compiles and serves plugin.js on request, so pnpm dev alone is
enough — there is no build step to remember. Drive the fake scene from the
console through window.harness. pnpm test:harness drives the same page
without you (see scripts/ui-probe/README.md).
dev/harness/sandbox-test.html reproduces Creator's opaque-origin iframe (no
localStorage, no crypto.randomUUID) for the fallback paths.
pnpm test # vitest: engine logic, reducer, demo and corpus replay (1002 tests, 38 files)
pnpm test:quickjs # builds, then drives dist/plugin.js in real QuickJS
pnpm test:ui # opens the panel in headless Chrome and probes the DOM
pnpm test:harness # records and replays through the host harness in headless Chrome
pnpm type-check # tsc -b across all three project references
pnpm build # production bundle → dist/ (manifest.json, plugin.js, ui.html)
test:quickjs exists because Creator invokes the sandbox's callback without
pumping the VM job queue. A pure VM promise chain never settles there, so code
that passes in a browser can be dead in Creator. The smoke test drives the
real bundle with zero pumps and asserts the RPC contract holds.
pnpm test also replays the macro corpus — one saved macro per shape this
plugin has ever written to storage or export — so a change to the step shape
that an older macro cannot survive fails a test instead of blanking a panel
(engine/testing/macros/, and see
docs/contributing/macro-corpus.md).
test:ui exists because the unit tests run in Node with no DOM. It opens the
panel in headless Chrome over the DevTools protocol and asks the page what
paints on top, what a box measures, and what a key does under a modifier —
the questions that caught a menu buried behind the deck.
test:harness exists because the other checks each see one half of the
plugin. It drives the host harness in the same headless Chrome: the real
sandbox bundle, the real panel, and the fake scene as the host. It records an
edit, saves the macro, replays it onto other layers, and asks the fake scene
what the values became. It is the only check that runs record and playback
together. Both suites share one driver — see
scripts/ui-probe/README.md.
sandbox/ The QuickJS plugin sandbox: RPC dispatcher, serializer, applier, store, manifest.
engine/ The pure engine both sides use: protocol, snapshots, differ, labels, simplify.
ui/ The React panel: state machine, gateways, components, styles, dev strip.
dev/harness/ Host-emulation pages for the dev server only. Never part of the build.
scripts/ The trace server, the QuickJS smoke test, the release bundler, and the
release-notes helper.
docs/ User guide, architecture, design system, runtime API, limitations,
contributing guides, release notes per version, and the history log.
.claude/ The triage agents, the /triage-traces skill, and the two installed
LottieFiles Creator plugin skills.
.github/ CI (type-check, tests, QuickJS smoke, build) and the tag-driven Release workflow.
Each tree compiles under its own tsconfig.*.json and tsconfig.json is the
solution file. pnpm bundle builds and writes release/macro-recorder-v<version>.zip
with exactly the three files Creator needs, and pnpm bundle:dev writes the
-dev build with the dev strip on, the name "Macro Recorder (dev)", and its
own plugin id, so the dev build keeps a separate macro store in Creator. The
build stamps the version into manifest.json.
Dev sessions write a trace bundle per record and playback run to
traces/. Each bundle carries what the panel never shows: every RPC call
with timing, the {prev, next} snapshot pair behind each recorded tick, and
per-target probes before and after each playback step. Snapshot and probe
payloads are opt-in per session (debug: true, dev builds only), so a
production panel gets byte-identical responses.
To triage captured traces, run the skill in Claude Code:
/triage-traces
The skill:
traces/.processed does not name yet.macro-triage agent per trace. Each agent checks
env.sandboxRev first, then classifies the trace against the failure
taxonomy and returns a diagnosis with evidence.macro-fixture agent before anyone writes a fix.traces/.processed.Trace bundles are large — never read one into the main context; the agents
exist for that. Nothing cleans traces/ automatically; delete it when you
finish. When you triage by hand, check env.sandboxRev first: a stale
sandbox reproduces bugs that are already fixed.
ui/state/appReducer.ts — one discriminated-union state machine with five
modes (idle → recording → reviewing, and idle → playing directly or
through configuring, the pre-play parameter form).ui/gateways/types.ts — the three gateway interfaces the panel talks to;
ui/gateways/index.ts is the single real-versus-mock seam.sandbox/serialize.ts and sandbox/applier.ts — the reads and the writes
of Creator's live node proxies. sandbox/playback.ts and
sandbox/recorder.ts touch a proxy only to resolve targets, run scene-level
ops, and probe for diagnostics. Everything downstream is plain data.engine/testing/fakeScene.ts — the test double for the proxy surface,
shared by the harness and vitest. It reproduces the host's traps on
purpose, above all that a staticValue write does nothing while keyframes
exist. Never make it more permissive than the real host.min-width: 260px and scrolls horizontally below that.docs/limitations.md tracks the host
limits with their evidence.MIT — see LICENSE.