---
title: "DF8004: Devframe Id Is Not a Mountable URL Segment"
description: "Devframe id \"{id}\" is not a mountable URL segment; the hub mounts each frame at <base><id>/."
canonical_url: "https://devfra.me/errors/df8004"
---
# DF8004: Devframe Id Is Not a Mountable URL Segment

> Devframe id "\{id}" is not a mountable URL segment; the hub mounts each frame at \<base>\<id>/.

## Message

> Devframe id "`{id}`" is not a mountable URL segment; the hub mounts each frame at `<base><id>/`.

## Cause

`initHub` derives each frame's mount base from its id (`/__devframes/<id>/`), and that segment is routed by h3, where `:` and `*` are route-pattern markers and `/` ends the segment. An id carrying those characters either crashes route registration or matches the wrong paths.

## Example

```ts
import { initHub } from '@devframes/hub/initiate'

initHub({
  base: '/__devframes/',
  devframes: [
    defineDevframe({ id: 'devframes:plugin:my-tool', /* … */ })
  ], // ✗ throws DF8004
})

// ✓ Good, route-safe id (letters, digits, `_`, `-`, `.`):
defineDevframe({ id: 'devframes_plugin_my-tool', /* … */ })
```

## Fix

Set a route-safe `id` on the definition: letters, digits, `_`, `-`, and `.` only (e.g. `my_plugin` instead of `my:plugin`). This constraint applies to the devframe id alone; RPC function ids (the colon-namespaced `devframes:plugin:<slug>:<fn>` convention) are unaffected.

## Source

- [`packages/hub/src/node/initiate.ts`](https://github.com/devframes/devframe/blob/main/packages/hub/src/node/initiate.ts): `initHub` throws this while mounting the `devframes` list.


## Sitemap

See the full [sitemap](https://devfra.me/sitemap.md) for all pages.
