HarborHarbor
DocumentationGuidesPlugins
Authoring

Apps (Beta)

Author Harbor Apps with deployApp, route handlers, and inspect.

Beta

The authoring surface is deployApp inside Harbor runtime files. Do not add legacy Orbit package imports to new App docs.

Shape

feedback.app.ts
deployApp({
  id: "feedbackBoard",
  title: "Feedback Board",
  description: "Collect lightweight feedback for a workspace.",
  access: "workspace_member",
  routes: {
    "GET /": {
      staticHtml: "<h1>Feedback Board</h1>",
    },
    "POST /feedback": {
      async run(request) {
        const body = await request.json()
        await hrbr.db.exec(
          "insert into feedback (message) values (?)",
          [String(body.message ?? "")]
        )
        return { ok: true }
      },
    },
  },
})

Publish and open

hrbr inspect -f ./feedback.app.ts
hrbr inspect 'return await hrbr.apps.open({ name: "feedback-board" })'
hrbr inspect 'return await hrbr.apps.inspect({ name: "feedback-board" })'

Use hrbr exec -f ./feedback.app.ts when you want publish wrapped in a normal execution trace.

Access modes

ModeUse
workspace_memberDefault for internal tools and dashboards.
publicPublic read-only pages, intake forms, and webhooks.

Public routes should be collect-only or read-only. Keep workspace-writing provider calls behind private routes or Functions.

Runtime model

Use inspect to check app metadata, versions, and routes. Use exec when a route or publish path should create a traced execution run.