diff --git a/.github/workflows/dependabot-approve-merge.yml b/.github/workflows/dependabot-approve-merge.yml
new file mode 100644
index 00000000..ed902d92
--- /dev/null
+++ b/.github/workflows/dependabot-approve-merge.yml
@@ -0,0 +1,49 @@
+# This workflow is provided via the organization template repository
+#
+# https://github.com/nextcloud/.github
+# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
+#
+# SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors
+# SPDX-License-Identifier: MIT
+
+name: Dependabot
+
+on:
+ pull_request_target: # zizmor: ignore[dangerous-triggers]
+ branches:
+ - main
+ - master
+ - stable*
+
+permissions:
+ contents: read
+
+concurrency:
+ group: dependabot-approve-merge-${{ github.head_ref || github.run_id }}
+ cancel-in-progress: true
+
+jobs:
+ auto-approve-merge:
+ if: github.event.pull_request.user.login == 'dependabot[bot]' || github.event.pull_request.user.login == 'renovate[bot]'
+ runs-on: ubuntu-latest-low
+ permissions:
+ # for hmarr/auto-approve-action to approve PRs
+ pull-requests: write
+
+ steps:
+ - name: Disabled on forks
+ if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
+ run: |
+ echo 'Can not approve PRs from forks'
+ exit 1
+
+ # GitHub actions bot approve
+ - uses: hmarr/auto-approve-action@b40d6c9ed2fa10c9a2749eca7eb004418a705501 # v2
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+
+ # Nextcloud bot approve and merge request
+ - uses: ahmadnassri/action-dependabot-auto-merge@45fc124d949b19b6b8bf6645b6c9d55f4f9ac61a # v2
+ with:
+ target: minor
+ github-token: ${{ secrets.DEPENDABOT_AUTOMERGE_TOKEN }}
diff --git a/.github/workflows/release-relay.yml b/.github/workflows/release-relay.yml
new file mode 100644
index 00000000..08908315
--- /dev/null
+++ b/.github/workflows/release-relay.yml
@@ -0,0 +1,38 @@
+# This workflow is provided via the organization template repository
+#
+# https://github.com/nextcloud/.github
+# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
+#
+# SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
+# SPDX-License-Identifier: MIT
+
+name: Notify release-relay on release
+
+on:
+ release:
+ types: [published]
+
+permissions:
+ contents: read
+
+jobs:
+ notify:
+ name: Dispatch release to release-relay
+ runs-on: ubuntu-latest
+
+ # Only allowed to run on nextcloud-releases repositories
+ if: ${{ github.repository_owner == 'nextcloud-releases' }}
+
+ steps:
+ - name: Check actor permission
+ uses: skjnldsv/check-actor-permission@69e92a3c4711150929bca9fcf34448c5bf5526e7 # v3.0
+ with:
+ require: write
+
+ - name: Dispatch to release-relay
+ uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4.0.1
+ with:
+ token: ${{ secrets.DISPATCH_PAT }}
+ repository: nextcloud-gmbh/release-relay
+ event-type: app-tagged
+ client-payload: '{"app": "${{ github.repository }}", "tag": "${{ github.event.release.tag_name }}"}'
diff --git a/.github/workflows/update-nextcloud-ocp-approve-merge.yml b/.github/workflows/update-nextcloud-ocp-approve-merge.yml
new file mode 100644
index 00000000..dfe0ef4e
--- /dev/null
+++ b/.github/workflows/update-nextcloud-ocp-approve-merge.yml
@@ -0,0 +1,58 @@
+# This workflow is provided via the organization template repository
+#
+# https://github.com/nextcloud/.github
+# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
+#
+# SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors
+# SPDX-License-Identifier: MIT
+
+name: Auto approve nextcloud/ocp
+
+on:
+ pull_request_target: # zizmor: ignore[dangerous-triggers]
+ branches:
+ - main
+ - master
+ - stable*
+
+permissions:
+ contents: read
+
+concurrency:
+ group: update-nextcloud-ocp-approve-merge-${{ github.head_ref || github.run_id }}
+ cancel-in-progress: true
+
+jobs:
+ auto-approve-merge:
+ if: github.actor == 'nextcloud-command'
+ runs-on: ubuntu-latest-low
+ permissions:
+ # for hmarr/auto-approve-action to approve PRs
+ pull-requests: write
+ # for alexwilson/enable-github-automerge-action to approve PRs
+ contents: write
+
+ steps:
+ - name: Disabled on forks
+ if: ${{ github.event.pull_request.head.repo.full_name != github.repository }}
+ run: |
+ echo 'Can not approve PRs from forks'
+ exit 1
+
+ - uses: mdecoleman/pr-branch-name@55795d86b4566d300d237883103f052125cc7508 # v3.0.0
+ id: branchname
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+
+ # GitHub actions bot approve
+ - uses: hmarr/auto-approve-action@b40d6c9ed2fa10c9a2749eca7eb004418a705501 # v2
+ if: startsWith(steps.branchname.outputs.branch, 'automated/noid/') && endsWith(steps.branchname.outputs.branch, 'update-nextcloud-ocp')
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+
+ # Enable GitHub auto merge
+ - name: Auto merge
+ uses: alexwilson/enable-github-automerge-action@56e3117d1ae1540309dc8f7a9f2825bc3c5f06ff # v2.0.0
+ if: startsWith(steps.branchname.outputs.branch, 'automated/noid/') && endsWith(steps.branchname.outputs.branch, 'update-nextcloud-ocp')
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/update-nextcloud-ocp.yml b/.github/workflows/update-nextcloud-ocp.yml
new file mode 100644
index 00000000..1e143aaa
--- /dev/null
+++ b/.github/workflows/update-nextcloud-ocp.yml
@@ -0,0 +1,128 @@
+# This workflow is provided via the organization template repository
+#
+# https://github.com/nextcloud/.github
+# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
+#
+# SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors
+# SPDX-License-Identifier: MIT
+
+name: Update nextcloud/ocp
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: "5 2 * * 0"
+
+permissions:
+ contents: read
+ issues: write
+
+jobs:
+ update-nextcloud-ocp:
+ runs-on: ubuntu-latest
+
+ strategy:
+ fail-fast: false
+ matrix:
+ branches:
+ - ${{ github.event.repository.default_branch }}
+ - 'stable34'
+ - 'stable33'
+ - 'stable32'
+
+ name: update-nextcloud-ocp-${{ matrix.branches }}
+
+ steps:
+ - id: checkout
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+ with:
+ persist-credentials: false
+ ref: ${{ matrix.branches }}
+ submodules: true
+ continue-on-error: true
+
+ - name: Set up php8.2
+ if: steps.checkout.outcome == 'success'
+ uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
+ with:
+ php-version: 8.2
+ # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
+ extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
+ coverage: none
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Read codeowners
+ if: steps.checkout.outcome == 'success'
+ id: codeowners
+ run: |
+ grep '/appinfo/info.xml' .github/CODEOWNERS | cut -f 2- -d ' ' | xargs | awk '{ print "codeowners="$0 }' >> $GITHUB_OUTPUT
+ continue-on-error: true
+
+ - name: Composer install
+ if: steps.checkout.outcome == 'success'
+ run: composer install
+
+ - name: Composer update nextcloud/ocp
+ id: update_branch
+ if: ${{ steps.checkout.outcome == 'success' && matrix.branches != 'main' }}
+ run: composer require --dev 'nextcloud/ocp:dev-${{ matrix.branches }}'
+
+ - name: Raise on issue on failure
+ uses: dacbd/create-issue-action@cdb57ab6ff8862aa09fee2be6ba77a59581921c2 # v2.0.0
+ if: ${{ steps.checkout.outcome == 'success' && failure() && steps.update_branch.conclusion == 'failure' }}
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ title: 'Failed to update nextcloud/ocp package on branch ${{ matrix.branches }}'
+ body: 'Please check the output of the GitHub action and manually resolve the issues
${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
${{ steps.codeowners.outputs.codeowners }}'
+
+ - name: Composer update nextcloud/ocp
+ id: update_main
+ if: ${{ steps.checkout.outcome == 'success' && matrix.branches == 'main' }}
+ run: composer require --dev nextcloud/ocp:dev-master
+
+ - name: Raise on issue on failure
+ uses: dacbd/create-issue-action@cdb57ab6ff8862aa09fee2be6ba77a59581921c2 # v2.0.0
+ if: ${{ steps.checkout.outcome == 'success' && failure() && steps.update_main.conclusion == 'failure' }}
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ title: 'Failed to update nextcloud/ocp package on branch ${{ matrix.branches }}'
+ body: 'Please check the output of the GitHub action and manually resolve the issues
${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
${{ steps.codeowners.outputs.codeowners }}'
+
+ - name: Reset checkout 3rdparty
+ if: steps.checkout.outcome == 'success'
+ run: |
+ git clean -f 3rdparty
+ git checkout 3rdparty
+ continue-on-error: true
+
+ - name: Reset checkout vendor
+ if: steps.checkout.outcome == 'success'
+ run: |
+ git clean -f vendor
+ git checkout vendor
+ continue-on-error: true
+
+ - name: Reset checkout vendor-bin
+ if: steps.checkout.outcome == 'success'
+ run: |
+ git clean -f vendor-bin
+ git checkout vendor-bin
+ continue-on-error: true
+
+ - name: Create Pull Request
+ if: steps.checkout.outcome == 'success'
+ uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
+ with:
+ token: ${{ secrets.COMMAND_BOT_PAT }}
+ commit-message: 'chore(dev-deps): Bump nextcloud/ocp package'
+ committer: GitHub
+ author: nextcloud-command
+ signoff: true
+ branch: 'automated/noid/${{ matrix.branches }}-update-nextcloud-ocp'
+ title: '[${{ matrix.branches }}] Update nextcloud/ocp dependency'
+ body: |
+ Auto-generated update of [nextcloud/ocp](https://github.com/nextcloud-deps/ocp/) dependency
+ labels: |
+ dependencies
+ 3. to review
diff --git a/.nextcloudignore b/.nextcloudignore
new file mode 100644
index 00000000..3cc54d8a
--- /dev/null
+++ b/.nextcloudignore
@@ -0,0 +1,44 @@
+# SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+/AUTHORS.md
+/build
+/.editorconfig
+/.eslintrc.js
+/.git
+/.github
+/.gitignore
+/.php*
+/.travis.yml
+/.tx
+/.scrutinizer.yml
+/.nextcloudignore
+/babel.config.js
+/CONTRIBUTING.md
+/composer.json
+/composer.lock
+/composer.phar
+/karma.conf.js
+/krankerl.toml
+/l10n/no-php
+/Makefile
+/nbproject
+/node_modules
+/package.json
+/package-lock.json
+/psalm.xml
+/screenshots
+/src
+/stylelint.config.js
+/tests
+/vendor/bin
+/vendor/**/tests
+/webpack.common.js
+/webpack.dev.js
+/webpack.js
+/webpack.prod.js
+/vendor/bin
+/vendor-bin
+/vite.config.ts
+/tsconfig.json
+/rector.php
+/CHANGELOG.md
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 99b70b51..00000000
--- a/Makefile
+++ /dev/null
@@ -1,114 +0,0 @@
-# SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
-# SPDX-License-Identifier: AGPL-3.0-or-later
-app_name=FullTextSearch
-
-build_dir=$(CURDIR)/build/artifacts
-appstore_dir=$(build_dir)/appstore
-source_dir=$(build_dir)/source
-sign_dir=$(build_dir)/sign
-package_name=$(shell echo $(app_name) | tr '[:upper:]' '[:lower:]')
-cert_dir=$(HOME)/.nextcloud/certificates
-github_account=nextcloud
-release_account=nextcloud-releases
-NPM?=npm
-branch=stable29
-version=29.0.0
-since_tag=
-
-all: appstore
-
-release: appstore github-release github-upload
-
-github-release:
- if [ -z "$(release_account)" ]; then \
- release_account=$(github_account); \
- release_branch=$(branch); \
- else \
- release_account=$(release_account); \
- release_branch=master; \
- fi; \
- if [ -z "$(since_tag)" ]; then \
- latest_tag=$$(git describe --tags `git rev-list --tags --max-count=1`); \
- else \
- latest_tag=$(since_tag); \
- fi; \
- comparison="$$latest_tag..HEAD"; \
- if [ -z "$$latest_tag" ]; then comparison=""; fi; \
- changelog=$$(git log $$comparison --oneline --no-merges | sed -e 's/^/$(github_account)\/$(package_name)@/'); \
- github-release release \
- --user $$release_account \
- --repo $(package_name) \
- --target $$release_branch \
- --tag $(version) \
- --description "**Changelog**
$$changelog" \
- --name "$(app_name) v$(version)"; \
- if [ $(github_account) != $$release_account ]; then \
- link="https://github.com/$$release_account/$(package_name)/releases/download/$(version)/$(package_name)-$(version).tar.gz";\
- github-release release \
- --user $(github_account) \
- --repo $(package_name) \
- --target $(branch) \
- --tag $(version) \
- --description "**Download**
$$link
**Changelog**
$$changelog
" \
- --name "$(app_name) v$(version)"; \
- fi; \
-
-
-github-upload:
- if [ -z "$(release_account)" ]; then \
- release_account=$(github_account); \
- else \
- release_account=$(release_account); \
- fi; \
- github-release upload \
- --user $$release_account \
- --repo $(package_name) \
- --tag $(version) \
- --name "$(package_name)-$(version).tar.gz" \
- --file $(build_dir)/$(package_name).tar.gz
-
-
-clean:
- rm -rf $(build_dir)
- rm -rf node_modules
-
-# composer packages
-composer:
- composer install --prefer-dist
- composer upgrade --prefer-dist
-
-node-modules:
- $(NPM) ci
-
-build-js-production:
- $(NPM) run build
-
-appstore: clean node-modules build-js-production composer
- mkdir -p $(sign_dir)
- rsync -a \
- --exclude=/build \
- --exclude=/docs \
- --exclude=/translationfiles \
- --exclude=/.tx \
- --exclude=/tests \
- --exclude=.git \
- --exclude=/.github \
- --exclude=/l10n/l10n.pl \
- --exclude=/CONTRIBUTING.md \
- --exclude=/issue_template.md \
- --exclude=/README.md \
- --exclude=/composer.json \
- --exclude=/testConfiguration.json \
- --exclude=/composer.lock \
- --exclude=/.gitattributes \
- --exclude=/.gitignore \
- --exclude=/.scrutinizer.yml \
- --exclude=/.travis.yml \
- --exclude=/Makefile \
- ./ $(sign_dir)/$(package_name)
- tar -czf $(build_dir)/$(package_name).tar.gz \
- -C $(sign_dir) $(package_name)
- @if [ -f $(cert_dir)/$(package_name).key ]; then \
- echo "Signing packageā¦"; \
- openssl dgst -sha512 -sign $(cert_dir)/$(package_name).key $(build_dir)/$(package_name).tar.gz | openssl base64; \
- fi
diff --git a/krankerl.toml b/krankerl.toml
new file mode 100644
index 00000000..7244d991
--- /dev/null
+++ b/krankerl.toml
@@ -0,0 +1,8 @@
+# SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
+# SPDX-License-Identifier: AGPL-3.0-or-later
+[package]
+before_cmds = [
+ "composer install --no-dev -o",
+ 'npm ci',
+ 'npm run build'
+]