Flow-based kanban project and task management for Nextcloud dev and IT teams
Planninq is a Kanban-based project and task management app for Nextcloud, built as a thin client on OpenRegister. It manages projects, tasks, kanban boards with WIP limits, backlogs, and time entries — giving internal dev and IT teams a focused workflow tool built directly into their Nextcloud environment. Unlike Nextcloud Deck (which lacks backlog management, time tracking, and WIP limits), Planninq closes the gap between Deck's simplicity and Jira's complexity.
Pre-wired for OpenRegister — all data is stored as OpenRegister objects. If your app needs OpenRegister, install it first. If not, remove the dependency from
appinfo/info.xmlandopenspec/app-config.json.
Add screenshots here once the app has a UI.
Features are defined in openspec/specs/. See the roadmap for planned work. Full feature documentation is in docs/features/.
- Projects — Create and manage project containers with team members, colors, and kanban boards
- Tasks — Full task lifecycle with priorities, labels, assignees, due dates, and status tracking (open → in progress → done)
- Backlog — Task queue for unscheduled work with sorting and filtering; tasks promote to the board via drag-and-drop
- Kanban Board — Visual board per project with configurable columns, drag-and-drop cards, and WIP limits
- Dashboard & My Work — Personal landing page with KPI cards (open, overdue, in progress, done today), recent projects, and tasks due this week; My Work groups all assigned tasks by urgency
- Time Tracking — Estimate effort per task, log multiple time entries (duration + date + description), and review logged time in a personal timesheet view
- Procest Integration — Link tasks and projects to Procest cases via
caseReference(project) andzaakUuid(task) fields; case badges appear in the project list and task detail
- Admin Settings — Configurable admin panel for default columns, label management, and OpenRegister initialization; uses
CnVersionInfoCardandCnSettingsSectioncomponents - User Settings — Per-user notification preferences and default view selection via
NcAppSettingsDialog
- OpenRegister Integration — All data stored as OpenRegister objects; no custom database tables
- Quality Pipeline — PHPCS, PHPMD, Psalm, PHPStan, ESLint, Stylelint
graph TD
A[Vue 3 Frontend] -->|REST API| B[OpenRegister API]
B --> C[(PostgreSQL JSON store)]
A --> D[Nextcloud Activity]
A --> E[Nextcloud Search]
See docs/ARCHITECTURE.md for the full architecture breakdown.
| Object | Schema.org Type | Description |
|---|---|---|
| Task | schema:Action / schema:PlanAction |
Core unit of work — title, description, assignee, due date, priority, status, estimates |
| Project | schema:CreativeWork |
Container for tasks and kanban board — teams, members, metadata |
| Column | schema:DefinedTerm |
Kanban board column — configurable stages with WIP limits |
| TimeEntry | schema:QuantitativeValue |
Effort log — task, user, duration (minutes), date, description |
| Label | schema:DefinedTerm |
Cross-project tag — name, color, description |
Data model is defined using OpenRegister schemas. See docs/ARCHITECTURE.md for full entity definitions and standards mapping, openspec/specs/ for feature-level requirements, and openspec/architecture/ for architectural decisions.
planninq/
├── appinfo/ # Nextcloud app manifest, routes, navigation
├── lib/ # PHP backend
│ ├── AppInfo/Application.php
│ ├── Controller/ # DashboardController, SettingsController
│ ├── Service/SettingsService.php
│ ├── Listener/DeepLinkRegistrationListener.php
│ ├── Repair/InitializeSettings.php
│ └── Settings/ # AdminSettings, planninq_register.json
├── templates/ # PHP templates (SPA shells)
├── src/ # Vue 3 frontend
│ ├── main.js # App entry point
│ ├── App.vue # Root component
│ ├── navigation/MainMenu.vue # App navigation sidebar
│ ├── router/ # Vue Router
│ ├── store/ # Pinia stores
│ └── views/ # Route-level views + UserSettings.vue
├── openspec/ # Specifications, decisions, and roadmap
│ ├── app-config.json # Canonical app config (id, goal, dependencies, CI)
│ ├── config.yaml # OpenSpec CLI configuration
│ ├── specs/ # Feature specs (input for OpenSpec changes)
│ ├── architecture/ # App-specific Architectural Decision Records
│ ├── ROADMAP.md # Product roadmap
│ └── changes/ # OpenSpec change directories (created on first change)
├── tests/ # Unit and integration tests
├── l10n/ # Translations (en, nl)
├── .github/workflows/ # CI/CD pipelines
├── Makefile # Dev helpers (make dev-link)
└── img/ # App icons and screenshots
| Dependency | Version |
|---|---|
| Nextcloud | 31 – 33 |
| PHP | 8.3+ |
| Node.js | 20+ |
| OpenRegister | latest |
- Go to Apps in your Nextcloud instance
- Search for Planninq
- Click Download and enable
OpenRegister must be installed first. Install OpenRegister →
cd /var/www/html/custom_apps
git clone https://github.com/ConductionNL/planninq.git planninq
cd planninq
npm install && npm run build
php occ app:enable planninqdocker compose -f ../openregister/docker-compose.yml up -dnpm install
npm run dev # Watch mode
npm run build # Production build# PHP
composer check:strict # All quality checks (PHPCS, PHPMD, Psalm, PHPStan, tests)
composer cs:fix # Auto-fix PHPCS issues
composer phpmd # Mess detection
composer phpmetrics # HTML metrics report
# Frontend
npm run lint # ESLint
npm run stylelint # CSS lintingNextcloud requires the app directory name to match the <id> in appinfo/info.xml (planninq).
Note: The
js/build output is not committed. You must build the frontend before enabling the app, or the UI will be blank.
make dev-link
npm install && npm run build
docker exec nextcloud php occ app:enable planninq| Layer | Technology |
|---|---|
| Frontend | Vue 3.5, Pinia, @nextcloud/vue 9 |
| Build | Webpack 5, @nextcloud/webpack-vue-config |
| Backend | PHP 8.1+, Nextcloud App Framework |
| Data | OpenRegister (PostgreSQL JSON objects) |
| UX | @conduction/nextcloud-vue |
| 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, goals, dependencies, and CI configuration |
openspec/specs/ |
Feature specs — what the app should do |
openspec/architecture/ |
App-specific Architectural Decision Records |
openspec/ROADMAP.md |
Product roadmap |
openspec/ |
Implementation specifications and changes |
- Accessibility: WCAG AA (Dutch government requirement)
- Authorization: RBAC via OpenRegister
- Audit trail: Full change history on all objects
- Localization: English and Dutch
- OpenRegister — Object storage layer (required dependency)
Add related apps here as integrations are built.
The js/ build output is not committed to the repo. Run the frontend build before enabling the app:
npm install && npm run buildNextcloud requires the app directory name to exactly match the <id> in appinfo/info.xml. Make sure the directory is named planninq:
make dev-link # creates apps-extra/planninq -> planninqThen enable the app again:
docker exec nextcloud php occ app:enable planninqFor support, contact us at support@conduction.nl.
For a Service Level Agreement (SLA), contact sales@conduction.nl.
This project is licensed under the EUPL-1.2.
All dependencies (PHP and JavaScript) are automatically checked against an approved license allowlist during CI. The following SPDX license families are approved:
- Permissive: MIT, ISC, BSD-2-Clause, BSD-3-Clause, 0BSD, Apache-2.0, Unlicense, CC0-1.0, CC-BY-3.0, CC-BY-4.0, Zlib, BlueOak-1.0.0, Artistic-2.0, BSL-1.0
- Copyleft (EUPL-compatible): LGPL-2.0/2.1/3.0, GPL-2.0/3.0, AGPL-3.0, EUPL-1.1/1.2, MPL-2.0
- Font licenses: OFL-1.0, OFL-1.1
Built by Conduction — open-source software for Dutch government and public sector organizations.