v0.36.0
alpic-ai/skybridgev0.36.0Apr 30, 2026by github-actions[bot]
AI Summary
A major version bump introducing significant architectural changes for the v1.0.0 release, including API unification and project layout restructuring.
Key Highlights
- Unified registerTool API, merging widget configuration into tool definitions.
- Removed manual mountWidget calls as Vite auto-mounts views.
- Renamed import path from skybridge/web to skybridge/vite.
- Flattened project layout, removing server/ and web/ directories.
Breaking Changes
- registerWidget removed and merged into registerTool.
- mountWidget removed from public API.
- Import path skybridge/web renamed to skybridge/vite.
- server/ and web/ project layout dropped.
New Features
- Unified registerTool API
- Flat project structure
- Renamed 'widget' terminology to 'view'
Full Release Notes
## Summary
*v0.36.0 introduces several breaking changes in preparation for the v1 release*
### How to migrate?
1. Install [the latest version of the skill](https://docs.skybridge.tech/devtools/skills)
2. Run the prompt: `Migrate my app based on https://github.com/alpic-ai/skybridge/releases/tag/v0.36.0`
---
### registerWidget removed — merged into registerTool (PR #701)
The separate registerWidget call is gone. Widget/view config moves into registerTool as an optional view field:
```tsx
// before
server.registerTool("my-tool", schema, handler)
server.registerWidget({ component: "my-view", ... })
```
```tsx
// after
server.registerTool({ name: "my-tool", ...schema, view: { component: "my-view" } }, handler)
```
### mountWidget removed from public API (PR #701)
The Vite plugin now auto-mounts views found in the views directory. Any manual mountWidget call should be removed.
```tsx
// before
import { mountWidget } from "skybridge/web";
export default function SearchFlights() { ... }
mountWidget(<SearchFlights />)
```
```tsx
// after
export default function SearchFlights() { ... }
```
### skybridge/web import path renamed to skybridge/vite (PR #720)
The Vite plugin subpath export changed:
```tsx
// before
import { skybridge } from "skybridge/web"
```
```tsx
// after
import { skybridge } from "skybridge/vite"
```
### server/ + web/ project layout dropped (PR #701)
The old two-directory layout (src/server/, src/web/) is no longer supported. Skybridge now uses a flat src/ tree with src/views/ for view files. The views directory is configurable in the provided skybridge plugin.
```
// before
├── server/
│ └── src/
│ └── index.ts
└── web/
└── src/
└── widgets/
└── my-widget.tsx
```
```
// After
└── src/
├── server.ts
└── views/
└── my-view.tsx
```
### All widget terminology renamed to view (PR #720)
#### useWidgetState renamed to useViewState
```tsx
// before
import { useWidgetState } from "skybridge/web"
```
```tsx
// after
import { useViewState } from "skybridge/vite"
```
#### widgetsDevServer renamed to viewsDevServer
```tsx
// before
import { devtoolsStaticServer, widgetsDevServer } from "skybridge/server";
app.use(await widgetsDevServer());
```
```tsx
// after
import { devtoolsStaticServer, viewsDevServer } from "skybridge/server";
app.use(await viewsDevServer());
```
## Changes
- fix(asset-base-url): skip rewriting strings in `import ... from` clauses @valentinbeggi (#715)
- Rename widget to view @harijoe (#720)
- fix: log error when view is missing default export @paulleseute (#721)
- Fix strict component name type safety @harijoe (#723)
- fix: release port on SIGTERM/SIGINT in McpServer.run() @paulleseute (#712)
- fix: version view resource URIs with bundle content hash @paulleseute (#718)
- fix: support concurrent /mcp requests @paulleseute (#711)
- feat: unify registerTool API, tool-widget e2e typing, flat structure (SKY-332) @harijoe (#701)
- feat: make template use workspace skybridge @paulleseute (#706)
- fix(devtools): persist inspector preferences across refreshes @valentinbeggi (#703)
- feat: add tunnel to docs @paulleseute (#698)
- chore: remove mintlify preview workflow @valentinbeggi (#695)
- fix(auth-clerk): exclude openid scope from PRM to fix Clerk DCR auth @qchuchu (#693)