diff --git a/.github/workflows/publish-vscode-extension.yml b/.github/workflows/publish-vscode-extension.yml
new file mode 100644
index 000000000000..46412eea22ce
--- /dev/null
+++ b/.github/workflows/publish-vscode-extension.yml
@@ -0,0 +1,52 @@
+name: Publish VSCE/OVX
+
+on:
+ workflow_dispatch:
+
+env:
+ CI: 1
+ PRINT_GITHUB_ANNOTATIONS: 1
+defaults:
+ run:
+ shell: bash
+
+jobs:
+ publish:
+ name: Publish VSCE/OVX
+ environment: vsce publish
+ timeout-minutes: 15
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ concurrency: vscode-extension-publish
+
+ steps:
+ - name: Generate GH token
+ id: generate_token
+ uses: actions/create-github-app-token@v2
+ with:
+ app-id: ${{ secrets.HUPPY_APP_ID }}
+ private-key: ${{ secrets.HUPPY_APP_PRIVATE_KEY }}
+
+ - name: Check out code
+ uses: actions/checkout@v6
+ with:
+ persist-credentials: false
+ submodules: true
+ token: ${{ steps.generate_token.outputs.token }}
+
+ - name: Configure git credentials
+ run: git config --global url."https://x-access-token:${{ steps.generate_token.outputs.token }}@github.com/".insteadOf "https://github.com/"
+
+ - uses: ./.github/actions/setup
+
+ - name: Build types
+ run: yarn build-types
+
+ - name: Publish extension
+ run: yarn tsx ./internal/scripts/publish-editor-extensions.ts
+ env:
+ VSCE_PAT: ${{ secrets.VSCE_PAT }}
+ OVSX_PAT: ${{ secrets.OVSX_PAT }}
+ TLDRAW_ENV: production
+ GH_TOKEN: ${{ steps.generate_token.outputs.token }}
diff --git a/.oxlintrc.json b/.oxlintrc.json
index 187ee8c16316..a10cdde89036 100644
--- a/.oxlintrc.json
+++ b/.oxlintrc.json
@@ -124,7 +124,11 @@
{
"argsIgnorePattern": "^_",
"varsIgnorePattern": "^_",
- "caughtErrorsIgnorePattern": "^_"
+ "caughtErrorsIgnorePattern": "^_",
+ "fix": {
+ "imports": "safe-fix",
+ "variables": "off"
+ }
}
],
"no-useless-backreference": "error",
diff --git a/apps/docs/content/releases/next.mdx b/apps/docs/content/releases/next.mdx
index 1d7baf7183bb..c7cf4f2f1335 100644
--- a/apps/docs/content/releases/next.mdx
+++ b/apps/docs/content/releases/next.mdx
@@ -5,10 +5,10 @@ author: tldraw
date: 03/18/2026
order: 0
status: published
-last_version: v4.5.6
+last_version: v4.5.7
---
-This release adds a first-class theme system with display values for customizing default shapes, shape attribution with a new `TLUserStore` provider and extensible user records, clipboard hooks for intercepting copy, cut, and paste, custom record types to the store, a new `@tldraw/mermaid` package for converting Mermaid diagrams to native shapes, WebSocket hibernation support for tlsync, a new `@tldraw/editor-controller` package for scripting and automation, RTL language support in the UI, cross-window embedding support, arbitrary iframe embed pasting, and smarter export trimming. It also includes various other improvements and bug fixes.
+This release adds a first-class theme system with display values for customizing default shapes, extensible asset types via a new `AssetUtil` system, shape attribution with a new `TLUserStore` provider and extensible user records, clipboard hooks for intercepting copy, cut, and paste, custom record types to the store, a new `@tldraw/mermaid` package for converting Mermaid diagrams to native shapes, WebSocket hibernation support for tlsync, a new `@tldraw/editor-controller` package for scripting and automation, RTL language support in the UI, cross-window embedding support, arbitrary iframe embed pasting, a paste-as-plain-text keyboard shortcut, and smarter export trimming. It also includes various other improvements and bug fixes.
## What's new
@@ -19,10 +19,7 @@ A new first-class theme system replaces the previous approach where colors were
Register custom themes via `TLThemes` module augmentation for type-safe IDs, add or remove palette colors via `TLThemeDefaultColors` and `TLRemovedDefaultThemeColors`, and pass themes to the editor via the `themes` and `initialTheme` props:
```tsx
-
+
```
Each default shape util defines `getDefaultDisplayValues` to resolve visual properties (colors, stroke widths, font sizes) from the current theme and color mode. Override display values for a default shape with `getCustomDisplayValues`:
@@ -191,6 +188,47 @@ Note shapes now track and display a "first edited by" attribution label in the b
Paste any `