nextcloud-notes-desktop/README.md
Daniel 0076b37a23
Some checks failed
Release / Build Linux (push) Has been cancelled
Release / Build macOS (push) Has been cancelled
Use Forgejo runners for release builds
2026-05-15 16:39:18 +02:00

2.2 KiB

Nextcloud Notes Desktop

A fast, cross-platform desktop client for the Nextcloud Notes app, inspired by dgmid/nextcloud-notes-mac-client but rebuilt with a modern Electron + React stack.

Goals

  • macOS-first desktop experience with Windows/Linux builds available.
  • Fast startup from a local IndexedDB cache.
  • Incremental sync using the Nextcloud Notes API pruneBefore and chunk cursor support.
  • Safe credential storage via Electron safeStorage when available; renderer code never receives the stored app password.
  • ETag-aware updates to avoid overwriting newer server changes.
  • Hardened Electron shell with context isolation, renderer sandboxing, blocked permission prompts, denied window popups, and a content security policy.

Development

npm install
npm run dev

Use a Nextcloud app password for login.

Packaging

npm run dist:mac
npm run dist:win
npm run dist:linux

Artifacts are written to release/.

macOS DMG builds must run on macOS because the DMG toolchain and dmg-license dependency are Darwin-only. The dist:mac script builds both Intel and Apple Silicon outputs when run on a Mac.

CI Releases

Forgejo Actions builds release artifacts on registered runners. The Linux job uses the existing ubuntu-latest runner; the macOS job expects a Forgejo runner registered with the macos-latest label so it can build DMG/zip artifacts natively. Push a version tag to publish artifacts to a Forgejo Release:

git tag v0.1.0
git push origin v0.1.0

The workflow can also be run manually from the Actions tab; manual runs upload workflow artifacts but do not create a GitHub Release unless the run is for a v* tag.

Current Linux outputs:

  • release/Nextcloud Notes-0.1.0-linux-x86_64.AppImage
  • release/Nextcloud Notes-0.1.0-linux-amd64.deb

Notes API

The app uses:

  • GET /index.php/apps/notes/api/v1/notes?chunkSize=100&pruneBefore=<unix>
  • GET /index.php/apps/notes/api/v1/notes/:id
  • POST /index.php/apps/notes/api/v1/notes
  • PUT /index.php/apps/notes/api/v1/notes/:id with If-Match
  • DELETE /index.php/apps/notes/api/v1/notes/:id

The sync path handles the API's final pruned ID-only chunk for deletion detection.