Citizen-developer app builder for Nextcloud — compose apps from registers, connectors, workflows, and documents without code.
OpenBuild is a citizen-developer app builder for Nextcloud. It lets non-technical users compose apps from the Conduction ecosystem (OpenRegister schemas, OpenConnector APIs, Procest workflows, Docudesk documents, NL Design themes, LaunchPad dashboards) through a visual interface, without scaffolding PHP for each new app.
Per ADR-024 each built app is rendered at runtime by mounting CnAppRoot with the app's manifest, which lives as a JSON blob in OpenBuild's own OpenRegister namespace. Per ADR-031 behaviour (state machines, aggregations, calculations, notifications) is declared as schema metadata in the register file instead of service code. Built apps are virtual at first (records in OpenBuild's register, rendered inside the OpenBuild shell at /apps/openbuild/builder/{slug}); a Phase-2 export generates a real Nextcloud app from a virtual app.
Requires OpenRegister — all virtual-app data is stored as OpenRegister objects.
Add screenshots here once the shell + textarea editor + seeded hello-world virtual app are merged.
Features are defined in openspec/specs/ and tracked via the 9-spec chain that starts with bootstrap-openbuild.
Application+BuiltAppRouteOR schemas with declarativedraft → published → archivedlifecycle (canonical ADR-031 example — no service class)- Manifest endpoint —
GET /index.php/apps/openbuild/api/applications/{slug}/manifestreturns the stored manifest blob - Nested-
CnAppRootruntime —/builder/{slug}/*mounts a virtual app inside the OpenBuild shell; path segments after the slug forward to the inner manifest's router - Textarea manifest editor — JSON-only for v1 (visual editor lives in chain spec #5)
- Seeded
hello-worldApplication exercisingindex,detail, andformpage types out of the box
Each Application's editor exposes two tabs (openbuild-page-editor v1.1):
- Design (default) — type-aware sub-editors for the six manifest page types
(
index,detail,form,dashboard,chat,logs,settings,files,custom). The Design tab carries an inline-mark validator that flags ADR-024 schema errors on the offending field instead of dumping a side-panel summary, plus an undo/redo stack scoped to the in-flight manifest. - Raw JSON — the integrator fallback. Drops you into the manifest's bare
JSON when a manifest shape isn't yet supported by a Design-tab sub-editor, or
when you want to bulk-edit. Edits round-trip losslessly through
parse → stringify → parse(Vitest spectests/composables/manifestRoundTrip.spec.js) so external authoring tools — git diffs, IDE auto-format — stay coherent with the Design tab.
Run the canonical-shape validator locally:
npm run check:manifestThe script (scripts/check-manifest.js) validates the OpenBuild shell
manifest plus the wizard seed against
@conduction/nextcloud-vue/src/schemas/app-manifest.schema.json (the
ADR-024 canonical schema) and exits non-zero on any structural drift.
nextcloud-vue-in-memory-manifest(innextcloud-vue/) —useAppManifestoverload accepting an in-memory manifest objectopenregister-runtime-schema-api(inopenregister/) — runtime schema-creation APIopenbuild-schema-editor— visual schema designeropenbuild-page-editor— visual manifest/page designeropenbuild-versioning— draft / publish / rollbackopenbuild-rbac— per-built-app permissionsopenbuild-templates-marketplace— starter templatesopenbuild-export-to-real-app— Phase-2 export to a real Nextcloud app
graph TD
A[OpenBuild shell - Vue 2 / Pinia] -->|nested mount| B[CnAppRoot per virtual app]
A -->|CRUD via OR REST| C[OpenRegister API]
B -->|GET manifest| D[ApplicationsController]
D --> C
C --> E[(PostgreSQL JSON store)]
A --> F[Nextcloud Activity + Search]
| Schema | Description |
|---|---|
Application |
One row per virtual app. Holds slug, name, description, manifest (JSON blob), version, status (draft / published / archived). Declarative lifecycle via x-openregister-lifecycle. |
BuiltAppRoute |
Slug → applicationUuid index for fast runtime lookup; upkept by the Application lifecycle. |
hello-message |
Seed schema for the canonical hello-world virtual app (three sample objects). |
Data model is fully defined in lib/Settings/openbuild_register.json. See openspec/changes/bootstrap-openbuild/ for the foundational spec.
| Dependency | Version |
|---|---|
| Nextcloud | 28 – 33 |
| PHP | 8.1+ |
| Node.js | 20+ |
| OpenRegister | latest |
| @conduction/nextcloud-vue | latest |
- Go to Apps in your Nextcloud instance
- Search for OpenBuild
- Click Download and enable
OpenRegister must be installed first. Install OpenRegister →
cd /var/www/html/custom_apps
git clone https://codeberg.org/Conduction/openbuild.git openbuild
cd openbuild
npm install && npm run build
php occ app:enable openbuildnpm install
npm run dev # Watch mode
npm run build # Production build# PHP
composer check:strict # PHPCS + PHPMD + Psalm + PHPStan + tests
composer cs:fix # Auto-fix PHPCS
composer phpmd # Mess detection
# Frontend
npm run lint # ESLint
npm run stylelint # CSS lintingNote: The
js/build output is not committed. Build the frontend before enabling the app or the UI will be blank.
| Layer | Technology |
|---|---|
| Frontend | Vue 2.7, Pinia, @conduction/nextcloud-vue (CnAppRoot, CnPageRenderer, useAppManifest) |
| Build | Webpack 5, @nextcloud/webpack-vue-config |
| Backend | PHP 8.1+, Nextcloud App Framework (single controller method: manifest endpoint) |
| Data | OpenRegister (PostgreSQL JSON objects + x-openregister-lifecycle declarative state machines) |
| Quality | PHPCS, PHPMD, Psalm, PHPStan, ESLint, Stylelint |
| Branch | Purpose |
|---|---|
main |
Stable releases — triggers release workflow |
beta |
Beta / pre-release builds |
development |
Active development — merge target for feature branches |
| Resource | Description |
|---|---|
openspec/app-config.json |
App identity, dependencies, CI configuration |
openspec/changes/bootstrap-openbuild/ |
Foundational spec (proposal, specs, design, tasks) |
openspec/specs/ |
Feature specs |
openspec/architecture/ |
App-specific Architectural Decision Records |
- Accessibility: WCAG AA (NL Design System guarantees, ADR-010)
- Authorization: RBAC via OpenRegister (ADR-022) — no app-local RBAC duplication
- Audit trail: Full lifecycle audit on every Application transition via OR's audit trail
- Localization: English and Dutch (ADR-007)
- OpenRegister — Object storage layer (required dependency)
- OpenConnector — API / iPaaS integration (consumed by built apps via manifest)
- Procest — Process / case management (consumed via workflow attachments)
- Docudesk — Document generation (consumed via template attachments)
- LaunchPad — Dashboards (consumed via widget embeds)
- NL Design — Government theming (CSS variable inheritance)
For support, contact support@conduction.nl.
For a Service Level Agreement (SLA), contact sales@conduction.nl.
This project is licensed under the EUPL-1.2.
Built by Conduction — open-source software for Dutch government and public sector organizations.