Runable v1.0.0-alpha.20
Why Runable? Docs Modules Work with AI Blog About Changelog
  • 01Why Runable?
  • 02Docs
  • 03Modules
  • 04Work with AI
  • 05Blog
  • 06About
  • 07Changelog
Vue without a fixed server runtime.
Getting Started Structure Integrations Guide MCP API
  • Getting Started Structure Integrations Guide MCP API
Build the Interface
  • Routing
  • Layouts
  • Middlewares
  • Error Handling
Load and Render
  • Data Fetching
  • SSR and CSR
  • Head and SEO
Extend Runable
  • Auto-imports
  • Plugins
  • Modules
Configure and Ship
  • Runtime Configuration
  • CSS and Assets
  • Production Build
CLI
  • Overview
  • Create
  • Prepare
  • Build
  • MCP
  • AI Skills
  • Inspector

Routing

Create application routes from files in app/pages.

Runable turns components in app/pages/ into Vue Router routes. Add, move, or delete a file and the route table follows automatically.

Create routes

app/pages/
├── index.vue                 → /
├── about.vue                 → /about
├── projects/
│   ├── index.vue             → /projects
│   └── [id].vue              → /projects/:id
├── blog/[[page]].vue         → /blog/:page?
└── docs/[...path].vue        → /docs/:path*

Read parameters from a dynamic route with useRoute():

<script setup lang="ts">
const route = useRoute();
const projectId = computed(() => String(route.params.id));
</script>

<template>
  <h1>Project {{ projectId }}</h1>
</template>

Define page metadata

definePageMeta() is auto-imported into pages.

<script setup lang="ts">
definePageMeta({
  name: "project-details",
  layout: "dashboard",
  middleware: ["auth"],
});
</script>

Use these fields to control the route:

FieldEffect
nameReplaces the generated name
pathReplaces the generated path
aliasAdds one or more alternate paths
layoutSelects the layout
middlewareRuns named middleware

Parent route metadata is passed to children. A value defined by the child takes precedence.

Navigate

Use RunableLink in templates or navigateTo() in scripts:

<template>
  <RunableLink to="/projects">View projects</RunableLink>
</template>
await navigateTo({ name: "project-details", params: { id: "42" } });

For direct Vue Router access, use useRoute() and useRouter().

Display nested pages

Place RunablePage in a parent page to display its child route:

<!-- app/pages/projects.vue -->
<template>
  <section>
    <h1>Projects</h1>
    <RunablePage />
  </section>
</template>
Hot reload

Vue Router handles changes in app/pages/. You do not need to restart the server after adding a page.

Report an issue Edit this page
Guide

Build, render, extend, and ship a Runable application.

Layouts

Share an interface structure across pages without duplicating templates.

On this page

  • 1Create routes
  • 2Define page metadata
  • 3Navigate
  • 4Display nested pages
Runable

The Vue framework that brings productive conventions to any backend.

Product

  • Why Runable
  • Documentation
  • Installation
  • Integrations

Project

  • About
  • Blog
  • Changelog
  • Sponsor

Community

  • GitHub
  • Issues
  • Discussions
  • Bluesky

© 2026 Runable. Released under the MIT License.

Open source Built with Vue and Runable