No description
  • TypeScript 34.2%
  • PHP 29.4%
  • Vue 29%
  • Shell 4.4%
  • CSS 2.7%
  • Other 0.2%
Find a file
blade34242 e64dcc9413
All checks were successful
Nextcloud Server Tests / version-consistency (push) Successful in 34s
Nextcloud Server Tests / matrix-config (push) Successful in 37s
Nextcloud Server Tests / Nextcloud stable31 / PHP 8.2 (stable31, 8.2) (push) Successful in 16m52s
Nextcloud Server Tests / Nextcloud stable31 / PHP 8.3 (stable31, 8.3) (push) Successful in 16m40s
Nextcloud Server Tests / Nextcloud stable32 / PHP 8.2 (stable32, 8.2) (push) Successful in 17m51s
Nextcloud Server Tests / Nextcloud stable32 / PHP 8.3 (stable32, 8.3) (push) Successful in 17m39s
Nextcloud Server Tests / Nextcloud stable33 / PHP 8.2 (stable33, 8.2) (push) Successful in 16m40s
Nextcloud Server Tests / Nextcloud stable33 / PHP 8.3 (stable33, 8.3) (push) Successful in 17m46s
Nextcloud Server Tests / Nextcloud stable34 / PHP 8.2 (stable34, 8.2) (push) Successful in 18m23s
Nextcloud Server Tests / Nextcloud stable34 / PHP 8.3 (stable34, 8.3) (push) Successful in 17m40s
Build And Publish Appstore Package / build_and_publish (push) Successful in 3m44s
Harden version bump changelog validation
2026-07-24 19:38:33 +07:00
.forgejo/workflows Use upload-artifact v3 in Forgejo workflow 2026-05-10 13:41:26 +07:00
.github Expand CI matrix to Nextcloud 31-34 2026-07-09 11:07:16 +07:00
img Refresh marketplace media set and demo video 2026-03-07 14:39:20 +07:00
opsdash Refine dashboard edit and lookback context 2026-07-20 13:19:34 +07:00
tools Harden version bump changelog validation 2026-07-24 19:38:33 +07:00
.gitignore Split internal docs from app repo 2026-04-17 12:39:28 +07:00
CHANGELOG.md Harden version bump changelog validation 2026-07-24 19:38:33 +07:00
CI_ROADMAP.md Re-enable Forgejo must-pass Playwright smoke 2026-05-10 13:15:36 +07:00
CONTRIBUTING.md Raise Nextcloud minimum to 31 2026-07-14 13:35:35 +07:00
docker-compose.yml Prepare 0.8.2 release 2026-07-09 10:49:57 +07:00
docker-compose30.yml Split internal docs from app repo 2026-04-17 12:39:28 +07:00
docker-compose31.yml Split internal docs from app repo 2026-04-17 12:39:28 +07:00
docker-compose32.yml Split internal docs from app repo 2026-04-17 12:39:28 +07:00
docker-compose33-mail.yml Add goal-aware recap mail pipeline 2026-05-14 13:24:17 +07:00
docker-compose33.yml feat: add nextcloud 33 support 2026-04-23 16:05:44 +07:00
docker-compose34.yml Prepare 0.8.2 release 2026-07-09 10:49:57 +07:00
Makefile Prepare 0.8.2 release 2026-07-09 10:49:57 +07:00
pack.whitelist fix: stabilize calendar selection and capture known issues 2025-10-28 15:57:06 +07:00
pack_opsdash.sh fix: stabilize calendar selection and capture known issues 2025-10-28 15:57:06 +07:00
README.md Raise Nextcloud minimum to 31 2026-07-14 13:35:35 +07:00
SECURITY.md Raise Nextcloud minimum to 31 2026-07-14 13:35:35 +07:00

Opsdash - Operational Calendar Dashboard

CI runs in Forgejo Actions on the Forgejo-hosted repository.

Opsdash is an independent third-party app that turns Nextcloud Calendar data into a practical operations dashboard: what happened, what is on target, and where your time is drifting.

Opsdash is not affiliated with, endorsed by, sponsored by, or officially maintained by Nextcloud GmbH or the Nextcloud project.

🚀 Feature Rundown

  • 📅 Dashboard KPIs for week/month, busiest days, averages, weekend share, top categories, longest events, and multi-tab layouts.
  • 🎯 Targets & pacing per-calendar and per-category goals, pace hints, trend context, forecast signals, and over-target progress beyond 200%.
  • ⏱️ Current period done vs planned active week/month separates elapsed hours from future hours so “done” metrics stop at now and upcoming time stays clearly labeled.
  • ⚖️ Balance share cards, stacked bars, relations/ratios, heatmaps, lookback trends, and daypart toggles.
  • 🧠 Notes edit “This week/month”, view “Last week/month”, and optionally surface notes in cards.
  • 🧩 Shared overlays onboarding, profiles, and the in-app What's new window now share one large overlay shell and interaction model.
  • Release notes in-app new versions can auto-open a What's new view with short highlights, preview images, a clickable version history, and remembered dismissal per app version.
  • 🗓️ Activity & schedule event and active-day KPIs plus “Days off” trend heatmaps.
  • 🔐 Runs inside Nextcloud same session, same permissions, CSRF-protected writes, no external API calls.
  • 🗂️ Deck widgets Deck cards now starts as a focused, manually scrollable action queue with separate Backlog access and an explicit expand control; Deck stats provides compact range-aware summaries.
  • 📨 Reporting & recap mail configure separate weekly/monthly recap modes, trigger a live test send from the UI, and render goal-type-aware mails inside the native Nextcloud email shell.
  • 📐 Widget sizing controls per-widget width/height plus scale/dense options for layout tuning.

Screenshots

Overview (Light)

Widgets (Light) Widgets (Dark)
Widgets Light Widgets Dark
Onboarding (Light) Onboarding (Dark)
Onboarding Light Onboarding Dark
What's New Overlay
What's New Overlay
Calendar Table (Light) Calendar Table (Dark)
Calendar Table Light Calendar Table Dark

Compatibility

Opsdash supports Nextcloud installations, but it is an independent third-party app and not an official Nextcloud app.

Branch Nextcloud App version
master 31-34 0.8.3
release/0.5.x 30-33 Store-ready line

Install

Install from the Nextcloud App Store as a third-party app (when published) or place opsdash in custom_apps/ and enable it:

occ app:enable opsdash

Development

make start
cd opsdash
npm ci
composer install
npm run build
npm run test:unit
composer run test:unit
PLAYWRIGHT_BASE_URL=http://localhost:8093 npm run test:e2e
  • make start starts the local Nextcloud 33 dev container on http://localhost:8093.
  • make start34 starts the Nextcloud 34 container on http://localhost:8095.
  • make start33 starts the same Nextcloud 33 stack explicitly.
  • make start32 starts the Nextcloud 32 container on http://localhost:8092.
  • make start31 starts the Nextcloud 31 container on http://localhost:8088.
  • The checked-out app is mounted into the dev container from ./opsdash by default. Override with APP_SOURCE_DIR=/abs/path/to/opsdash if you need a different source path.
  • make status / make logs help confirm the stack is up before testing.
  • The ghcr.io/juliusknorr/nextcloud-dev-php83:latest image bootstraps the server on first start. After docker compose up -d, Apache may answer on the mapped port before Nextcloud is ready.
  • On a fresh volume, wait until docker exec <container> bash -lc 'cd /var/www/html && php occ status' reports installed: true. This can take roughly 4 minutes on first bootstrap.
  • Do not run php occ maintenance:install against these dev-image containers during normal startup. Use the image's built-in bootstrap flow and only intervene manually when you intentionally reset a dedicated test volume.

Mail Test Stack

For SMTP testing with a local mail catcher:

docker compose -f docker-compose33-mail.yml up -d
docker exec nc33-mailguard bash -lc 'cd /var/www/html && php occ status'
  • docker-compose33-mail.yml starts a dedicated Nextcloud 33 test instance on http://localhost:8094.
  • It also starts Mailpit with SMTP on localhost:1026 and the web inbox on http://localhost:8026.
  • The same bootstrap rule applies here: wait for occ status to show installed: true before setting SMTP, users, or app config.
  • Test-send paths:
    • UI: POST /overview/report/test-send
    • CLI payload: php occ opsdash:report --user=<uid> --range=week --offset=0 --format=json
  • Report mails are goal-type-driven:
    • Single Goal
    • Calendar Goals
    • Calendar + Category Goals
  • Dashboard presets/layout variants stay in the UI, but they do not affect report rendering.
  • Automatic recap delivery is integrated through the Nextcloud background job system, not an app-managed Unix cron path.
  • Scheduler semantics:
    • final = complete previous week/month after the period closes
    • checkpoint_final = midpoint checkpoint plus final closed-period recap
    • sendTimeLocal = user-local Nextcloud time, not raw server time
  • Current defaults:
    • weekly enabled: final at 06:00
    • monthly disabled: checkpoint_final at 18:00
  • Release builds intentionally expose only one Opsdash occ command: php occ opsdash:report.

Quick smoke check:

make smoke

Packaging

make release VERSION=0.8.3

One-step release helper:

  • bumps appinfo/info.xml, package.json, package-lock.json, opsdash/VERSION, and SECURITY.md
  • runs the packaged app build
  • creates build/dist/opsdash-<version>.tar.gz

Manual packaging only:

make appstore VERSION=0.8.3

Produces build/dist/opsdash-<version>.tar.gz (unsigned).
Sign separately with:

make sign VERSION=0.8.3 SIGN_PRIVATE_KEY_FILE=/secure/path/privkey.pem SIGN_CERT_FILE=/secure/path/cert.crt SIGN_CONTAINER=nc33-dev

Upload the signed tarball with:

FORGEJO_TOKEN=<token> make upload VERSION=0.8.3 RELEASE_TAG=v0.8.3

Push to the Nextcloud App Store with:

APPSTORE_TOKEN=<token> SIGN_PRIVATE_KEY_FILE=/secure/path/privkey.pem DOWNLOAD_URL=https://public-host/opsdash-0.8.3.tar.gz make appstore-push VERSION=0.8.3

Long-form internal release and runbook documentation now lives in the separate opsdash-docs and opsdash-ops workspace repos. Keep this repo focused on the app, its generic release commands, and contributor-facing basics.

Contributing

  1. Keep PRs focused.
  2. Update docs and fixtures when payloads change.
  3. Run unit tests before opening a PR.