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)