Overview
What is Facilio Vibe?#
Facilio Vibe is Facilio's app platform for shipping fully custom web apps to a managed subdomain like https://<linkName>.vibe.facilio.com. You author a static web app in any language or framework (React, Vue, Svelte, Solid, plain HTML — your choice), integrate Facilio APIs via the @facilio/vibe-sdk, and ship it to a live URL with the @facilio/vibe-cli.
Unlike Connected Apps, which embed widgets inside the Facilio UI through an iframe/webview, Vibe apps are standalone web apps hosted on their own subdomain. They use browser-cookie auth gated by the SDK and call Facilio data through schema-discoverable actions exposed by the Facilio MCP server.
When to use Vibe vs Connected Apps#
| Use Vibe when… | Use Connected Apps when… |
|---|---|
| You need a standalone tool on its own URL (dashboards, portals, public-facing apps) | You need a widget embedded inside Facilio (record summary tab, custom form, dialer) |
| You want full control over the framework, bundler, and routing | You want platform-managed UI lifecycle (events, navigation, dialog placement) |
| The audience is broader than Facilio users (vendors, tenants, public links) | The audience is signed-in Facilio users working inside a module |
| AI agents need to build and ship the app end-to-end with no manual UI registration | The app needs to read Facilio context (current record, current form, current user) directly |
Use cases#
- Custom dashboards — KPI views, asset summaries, vendor scorecards on a sharable URL
- Internal tools — one-off forms, bulk editors, data-quality utilities for ops teams
- Customer / tenant portals — branded micro-sites that talk to Facilio data through the SDK
- AI-generated apps — point an agent at a goal ("build me a workorder triage screen") and let it scaffold, build, and deploy without human intervention beyond a single OAuth approval
- Rapid prototypes — ship a working URL in minutes without provisioning hosting or worrying about CORS, auth, or session cookies
How it works#
┌──────────────────────────────────────────────┐│ https://<linkName>.vibe.facilio.com ││ ││ ┌──────────────┐ ┌────────────────────┐ ││ │ Your static │◄──►│ @facilio/vibe-sdk │ ││ │ app │ │ (browser cookie) │ ││ └──────────────┘ └─────────┬──────────┘ ││ │ ││ executeAction( ││ connectionSlug, ││ actionSlug, payload) ││ │ │└────────────────────────────────┼─────────────┘ ▼ ┌────────────────────────────────┐ │ Facilio Connections / MCP │ │ (https://mcp.facilio.com/mcp) │ │ — connection + action catalog │ └────────────────────────────────┘- Author your app in any framework. The only constraint is that the build output folder contains an
index.htmlat its root. - Authenticate once on your machine with
vibe login(OAuth device flow — one click in the browser). - Create the app with
vibe app create --name "My App"— writesvibe.jsonwith the assignedlinkName. - Build and deploy with your normal build command, then
vibe deploy. The CLI zips the publish folder, uploads it, and prints the live URL. - At runtime, the SDK handles browser-cookie auth and exposes
executeAction(connectionSlug, actionSlug, payload)as the only sanctioned way to talk to Facilio data. Slugs and payload shapes come from the MCP catalog.
The agent-friendly workflow#
Vibe is designed so an AI agent can take a fresh machine from zero to a live URL with exactly one human action: clicking "Approve" in the browser during vibe login. Everything else — installing Node, scaffolding the project, writing the source, building, creating the app, deploying, iterating — is fully automatic.
# Agent-driven sequence (no further user input needed after vibe login)vibe login # one-time; user clicks "Approve" oncevibe app create --name "My App" # one-time; non-interactive with --name flagnpm run build # or any build command for your frameworkvibe deploy # zips, uploads, publishes, prints live URLSee Building with AI Agents for the full agent recipe and the llms.txt reference you can hand to Claude, ChatGPT, or Cursor.
CLI quick reference#
| Command | Purpose |
|---|---|
vibe login | OAuth device-flow login. Run once per machine. |
vibe app create --name "..." | Create a new app. Writes vibe.json with the assigned linkName. Run once per app. |
vibe app list | List all apps in the org (linkName, name, URL, status, last-published timestamp). |
vibe deploy | Zip the build.publish folder, upload, publish. Prints the live URL and the immutable versioned URL. |
vibe whoami | Print the email and server of the active session. |
vibe logout | Remove the stored token. |
See the CLI Reference for flags, env vars, and the full command surface.
SDK quick reference#
import { createVibe } from '@facilio/vibe-sdk';
const vibe = createVibe(); // serverURL defaults to window.location.origin
// Authawait vibe.getCurrentUser(); // { user: { uid, email, name, username }, org: { orgId } } or nullawait vibe.isAuthenticated(); // booleanvibe.login(); // redirect to identity-servicevibe.logout(); // sign out
// Dataconst { response } = await vibe.executeAction( 'facilio-cmms', 'list-assets', { /* payload — shape from MCP catalog */ });const assets = response?.data ?? [];
// Escape hatchawait vibe.fetch('/api/runtime/...'); // thin wrapper around fetch() with credentials and 401 handling| Method | Purpose |
|---|---|
createVibe() | Create the SDK client. Defaults to window.location.origin. |
getCurrentUser() | Returns { user, org } or null. Use as the single source of truth for "is the user signed in?". |
isAuthenticated() | Boolean check for signed-in state. |
login() | Redirect to identity-service login. Wire this when getCurrentUser() returns null. |
logout() | Sign out the current session. |
executeAction(connectionSlug, actionSlug, payload) | The only sanctioned way to call Facilio data. Slugs come from the MCP catalog. |
fetch(path, init) | Raw HTTP escape hatch with credentials: 'include' and auto-redirect to login on 401. Prefer executeAction. |
See the SDK Reference for full method signatures, response shapes, and error handling.
Build with AI#
AI agents can develop and ship a Vibe app end-to-end. Point the agent at the full Vibe build-and-deploy guide:
https://facilio.com/developers/docs/vibe/llms.txtSee Building with AI Agents for prompt patterns and the agent-autonomy recipe.
Hard constraints#
- The build output folder must contain
index.htmlat its root — this is a constraint on the build output, not your source layout. Bundlers like Vite, webpack, and Next export produce this automatically. - The site is static — no server-side rendering, no Node runtime on the server. Anything dynamic happens client-side through the SDK.
- Auth is browser-cookie based — gated by
@facilio/vibe-sdk. Don't roll your own login. - All Facilio data access goes through
vibe.executeAction()— never call arbitrary/api/...URLs you guessed at. Slugs and payloads come from the MCP catalog.