What's new
Component-instance drift/override visibility
- \penpot_get_shape\ now always includes a \componentInfo\ field with \linkState\ (\linked\ / \detached\ /
ot-an-instance\ / \main-component-root), and for same-file linked instances a \driftedFields\ array listing which visual properties differ from the main component definition. - \penpot_find_shapes\ includes \linkState\ and \driftedFields\ in each match entry.
File snapshot / version history
Full suite: \penpot_list_file_snapshots, \penpot_create_file_snapshot, \penpot_restore_file_snapshot, \penpot_rename_file_snapshot, \penpot_delete_file_snapshot, \penpot_lock_file_snapshot, \penpot_unlock_file_snapshot, \penpot_get_file_snapshot_data.
Fully headless OIDC/SSO login
Set \PENPOT_OIDC_USERNAME\ + \PENPOT_OIDC_PASSWORD\ to drive the OIDC redirect flow over plain HTTP — no browser needed. Handles multi-step IdP flows (Keycloak, Authentik, Dex).
Checkpoint persistence
Set \PENPOT_CHECKPOINTS_PATH\ to a local directory; checkpoints survive server restarts.
Stale-write detection
\PenpotStaleWriteError\ is thrown by all write tools when \update-file\ reports concurrent edits from another session.
Unit test coverage
New test files for RPC client, exporter client, OIDC auth, snapshots, checkpoints, export tool, text replacement, and component drift — all running in CI.