Skip to main content

Features

OpenBuilt is a citizen-developer app builder for Nextcloud. Every feature below is shipped and verified by the spec gate (PHPUnit + Vitest + Newman + Playwright + Hydra mechanical gates — see Technical for the matrix).

App creation wizard​

A three-step modal that creates the parent Application, an admin-defined version chain (development → staging → production by default), and one per-version OpenRegister register per tier. The wizard is atomic: a failure at any step rolls back every resource it provisioned so the org-wide unique slug isn't squatted.

Highlights:

  • Identity step — slug + name + description with live duplicate-slug detection.
  • Versions step — pick a preset (single, dev-prod, dev-staging-prod) or hand-design the chain. The wizard enforces ADR-002's linear-chain rule (no fan-out, no cycles, exactly one terminal production tier).
  • Permissions step — owners / editors / viewers, with the caller pre-filled into owners. Group group:* means "all signed-in users" (REQ-OBRBAC-004).

Spec: openbuilt-app-creation-wizard.

Versioned app deployment​

Per ADR-002, every Application carries N ApplicationVersion rows on a linear promotesTo chain. Each version owns:

  • a per-version OpenRegister register (openbuilt-{appSlug}-{versionSlug}) so dev data, staging data, and production data are physically isolated;
  • its own manifest (the page + menu + widget declaration);
  • its own semver — auto-bumped when the manifest changes meaningfully, untouched on metadata-only edits (the no-op-detect rule).

The Application.productionVersion pointer decides which version answers at /apps/openbuilt/{slug}. Switching productionVersion is a single OR write — rollback is instant, no redeploy.

Spec: openbuilt-versioning-model.

Version promotion (dev → staging → prod)​

Three strategies for moving one version forward into the next:

  • migrate-existing-data — schema-import the source version's columns onto the target's existing rows (default when target IS the production version; preserves production data).
  • start-with-source-data — wipe target rows, copy source rows over (default for mid-chain targets; reproducible from-source build).
  • empty-start — wipe target rows entirely and start clean. Gated by a type-the-slug confirmation in the UI.

Failure handling: target flips to archived, OR lock releases, response carries code: "promotion_failed". Source register is read-only throughout — a failed promotion never mutates the source.

Spec: openbuilt-version-promotion.

?_version= URL routing (bookmarkable preview)​

Every builder URL accepts an optional ?_version=<slug> query that pins the rendered manifest to a specific ApplicationVersion. The leading underscore (_version, not version) is OpenBuilt's system-reserved namespace so citizen developers can ship their own ?version= query params without collision.

  • Without the param: the production manifest answers — accessible to everyone in the org.
  • With the param + production slug: also accessible to everyone.
  • With the param + non-production slug: only callers in permissions.editors ∪ permissions.owners see it. Viewers / non-members get a security-shaped 404 (no existence leak).

Spec: openbuilt-version-routing.

Application detail overview (maintainer dashboard)​

The detail page for each Application packs the maintainer's daily working surface into one screen:

  • Hero strip — icon, name, description, status, your role badge, productionVersion semver.
  • Version pill strip — one pill per version (most-upstream first), with * marking production. Click a pill to switch the rest of the page to that version.
  • Window toggle (7d / 30d / 90d) — drives the KPI + activity calls.
  • KPI grid — Active users, Object count, Files, Audit events for the selected (version, window).
  • Activity graph — daily event counts; empty-state when the window has no traffic.
  • Structural widgets — Register, Schemas, Pages, Menu cards with deep-links into OpenRegister, Schema Designer, Page Designer.

Spec: openbuilt-app-detail-overview.

Nextcloud nav integration (one top-bar entry per published app)​

Every published Application gets its own top-bar entry alongside Files, Mail, Talk etc. The entry's icon is served by GET /apps/openbuilt/icons/{slug}.svg (light) / {slug}-dark.svg (dark) and falls back to the app icon when the OR-attached file is missing.

Visibility is per-app: only callers who hold any role on the Application (or are listed via group:* wildcard) see the entry. Draft and archived apps stay hidden.

Spec: openbuilt-nextcloud-nav.

Templates marketplace​

The "New from template" path clones a marked Application + its companion schemas into the caller's namespace. The same-user-same-slug case returns slug_collision 409 so the caller can pick a fresh slug; the cross-user case provisions an owner-namespaced register (openbuilt-{ownerUid}-{slug}) so two users can clone the same template without colliding on OR's organisation-wide unique constraint.

Schema designer​

A visual editor for the per-version schema set. Field types, lifecycle states + transitions, RBAC, relations to other schemas, widgets, aggregations, calculations and notifications all live in the schema's declarative annotations (ADR-031) — readable by humans, executable by OpenRegister at runtime.

Page editor v1.1​

JSON-driven page declaration with type-aware sub-editors per page type (index, detail, form, dashboard, chat, logs, settings, files, custom). Inline validator marks paint the offending field on save; an undo/redo stack covers the in-flight manifest; the Raw JSON tab is the integrator fallback for shapes the Design tab can't yet author.

MCP authoring surface (for AI assistants)​

OpenBuilt registers eight tools on the OpenRegister MCP bus so an LLM can author apps directly: listApps, getAppManifest, createApp, promoteVersion, upsertSchema, upsertPage, addWidget, upsertMenuItem. Each tool carries the per-app RBAC gate; an LLM acting on behalf of a user can only modify apps where that user holds owner or editor role.

Export to a real Nextcloud app (Phase 2)​

A built app is virtual by default — it lives as a record in OpenBuilt's register and is rendered inside the OpenBuilt shell at /apps/openbuilt/{slug}. Phase 2 export bakes the manifest, register, and schemas into a standalone Nextcloud app you can install on any Nextcloud instance — no OpenBuilt dependency at runtime.