Skip to content

ConductionNL/openbuild

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

897 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

OpenBuild logo

OpenBuild

Citizen-developer app builder for Nextcloud — compose apps from registers, connectors, workflows, and documents without code.

Latest release License Code quality


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.

Screenshots

Add screenshots here once the shell + textarea editor + seeded hello-world virtual app are merged.

Features

Features are defined in openspec/specs/ and tracked via the 9-spec chain that starts with bootstrap-openbuild.

Spec #1 — bootstrap-openbuild (this release)

  • Application + BuiltAppRoute OR schemas with declarative draft → published → archived lifecycle (canonical ADR-031 example — no service class)
  • Manifest endpointGET /index.php/apps/openbuild/api/applications/{slug}/manifest returns the stored manifest blob
  • Nested-CnAppRoot runtime/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-world Application exercising index, detail, and form page types out of the box

Visual designer (Design tab + Raw JSON fallback)

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 spec tests/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:manifest

The 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.

Chained follow-on specs

  • nextcloud-vue-in-memory-manifest (in nextcloud-vue/) — useAppManifest overload accepting an in-memory manifest object
  • openregister-runtime-schema-api (in openregister/) — runtime schema-creation API
  • openbuild-schema-editor — visual schema designer
  • openbuild-page-editor — visual manifest/page designer
  • openbuild-versioning — draft / publish / rollback
  • openbuild-rbac — per-built-app permissions
  • openbuild-templates-marketplace — starter templates
  • openbuild-export-to-real-app — Phase-2 export to a real Nextcloud app

Architecture

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]
Loading

Data Model

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.

Requirements

Dependency Version
Nextcloud 28 – 33
PHP 8.1+
Node.js 20+
OpenRegister latest
@conduction/nextcloud-vue latest

Installation

From the Nextcloud App Store

  1. Go to Apps in your Nextcloud instance
  2. Search for OpenBuild
  3. Click Download and enable

OpenRegister must be installed first. Install OpenRegister →

From Source

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 openbuild

Development

Frontend development

npm install
npm run dev        # Watch mode
npm run build      # Production build

Code quality

# 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 linting

Note: The js/ build output is not committed. Build the frontend before enabling the app or the UI will be blank.

Tech Stack

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

Branches

Branch Purpose
main Stable releases — triggers release workflow
beta Beta / pre-release builds
development Active development — merge target for feature branches

Documentation

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

Standards & Compliance

  • 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)

Related Apps

  • 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)

Support

For support, contact support@conduction.nl.

For a Service Level Agreement (SLA), contact sales@conduction.nl.

License

This project is licensed under the EUPL-1.2.

Authors

Built by Conduction — open-source software for Dutch government and public sector organizations.

About

Citizen-developer app builder for Nextcloud — compose data-driven apps from registers and schemas without writing code.

Resources

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages