diff --git a/.github/actions/prepare-linux/action.yml b/.github/actions/prepare-linux/action.yml
index 5aa2b824..c7011157 100644
--- a/.github/actions/prepare-linux/action.yml
+++ b/.github/actions/prepare-linux/action.yml
@@ -52,7 +52,7 @@ runs:
if: inputs.conan == 'true'
uses: conan-io/setup-conan@2f4bd34e8e0af00e1a77a66e1d284e06d71d703f # v1
with:
- version: 2.25.1
+ version: 2.28.1
cache_packages: true
- name: Install Conan dependencies
diff --git a/.github/actions/prepare-macos/action.yml b/.github/actions/prepare-macos/action.yml
index cd3ad1f3..da531f14 100644
--- a/.github/actions/prepare-macos/action.yml
+++ b/.github/actions/prepare-macos/action.yml
@@ -37,7 +37,7 @@ runs:
- name: Install Conan
uses: conan-io/setup-conan@2f4bd34e8e0af00e1a77a66e1d284e06d71d703f # v1
with:
- version: 2.25.1
+ version: 2.28.1
cache_packages: true
- name: Install Conan dependencies
diff --git a/.github/actions/prepare-windows/action.yml b/.github/actions/prepare-windows/action.yml
index da618b4a..504fbd7f 100644
--- a/.github/actions/prepare-windows/action.yml
+++ b/.github/actions/prepare-windows/action.yml
@@ -16,7 +16,7 @@ runs:
- name: Install NSIS
id: nsis
- uses: negrutiu/nsis-install@f3339c88dba6fd08910d5275a943f8f746d94876 # v2
+ uses: negrutiu/nsis-install@9c575d44c2938a43e38a305caeb403de90303c60 # v3
- name: Install `ExecDos` NSIS-plugin
uses: negrutiu/nsis-install-plugin@c7f666810808b77249537bec2f7110e7ad9340b1 # v1
@@ -40,7 +40,7 @@ runs:
- name: Install Conan
uses: conan-io/setup-conan@2f4bd34e8e0af00e1a77a66e1d284e06d71d703f # v1
with:
- version: 2.25.1
+ version: 2.28.1
cache_packages: true
- name: Install Conan dependencies
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index ccc42eb8..ffa4cb39 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -16,10 +16,24 @@ on:
branches:
- release
- main
+ paths:
+ - 'src/**'
+ - 'external/**'
+ - '**/CMakeLists.txt'
+ - '**/conanfile.py'
+ - '**/conanfile.txt'
+ - '.github/workflows/codeql.yml'
pull_request:
branches:
- release
- main
+ paths:
+ - 'src/**'
+ - 'external/**'
+ - '**/CMakeLists.txt'
+ - '**/conanfile.py'
+ - '**/conanfile.txt'
+ - '.github/workflows/codeql.yml'
schedule:
- cron: '18 19 * * 5'
@@ -92,7 +106,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 # v4
+ uses: github/codeql-action/init@7211b7c8077ea37d8641b6271f6a365a22a5fbfa # v4
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
@@ -119,6 +133,6 @@ jobs:
cmake --build --preset conan-release --parallel $(nproc --all)
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13 # v4
+ uses: github/codeql-action/analyze@7211b7c8077ea37d8641b6271f6a365a22a5fbfa # v4
with:
category: "/language:${{matrix.language}}"
diff --git a/.github/workflows/gonnect.yml b/.github/workflows/gonnect.yml
index 0fd31ad6..62f39e63 100644
--- a/.github/workflows/gonnect.yml
+++ b/.github/workflows/gonnect.yml
@@ -2,11 +2,38 @@ name: GOnnect Build
on:
workflow_dispatch: # can be manually dispatched under GitHub's "Actions" tab
+ inputs:
+ run_build:
+ description: Run build job
+ type: boolean
+ run_build_windows:
+ description: Run build-windows job
+ type: boolean
+ run_build_macos:
+ description: Run build-macos job
+ type: boolean
+ run_format:
+ description: Run format job
+ type: boolean
+ run_clang:
+ description: Run clang job
+ type: boolean
+ run_clazy:
+ description: Run clazy job
+ type: boolean
+ run_flatpak:
+ description: Run flatpak job
+ type: boolean
+ run_tests:
+ description: Run tests job
+ type: boolean
# Run the build only, if the branch is release or main or a PR with release or main as target is used
push:
branches:
- release
- main
+ tags:
+ - 'v*'
# Use the release/main branch workflow/actions definitions rather the definitions in the pull_request
pull_request:
branches:
@@ -25,11 +52,61 @@ env:
permissions:
contents: read
pull-requests: read
+ id-token: write
jobs:
+ # Detect changes to allow selecting the jobs to run.
+ # If the workflow is triggered manually, the selection comes from the inputs there.
+ changes:
+ runs-on: ubuntu-24.04
+ outputs:
+ # Job selection comes from inputs, if started manually. No need to use detected changes.
+ src: ${{ github.event_name != 'workflow_dispatch' && steps.filter.outputs.src }}
+ build: ${{ github.event_name != 'workflow_dispatch' && steps.filter.outputs.build }}
+ flatpak: ${{ github.event_name != 'workflow_dispatch' && steps.filter.outputs.flatpak }}
+ tests: ${{ github.event_name != 'workflow_dispatch' && steps.filter.outputs.tests }}
+ resources: ${{ github.event_name != 'workflow_dispatch' && steps.filter.outputs.resources }}
+ resources-windows: ${{ github.event_name != 'workflow_dispatch' && steps.filter.outputs.resources-windows }}
+ resources-macos: ${{ github.event_name != 'workflow_dispatch' && steps.filter.outputs.resources-macos }}
+ steps:
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
+
+ - name: Get changes
+ uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d
+ id: filter
+ with:
+ filters: |
+ src:
+ - 'src/**'
+ - 'external/**'
+ build:
+ - '**/CMakeLists.txt'
+ - '**/conanfile.py'
+ - '**/conanfile.txt'
+ - '**/CMakePresets.json'
+ flatpak:
+ - 'resources/flatpak/**'
+ - 'CMakeLists.txt'
+ tests:
+ - 'tests/**'
+ resources:
+ - 'resources/artwork/**'
+ - 'resources/emojis/**'
+ - 'resources/font/**'
+ - 'resources/sounds/**'
+ - 'resources/templates/**'
+ - 'migrate/**'
+ - 'i18n/**/*.ts'
+ resources-windows:
+ - 'resources/windows/**'
+ resources-macos:
+ - 'resources/macos/**'
+
build:
runs-on: ubuntu-24.04
name: "Build GOnnect (Linux)"
+ needs: changes
+ if: ${{ inputs.run_build || needs.changes.outputs.src == 'true' || needs.changes.outputs.tests == 'true' || needs.changes.outputs.build == 'true' }}
env:
CC: clang
CXX: clang++
@@ -52,7 +129,7 @@ jobs:
run: cmake --build --preset conan-release --parallel $(nproc --all)
- name: Upload Test artifacts
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: gonnect-tests
path: build/Release/tests/contactsTest
@@ -61,6 +138,8 @@ jobs:
build-windows:
runs-on: windows-2025
name: "Build GOnnect (Windows)"
+ needs: changes
+ if: ${{ inputs.run_build_windows || needs.changes.outputs.src == 'true' || needs.changes.outputs.build == 'true' || needs.changes.outputs.resources == 'true' || needs.changes.outputs.resources-windows == 'true' }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
@@ -73,18 +152,61 @@ jobs:
- name: Configure CMake
shell: cmd
- run: cmake --preset conan-default -DENABLE_MSGRAPH=ON
+ run: cmake --preset conan-default -DENABLE_MSGRAPH=ON -DMS_APPLICATION_IDENTIFIER=${{ secrets.AZURE_CLIENT_ID }}
env:
NSIS_USE_FAST_COMPRESSION: "1"
- - name: Build
+ - name: Build application
run: cmake --build --preset conan-release
- - name: Package
+ - name: Azure Login via OIDC
+ if: |
+ startsWith(github.ref, 'refs/tags/v') ||
+ github.ref == 'refs/heads/main' ||
+ github.ref == 'refs/heads/release'
+ uses: azure/login@532459ea530d8321f2fb9bb10d1e0bcf23869a43 # v3
+ with:
+ client-id: ${{ secrets.AZURE_CLIENT_ID }}
+ tenant-id: ${{ secrets.AZURE_TENANT_ID }}
+ subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
+
+ - name: Sign application
+ if: |
+ startsWith(github.ref, 'refs/tags/v') ||
+ github.ref == 'refs/heads/main' ||
+ github.ref == 'refs/heads/release'
+ uses: azure/artifact-signing-action@c7ab2a863ab5f9a846ddb8265964877ef296ee82 # v2
+ with:
+ endpoint: https://weu.codesigning.azure.net/
+ signing-account-name: GONICUS-signing
+ certificate-profile-name: gonicus-profile
+ files-folder: build/Release
+ files-folder-filter: exe
+ file-digest: SHA256
+ timestamp-rfc3161: http://timestamp.acs.microsoft.com
+ timestamp-digest: SHA256
+
+ - name: Build installer
run: cd build && cpack ${{github.workspace}}
+ - name: Sign installer
+ if: |
+ startsWith(github.ref, 'refs/tags/v') ||
+ github.ref == 'refs/heads/main' ||
+ github.ref == 'refs/heads/release'
+ uses: azure/artifact-signing-action@c7ab2a863ab5f9a846ddb8265964877ef296ee82 # v2
+ with:
+ endpoint: https://weu.codesigning.azure.net/
+ signing-account-name: GONICUS-signing
+ certificate-profile-name: gonicus-profile
+ files-folder: build
+ files-folder-filter: exe
+ file-digest: SHA256
+ timestamp-rfc3161: http://timestamp.acs.microsoft.com
+ timestamp-digest: SHA256
+
- name: Save installer
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: windows-installer.zip
compression-level: 0
@@ -93,6 +215,8 @@ jobs:
build-macos:
runs-on: macos-26
name: "Build GOnnect (MacOS)"
+ needs: changes
+ if: ${{ inputs.run_build_macos || needs.changes.outputs.src == 'true' || needs.changes.outputs.build == 'true' || needs.changes.outputs.resources == 'true' || needs.changes.outputs.resources-macos == 'true' }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
@@ -113,17 +237,17 @@ jobs:
run: cd build/Release && cpack ${{github.workspace}}
- name: Save installer
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: mac-installer.dmg
compression-level: 0
path: build/Release/GOnnect*.dmg
format:
- # disable temporarily due to defect action: https://github.com/jidicula/clang-format-action/issues/267
- if: false
runs-on: ubuntu-24.04
name: "Code Formatting"
+ needs: changes
+ if: ${{ inputs.run_format || needs.changes.outputs.src == 'true' }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Run clang-format style check for C/C++/Protobuf programs.
@@ -136,6 +260,8 @@ jobs:
clang:
runs-on: ubuntu-24.04
name: "Static Code Analyzer"
+ needs: changes
+ if: ${{ inputs.run_clang || needs.changes.outputs.src == 'true' }}
env:
CC: clang
CXX: clang++
@@ -159,7 +285,7 @@ jobs:
scripts/static-clang-analyzer.sh
- name: Save Report
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: clang-report
path: /tmp/build.log
@@ -168,6 +294,8 @@ jobs:
runs-on: ubuntu-24.04
container: fedora:43
name: "Qt Semantics"
+ needs: changes
+ if: ${{ inputs.run_clazy || needs.changes.outputs.src == 'true' || needs.changes.outputs.build == 'true' }}
steps:
- name: Install dependencies
@@ -209,7 +337,7 @@ jobs:
conan profile detect || true
- name: Restore cached Conan packages
- uses: actions/cache/restore@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
+ uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
id: cache-conan-packages
with:
path: ${{ steps.conan-info.outputs.conan-home }}/p
@@ -224,7 +352,7 @@ jobs:
conan install . --build=missing -ctools.cmake.cmaketoolchain:generator=Ninja
- name: Cached Conan packages
- uses: actions/cache/save@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
+ uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
if: always() && steps.cache-conan-packages.outputs.cache-hit != 'true'
with:
path: ${{ steps.conan-info.outputs.conan-home }}/p
@@ -243,6 +371,8 @@ jobs:
flatpak:
name: "Flatpak"
runs-on: ubuntu-24.04
+ needs: changes
+ if: ${{ inputs.run_flatpak || needs.changes.outputs.flatpak == 'true' || needs.changes.outputs.src == 'true' || needs.changes.outputs.build == 'true' || needs.changes.outputs.resources == 'true' }}
container:
image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.10
options: --privileged
@@ -258,7 +388,7 @@ jobs:
run: |
echo "gonnect_version=$(grep -oP 'GOnnect VERSION ([0-9.]+)' CMakeLists.txt | awk '{ print $3 }')" >> $GITHUB_OUTPUT
- - uses: flatpak/flatpak-github-actions/flatpak-builder@92ae9851ad316786193b1fd3f40c4b51eb5cb101 # v6.6
+ - uses: flatpak/flatpak-github-actions/flatpak-builder@401fe28a8384095fc1531b9d320b292f0ee45adb # v6.7
with:
bundle: gonnect
build-bundle: 'true'
@@ -269,7 +399,8 @@ jobs:
tests:
runs-on: ubuntu-24.04
name: "Unit Tests"
- needs: build
+ needs: [changes, build]
+ if: ${{ (inputs.run_tests || needs.changes.outputs.src == 'true' || needs.changes.outputs.build == 'true' || needs.changes.outputs.tests == 'true') && needs.build.result == 'success' }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
@@ -295,3 +426,17 @@ jobs:
uses: geekyeggo/delete-artifact@176a747ab7e287e3ff4787bf8a148716375ca118 # v6
with:
name: gonnect-tests
+
+ ci-status:
+ needs: [changes, build, build-windows, build-macos, format, clang, clazy, flatpak, tests]
+ if: always() # Ensure this runs even if upstream jobs were skipped
+ runs-on: ubuntu-24.04
+ steps:
+ - name: Verify pipeline status
+ run: |
+ # Contains evaluates to true if any job failed or was cancelled
+ if ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }}; then
+ echo "Pipeline failed."
+ exit 1
+ fi
+ echo "Pipeline passed!"
diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml
index 2cd9c75d..99032a7c 100644
--- a/.github/workflows/release-build.yml
+++ b/.github/workflows/release-build.yml
@@ -33,7 +33,7 @@ jobs:
run: |
echo "gonnect_version=$(grep -oP 'GOnnect VERSION ([0-9.]+)' CMakeLists.txt | awk '{ print $3 }')" >> $GITHUB_OUTPUT
- - uses: flatpak/flatpak-github-actions/flatpak-builder@92ae9851ad316786193b1fd3f40c4b51eb5cb101 # v6.6
+ - uses: flatpak/flatpak-github-actions/flatpak-builder@401fe28a8384095fc1531b9d320b292f0ee45adb # v6.7
with:
bundle: GOnnect.flatpak
build-bundle: 'true'
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 260b5ddb..1ea7c509 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -27,9 +27,9 @@ jobs:
steps:
- name: Get token
id: get_token
- uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3
+ uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3
with:
- app-id: ${{ secrets.RELEASE_APP_ID }}
+ client-id: ${{ secrets.RELEASE_APP_ID }}
private-key: ${{ secrets.RELEASE_APP_KEY }}
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
@@ -37,7 +37,7 @@ jobs:
fetch-depth: 0
token: ${{ steps.get_token.outputs.token }}
- name: Setup Node.js
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
node-version: "lts/*"
- name: Install dependencies
diff --git a/.github/workflows/renovate.yml b/.github/workflows/renovate.yml
index 4180c11a..40834b93 100644
--- a/.github/workflows/renovate.yml
+++ b/.github/workflows/renovate.yml
@@ -27,9 +27,9 @@ jobs:
steps:
- name: Get token
id: get_token
- uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3
+ uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3
with:
- app-id: ${{ secrets.APP_ID }}
+ client-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.APP_KEY }}
- name: Checkout
@@ -46,7 +46,7 @@ jobs:
resources/conan/updater.py --renovate=tmp/renovate/ -v
- name: Serve Files
- uses: Eun/http-server-action@f71cec1321f665652a46c40b6852f8e5a68bfcd4 # v1
+ uses: Eun/http-server-action@dadebd209d4a902eeefceb524c24c38b364c46a7 # v1
with:
directory: ${{ github.workspace }}/tmp/renovate/
port: 8080
@@ -58,7 +58,7 @@ jobs:
}
- name: Self-hosted Renovate
- uses: renovatebot/github-action@3633cede7d4d4598438e654eac4a695e46004420 # v46.1.7
+ uses: renovatebot/github-action@693b9ef15eec82123529a37c782242f091365961 # v46.1.14
with:
docker-cmd-file: .github/renovate-entrypoint.sh
docker-user: root
diff --git a/.gitignore b/.gitignore
index daf0da6e..55733278 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,6 @@
samples/callhistory.db
.qtcreator
-
# Used https://www.toptal.com/developers/gitignore/api/qtcreator,vim
# as a starting point.
@@ -66,4 +65,4 @@ tags
# Updater
updater.sqlite
__pycache__
-tmp/
\ No newline at end of file
+tmp/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7748f29f..d9bbec1f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,136 @@
+# [2.2.0-beta.9](https://github.com/gonicus/gonnect/compare/v2.2.0-beta.8...v2.2.0-beta.9) (2026-05-28)
+
+
+### Bug Fixes
+
+* clear out URI encoded number input ([#475](https://github.com/gonicus/gonnect/issues/475)) ([cd1c126](https://github.com/gonicus/gonnect/commit/cd1c126b55aef57532db88ae432705d8421f7fe7))
+
+
+### Features
+
+* add Blinkstick busylight support ([#474](https://github.com/gonicus/gonnect/issues/474)) ([af400bd](https://github.com/gonicus/gonnect/commit/af400bd2b32bb19ff1e62c8ff9fc20531056d997))
+
+# [2.2.0-beta.8](https://github.com/gonicus/gonnect/compare/v2.2.0-beta.7...v2.2.0-beta.8) (2026-05-21)
+
+
+### Bug Fixes
+
+* robustness for media and contacts cache ([#471](https://github.com/gonicus/gonnect/issues/471)) ([d879e1b](https://github.com/gonicus/gonnect/commit/d879e1b6a16ddca85658b20b8fb0fca63e51f05c))
+
+# [2.2.0-beta.7](https://github.com/gonicus/gonnect/compare/v2.2.0-beta.6...v2.2.0-beta.7) (2026-05-20)
+
+
+### Bug Fixes
+
+* do not show favorites in "most called" list ([#456](https://github.com/gonicus/gonnect/issues/456)) ([8ee676d](https://github.com/gonicus/gonnect/commit/8ee676d08a6e79eba5c31749fb62531dfa6c7069))
+* Ensure correct `tag` value type in flatpak manifest ([#466](https://github.com/gonicus/gonnect/issues/466)) ([3c5412a](https://github.com/gonicus/gonnect/commit/3c5412a250d5a7e3c3404432ae57d28465bac48c))
+* **ui:** do not treat room names beginning with digits as phone numbers ([#461](https://github.com/gonicus/gonnect/issues/461)) ([75ed3f2](https://github.com/gonicus/gonnect/commit/75ed3f23ebe0730f10c43f6867d91cd1d54acf3f))
+
+
+### Features
+
+* add template for 1&1 ([#465](https://github.com/gonicus/gonnect/issues/465)) ([865fcd9](https://github.com/gonicus/gonnect/commit/865fcd975f5d030674ff2d916c0eea5e1fa29456))
+* ical rrule parsing optimization ([#457](https://github.com/gonicus/gonnect/issues/457)) ([c46f066](https://github.com/gonicus/gonnect/commit/c46f066fd5f4f1aee410676f6e502ac682f4b265))
+* rtt ui integration ([#443](https://github.com/gonicus/gonnect/issues/443)) ([62d48f3](https://github.com/gonicus/gonnect/commit/62d48f313a4aed5c971dc52d8e33a13e8396a58d))
+* windows signing ([#462](https://github.com/gonicus/gonnect/issues/462)) ([f7dd63a](https://github.com/gonicus/gonnect/commit/f7dd63a69d2231c92c768154eae99326a7ba1c29))
+
+# [2.2.0-beta.6](https://github.com/gonicus/gonnect/compare/v2.2.0-beta.5...v2.2.0-beta.6) (2026-05-11)
+
+
+### Bug Fixes
+
+* base edits on SSL default configuration ([#459](https://github.com/gonicus/gonnect/issues/459)) ([6dcbf78](https://github.com/gonicus/gonnect/commit/6dcbf78a5b1b470ec966d8704b68e7d3e21da490))
+
+# [2.2.0-beta.5](https://github.com/gonicus/gonnect/compare/v2.2.0-beta.4...v2.2.0-beta.5) (2026-05-06)
+
+
+### Bug Fixes
+
+* if so configured, do not verify CA even if they are state ([#455](https://github.com/gonicus/gonnect/issues/455)) ([f45a1d8](https://github.com/gonicus/gonnect/commit/f45a1d81f152bb8d2024dad675206302255e2126))
+* ignore verification ssl errors if verifyServer=false ([#453](https://github.com/gonicus/gonnect/issues/453)) ([be3d71c](https://github.com/gonicus/gonnect/commit/be3d71c419b252e4a103d5107ab9a9598b474742))
+
+# [2.2.0-beta.5](https://github.com/gonicus/gonnect/compare/v2.2.0-beta.4...v2.2.0-beta.5) (2026-05-05)
+
+
+### Bug Fixes
+
+* ignore verification ssl errors if verifyServer=false ([#453](https://github.com/gonicus/gonnect/issues/453)) ([be3d71c](https://github.com/gonicus/gonnect/commit/be3d71c419b252e4a103d5107ab9a9598b474742))
+
+# [2.2.0-beta.4](https://github.com/gonicus/gonnect/compare/v2.2.0-beta.3...v2.2.0-beta.4) (2026-05-04)
+
+
+### Bug Fixes
+
+* do not wipe all contact sources on by-source removals ([#450](https://github.com/gonicus/gonnect/issues/450)) ([f89882f](https://github.com/gonicus/gonnect/commit/f89882f9be298c1f90de881239b44a50b749492b))
+* ignore certain ssl errors when verifyServer is false (webdav) ([#451](https://github.com/gonicus/gonnect/issues/451)) ([428860a](https://github.com/gonicus/gonnect/commit/428860a320785b9a52888a824d28990f59a6beb6))
+
+
+### Features
+
+* **ldap:** configurable contact attribute mapping ([#445](https://github.com/gonicus/gonnect/issues/445)) ([4113384](https://github.com/gonicus/gonnect/commit/41133841f2c00c72229658a159abfae59330d7c9))
+
+# [2.2.0-beta.3](https://github.com/gonicus/gonnect/compare/v2.2.0-beta.2...v2.2.0-beta.3) (2026-04-27)
+
+
+### Bug Fixes
+
+* prevent unhold on currently changing call ([#439](https://github.com/gonicus/gonnect/issues/439)) ([f1a05f5](https://github.com/gonicus/gonnect/commit/f1a05f59746755ebfb4d89def1b1bd1c8ff7a73a))
+
+# [2.2.0-beta.2](https://github.com/gonicus/gonnect/compare/v2.2.0-beta.1...v2.2.0-beta.2) (2026-04-23)
+
+
+### Bug Fixes
+
+* use verifyServer flag for CA verification with webdav ([#437](https://github.com/gonicus/gonnect/issues/437)) ([c1ab98f](https://github.com/gonicus/gonnect/commit/c1ab98fe1294fc6fa62c204007f714f55d6eafe2))
+
+
+### Features
+
+* **ui:** leave conference via systray menu ([#438](https://github.com/gonicus/gonnect/issues/438)) ([b973bb6](https://github.com/gonicus/gonnect/commit/b973bb63c7798bea7fc6bf0c249e053c5d331fef))
+
+# [2.2.0-beta.2](https://github.com/gonicus/gonnect/compare/v2.2.0-beta.1...v2.2.0-beta.2) (2026-04-23)
+
+
+### Bug Fixes
+
+* use verifyServer flag for CA verification with webdav ([#437](https://github.com/gonicus/gonnect/issues/437)) ([c1ab98f](https://github.com/gonicus/gonnect/commit/c1ab98fe1294fc6fa62c204007f714f55d6eafe2))
+
+# [2.2.0-beta.1](https://github.com/gonicus/gonnect/compare/v2.1.0...v2.2.0-beta.1) (2026-04-22)
+
+
+### Bug Fixes
+
+* build with certificate patch ([#433](https://github.com/gonicus/gonnect/issues/433)) ([8e8ba1f](https://github.com/gonicus/gonnect/commit/8e8ba1f9897457a4582ffdb059985569ac957984))
+* c++ standard and guarding updates ([#422](https://github.com/gonicus/gonnect/issues/422)) ([9e8171b](https://github.com/gonicus/gonnect/commit/9e8171ba4ef5336e988d6938fa62793432d89ae5))
+* code review loop ([#374](https://github.com/gonicus/gonnect/issues/374)) ([f1c609d](https://github.com/gonicus/gonnect/commit/f1c609da8dc0214e2f0c4909ef7b645b08352c11))
+* disable WMME in pjsip ([#397](https://github.com/gonicus/gonnect/issues/397)) ([a90a80c](https://github.com/gonicus/gonnect/commit/a90a80cb4796c96f1626f82d3e59d49312c23585))
+* handle direct pjsip mute again ([#402](https://github.com/gonicus/gonnect/issues/402)) ([0c4609c](https://github.com/gonicus/gonnect/commit/0c4609ca355f760478a19bda2c618aa299ff86eb))
+* home/call switch tab notification reset ([#404](https://github.com/gonicus/gonnect/issues/404)) ([95e0a3f](https://github.com/gonicus/gonnect/commit/95e0a3ff849fda5a6fbb7e2294a99349edef77f8))
+* make MWI subscription configurable ([#414](https://github.com/gonicus/gonnect/issues/414)) ([d74c530](https://github.com/gonicus/gonnect/commit/d74c53040e10f354cfbf86ef62662570af4bd3fc))
+* make ReadOnlyConfdSettings treate string lists correctly ([#423](https://github.com/gonicus/gonnect/issues/423)) ([48328e2](https://github.com/gonicus/gonnect/commit/48328e235cf888f00b95b4b6792b727138aaf35c))
+* more sip codes lead to auth request ([#379](https://github.com/gonicus/gonnect/issues/379)) ([31ee0cd](https://github.com/gonicus/gonnect/commit/31ee0cd138b21d34c3945274a4f6f08e344eae96))
+* mwi recursions ([#405](https://github.com/gonicus/gonnect/issues/405)) ([2a42344](https://github.com/gonicus/gonnect/commit/2a423440dbafddb79db9a988e0bb27716e47ed1f))
+* potential crash on HeadsetDevice destroyed ([#371](https://github.com/gonicus/gonnect/issues/371)) ([65900ab](https://github.com/gonicus/gonnect/commit/65900abcc5030f33687ebfab95e03f05c1591c51))
+* raise window after showing it ([#398](https://github.com/gonicus/gonnect/issues/398)) ([4f72dc6](https://github.com/gonicus/gonnect/commit/4f72dc6ad54731be70190d1495c00b15b301c14e))
+* reenable CardDAV plugin ([#406](https://github.com/gonicus/gonnect/issues/406)) ([9b9b136](https://github.com/gonicus/gonnect/commit/9b9b136f27fc945f2e6f6763401de76ead6a9a7b))
+* resolve feeder manager deadlock ([#427](https://github.com/gonicus/gonnect/issues/427)) ([9a8d604](https://github.com/gonicus/gonnect/commit/9a8d6048e871262fda444a24a5091096940274f2))
+* restore functionality for feeders without network requirements ([#387](https://github.com/gonicus/gonnect/issues/387)) ([01c6494](https://github.com/gonicus/gonnect/commit/01c64946a77c9cee40f566c9af2fecd51bfa7bcc))
+* tab switch/reset notifications ([9338ed0](https://github.com/gonicus/gonnect/commit/9338ed0c6a82c35d44e36a40d90a66781c0c0441))
+* **ui:** give focus to call screen when startet via enter ([#395](https://github.com/gonicus/gonnect/issues/395)) ([5e5d78e](https://github.com/gonicus/gonnect/commit/5e5d78e0a6364d511a43558e59be5ab020bf2795))
+
+
+### Features
+
+* adding global shortcuts support for windows ([#399](https://github.com/gonicus/gonnect/issues/399)) ([eb5237e](https://github.com/gonicus/gonnect/commit/eb5237ed507135d99f5d27b304eec25e0352df2a))
+* basic MWI support ([#392](https://github.com/gonicus/gonnect/issues/392)) ([8c3c914](https://github.com/gonicus/gonnect/commit/8c3c91455b04a800a5c3e09c76b1f3e3b92ce023))
+* delete old history entries ([#432](https://github.com/gonicus/gonnect/issues/432)) ([0ee826d](https://github.com/gonicus/gonnect/commit/0ee826d3384151954c559e3c417967f8b3fc872f))
+* display sip registration status ([#375](https://github.com/gonicus/gonnect/issues/375)) ([f9e6567](https://github.com/gonicus/gonnect/commit/f9e6567a1bc89b5c688d7edb53fd4cc54899dcba))
+* feeder plugin retry mechanism ([#391](https://github.com/gonicus/gonnect/issues/391)) ([e262f3f](https://github.com/gonicus/gonnect/commit/e262f3f75ef70ed54b1aca17c7169e06c7ebd94a))
+* pause/resume media on windows ([#370](https://github.com/gonicus/gonnect/issues/370)) ([61f3407](https://github.com/gonicus/gonnect/commit/61f34075a0f8dae316bd2a7ed6f6cf171917ad2b))
+* plugins for microsoft calendars and contacts ([#428](https://github.com/gonicus/gonnect/issues/428)) ([e7e8cd9](https://github.com/gonicus/gonnect/commit/e7e8cd96bffc42e63dfb488894adb836c5ad4ff5))
+* pre-fill missing it/es translations ([#377](https://github.com/gonicus/gonnect/issues/377)) ([4428e4e](https://github.com/gonicus/gonnect/commit/4428e4e659af0c708fa3738dc521977b7b11d1c2))
+* update pjproject to 2.17 ([#435](https://github.com/gonicus/gonnect/issues/435)) ([98c7199](https://github.com/gonicus/gonnect/commit/98c719971d48f696f312a21dde469c745c4ba220))
+
# [2.1.0](https://github.com/gonicus/gonnect/compare/v2.0.9...v2.1.0) (2026-04-10)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 370caee7..d39f5b4a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.26)
-project(GOnnect VERSION 2.1.0 LANGUAGES CXX)
+project(GOnnect VERSION 2.1.0.9 LANGUAGES CXX)
include(cmake/CCache.cmake)
include(cmake/Workarounds.cmake)
include(cmake/Versioning.cmake)
@@ -13,11 +13,11 @@ set(APPLICATION_VENDOR "GONICUS GmbH")
set(APPLICATION_ICON_NAME "${APPLICATION_SHORTNAME}" )
set(APPLICATION_URL "https://www.gonnect-project.org")
-#GOnnect_VERSION -> override from git tag
+set(MS_APPLICATION_IDENTIFIER "" CACHE STRING "Application ID used for OAUTH / Microsoft 365")
set(CMAKE_COMPILE_WARNING_AS_ERROR ON)
set(CMAKE_CXX_STANDARD 23)
-set(CMAKE_CXX_STANDARD_REQUIRED OFF)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_UNITY_BUILD_BATCH_SIZE 10)
@@ -41,7 +41,7 @@ option(ENABLE_EDS "Enable EDS plugins" ON)
option(ENABLE_LDAP "Enable LDAP plugin" ON)
option(ENABLE_DAV "Enable DAV plugin" ON)
option(ENABLE_CSV "Enable CSV plugin" ON)
-option(ENABLE_MSGRAPH "Enable MS Graph plugin" OFF)
+option(ENABLE_MSGRAPH "Enable MS Graph plugins" OFF)
set(APP_ID "de.gonicus.gonnect")
add_definitions(-DAPP_ID="${APP_ID}")
diff --git a/README.md b/README.md
index 40d9d5d7..6c4b8731 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
- Documentation |
+ Documentation |
Issues |
Install
@@ -14,9 +14,9 @@
# Overview
_GOnnect_ is a simple, easy to use UC client, designed for
-Linux / _Flatpak_ based installations. It makes use of various Flatpak
-portals and is meant to integrate well into modern Desktop Environments
-like _KDE_ or _GNOME_.
+Linux / _Flatpak_ based installations and Microsoft Windows.
+It is designed to integrate seamlessly into modern desktop
+environments.

@@ -28,6 +28,7 @@ Here's a short feature list:
* Call forwarding
* Conference calls with three parties
+ * Real-Time Text (RTT) over SIP
* Busy state for supported sources
* Configurable busy on active call
* Address sources
@@ -35,12 +36,14 @@ Here's a short feature list:
* CardDAV
* CSV
* GNOME Contacts / Evolution Data Service
+ * Microsoft 365 Contacts (on Windows)
* Configurable identities for outgoing calls
* Configurable Togglers (i.e. for call queues, CFNL, etc.)
* **Jitsi Meet Integration: Upgrade call to Videoconference**
* Calendar sources for upcoming conferences
* CalDAV
* GNOME Calendar / Evolution Data Service
+ * Microsoft 365 Calendar (on Windows)
* **Support for various hardware headsets (i.e. Yealink, Jabra)**
* Support for various busylights
* Custom audio device profiles or managed by your system
@@ -107,6 +110,7 @@ udevadm trigger
| kuando | Busylight UC Omega |
| Luxafor | Flag |
| Logitech | Litra Beam LX |
+| Blinkstick | All models |
# Automatic video light switching
diff --git a/conanfile.py b/conanfile.py
index 9aed2237..f61cdd3d 100644
--- a/conanfile.py
+++ b/conanfile.py
@@ -61,7 +61,7 @@ def package(self):
def requirements(self):
self.requires("hidapi/0.15.0")
- self.requires("pjproject/2.16")
+ self.requires("pjproject/2.17")
self.requires("openldap/2.6.13")
self.requires("libical/3.0.20")
self.requires("vcard/cci.20250408")
@@ -72,20 +72,20 @@ def requirements(self):
if self.settings.os == "Windows":
self.requires("wintoast/1.3.2")
+ self.requires("qhotkey/2026-03-19")
if self.settings.os == "Linux":
self.requires("libnotify/system")
self.requires("libpulse/system")
if self.options.with_conan_qt:
- self.requires("qt/6.10.2")
+ self.requires("qt/6.10.3")
self.requires("mpg123/1.33.0", override=True)
self.requires("wayland/1.24.0", override=True)
self.requires("openssl/3.5.5", override=True)
- self.requires("qca/2.3.10")
self.requires("qtwebdav/2025-03-16")
- self.requires("qtkeychain/0.15.0")
+ self.requires("qtkeychain/0.16.0")
self.requires("libusb/1.0.29")
def build_requirements(self):
diff --git a/docs/antora.yml b/docs/antora.yml
index 271381cb..faba21b2 100644
--- a/docs/antora.yml
+++ b/docs/antora.yml
@@ -1,3 +1,3 @@
name: gonnect-examples
-version: 2.1.0
+version: 2.2.0-beta.9
title: GOnnect examples
diff --git a/docs/modules/ROOT/examples/sample.conf b/docs/modules/ROOT/examples/sample.conf
index a28c8303..2070633d 100644
--- a/docs/modules/ROOT/examples/sample.conf
+++ b/docs/modules/ROOT/examples/sample.conf
@@ -62,6 +62,16 @@
## default: false
#disableGlobalShortcuts=false
+## Defines the maximum number of times a calendar/contact plugin will attempt
+## to fetch data before stopping and reporting a permanent failure.
+## (optional, default: 5)
+#feederPluginRetryCount=5
+
+## Specifies the delay (in milliseconds) before calendar/contact plugins attempt
+## to fetch and process data again after a previously failed attempt.
+## (optional, default: 10000)
+#feederPluginRetryInterval=10000
+
[sip]
## Encode SIP headers in their short forms to reduce size. By default, SIP headers in outgoing messages will
## be encoded in their full names. If this option is enabled, then SIP headers for outgoing messages will be
@@ -430,6 +440,11 @@
## default: ""
#voiceMailUri=
+## Enable RTT functionality for all calls regardless of peer support. If enabled, the RTT console is always
+## visible in the call interface. Otherwise, the RTT console only appears after receiving an RTT message.
+## default: false
+#showRealTimeTextConsole=false
+
#[auth0]
## The authentication scheme (e.g. “digest”).
@@ -597,12 +612,52 @@
## If the SIP environment the client is used in does support subscribing to buddy states (i.e. if a contact is available, busy, etc.), the phone number
## found for this LDAP attribute will be used for that subscription.
-## This is a performance optimization: when numbers saved under a specific attribute can and will never be subscriptable for SIP states (e.g. "mobile"),
+## This is a performance optimization: when numbers saved under a specific attribute can and will never be subscriptable for SIP states (e.g. "mobile"),
## the client does not need to try. While not an excessive overhead, it might affect performance on slow systems and a large number of subscriptions.
-## Multiple values must be comma-seperated, e.g. "telephoneNumber,mobile"
+## Multiple values must be comma-seperated, e.g. "telephoneNumber,mobile". When custom attribute names are configured below, the values listed here
+## must match those configured names exactly.
## (optional)
#sipStatusSubscriptableAttributes="telephoneNumber"
+## Map the semantic contact roles to the LDAP attribute names actually used by
+## the directory. Defaults match the standard inetOrgPerson schema and need only
+## be overridden for servers that publish phonebook entries under custom names
+## (e.g. Grandstream UCM uses CallerIDName / AccountNumber / MobileNumber / ...).
+## Setting a key to the empty string disables that role for this source.
+## Comparison against the directory is ASCII-case-insensitive (per RFC 4512).
+
+## Attribute holding the contact's display name.
+## (optional, default: "cn")
+#attrName="cn"
+
+## Attribute holding a stable per-contact identifier (used for change detection).
+## (optional, default: "uid")
+#attrUid="uid"
+
+## Attribute holding the contact's organisation / company.
+## (optional, default: "o")
+#attrCompany="o"
+
+## Attribute holding the contact's primary email address.
+## (optional, default: "mail")
+#attrEmail="mail"
+
+## Attribute holding the commercial / office phone number.
+## (optional, default: "telephoneNumber")
+#attrCommercial="telephoneNumber"
+
+## Attribute holding the mobile phone number.
+## (optional, default: "mobile")
+#attrMobile="mobile"
+
+## Attribute holding the home phone number.
+## (optional, default: "homePhone")
+#attrHome="homePhone"
+
+## Attribute holding the binary contact photo. Set empty to skip avatar lookup.
+## (optional, default: "jpegPhoto")
+#attrAvatar="jpegPhoto"
+
## Realm as it might be required for SASL LDAP bind
## default: ""
## (optional)
@@ -741,26 +796,6 @@
# enabled=true
-## A jschat block defines a Javascript chat plugin account for chatting.
-## It must be "jschat" followed by a unique number for each account.
-# [jschat0]
-
-## The display name that shall be shown in the UI for this chat account.
-## (optional)
-# displayName=My Company's Internal Chat
-
-## The name of this device to be identified by the chat server.
-## (optional, default: "GOnnect")
-# deviceId="My fancy device"
-
-## The absolute file path of the folder where to find the Javascript chat plugin.
-# url=/home/me/chatplugin/dist
-
-## The chat id. The server url is automatically deducted from the id.
-## (mandatory)
-# id=@username:homeserver.tld
-
-
## A CalDAV block defines a CalDAV source for dates.
## The password for the authentication will be requested in a UI dialog on next start of the app. It will then be saved encrypted for further usage in
## the config file named "keychain". Delete the appropriate part there to enforce a new password request.
@@ -861,3 +896,17 @@
## statusbar - The toggler is shown in the status bar of the main window
## settings-phoning - the toggler is shown on the settings page in the phoning section
# display=statusbar
+
+
+## Pre-configure global keyboard shortcuts on windows using the keys
+## * dial - shows the dialing window
+## * redial - dials the last number again
+## * hangup - hangs up the current call
+## * toggle-hold - toggles the hold state for the call
+## and the values as standard key sequences, detailed in the Qt documentation:
+## https://doc.qt.io/qt-6/qkeysequence.html#details
+#[windows_shortcuts]
+#dial=Ctrl+Shift+D
+#redial=Ctrl+Shift+R
+#hangup=Ctrl+Shift+H
+#toggle-hold=Ctrl+Shift+M
diff --git a/docs/modules/architecture/pages/architectural-scenarios.adoc b/docs/modules/architecture/pages/architectural-scenarios.adoc
new file mode 100644
index 00000000..b7951e37
--- /dev/null
+++ b/docs/modules/architecture/pages/architectural-scenarios.adoc
@@ -0,0 +1,236 @@
+= Architectural Scenarios
+
+== Call Flow Scenario
+
+=== Outgoing Call Sequence
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor User
+participant "UI" as UI
+participant "StateManager" as SM
+participant "SIPManager" as SIPM
+participant "SIPCallManager" as CM
+participant "SIPCall" as Call
+participant "PJSIP" as PJSIP
+
+User -> UI : Dial number
+UI -> SM : Get preferred identity
+SM --> UI : Return identity
+UI -> SIPM : Create call request
+SIPM -> CM : Create call
+CM -> Call : Initialize call
+Call -> PJSIP : Send INVITE
+PJSIP --> Call : 100 Trying
+Call --> CM : State changed
+CM --> UI : Update UI
+PJSIP --> Call : 180 Ringing
+Call --> CM : State changed
+CM --> UI : Update UI
+PJSIP --> Call : 200 OK
+Call --> CM : State changed
+CM --> UI : Update UI
+User -> UI : Answer call
+UI -> Call : Accept
+Call -> PJSIP : ACK
+PJSIP --> Call : Media established
+Call --> CM : Call active
+CM --> UI : Update UI
+@enduml
+....
+
+=== Incoming Call Sequence
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor RemoteUser
+participant "PJSIP" as PJSIP
+participant "SIPCall" as Call
+participant "SIPCallManager" as CM
+participant "UI" as UI
+participant "User" as User
+
+RemoteUser -> PJSIP : INVITE
+PJSIP -> Call : Create call
+Call -> CM : Notify incoming
+CM -> UI : Show incoming call
+UI --> User : Display call
+User -> UI : Answer
+UI -> Call : Accept
+Call -> PJSIP : 200 OK
+PJSIP --> Call : ACK
+Call --> CM : Call established
+CM --> UI : Update UI
+@enduml
+....
+
+=== Call Termination
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+participant "User" as User
+participant "UI" as UI
+participant "SIPCall" as Call
+participant "SIPCallManager" as CM
+participant "PJSIP" as PJSIP
+
+User -> UI : End call
+UI -> Call : Hangup
+Call -> PJSIP : Send BYE
+PJSIP --> Call : 200 OK
+Call --> CM : State changed
+CM --> UI : Update UI
+Call -> CM : Remove from active calls
+CM -> CM : Update call history
+@enduml
+....
+
+== Contact Synchronization Scenario
+
+=== Contact Source Loading
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "User" as User
+participant "Application" as App
+participant "AddressBookManager" as ABM
+participant "LDAP Feeder" as LDAP
+participant "CardDAV Feeder" as CD
+participant "Akonadi Feeder" as AK
+participant "ContactModel" as CM
+
+App -> ABM : Initialize
+ABM -> LDAP : Load contacts
+ABM -> CD : Load contacts
+ABM -> AK : Load contacts
+LDAP --> ABM : Contacts list
+CD --> ABM : Contacts list
+AK --> ABM : Contacts list
+ABM -> CM : Update model
+CM --> ABM : Acknowledged
+ABM --> App : Ready
+@enduml
+....
+
+=== Contact Search
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "User" as User
+participant "UI" as UI
+participant "ContactModel" as CM
+participant "Contact" as Contact
+
+User -> UI : Enter search term
+UI -> CM : Search query
+CM -> Contact : Filter contacts
+Contact --> CM : Matching contacts
+CM --> UI : Search results
+UI --> User : Display results
+@enduml
+....
+
+== Configuration Loading Scenario
+
+=== Application Startup
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "User" as User
+participant "Application" as App
+participant "UISettings" as UIS
+participant "AppSettings" as AS
+participant "Keychain" as KC
+participant "StateManager" as SM
+
+User -> App : Start application
+App -> AS : Load settings
+AS --> App : Configuration
+App -> KC : Load credentials
+KC --> App : Decrypted secrets
+App -> UIS : Apply UI settings
+UIS --> App : UI configured
+App -> SM : Initialize state
+SM --> App : State ready
+@enduml
+....
+
+== Buddy State Subscription Scenario
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+participant "SIPManager" as SIPM
+participant "SIPBuddy" as Buddy
+participant "PJSIP" as PJSIP
+participant "UI" as UI
+
+SIPM -> Buddy : Subscribe to state
+Buddy -> PJSIP : SUBSCRIBE request
+PJSIP --> Buddy : 200 OK
+PJSIP --> Buddy : NOTIFY with state
+Buddy --> SIPM : State changed
+SIPM --> UI : Emit buddyStateChanged
+UI --> Buddy : Update display
+@enduml
+....
+
+== Emergency Call Scenario
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "User" as User
+participant "UI" as UI
+participant "StateManager" as SM
+participant "SIPCallManager" as CM
+participant "SIPCall" as Call
+
+User -> UI : Click emergency number
+UI -> SM : Request emergency call
+SM --> UI : Authorization
+UI -> CM : Create emergency call
+CM -> Call : Initialize call
+Call -> Call : Mark as emergency
+Call -> CM : Send INVITE
+CM --> UI : Call in progress
+@enduml
+....
\ No newline at end of file
diff --git a/docs/modules/architecture/pages/building-block-view.adoc b/docs/modules/architecture/pages/building-block-view.adoc
new file mode 100644
index 00000000..1c835d06
--- /dev/null
+++ b/docs/modules/architecture/pages/building-block-view.adoc
@@ -0,0 +1,360 @@
+= Building Block View
+
+== High-Level Architecture
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title GOnnect High-Level Architecture
+
+package "Main Application" as Main {
+ component "Application" as App
+ component "StateManager" as SM
+ component "ErrorBus" as EB
+}
+
+package "UI Layer" as UI {
+ component "GonnectWindow" as GW
+ component "CallWindow" as CW
+ component "HistoryWindow" as HW
+ component "SearchWindow" as SW
+ component "SettingsWindow" as SettW
+}
+
+package "SIP Module" as SIP {
+ component "SIPManager" as SIPM
+ component "SIPCallManager" as SCM
+ component "SIPCall" as SC
+ component "SIPAccount" as SA
+ component "SIPBuddy" as SB
+ component "PreferredIdentity" as PI
+}
+
+package "Contacts Module" as Contacts {
+ component "AddressBookManager" as ABM
+ component "Contact" as C
+ component "ContactModel" as CM
+ component "AvatarManager" as AM
+ component "ContactSourceInfoModel" as CSIM
+}
+
+package "Calendar Module" as Calendar {
+ component "DateEventFeederManager" as DEM
+ component "DateEvent" as DE
+ component "DateEventsModel" as DM
+}
+
+package "Media Module" as Media {
+ component "AudioManager" as AuM
+ component "VideoManager" as VM
+ component "AudioPort" as AP
+}
+
+package "Platform" as Platform {
+ component "SystemTrayMenu" as STM
+ component "NotificationManager" as NM
+ component "Credentials" as Creds
+}
+
+package "Contact Sources" as Sources {
+ component "LDAP Feeder" as LDAP
+ component "CardDAV Feeder" as CD
+ component "Akonadi Feeder" as AK
+ component "EDS Feeder" as EDS
+ component "CSV Feeder" as CSV
+}
+
+package "Calendar Sources" as CalSources {
+ component "CalDAV Feeder" as CDV
+ component "Akonadi Calendar" as AKC
+ component "EDS Calendar" as EDSV
+}
+
+App --> UI : QML Context
+App --> SIP : SIP Management
+App --> Contacts : Contact Management
+App --> Calendar : Calendar Management
+App --> Media : Media Management
+App --> Platform : Platform Services
+
+SIPM --> SA : Account management
+SIPM --> SB : Buddy tracking
+SCM --> SC : Call management
+SC --> SIP : PJSIP integration
+
+ABM --> Sources : Contact sources
+ABM --> CM : Model updates
+AM --> C : Avatar loading
+
+DEM --> CalSources : Calendar sources
+DEM --> DM : Model updates
+
+AuM --> Media : Audio devices
+VM --> Media : Video devices
+AP --> AuM : Port routing
+
+STM --> Platform : System tray
+NM --> Platform : Notifications
+Creds --> Platform : Keychain
+@enduml
+....
+
+== SIP Module Architecture
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title GOnnect SIP Module
+
+package "SIP Core" as Core {
+ component "SIPManager" as SIPM
+ component "SIPEventLoop" as SEL
+ component "SIPMediaConfig" as SMC
+ component "SIPUserAgentConfig" as SUAC
+}
+
+package "Account Management" as Acc {
+ component "SIPAccountManager" as SAM
+ component "SIPAccount" as SA
+ component "PreferredIdentity" as PI
+ component "PreferredIdentityValidator" as PIV
+}
+
+package "Call Management" as CallM {
+ component "SIPCallManager" as SCM
+ component "SIPCall" as SC
+ component "ICallState" as ICS
+}
+
+package "Buddy Management" as Buddy {
+ component "SIPBuddy" as SB
+ component "SIPBuddyState" as SBS
+}
+
+package "Utilities" as Utils {
+ component "RingToneFactory" as RTF
+ component "RingTone" as RT
+ component "Ringer" as R
+ component "DtmfGenerator" as DTGF
+ component "TogglerManager" as TM
+ component "Toggler" as T
+}
+
+SIPM --> SEL : Event loop
+SIPM --> SMC : Media config
+SIPM --> SUAC : UA config
+SIPM --> SAM : Account manager
+
+SAM --> SA : Account instances
+SAM --> PI : Identity management
+SA --> PIV : Validation
+
+SCM --> SC : Call instances
+SC --> ICS : State interface
+
+RTF --> RT : Ring tone creation
+R --> RT : Ring playback
+TM --> T : Toggler instances
+DTGF --> SC : DTMF generation
+@enduml
+....
+
+== Contacts Module Architecture
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title GOnnect Contacts Module
+
+package "Core" as Core {
+ component "AddressBookManager" as ABM
+ component "Contact" as C
+ component "ContactModel" as CM
+ component "AvatarManager" as AM
+}
+
+package "Abstract Interfaces" as Abstract {
+ interface "IAddressBookFactory" as IABF
+ interface "IAddressBookFeeder" as IABFdr
+}
+
+package "LDAP Source" as LDAP {
+ component "LDAP Feeder" as LDAPF
+ component "LDAP Factory" as LDAPFact
+}
+
+package "CardDAV Source" as CD {
+ component "CardDAV Feeder" as CDF
+ component "CardDAV Factory" as CDFact
+}
+
+package "Akonadi Source" as AK {
+ component "Akonadi Feeder" as AKF
+ component "Akonadi Factory" as AKFact
+}
+
+package "EDS Source" as EDS {
+ component "EDS Feeder" as EDSF
+ component "EDS Factory" as EDSFact
+}
+
+package "CSV Source" as CSV {
+ component "CSV Feeder" as CSVF
+ component "CSV Factory" as CSVFact
+}
+
+package "Utilities" as Utils {
+ component "ContactSerializer" as CS
+ component "FuzzyCompare" as FC
+ component "PhoneNumberUtil" as PU
+ component "PhoneCodeLookup" as PCL
+ component "EmergencyContact" as EC
+ component "BlockInfo" as BI
+}
+
+ABM --> IABF : Factory interface
+ABM --> IABFdr : Feeder interface
+
+IABF --> LDAPFact : LDAP factory
+IABF --> CDFact : CardDAV factory
+IABF --> AKFact : Akonadi factory
+IABF --> EDSFact : EDS factory
+IABF --> CSVFact : CSV factory
+
+LDAPF --> IABFdr : Implements feeder
+CDF --> IABFdr : Implements feeder
+AKF --> IABFdr : Implements feeder
+EDSF --> IABFdr : Implements feeder
+CSVF --> IABFdr : Implements feeder
+
+ABM --> CM : Model updates
+ABM --> AM : Avatar requests
+AM --> C : Avatar loading
+
+CS --> C : Serialization
+FC --> C : Comparison
+PU --> C : Phone validation
+PCL --> C : Phone codes
+EC --> C : Emergency contacts
+BI --> C : Block info
+@enduml
+....
+
+== Calendar Module Architecture
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title GOnnect Calendar Module
+
+package "Core" as Core {
+ component "DateEventFeederManager" as DEM
+ component "DateEventManager" as DM
+ component "DateEvent" as DE
+ component "DateEventsModel" as DEMod
+}
+
+package "Abstract Interfaces" as Abstract {
+ interface "IDateEventFeederFactory" as IDEFF
+ interface "IDateEventFeeder" as IDEFFdr
+}
+
+package "CalDAV Source" as CDV {
+ component "CalDAV Feeder" as CDVF
+ component "CalDAV Factory" as CDVFct
+}
+
+package "Akonadi Source" as AK {
+ component "Akonadi Feeder" as AKF
+ component "Akonadi Factory" as AKFct
+}
+
+package "EDS Source" as EDS {
+ component "EDS Feeder" as EDSF
+ component "EDS Factory" as EDSFct
+}
+
+package "Utilities" as Utils {
+ component "RandomRoomNameGenerator" as RNG
+ component "EmojiResolver" as ER
+ component "EmojiModel" as EM
+}
+
+DEM --> IDEFF : Factory interface
+DEM --> IDEFFdr : Feeder interface
+
+IDEFF --> CDVFct : CalDAV factory
+IDEFF --> AKFct : Akonadi factory
+IDEFF --> EDSFct : EDS factory
+
+CDVF --> IDEFFdr : Implements feeder
+AKF --> IDEFFdr : Implements feeder
+EDSF --> IDEFFdr : Implements feeder
+
+DEM --> DEMod : Model updates
+DEM --> DE : Event instances
+
+RNG --> DE : Room name generation
+ER --> DE : Emoji resolution
+EM --> DE : Emoji model
+@enduml
+....
+
+== Media Module Architecture
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title GOnnect Media Module
+
+package "Audio" as Audio {
+ component "AudioManager" as AuM
+ component "SIPAudioDevice" as SAD
+ component "AudioPort" as AP
+}
+
+package "Video" as Video {
+ component "VideoManager" as VM
+ component "SIPVideoDevice" as SVD
+}
+
+package "Call Media" as CallMedia {
+ component "Sniffer" as Snif
+ component "HeadsetDeviceProxy" as HDP
+}
+
+package "Utilities" as Utils {
+ component "RingToneFactory" as RTF
+ component "RingTone" as RT
+}
+
+AuM --> SAD : Audio devices
+AuM --> AP : Port routing
+VM --> SVD : Video devices
+
+Snif --> Audio : Media sniffing
+HDP --> Audio : Headset proxy
+
+RTF --> RT : Ring tone creation
+@enduml
+....
\ No newline at end of file
diff --git a/docs/modules/architecture/pages/concepts.adoc b/docs/modules/architecture/pages/concepts.adoc
new file mode 100644
index 00000000..906826c1
--- /dev/null
+++ b/docs/modules/architecture/pages/concepts.adoc
@@ -0,0 +1,371 @@
+= Important Concepts
+
+== Preferred Identities
+
+GOnnect supports multiple preferred identities that allow callers to present different identities to callees based on the dialed number. This is useful for enterprises that want to route calls through different outbound numbers based on the destination.
+
+=== Identity Selection Algorithm
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "User" as User
+participant "UI" as UI
+participant "SIPManager" as SIPM
+participant "PreferredIdentity" as PI
+
+User -> UI : Initiate call
+UI -> SIPM : Get preferred identity
+SIPM -> PI : Check identity list
+PI --> SIPM : Return matching identity
+SIPM --> UI : Identity selected
+UI -> SIPM : Use identity for call
+@enduml
+....
+
+=== Identity Configuration
+
+|===
+| Field | Description | Example
+
+| enabled | Whether the identity is active | true
+| automatic | Whether identity is auto-selected | true
+| name | Display name in UI | "Support Line"
+| identity | SIP URI for this identity | sip:support@example.org
+| prefix | Number prefix for auto-selection | +492913641
+|===
+
+== Buddy State Management
+
+GOnnect tracks the availability state of contacts through SIP SUBSCRIBE/NOTIFY mechanism. This enables presence awareness in the contact list.
+
+=== Buddy State Flow
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+participant "Contact" as Contact
+participant "SIPBuddy" as SB
+participant "SIPManager" as SIPM
+participant "PJSIP" as PJSIP
+
+Contact -> SB : Subscribe
+SB -> PJSIP : SUBSCRIBE request
+PJSIP --> SB : 200 OK
+PJSIP --> SB : NOTIFY: available
+SB --> Contact : State: Available
+PJSIP --> SB : NOTIFY: busy
+SB --> Contact : State: Busy
+@enduml
+....
+
+=== Buddy States
+
+|===
+| State | Description | Icon
+
+| Available | Contact is online and available | Green dot
+| Busy | Contact is on a call | Red dot
+| Away | Contact is away | Yellow dot
+| Offline | Contact is offline | Gray dot
+| Unknown | State not known | Question mark
+|===
+
+== Contact Source Federation
+
+GOnnect aggregates contacts from multiple sources into a unified view. Each source can have different priorities and display names.
+
+=== Contact Merging
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+participant "User" as User
+participant "Search UI" as Search
+participant "AddressBookManager" as ABM
+participant "LDAP" as LDAP
+participant "CardDAV" as CD
+participant "Akonadi" as AK
+
+User -> Search : Search "John"
+Search -> ABM : Search query
+ABM -> LDAP : Search "John"
+ABM -> CD : Search "John"
+ABM -> AK : Search "John"
+LDAP --> ABM : 5 results
+CD --> ABM : 3 results
+AK --> ABM : 2 results
+ABM -> ABM : Merge and deduplicate
+ABM --> Search : 6 unique results
+Search --> User : Display results
+@enduml
+....
+
+=== Source Priority
+
+|===
+| Source | Default Priority | Configurable
+
+| LDAP | 50 | Yes
+| CardDAV | 50 | Yes
+| Akonadi | 25 | Yes
+| EDS | 25 | Yes
+| CSV | 10 | Yes
+|===
+
+== Call Quality Metrics
+
+GOnnect provides detailed call quality information using RTCP XR (Extended Reports) and PJSIP's built-in quality metrics.
+
+=== Quality Metrics
+
+|===
+| Metric | Description | Scale
+
+| MOS-TX | Mean Opinion Score - Transmission | 1.0 - 5.0
+| MOS-RX | Mean Opinion Score - Reception | 1.0 - 5.0
+| Loss-TX | Packet loss rate - Transmission | 0% - 100%
+| Loss-RX | Packet loss rate - Reception | 0% - 100%
+| Jitter-TX | Jitter - Transmission | 0 - 500ms
+| Jitter-RX | Jitter - Reception | 0 - 500ms
+| Delay-TX | One-way delay - Transmission | 0 - 500ms
+| Delay-RX | One-way delay - Reception | 0 - 500ms
+|===
+
+=== Quality Level Classification
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam stateStyle mode
+
+title Call Quality Levels
+
+state "Excellent" as Excellent
+state "Good" as Good
+state "Fair" as Fair
+state "Poor" as Poor
+state "Bad" as Bad
+
+Excellent : 4.5 - 5.0 MOS
+Good : 4.0 - 4.5 MOS
+Fair : 3.5 - 4.0 MOS
+Poor : 3.0 - 3.5 MOS
+Bad : < 3.0 MOS
+
+Excellent --> Good : MOS decreases
+Good --> Fair : MOS decreases
+Fair --> Poor : MOS decreases
+Poor --> Bad : MOS decreases
+@enduml
+....
+
+== Security Architecture
+
+=== Credential Storage
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+participant "SIPAccount" as SA
+participant "Credentials" as Creds
+participant "Keychain" as KC
+
+SA -> Creds : Request password
+Creds -> KC : Get credential
+KC --> Creds : Encrypted data
+Creds --> SA : Decrypted password
+SA -> SA : Use for authentication
+@enduml
+....
+
+=== Encryption Layers
+
+|===
+| Layer | Protocol | Purpose
+
+| Signaling | TLS 1.2+ | SIP message encryption
+| Media | SRTP | RTP/RTCP encryption
+| Credentials | Keychain | Password storage
+| Config | File permissions | Config file protection
+|===
+
+== Emergency Call Handling
+
+Emergency calls have special handling to ensure they are always prioritized and can override ongoing calls.
+
+=== Emergency Call Flow
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "User" as User
+participant "Emergency Button" as EB
+participant "SIPCallManager" as SCM
+participant "Active Call" as AC
+participant "Emergency Call" as EC
+
+User -> EB : Click emergency
+EB -> SCM : Request emergency call
+SCM -> AC : Terminate active calls
+AC --> SCM : Calls terminated
+SCM -> EC : Create emergency call
+EC --> SCM : Call established
+SCM --> EB : Emergency call in progress
+@enduml
+....
+
+=== Emergency Number Configuration
+
+|===
+| Field | Description | Example
+
+| number | Emergency number | 112
+| displayName | Display name | "Firefighters / Medical"
+| priority | Call priority | High
+|===
+
+== Jitsi Meet Integration
+
+GOnnect can upgrade SIP calls to Jitsi Meet video conferences when both parties support it.
+
+=== Jitsi Integration Flow
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+participant "SIPCall" as SC
+participant "JitsiConnector" as JC
+participant "Jitsi Meet" as Jitsi
+
+SC -> JC : Check capabilities
+JC --> SC : Jitsi supported
+SC -> JC : Create conference
+JC -> Jitsi : Create room
+Jitsi --> JC : Conference URL
+JC --> SC : Upgrade to Jitsi
+SC --> JC : Send invite
+@enduml
+....
+
+=== Jitsi Configuration
+
+|===
+| Field | Description | Example
+
+| url | Jitsi server URL | https://meet.example.com
+| displayName | Display name in Jitsi | "GOnnect User"
+| preconfig | Show pre-join screen | false
+| authorizationMode | Authorization method | none
+| muc | Jitsi MUC for dial-in | conference.meet.jit.si
+|===
+
+== Plugin Architecture
+
+GOnnect uses a plugin-based architecture for contact sources and chat plugins.
+
+=== Contact Source Plugins
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title Contact Source Plugin Architecture
+
+interface "IAddressBookFeeder" as Feeder
+
+package "Core" as Core {
+ component "AddressBookManager" as ABM
+}
+
+package "Plugins" as Plugins {
+ component "LDAP Feeder" as LDAP
+ component "CardDAV Feeder" as CD
+ component "Akonadi Feeder" as AK
+ component "EDS Feeder" as EDS
+ component "CSV Feeder" as CSV
+}
+
+ABM --> Feeder : Factory creates
+LDAP --> Feeder : Implements
+CD --> Feeder : Implements
+AK --> Feeder : Implements
+EDS --> Feeder : Implements
+CSV --> Feeder : Implements
+@enduml
+....
+
+=== Plugin Lifecycle
+
+|===
+| Phase | Action | Description
+
+| Load | Initialize | Load plugin library
+| Configure | Apply settings | Read configuration
+| Start | Begin fetch | Start data synchronization
+| Stop | Cleanup | Release resources
+| Unload | Destroy | Unload library
+|===
+
+== State Management
+
+StateManager provides a centralized way to manage application state and coordinate between different components.
+
+=== State Properties
+
+|===
+| Property | Type | Description
+
+| globalShortcutsSupported | bool | System supports global shortcuts
+| uiEditMode | bool | UI is in edit mode
+| uiHasActiveEditDialog | bool | Edit dialog is open
+| globalShortcuts | QVariantMap | Custom shortcut mappings
+|===
+
+=== State Change Flow
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+participant "UI" as UI
+participant "StateManager" as SM
+participant "Other Component" as OC
+
+UI -> SM : Set uiEditMode=true
+SM --> UI : uiEditModeChanged signal
+SM --> OC : uiEditModeChanged signal
+OC -> UI : Update UI based on state
+@enduml
+....
diff --git a/docs/modules/architecture/pages/deployment-view.adoc b/docs/modules/architecture/pages/deployment-view.adoc
new file mode 100644
index 00000000..8a198a70
--- /dev/null
+++ b/docs/modules/architecture/pages/deployment-view.adoc
@@ -0,0 +1,316 @@
+= Deployment View
+
+== Deployment Architecture
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title GOnnect Deployment Architecture
+
+rectangle "User Desktop" as UserDesktop {
+ rectangle "GOnnect Application" as App {
+ component "Main Process" as MainProc
+ component "QML Engine" as QMLE
+ component "C++ Backend" as CPP
+ }
+ component "System Tray" as Tray
+ component "Notification Daemon" as ND
+}
+
+rectangle "Network" as Network {
+ rectangle "SIP Server / PBX" as SIPServer
+ rectangle "LDAP Server" as LDAPServer
+ rectangle "CardDAV Server" as CardDAVServer
+ rectangle "CalDAV Server" as CalDAVServer
+ rectangle "Jitsi Meet Server" as JitsiServer
+}
+
+rectangle "Local Services" as Local {
+ component "Akonadi Server" as Akonadi
+ component "EDS Server" as EDS
+ component "Keychain Service" as KC
+}
+
+MainProc --> SIPServer : SIP/TLS (5061)
+MainProc --> LDAPServer : LDAP/LDAPS
+MainProc --> CardDAVServer : CardDAV/HTTPS
+MainProc --> CalDAVServer : CalDAV/HTTPS
+MainProc --> JitsiServer : WebRTC/HTTPS
+
+MainProc --> Akonadi : D-Bus
+MainProc --> EDS : D-Bus
+MainProc --> KC : Secret Service API
+
+MainProc --> Tray : System tray
+Tray --> ND : Notifications
+@enduml
+....
+
+== Linux Deployment
+
+=== Native Linux Build
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title Linux Native Deployment
+
+rectangle "Build System" as Build {
+ component "CMake" as CMake
+ component "Conan" as Conan
+ component "clang-format" as CF
+}
+
+rectangle "Build Dependencies" as BuildDeps {
+ component "Qt6" as Qt6
+ component "PJSIP" as PJSIP
+ component "libsecret" as LS
+ component "logfault" as LF
+}
+
+rectangle "Target System" as Target {
+ component "GOnnect Binary" as Bin
+ component "QML Files" as QML
+ component "Translations" as Trans
+ component "Config Files" as CFG
+}
+
+rectangle "Runtime Dependencies" as Runtime {
+ component "Qt6 Runtime" as Qt6R
+ component "D-Bus" as DBus
+ component "Keychain Service" as KCS
+ component "Akonadi" as Akonadi
+ component "EDS" as EDS
+}
+
+CMake --> Conan : Dependency resolution
+Conan --> BuildDeps : Fetch packages
+CMake --> Target : Build application
+
+Target --> Runtime : Link libraries
+Target --> BuildDeps : Runtime libs
+@enduml
+....
+
+=== Flatpak Deployment
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title Flatpak Deployment
+
+rectangle "Flatpak Build" as FPBuild {
+ component "Flatpak Builder" as FPB
+ component "Manifest" as Manifest
+}
+
+rectangle "Flatpak Runtime" as FPR {
+ component "org.freedesktop.Platform" as FLP
+ component "org.kde.Platform" as KDP
+ component "Qt6 Runtime" as Qt6R
+}
+
+rectangle "Flatpak App" as FPA {
+ component "GOnnect App" as GP
+ component "Extensions" as Ext
+}
+
+rectangle "Host System" as Host {
+ component "D-Bus" as DBus
+ component "Keyring" as Keyring
+ component "File System" as FS
+}
+
+FPB --> FPR : Base runtime
+FPB --> FPA : Build app
+FPA --> FPR : Runtime dependencies
+FPA --> Host : D-Bus access
+FPA --> Host : Keyring access
+FPA --> Host : File system access
+@enduml
+....
+
+== macOS Deployment
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title macOS Deployment
+
+rectangle "Build System" as Build {
+ component "CMake" as CMake
+ component "Conan" as Conan
+}
+
+rectangle "Build Dependencies" as BuildDeps {
+ component "Qt6" as Qt6
+ component "PJSIP" as PJSIP
+ component "Keychain" as KC
+ component "OSLog" as OSLog
+}
+
+rectangle "App Bundle" as AppBundle {
+ component "GOnnect.app" as App
+ component "Contents/MacOS" as MacOS
+ component "Contents/Resources" as Res
+ component "Info.plist" as Info
+}
+
+rectangle "System Integration" as Sys {
+ component "LaunchAgents" as LA
+ component "MenuBar" as MB
+ component "Notifications" as N
+}
+
+CMake --> Conan : Dependency resolution
+Conan --> BuildDeps : Fetch packages
+CMake --> AppBundle : Build application
+
+AppBundle --> Sys : Register services
+AppBundle --> Sys : Launch agent
+@enduml
+....
+
+== Windows Deployment
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title Windows Deployment
+
+rectangle "Build System" as Build {
+ component "CMake" as CMake
+ component "Conan" as Conan
+ component "Visual Studio" as VS
+}
+
+rectangle "Build Dependencies" as BuildDeps {
+ component "Qt6" as Qt6
+ component "PJSIP" as PJSIP
+ component "Windows SDK" as WinSDK
+ component "WinCrypt" as WinCrypt
+}
+
+rectangle "Installer" as Inst {
+ component "NSIS Installer" as NSIS
+ component "GOnnect Setup.exe" as Setup
+}
+
+rectangle "System Integration" as Sys {
+ component "Start Menu" as SM
+ component "Taskbar" as TB
+ component "Event Viewer" as EV
+ component "Windows Keychain" as WK
+}
+
+CMake --> VS : Build configuration
+VS --> BuildDeps : Link libraries
+CMake --> Inst : Generate installer
+
+Inst --> Sys : Create shortcuts
+Inst --> Sys : Register file types
+Inst --> Sys : Event log source
+@enduml
+....
+
+== Configuration File Structure
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title GOnnect Configuration Structure
+
+package "User Configuration" as UserConf {
+ file "gonnect.conf" as CONF
+ file "keychain" as KC
+}
+
+package "System Configuration" as SysConf {
+ file "/etc/gonnect/gonnect.conf" as SYS_CONF
+ file "/etc/gonnect/keychain.d/" as SYS_KC
+}
+
+package "Application Resources" as Resources {
+ file ":/i18n/gonnect_de.qm" as QM1
+ file ":/i18n/gonnect_en.qm" as QM2
+ file ":/qml/GonnectWindow.qml" as QML1
+ file ":/qml/CallWindow.qml" as QML2
+}
+
+package "Runtime Data" as Runtime {
+ file "~/.local/share/gonnect/log/" as LOG
+ file "~/.local/share/gonnect/cache/" as CACHE
+ file "~/.local/share/gonnect/history/" as HIST
+}
+
+UserConf --> Resources : Load resources
+SysConf --> UserConf : Override settings
+Resources --> Runtime : Write logs
+Runtime --> UserConf : Persist data
+@enduml
+....
+
+== Network Ports and Protocols
+
+|===
+| Protocol | Port | Direction | Purpose
+
+| SIP/TLS | 5061 | Outbound | SIP signaling (encrypted)
+| SIP/UDP | 5060 | Outbound | SIP signaling (unencrypted)
+| SIP/TCP | 5060 | Outbound | SIP signaling (TCP)
+| RTP | 10000-20000 | Bidirectional | Media streams
+| STUN | 3478 | Outbound | NAT traversal
+| TURN | 3478 | Outbound | NAT relay
+| CardDAV | 443 | Outbound | Contact synchronization
+| CalDAV | 443 | Outbound | Calendar synchronization
+| Jitsi | 443 | Outbound | Video conference
+| D-Bus | N/A | Local | IPC
+|===
+
+== Resource Requirements
+
+=== Minimum Requirements
+
+|===
+| Resource | Minimum | Recommended
+
+| CPU | 1 Core @ 1GHz | 2 Cores @ 2GHz
+| RAM | 1GB | 4GB
+| Disk | 500MB | 1GB
+| Network | 128kbps | 1Mbps+
+|===
+
+== Environment Variables
+
+|===
+| Variable | Purpose | Default
+
+| GONNECT_DEBUG | Enable debug logging | false
+| QT_LOGGING_RULES | Qt logging configuration |
+| PJSIP_LOG_LEVEL | PJSIP logging level | 0
+| KEYCHAIN_SERVICE | Keychain service name | gonnect
+|===
diff --git a/docs/modules/architecture/pages/introduction-and-goals.adoc b/docs/modules/architecture/pages/introduction-and-goals.adoc
new file mode 100644
index 00000000..3a2a32c7
--- /dev/null
+++ b/docs/modules/architecture/pages/introduction-and-goals.adoc
@@ -0,0 +1,109 @@
+= Introduction and Goals
+
+== Scope
+
+GOnnect is a cross-platform Unified Communications client built with Qt/QML that provides:
+
+* SIP voice calling capabilities
+* Contact aggregation from multiple sources (LDAP, CardDAV, Akonadi, EDS)
+* Calendar integration (CalDAV, Akonadi, EDS)
+* Instant messaging support
+* Jitsi Meet integration for video conferences
+* System tray integration with custom window decoration
+* Multi-platform support (Linux, Windows, macOS (experimental))
+
+The application targets enterprise and professional users requiring reliable communication tools with integration into corporate infrastructure.
+
+== System Context
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title GOnnect System Context Diagram
+
+rectangle "End User" as User
+rectangle "GOnnect Client" as Client
+rectangle "SIP Server / PBX" as SIPServer
+rectangle "LDAP Server" as LDAPServer
+rectangle "CardDAV Server" as CardDAVServer
+rectangle "CalDAV Server" as CalDAVServer
+rectangle "Jitsi Meet Server" as JitsiServer
+rectangle "Akonadi / EDS" as LocalServices
+
+User --> Client : Uses application
+Client --> SIPServer : SIP signaling (TLS/TCP/UDP)
+Client --> SIPServer : SRTP media
+Client --> LDAPServer : LDAP queries
+Client --> CardDAVServer : CardDAV requests
+Client --> CalDAVServer : CalDAV requests
+Client --> JitsiServer : Jitsi Meet sessions
+Client --> LocalServices : Local contacts/calendar
+
+@enduml
+....
+
+== Stakeholders and Interests
+
+|===
+| Stakeholder | Interest
+
+| End Users | Reliable call quality, intuitive UI, seamless contact/calendar integration
+| System Administrators | Easy deployment, configuration management, monitoring
+| Security Team | Encrypted communications, secure credential storage, compliance
+| Developers | Maintainable codebase, clear architecture, testability
+| Product Managers | Feature flexibility, platform support, performance
+|===
+
+== Goals
+
+=== Technical Goals
+
+* Cross-platform compatibility (Linux, macOS, Windows)
+* High call quality with adaptive codec selection
+* Low resource consumption and fast startup
+* Reliable background operation (system tray, autostart)
+* Comprehensive logging and debugging capabilities
+
+=== Non-Technical Goals
+
+* User-friendly interface with minimal training required
+* Flexible configuration for diverse deployment scenarios
+* Extensibility through plugin architecture (contact sources, chat plugins)
+* Internationalization support (i18n)
+* Open source development model
+
+=== Out of Scope
+
+* PSTN gateway functionality
+* PBX server functionality
+* Mobile platform support (iOS, Android)
+
+== Definition of Terms
+
+|===
+| Term | Definition
+
+| SIP | Session Initiation Protocol (RFC 3261)
+| AOR | Address of Record - SIP URI identifying a user
+| SRTP | Secure Real-time Transport Protocol
+| ICE | Interactive Connectivity Establishment (RFC 5245)
+| STUN | Session Traversal Utilities for NAT
+| TURN | Traversal Using Relays around NAT
+| CardDAV | Contacts distributed via CalDAV protocol
+| CalDAV | Calendar distributed via CalDAV protocol
+| RTT | Real-time text (RFC 4103)
+|===
+
+== General Constraints
+
+* Must use Qt6 framework for cross-platform GUI
+* Must use PJSIP library for SIP stack implementation
+* Must support C++17 standard
+* Must follow Qt coding conventions
+* Must be buildable with CMake and Conan dependency management
+* Must support Flatpak packaging for Linux distribution
+* Must comply with DCO (Developer Certificate of Origin) for contributions
\ No newline at end of file
diff --git a/docs/modules/architecture/pages/requirements-and-constraints.adoc b/docs/modules/architecture/pages/requirements-and-constraints.adoc
new file mode 100644
index 00000000..0946d44d
--- /dev/null
+++ b/docs/modules/architecture/pages/requirements-and-constraints.adoc
@@ -0,0 +1,147 @@
+= Requirements and Constraints
+
+== Functional Requirements
+
+=== SIP Communication
+
+|===
+| ID | Requirement | Priority
+
+| FR-SIP-001 | Support SIP accounts with TLS/UDP/TCP transport | High
+| FR-SIP-002 | Support SRTP media encryption | High
+| FR-SIP-003 | Support multiple SIP accounts simultaneously | High
+| FR-SIP-004 | Support preferred identity selection | Medium
+| FR-SIP-005 | Support call forwarding and transfer | Medium
+| FR-SIP-006 | Support RTT (Real-time text) | Medium
+| FR-SIP-007 | Support DTMF tones in call | Medium
+|===
+
+=== Call Management
+
+|===
+| ID | Requirement | Priority
+
+| FR-CALL-001 | Support incoming call handling | High
+| FR-CALL-002 | Support outgoing call initiation | High
+| FR-CALL-003 | Support call hold/unhold | High
+| FR-CALL-004 | Support call mute/unmute | High
+| FR-CALL-005 | Support call history tracking | High
+| FR-CALL-006 | Support emergency call priority | High
+| FR-CALL-007 | Support call quality metrics display | Medium
+|===
+
+=== Contact Management
+
+|===
+| ID | Requirement | Priority
+
+| FR-CONTACT-001 | Support LDAP contact sources | High
+| FR-CONTACT-002 | Support CardDAV contact sources | High
+| FR-CONTACT-003 | Support Akonadi contact sources | Medium
+| FR-CONTACT-004 | Support EDS contact sources | Medium
+| FR-CONTACT-005 | Support CSV contact import | Medium
+| FR-CONTACT-006 | Support fuzzy contact search | High
+| FR-CONTACT-007 | Support contact avatar display | Medium
+| FR-CONTACT-008 | Support buddy state subscription | Medium
+|===
+
+=== Calendar Integration
+
+|===
+| ID | Requirement | Priority
+
+| FR-CAL-001 | Support CalDAV calendar sources | High
+| FR-CAL-002 | Support Akonadi calendar sources | Medium
+| FR-CAL-003 | Support EDS calendar sources | Medium
+| FR-CAL-004 | Support event-based call initiation | Medium
+| FR-CAL-005 | Support room booking integration | Low
+|===
+
+=== User Interface
+
+|===
+| ID | Requirement | Priority
+
+| FR-UI-001 | Support QML-based user interface | High
+| FR-UI-002 | Support custom window decoration | High
+| FR-UI-003 | Support system tray integration | High
+| FR-UI-004 | Support internationalization (i18n) | High
+| FR-UI-005 | Support accessibility features | Medium
+| FR-UI-006 | Support keyboard shortcuts | Medium
+|===
+
+== Non-Functional Requirements
+
+=== Performance
+
+|===
+| ID | Requirement | Target
+
+| NFR-PERF-001 | Application startup time | < 3 seconds
+| NFR-PERF-002 | Call establishment time | < 2 seconds
+| NFR-PERF-003 | Contact search response time | < 500ms
+| NFR-PERF-004 | Memory usage (idle) | < 200MB
+| NFR-PERF-005 | CPU usage (idle) | < 5%
+|===
+
+=== Quality
+
+|===
+| ID | Requirement | Target
+
+| NFR-QUAL-001 | Call quality MOS score | > 3.5
+| NFR-QUAL-002 | Audio latency | < 150ms
+| NFR-QUAL-003 | Video frame rate | >= 25 fps
+| NFR-QUAL-004 | Jitter buffer adaptation | < 100ms
+|===
+
+=== Reliability
+
+|===
+| ID | Requirement | Target
+
+| NFR-REL-001 | Call drop rate | < 1%
+| NFR-REL-002 | Uptime (background) | 24/7
+| NFR-REL-003 | Auto-reconnect on network failure | Yes
+| NFR-REL-004 | Config persistence | 100%
+|===
+
+=== Security
+
+|===
+| ID | Requirement | Target
+
+| NFR-SEC-001 | SIP signaling encryption | TLS 1.2+
+| NFR-SEC-002 | Media encryption | SRTP
+| NFR-SEC-003 | Credential storage | Encrypted keychain
+| NFR-SEC-004 | Certificate validation | Strict
+|===
+
+== Architectural Constraints
+
+=== Technology Constraints
+
+* Qt6 framework (minimum version 6.5)
+* C++17 standard
+* PJSIP library (v2.14+)
+* CMake build system (v3.20+)
+* Conan dependency manager
+* Qt Quick Controls 2
+* Qt WebEngine (for Jitsi integration)
+
+=== Platform Constraints
+
+|===
+| Platform | Minimum Version | Notes
+
+| Linux | Ubuntu 20.04+ | Flatpak and native builds
+| macOS | macOS 12.0+ | Apple Silicon and Intel
+| Windows | Windows 10 21H2+ | MSVC 2022
+|===
+
+=== Dependency Constraints
+
+* Must use Qt's parent-child memory management
+* Must avoid raw new/delete in favor of Qt containers
+* Must use QML for UI, C++ for business logic
+* Must follow Qt coding style guidelines
diff --git a/docs/modules/architecture/pages/runtime-view.adoc b/docs/modules/architecture/pages/runtime-view.adoc
new file mode 100644
index 00000000..afc5a375
--- /dev/null
+++ b/docs/modules/architecture/pages/runtime-view.adoc
@@ -0,0 +1,306 @@
+= Runtime View
+
+== Application Startup Flow
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "User" as User
+participant "main.cpp" as Main
+participant "Application" as App
+participant "StateManager" as SM
+participant "SIPManager" as SIPM
+participant "AddressBookManager" as ABM
+participant "DateEventFeederManager" as DEM
+participant "Credentials" as Creds
+participant "UISettings" as UIS
+participant "SystemTrayMenu" as STM
+participant "BackgroundManager" as BG
+
+User -> Main : Launch application
+Main -> App : Construct Application
+App -> SM : Initialize state
+SM --> App : State ready
+App -> UIS : Load settings
+UIS --> App : Settings loaded
+App -> ABM : Initialize address books
+App -> DEM : Initialize calendar feeders
+App -> STM : Create tray menu
+App -> Creds : Initialize credentials
+Creds --> App : Credentials loaded
+App -> BG : Request autostart
+BG --> App : Autostart configured
+App -> SIPM : Initialize SIP (after creds)
+SIPM --> App : SIP ready
+App --> Main : Application ready
+Main --> User : UI displayed
+@enduml
+....
+
+== SIP Initialization Sequence
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+participant "SIPManager" as SIPM
+participant "SIPEventLoop" as SEL
+participant "SIPMediaConfig" as SMC
+participant "SIPUserAgentConfig" as SUAC
+participant "SIPAccountManager" as SAM
+participant "PJSIP" as PJSIP
+
+SIPM -> SEL : Create event loop
+SIPM -> SMC : Create media config
+SIPM -> SUAC : Create UA config
+SIPM -> SAM : Create account manager
+SAM -> PJSIP : Create endpoint
+PJSIP --> SAM : Endpoint created
+SAM --> SIPM : Accounts ready
+SIPM -> SEL : Start event loop
+SEL --> SIPM : Event loop running
+@enduml
+....
+
+== Call State Machine
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam stateStyle mode
+
+title SIPCall State Machine
+
+state "Idle" as Idle
+state "Dialing" as Dialing
+state "Ringing" as Ringing
+state "EarlyMedia" as EarlyMedia
+state "Established" as Established
+state "Hold" as Hold
+state "Terminating" as Terminating
+state "Terminated" as Terminated
+
+Idle --> Dialing : INVITE sent
+Dialing --> Ringing : 180/183 received
+Dialing --> Idle : Cancel/Timeout
+Ringing --> EarlyMedia : 183/200 OK
+Ringing --> Terminated : Reject
+EarlyMedia --> Established : ACK sent
+EarlyMedia --> Terminated : BYE sent
+Established --> Hold : Hold requested
+Established --> Terminating : BYE sent
+Hold --> Established : Unhold requested
+Hold --> Terminating : BYE sent
+Terminating --> Terminated : 200 OK
+@enduml
+....
+
+== Contact Synchronization Flow
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "User" as User
+participant "Application" as App
+participant "AddressBookManager" as ABM
+participant "ContactSource1" as CS1
+participant "ContactSource2" as CS2
+participant "ContactSource3" as CS3
+participant "ContactModel" as CM
+participant "AvatarManager" as AM
+
+App -> ABM : Initialize
+ABM -> CS1 : Start loading
+ABM -> CS2 : Start loading
+ABM -> CS3 : Start loading
+CS1 --> ABM : Contacts batch 1
+CS2 --> ABM : Contacts batch 1
+CS3 --> ABM : Contacts batch 1
+CS1 --> ABM : Contacts batch 2
+CS2 --> ABM : Contacts batch 2
+CS3 --> ABM : Contacts batch 2
+ABM -> CM : Update model
+CM --> ABM : Acknowledged
+ABM --> App : Ready
+App --> User : Contact search available
+AM -> CS1 : Request avatar
+AM -> CS2 : Request avatar
+CS1 --> AM : Avatar data
+CS2 --> AM : Avatar data
+AM --> CM : Update avatars
+@enduml
+....
+
+== Buddy State Update Flow
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+participant "PJSIP" as PJSIP
+participant "SIPManager" as SIPM
+participant "SIPBuddy" as SB
+participant "ContactModel" as CM
+participant "UI" as UI
+
+PJSIP --> SB : NOTIFY: presence state
+SB -> SIPM : State changed
+SIPM --> CM : Emit buddyStateChanged
+CM --> UI : Update buddy icon
+UI --> SB : Acknowledged
+@enduml
+....
+
+== Call Quality Monitoring
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+participant "SIPCall" as SC
+participant "PJSIP" as PJSIP
+participant "SIPCallManager" as SCM
+participant "UI" as UI
+
+SC -> PJSIP : Get RTCP stats
+PJSIP --> SC : RTCP statistics
+SC -> SC : Calculate MOS
+SC -> SCM : Notify quality
+SCM --> UI : Update quality display
+SC -> PJSIP : Get jitter buffer stats
+PJSIP --> SC : Jitter buffer info
+SC -> SC : Update metrics
+SC --> SCM : Quality info changed
+@enduml
+....
+
+== Emergency Call Flow
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "User" as User
+participant "UI" as UI
+participant "StateManager" as SM
+participant "SIPCallManager" as SCM
+participant "SIPCall" as SC
+participant "PJSIP" as PJSIP
+
+User -> UI : Click emergency button
+UI -> SM : Request emergency call
+SM --> UI : Authorization granted
+UI -> SCM : Create emergency call
+SCM -> SC : Initialize call
+SC -> SC : Mark as emergency
+SC -> PJSIP : Send INVITE
+PJSIP --> SC : 100 Trying
+SC --> SCM : State changed
+SCM --> UI : Call in progress
+PJSIP --> SC : 180 Ringing
+SC --> SCM : State changed
+SCM --> UI : Update UI
+PJSIP --> SC : 200 OK
+SC --> SCM : Call established
+SCM --> UI : Update UI
+@enduml
+....
+
+== Configuration Save/Load Cycle
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "User" as User
+participant "SettingsWindow" as SW
+participant "AppSettings" as AS
+participant "Keychain" as KC
+participant "SIPManager" as SIPM
+participant "UISettings" as UIS
+
+User -> SW : Modify settings
+SW -> AS : Save settings
+AS --> SW : Saved
+SW -> KC : Save credentials
+KC --> SW : Encrypted
+SW -> SIPM : Apply SIP settings
+SIPM --> SW : Settings applied
+SW -> UIS : Apply UI settings
+UIS --> SW : UI updated
+@enduml
+....
+
+== System Tray Menu Activation
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "User" as User
+participant "SystemTray" as ST
+participant "SystemTrayMenu" as STM
+participant "Application" as App
+participant "StateManager" as SM
+
+User -> ST : Click tray icon
+ST --> STM : Show menu
+STM --> App : Request window
+App --> STM : Window reference
+STM --> SM : Get call state
+SM --> STM : Current state
+STM --> User : Menu displayed
+User -> STM : Select action
+STM --> App : Execute action
+App --> STM : Action completed
+@enduml
+....
+
+== D-Bus Activation
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "External Process" as Ext
+participant "D-Bus" as DBUS
+participant "StateManager" as SM
+participant "Application" as App
+
+Ext -> DBUS : Activate signal
+DBUS --> SM : Activate called
+SM -> App : Bring to front
+App --> SM : Window shown
+SM --> Ext : Activation complete
+@enduml
+....
diff --git a/docs/modules/architecture/pages/security.adoc b/docs/modules/architecture/pages/security.adoc
new file mode 100644
index 00000000..18669e5b
--- /dev/null
+++ b/docs/modules/architecture/pages/security.adoc
@@ -0,0 +1,403 @@
+= Security Considerations
+
+== Security Architecture Overview
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title GOnnect Security Architecture
+
+package "Security Boundaries" as Sec {
+ component "Application Sandbox" as Sandbox
+ component "Credential Store" as Creds
+ component "Network Layer" as Net
+}
+
+package "Authentication" as Auth {
+ component "SIP Digest Auth" as SIPAuth
+ component "LDAP Bind" as LDAPBind
+ component "CardDAV Auth" as CDAuth
+ component "CalDAV Auth" as CDVAuth
+}
+
+package "Encryption" as Enc {
+ component "TLS/SSL" as TLS
+ component "SRTP" as SRTP
+ component "Keychain" as KC
+}
+
+package "Access Control" as AC {
+ component "Contact Blocking" as CB
+ component "Emergency Override" as EO
+ component "Permission Checks" as PC
+}
+
+Sandbox --> Creds : Secure access
+Sandbox --> Net : Encrypted comms
+Net --> TLS : Transport security
+Net --> SRTP : Media security
+Auth --> SIPAuth : SIP authentication
+Auth --> LDAPBind : LDAP authentication
+Auth --> CDAuth : CardDAV authentication
+Auth --> CDVAuth : CalDAV authentication
+AC --> CB : Contact filtering
+AC --> EO : Emergency priority
+AC --> PC : Permission validation
+@enduml
+....
+
+== Authentication Mechanisms
+
+=== SIP Authentication
+
+GOnnect supports SIP digest authentication as defined in RFC 2617.
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "User" as User
+participant "SIPAccount" as SA
+participant "Credentials" as Creds
+participant "SIP Server" as SIPServer
+
+User -> SA : Configure account
+SA -> Creds : Store credentials
+Creds --> SA : Encrypted storage
+
+User -> SA : Initiate call
+SA -> Creds : Retrieve credentials
+Creds --> SA : Decrypted credentials
+SA -> SIPServer : REGISTER with auth
+SIPServer --> SA : 401 Unauthorized
+SA -> SIPServer : REGISTER with digest
+SIPServer --> SA : 200 OK
+@enduml
+....
+
+=== Authentication Methods
+
+|===
+| Method | Protocol | Security Level | Description
+
+| Digest | SIP | High | RFC 2617 digest authentication
+| Basic | SIP | Low | Base64 encoded credentials (not recommended)
+| GSSAPI | LDAP | High | Kerberos-based authentication
+| Plain | LDAP | Medium | Simple bind with password
+| OAuth 2.0 | CardDAV/CalDAV | High | Token-based authentication
+| Basic | CardDAV/CalDAV | Medium | HTTP Basic auth
+|===
+
+== Encryption Implementation
+
+=== Transport Security
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title Transport Security Layers
+
+rectangle "Application" as App {
+ component "SIP Manager" as SIPM
+ component "Network Layer" as Net
+}
+
+rectangle "Transport Layer" as Transport {
+ component "TLS 1.2+" as TLS
+ component "DTLS-SRTP" as DTLS
+}
+
+rectangle "Network" as Network {
+ component "Firewall" as FW
+ component "Internet" as Internet
+}
+
+App --> Transport : Secure channel
+Transport --> Network : Encrypted packets
+Net --> TLS : SIP over TLS
+Net --> DTLS : Media over DTLS
+@enduml
+....
+
+=== Encryption Configuration
+
+|===
+| Parameter | Value | Description
+
+| TLS Version | 1.2+ | Minimum TLS version
+| Cipher Suites | AES-256-GCM | Preferred cipher suites
+| Certificate Validation | Strict | Enforce certificate validation
+| SRTP Profile | AES_CM_128_HMAC_SHA1_80 | Default SRTP profile
+|===
+
+=== Certificate Handling
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+participant "SIPManager" as SIPM
+participant "Certificate Store" as CertStore
+participant "CA Bundle" as CABundle
+participant "SIP Server" as SIPServer
+
+SIPM -> CertStore : Load CA certificates
+CertStore --> SIPM : CA bundle
+SIPM -> SIPServer : TLS handshake
+SIPServer --> SIPM : Server certificate
+SIPM -> CABundle : Validate certificate
+CABundle --> SIPM : Validation result
+SIPM --> SIPServer : Handshake complete
+@enduml
+....
+
+== Credential Storage
+
+=== Keychain Integration
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "User" as User
+participant "Credentials" as Creds
+participant "Keychain Service" as KC
+participant "SIPAccount" as SA
+
+User -> SA : Enter password
+SA -> Creds : Store credential
+Creds -> KC : Save to keychain
+KC --> Creds : Encrypted storage
+
+SA -> Creds : Request password
+Creds -> KC : Get credential
+KC --> Creds : Prompt user
+User -> KC : Enter password
+KC --> Creds : Decrypted password
+Creds --> SA : Password for auth
+@enduml
+....
+
+=== Keychain Service Configuration
+
+|===
+| Platform | Keychain Service | Service Name | Label
+
+| Linux | Secret Service API | gonnect | GOnnect credentials
+| macOS | Keychain | gonnect | GOnnect credentials
+| Windows | Windows Credential Manager | gonnect | GOnnect credentials
+|===
+
+=== Credential Security
+
+|===
+| Aspect | Implementation | Notes
+
+| Storage | Platform keychain | Encrypted at rest
+| Access | Runtime only | Never written to disk
+| Transmission | In-memory only | No network transmission
+| Logging | Never logged | Credentials excluded from logs
+|===
+
+== Contact Privacy
+
+=== Contact Blocking
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam sequenceMessageAlign center
+skinparam participantStyle rectangle
+
+actor "Caller" as Caller
+participant "SIPCall" as SC
+participant "BlockInfo" as BI
+participant "SIPManager" as SIPM
+
+Caller -> SIPM : INVITE
+SIPM -> BI : Check block list
+BI --> SIPM : Contact blocked
+SIPM -> SC : Reject call
+SC --> Caller : 603 Declined
+@enduml
+....
+
+=== Blocking Configuration
+
+|===
+| Field | Description | Default
+
+| blocked | Contact is blocked | false
+| blockSipCode | SIP response code | 603 (Declined)
+| blockReason | Reason for blocking | Configurable
+|===
+
+== Network Security
+
+=== Firewall Configuration
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title GOnnect Firewall Requirements
+
+rectangle "GOnnect" as App {
+ component "SIP Signaling" as SIP
+ component "Media Streams" as Media
+ component "External Services" as Ext
+}
+
+rectangle "Firewall" as FW {
+ component "Outbound Rules" as Out
+ component "Inbound Rules" as In
+}
+
+rectangle "Network" as Network {
+ component "SIP Server" as SIPServer
+ component "External Servers" as ExtServers
+}
+
+App --> FW : Request access
+FW --> Out : Allow outbound
+FW --> In : Allow inbound (RTP)
+Out --> SIPServer : SIP/TLS (5061)
+Out --> ExtServers : CardDAV/CalDAV
+In --> Media : RTP/RTCP (10000-20000)
+@enduml
+....
+
+=== Required Ports
+
+|===
+| Port | Protocol | Direction | Purpose
+
+| 5061 | TCP/TLS | Outbound | SIP signaling
+| 5060 | TCP/UDP | Outbound | SIP signaling
+| 10000-20000 | UDP | Bidirectional | RTP media
+| 3478 | UDP/TCP | Outbound | STUN/TURN
+| 443 | TCP/TLS | Outbound | CardDAV/CalDAV/Jitsi
+|===
+
+== Security Best Practices
+
+=== Configuration Security
+
+|===
+| Practice | Description | Priority
+
+| Use strong passwords | Minimum 12 characters with complexity | High
+| Enable TLS | Always use TLS for SIP signaling | High
+| Validate certificates | Enable strict certificate validation | High
+| Regular updates | Keep application updated | High
+| Secure keychain | Protect system keychain access | High
+|===
+
+=== Operational Security
+
+|===
+| Practice | Description | Frequency
+
+| Audit logs | Review application logs | Weekly
+| Check certificates | Verify certificate validity | Monthly
+| Update credentials | Rotate passwords periodically | Quarterly
+| Review access | Audit who has access | Monthly
+|===
+
+== Threat Model
+
+=== Identified Threats
+
+|===
+| Threat | Impact | Mitigation
+
+| Eavesdropping | Confidentiality | TLS/SRTP encryption
+| Man-in-the-Middle | Integrity | Certificate validation
+| Credential Theft | Confidentiality | Keychain storage
+| Unauthorized Access | Availability | Authentication
+| Denial of Service | Availability | Rate limiting
+|===
+
+=== Attack Surface
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title GOnnect Attack Surface
+
+rectangle "External Interfaces" as Ext {
+ component "SIP Interface" as SIP
+ component "Network Services" as Net
+ component "File System" as FS
+}
+
+rectangle "Internal Components" as Int {
+ component "SIP Stack" as SIPStack
+ component "Contact Manager" as CM
+ component "Credential Handler" as CH
+}
+
+rectangle "Data Stores" as Data {
+ component "Keychain" as KC
+ component "Config Files" as CFG
+ component "Cache" as Cache
+}
+
+Ext --> Int : Interface exposure
+Int --> Data : Data access
+SIP --> SIPStack : SIP processing
+Net --> Net : Network services
+FS --> Cache : File operations
+CH --> KC : Credential access
+@enduml
+....
+
+== Security Compliance
+
+=== Protocol Compliance
+
+|===
+| Standard | Compliance | Notes
+
+| RFC 3261 (SIP) | Full | Complete SIP implementation
+| RFC 3264 (SDP) | Full | Offer/answer model
+| RFC 3711 (SRTP) | Full | Media encryption
+| RFC 5245 (ICE) | Full | NAT traversal
+| RFC 5389 (STUN) | Full | NAT discovery
+| RFC 5626 (SIP Outbound) | Full | Connection reuse
+|===
+
+=== Security Standards
+
+|===
+| Standard | Status | Notes
+
+| OWASP | Compliant | Follows OWASP guidelines
+| NIST | Compliant | Meets NIST recommendations
+| GDPR | Compliant | Privacy by design
+|===
diff --git a/docs/modules/architecture/pages/solution-strategy.adoc b/docs/modules/architecture/pages/solution-strategy.adoc
new file mode 100644
index 00000000..8a2414b1
--- /dev/null
+++ b/docs/modules/architecture/pages/solution-strategy.adoc
@@ -0,0 +1,204 @@
+= Solution Strategy
+
+== Overall Architecture
+
+GOnnect follows a layered architecture pattern with clear separation of concerns:
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title GOnnect Layered Architecture
+
+rectangle "Presentation Layer (QML)" as Presentation {
+ rectangle "Main Window" as MainWindow
+ rectangle "Call Window" as CallWindow
+ rectangle "Settings Window" as SettingsWindow
+ rectangle "Search Window" as SearchWindow
+}
+
+rectangle "Application Layer (C++)" as Application {
+ rectangle "Application" as App
+ rectangle "StateManager" as StateMgr
+ rectangle "UISettings" as UISettings
+ rectangle "ErrorBus" as ErrorBus
+}
+
+rectangle "Business Logic Layer (C++)" as Business {
+ rectangle "SIP Module" as SIP
+ rectangle "Contacts Module" as Contacts
+ rectangle "Calendar Module" as Calendar
+ rectangle "Media Module" as Media
+}
+
+rectangle "Infrastructure Layer (C++/External)" as Infrastructure {
+ rectangle "PJSIP" as PJSIP
+ rectangle "Qt Multimedia" as QtMedia
+ rectangle "Keychain" as Keychain
+ rectangle "D-Bus" as DBus
+}
+
+Presentation --> Application : QML Context
+Application --> Business : C++ Backend
+Business --> Infrastructure : External Libraries
+@enduml
+....
+
+== Design Patterns
+
+=== Singleton Pattern
+
+Used for global managers that should have exactly one instance:
+
+* `SIPManager` - SIP stack management
+* `StateManager` - Global application state
+* `AddressBookManager` - Contact source management
+* `UISettings` - UI configuration
+
+=== Factory Pattern
+
+Used for creating contact and calendar sources:
+
+* `IAddressBookFactory` - Contact source factory
+* `IDateEventFeederFactory` - Calendar source factory
+
+=== Observer Pattern
+
+Qt's signal/slot mechanism for event notification:
+
+* `ErrorBus` - Error event broadcasting
+* `StateManager` - State change notifications
+* `SIPManager` - Buddy state changes
+
+=== MVC Pattern
+
+For QML data models:
+
+* `CallsModel` - Call list model
+* `HistoryModel` - Call history model
+* `ContactModel` - Contact list model
+
+== Technology Decisions
+
+=== Why Qt/QML?
+
+* Cross-platform GUI framework
+* Declarative UI with QML
+* Strong C++ backend integration
+* Rich ecosystem of Qt modules
+* Active community and long-term support
+
+=== Why PJSIP?
+
+* Mature SIP stack (15+ years)
+* Feature-complete implementation
+* C++ wrapper (PJSUA2) available
+* Active development and maintenance
+* Industry-standard compliance
+
+=== Why CMake + Conan?
+
+* Modern build system with presets
+* Cross-platform compatibility
+* Conan for dependency management
+* Better dependency versioning than Qt's qmake
+
+== Module Responsibilities
+
+=== SIP Module
+
+|===
+| Component | Responsibility
+
+| SIPManager | Central SIP stack management, account handling
+| SIPCall | Individual call state and media handling
+| SIPCallManager | Call lifecycle management
+| SIPBuddy | Contact buddy state tracking
+| SIPAccount | Account configuration and credentials
+|===
+
+=== Contacts Module
+
+|===
+| Component | Responsibility
+
+| AddressBookManager | Contact source orchestration
+| Contact | Contact data model
+| ContactModel | QML contact list model
+| AvatarManager | Contact avatar handling
+|===
+
+=== Calendar Module
+
+|===
+| Component | Responsibility
+
+| DateEventFeederManager | Calendar source orchestration
+| DateEvent | Calendar event data model
+| DateEventsModel | QML calendar events model
+|===
+
+=== Media Module
+
+|===
+| Component | Responsibility
+
+| AudioManager | Audio device and stream management
+| VideoManager | Video device and stream management
+| AudioPort | Audio port routing
+|===
+
+== Component Interaction
+
+[plantuml]
+....
+@startuml
+skinparam backgroundColor #FFFFFF
+skinparam componentStyle uml2
+skinparam shadowing false
+
+title GOnnect Component Interaction
+
+package "UI Layer" as UI {
+ component "GonnectWindow" as GW
+ component "CallWindow" as CW
+ component "SettingsWindow" as SW
+}
+
+package "Application Layer" as Applayer {
+ component "Application" as App
+ component "StateManager" as SM
+ component "UISettings" as UIS
+}
+
+package "Business Layer" as Biz {
+ component "SIPManager" as SIPM
+ component "SIPCallManager" as SCM
+ component "AddressBookManager" as ABM
+ component "DateEventFeederManager" as DEM
+}
+
+package "Infrastructure" as Infra {
+ component "PJSIP" as PJS
+ component "Keychain" as KC
+ component "D-Bus" as DBUS
+}
+
+GW --> App : QML Context
+CW --> App : QML Context
+SW --> App : QML Context
+
+App --> SM : Singleton
+App --> SIPM : Singleton
+App --> ABM : Singleton
+App --> DEM : Singleton
+
+SM --> DBUS : Activation
+SIPM --> PJS : SIP Stack
+SIPM --> KC : Credentials
+ABM --> PJS : Buddy State
+@enduml
+....
diff --git a/external/hid-rp/hid-rp/hid/rdf/descriptor_view.hpp b/external/hid-rp/hid-rp/hid/rdf/descriptor_view.hpp
index bf46c3dc..68d1226a 100644
--- a/external/hid-rp/hid-rp/hid/rdf/descriptor_view.hpp
+++ b/external/hid-rp/hid-rp/hid/rdf/descriptor_view.hpp
@@ -254,8 +254,8 @@ class descriptor_view_base : public items_view_base
{}
template
constexpr descriptor_view_base(const TIter begin, const TIter end)
- : descriptor_view_base(std::addressof(*begin),
- std::addressof(*begin) + std::distance(begin, end))
+ : descriptor_view_base(begin == end ? nullptr : std::addressof(*begin),
+ begin == end ? nullptr : std::addressof(*begin) + std::distance(begin, end))
{}
private:
diff --git a/i18n/gonnect_de.ts b/i18n/gonnect_de.ts
index 868cf458..4db0d4f8 100644
--- a/i18n/gonnect_de.ts
+++ b/i18n/gonnect_de.ts
@@ -1965,7 +1965,7 @@
FirstAidButton
- Emegency call
+ Emergency call
Notruf
diff --git a/i18n/gonnect_es.ts b/i18n/gonnect_es.ts
index 41451147..04134ed4 100644
--- a/i18n/gonnect_es.ts
+++ b/i18n/gonnect_es.ts
@@ -1965,7 +1965,7 @@
FirstAidButton
- Emegency call
+ Emergency call
diff --git a/i18n/gonnect_fa.ts b/i18n/gonnect_fa.ts
index 5878b86f..51c5c579 100644
--- a/i18n/gonnect_fa.ts
+++ b/i18n/gonnect_fa.ts
@@ -1963,7 +1963,7 @@
FirstAidButton
- Emegency call
+ Emergency call
diff --git a/i18n/gonnect_fr.ts b/i18n/gonnect_fr.ts
index 7612ec26..e8e4b54d 100644
--- a/i18n/gonnect_fr.ts
+++ b/i18n/gonnect_fr.ts
@@ -1965,7 +1965,7 @@
FirstAidButton
- Emegency call
+ Emergency call
Appel d ' urgence
diff --git a/i18n/gonnect_it.ts b/i18n/gonnect_it.ts
index c1148660..a068789a 100644
--- a/i18n/gonnect_it.ts
+++ b/i18n/gonnect_it.ts
@@ -1965,7 +1965,7 @@
FirstAidButton
- Emegency call
+ Emergency call
Chiamata di emergenza
diff --git a/i18n/gonnect_ru.ts b/i18n/gonnect_ru.ts
index 9a23445f..166195d1 100644
--- a/i18n/gonnect_ru.ts
+++ b/i18n/gonnect_ru.ts
@@ -1967,7 +1967,7 @@
FirstAidButton
- Emegency call
+ Emergency call
diff --git a/i18n/gonnect_uk.ts b/i18n/gonnect_uk.ts
index 9d551ecb..cc837f72 100644
--- a/i18n/gonnect_uk.ts
+++ b/i18n/gonnect_uk.ts
@@ -1967,7 +1967,7 @@
FirstAidButton
- Emegency call
+ Emergency call
diff --git a/migrate/callhistory/009.sql b/migrate/callhistory/009.sql
new file mode 100644
index 00000000..3243dc5b
--- /dev/null
+++ b/migrate/callhistory/009.sql
@@ -0,0 +1 @@
+ALTER TABLE contactflags DROP COLUMN callcount;
diff --git a/migrate/migrationscripts.qrc b/migrate/migrationscripts.qrc
index 726821a6..5630b83c 100644
--- a/migrate/migrationscripts.qrc
+++ b/migrate/migrationscripts.qrc
@@ -8,5 +8,6 @@
callhistory/006.sql
callhistory/007.sql
callhistory/008.sql
+ callhistory/009.sql
diff --git a/resources/conan/recipes/pjproject/all/conandata.yml b/resources/conan/recipes/pjproject/all/conandata.yml
index fc4c6b1d..d588dba4 100644
--- a/resources/conan/recipes/pjproject/all/conandata.yml
+++ b/resources/conan/recipes/pjproject/all/conandata.yml
@@ -1,7 +1,4 @@
sources:
- '2.16':
- url: https://github.com/pjsip/pjproject/archive/refs/tags/2.16.tar.gz
- sha256: 3af2e481d51aaa095897820fa2ee26c30e530590c6ca56d23e4133bbdad369eb
-patches:
- '2.16':
- - patch_file: patches/01-cmake-archive-location.patch
+ '2.17':
+ url: https://github.com/pjsip/pjproject/archive/refs/tags/2.17.tar.gz
+ sha256: 065fe06c06788d97c35f563796d59f00ce52fe9558a52d7b490a042a966facce
diff --git a/resources/conan/recipes/pjproject/all/conanfile.py b/resources/conan/recipes/pjproject/all/conanfile.py
index cfe7a4a4..6720d51f 100644
--- a/resources/conan/recipes/pjproject/all/conanfile.py
+++ b/resources/conan/recipes/pjproject/all/conanfile.py
@@ -158,6 +158,7 @@ def makeSiteConfig(self):
with open(os.path.join(self.build_folder, 'pjlib/include/pj/config_site.h'), 'a') as file:
file.write('\n\n#define PJ_HAS_IPV6 1\n')
file.write('\n\n#define PJMEDIA_HAS_RTCP_XR 1\n')
+ file.write('\n\n#define PJMEDIA_HAS_DTMF_FLASH 0\n')
file.write('\n\n#define PJSIP_MAX_PKT_LEN 8192\n')
if self.settings.os == "Macos":
diff --git a/resources/conan/recipes/pjproject/config.yml b/resources/conan/recipes/pjproject/config.yml
index 5ddf541c..ca9856db 100644
--- a/resources/conan/recipes/pjproject/config.yml
+++ b/resources/conan/recipes/pjproject/config.yml
@@ -1,5 +1,5 @@
versions:
- '2.16':
+ '2.17':
folder: all
updater:
source: anitya
diff --git a/resources/conan/recipes/qca/all/conandata.yml b/resources/conan/recipes/qca/all/conandata.yml
deleted file mode 100644
index 49249077..00000000
--- a/resources/conan/recipes/qca/all/conandata.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-sources:
- "2.3.10":
- url: "https://github.com/KDE/qca/archive/refs/tags/v2.3.10.zip"
- sha256: "2d95f384255ad96832f93c14ae51d24828d6fea373a9045dada40007a7319659"
-patches:
- "2.3.10":
- - patch_file: "patches/fix-windows-static-build.patch"
diff --git a/resources/conan/recipes/qca/all/conanfile.py b/resources/conan/recipes/qca/all/conanfile.py
deleted file mode 100644
index ba982964..00000000
--- a/resources/conan/recipes/qca/all/conanfile.py
+++ /dev/null
@@ -1,83 +0,0 @@
-import os
-from conan import ConanFile
-from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout, CMakeDeps
-from conan.tools.files import apply_conandata_patches, export_conandata_patches, get, collect_libs
-from conan.tools.env import Environment, VirtualBuildEnv, VirtualRunEnv
-from conan.tools.build import cross_building
-
-class QCA(ConanFile):
- name = "qca"
- license = "GPL"
- homepage = "https://github.com/KDE/qca"
- package_type = "library"
-
- settings = "os", "arch", "compiler", "build_type"
- options = {
- "shared": [True, False],
- "fPIC": [True, False],
- "with_conan_qt": [True, False],
- }
- default_options = {
- "shared": False,
- "fPIC": True,
- "with_conan_qt": False,
- }
-
- def export_sources(self):
- export_conandata_patches(self)
-
- def requirements(self):
- if self.options.with_conan_qt:
- self.requires("qt/6.10.1")
-
- self.requires("openssl/3.5.4")
-
- def source(self):
- get(self, **self.conan_data["sources"][self.version], strip_root=True)
-
- def config_options(self):
- if self.settings.os == "Windows":
- del self.options.fPIC
-
- def layout(self):
- cmake_layout(self)
-
- def generate(self):
- vbe = VirtualBuildEnv(self)
- vbe.generate()
- if not cross_building(self):
- vre = VirtualRunEnv(self)
- vre.generate(scope="build")
-
- # TODO: to remove when properly handled by conan (see https://github.com/conan-io/conan/issues/11962)
- env = Environment()
- env.unset("VCPKG_ROOT")
- env.prepend_path("PKG_CONFIG_PATH", self.generators_folder)
- env.vars(self).save_script("conanbuildenv_pkg_config_path")
-
- deps = CMakeDeps(self)
- deps.generate()
- tc = CMakeToolchain(self)
- tc.variables['BUILD_WITH_QT6'] = True
- tc.variables['BUILD_TESTS'] = False
- tc.variables['BUILD_TOOLS'] = False
- tc.variables['BUILD_PLUGINS'] = "ossl"
- tc.variables['OSX_FRAMEWORK'] = False
- tc.generate()
-
- def build(self):
- apply_conandata_patches(self)
- cmake = CMake(self)
- cmake.configure()
- cmake.build()
-
- def package(self):
- cmake = CMake(self)
- cmake.install()
-
- def package_info(self):
- self.cpp_info.set_property("cmake_file_name", "Qca-qt6")
- self.cpp_info.set_property("cmake_target_name", "qca-qt6")
- self.cpp_info.libs = collect_libs(self)
- self.cpp_info.includedirs.append(os.path.join("include", "Qca-qt6"))
- self.cpp_info.includedirs.append(os.path.join("include", "Qca-qt6", "QtCrypto"))
diff --git a/resources/conan/recipes/qca/all/patches/fix-windows-static-build.patch b/resources/conan/recipes/qca/all/patches/fix-windows-static-build.patch
deleted file mode 100644
index 625bc51e..00000000
--- a/resources/conan/recipes/qca/all/patches/fix-windows-static-build.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-diff --git a/cmake/modules/QcaMacro.cmake b/cmake/modules/QcaMacro.cmake
-index 94f2562d..64dff0ff 100644
---- a/cmake/modules/QcaMacro.cmake
-+++ b/cmake/modules/QcaMacro.cmake
-@@ -66,8 +66,8 @@ endmacro(add_qca_test)
-
- macro(install_pdb TARGET INSTALL_PATH)
- if(MSVC)
-- install(FILES $ DESTINATION ${INSTALL_PATH} CONFIGURATIONS Debug)
-- install(FILES $ DESTINATION ${INSTALL_PATH} CONFIGURATIONS RelWithDebInfo)
-+ #install(FILES $ DESTINATION ${INSTALL_PATH} CONFIGURATIONS Debug)
-+ #install(FILES $ DESTINATION ${INSTALL_PATH} CONFIGURATIONS RelWithDebInfo)
- endif()
- endmacro(install_pdb)
-
diff --git a/resources/conan/recipes/qca/config.yml b/resources/conan/recipes/qca/config.yml
deleted file mode 100644
index 1c1d2520..00000000
--- a/resources/conan/recipes/qca/config.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-versions:
- "2.3.10":
- folder: all
-
-updater:
- source: anitya
- id: 13606
- url-pattern: "https://github.com/KDE/qca/archive/refs/tags/v${version}.zip"
\ No newline at end of file
diff --git a/resources/conan/recipes/qhotkey/all/conandata.yml b/resources/conan/recipes/qhotkey/all/conandata.yml
new file mode 100644
index 00000000..2caa89fb
--- /dev/null
+++ b/resources/conan/recipes/qhotkey/all/conandata.yml
@@ -0,0 +1,4 @@
+sources:
+ '2026-03-19':
+ url: "https://github.com/Skycoder42/QHotkey/archive/4e3a244d87f1f7e741e1395f2ffe825f3a8ada45.zip"
+ sha256: "6055b2b91b955b8e1b24674c4250a9da87fc7e754a8001ef867e7edab934e854"
diff --git a/resources/conan/recipes/qhotkey/all/conanfile.py b/resources/conan/recipes/qhotkey/all/conanfile.py
new file mode 100644
index 00000000..5930f582
--- /dev/null
+++ b/resources/conan/recipes/qhotkey/all/conanfile.py
@@ -0,0 +1,60 @@
+from conan import ConanFile
+from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout, CMakeDeps
+from conan.tools.files import apply_conandata_patches, export_conandata_patches, get
+import os
+
+class QHotkey(ConanFile):
+ name = "qhotkey"
+ description = "A global shortcut/hotkey for Desktop Qt-Applications."
+ license = "BSD-3-clause"
+ homepage = "https://github.com/Skycoder42/QHotkey"
+ package_type = "library"
+
+ settings = "os", "arch", "compiler", "build_type"
+ options = {
+ "shared": [True, False],
+ "fPIC": [True, False],
+ "with_conan_qt": [True, False],
+ }
+ default_options = {
+ "shared": False,
+ "fPIC": True,
+ "with_conan_qt": False,
+ }
+
+ def export_sources(self):
+ export_conandata_patches(self)
+
+ def requirements(self):
+ if self.options.with_conan_qt:
+ self.requires("qt/6.10.1")
+
+ def source(self):
+ get(self, **self.conan_data["sources"][self.version], strip_root=True)
+ apply_conandata_patches(self)
+
+ def layout(self):
+ cmake_layout(self)
+
+ def generate(self):
+ deps = CMakeDeps(self)
+ deps.generate()
+ tc = CMakeToolchain(self)
+ tc.variables['QT_DEFAULT_MAJOR_VERSION '] = 6
+ tc.generate()
+
+ def build(self):
+ apply_conandata_patches(self)
+ cmake = CMake(self)
+ cmake.configure()
+ cmake.build()
+
+ def package(self):
+ cmake = CMake(self)
+ cmake.install()
+
+ def package_info(self):
+ self.cpp_info.set_property("cmake_file_name", "QHotkey")
+ self.cpp_info.set_property("cmake_target_name", "QHotkey")
+ self.cpp_info.libs = ["QHotkey"]
+ self.cpp_info.includedirs.append(os.path.join("include"))
diff --git a/resources/conan/recipes/qhotkey/config.yml b/resources/conan/recipes/qhotkey/config.yml
new file mode 100644
index 00000000..18b6757e
--- /dev/null
+++ b/resources/conan/recipes/qhotkey/config.yml
@@ -0,0 +1,8 @@
+versions:
+ '2026-03-19':
+ folder: all
+updater:
+ source: github
+ id: Skycoder42/QHotkey
+ branch: master
+ url-pattern: https://github.com/Skycoder42/QHotkey/archive/${sha}.zip
diff --git a/resources/conan/recipes/qtkeychain/all/conandata.yml b/resources/conan/recipes/qtkeychain/all/conandata.yml
index 8b3865d4..c77e015e 100644
--- a/resources/conan/recipes/qtkeychain/all/conandata.yml
+++ b/resources/conan/recipes/qtkeychain/all/conandata.yml
@@ -1,7 +1,4 @@
sources:
- "0.15.0":
- url: "https://github.com/frankosterfeld/qtkeychain/archive/refs/tags/0.15.0.zip"
- sha256: "2aca3845e18366f450ce4d0ef94411d9417aa9d86c4444dad8ebf06e3b565743"
-patches:
- "0.15.0":
- - patch_file: patches/fix-apple-keychain.patch
+ "0.16.0":
+ url: "https://github.com/frankosterfeld/qtkeychain/archive/refs/tags/0.16.0.zip"
+ sha256: "5d06fd509e1e483bae0e5778c2cb71e8f91736c361f8028c304f5fe4b165faad"
diff --git a/resources/conan/recipes/qtkeychain/all/patches/fix-apple-keychain.patch b/resources/conan/recipes/qtkeychain/all/patches/fix-apple-keychain.patch
deleted file mode 100644
index f0f0b5da..00000000
--- a/resources/conan/recipes/qtkeychain/all/patches/fix-apple-keychain.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-diff -Naur a/qtkeychain/keychain_apple.mm b/qtkeychain/keychain_apple.mm
---- a/qtkeychain/keychain_apple.mm 2025-01-16 12:53:01
-+++ b/qtkeychain/keychain_apple.mm 2025-11-13 15:44:41
-@@ -106,11 +106,10 @@
-
- - (void)keychainReadTaskFinished:(NSData *)retrievedData
- {
-- _privateJob->data.clear();
-- _privateJob->mode = JobPrivate::Binary;
--
-- if (retrievedData != nil) {
-- if (_privateJob) {
-+ if (_privateJob) {
-+ _privateJob->data.clear();
-+ _privateJob->mode = JobPrivate::Binary;
-+ if (retrievedData != nil) {
- _privateJob->data = QByteArray::fromNSData(retrievedData);
- }
- }
diff --git a/resources/conan/recipes/qtkeychain/config.yml b/resources/conan/recipes/qtkeychain/config.yml
index e0f0f130..c51bf08d 100644
--- a/resources/conan/recipes/qtkeychain/config.yml
+++ b/resources/conan/recipes/qtkeychain/config.yml
@@ -1,8 +1,8 @@
versions:
- "0.15.0":
+ "0.16.0":
folder: all
updater:
source: anitya
id: 381807
- url-pattern: https://github.com/frankosterfeld/qtkeychain/archive/refs/tags/${version}.zip
\ No newline at end of file
+ url-pattern: https://github.com/frankosterfeld/qtkeychain/archive/refs/tags/${version}.zip
diff --git a/resources/conan/recipes/qtwebdav/all/conandata.yml b/resources/conan/recipes/qtwebdav/all/conandata.yml
index 5eddbcae..cb35149e 100644
--- a/resources/conan/recipes/qtwebdav/all/conandata.yml
+++ b/resources/conan/recipes/qtwebdav/all/conandata.yml
@@ -5,3 +5,4 @@ sources:
patches:
- patch_file: patches/fixcmake.patch
- patch_file: patches/remove-deprecations.patch
+- patch_file: patches/ssl-certificates.patch
diff --git a/resources/conan/recipes/qtwebdav/all/patches/ssl-certificates.patch b/resources/conan/recipes/qtwebdav/all/patches/ssl-certificates.patch
new file mode 100644
index 00000000..9e9b0afc
--- /dev/null
+++ b/resources/conan/recipes/qtwebdav/all/patches/ssl-certificates.patch
@@ -0,0 +1,77 @@
+diff --git a/qwebdav.cpp b/qwebdav.cpp
+index 091500d..f3fa4b8 100644
+--- a/qwebdav.cpp
++++ b/qwebdav.cpp
+@@ -160,6 +160,16 @@ void QWebdav::acceptSslCertificate(const QString &sslCertDigestMd5,
+ m_sslCertDigestSha1 = hexToDigest(sslCertDigestSha1);
+ }
+
++void QWebdav::addSslCa(QSslCertificate certificate)
++{
++ m_sslCa += certificate;
++}
++
++void QWebdav::addSslCa(const QList &certificates)
++{
++ m_sslCa += certificates;
++}
++
+ void QWebdav::replyReadyRead()
+ {
+ auto reply = qobject_cast(QObject::sender());
+@@ -692,9 +702,23 @@ QNetworkReply* QWebdav::remove(const QString& path)
+ return createRequest("DELETE", req);
+ }
+
++void QWebdav::setVerifyCa(const bool value) {
++ m_verifyCa = value;
++}
++
+ QNetworkRequest QWebdav::buildRequest() {
+ QNetworkRequest req;
+ if (isSSL()) {
++
++ QSslConfiguration sslConfig = QSslConfiguration::defaultConfiguration();
++ if (!m_verifyCa) {
++ sslConfig.setPeerVerifyMode(QSslSocket::PeerVerifyMode::VerifyNone);
++ }
++ if (!m_sslCa.isEmpty()) {
++ sslConfig.addCaCertificates(m_sslCa);
++ }
++ req.setSslConfiguration(sslConfig);
++
+ QString concatenated = m_username + ":" + m_password;
+ QByteArray data = concatenated.toLocal8Bit().toBase64();
+ QString headerData = "Basic " + data;
+diff --git a/qwebdav.h b/qwebdav.h
+index 7111f05..3e8cbcb 100644
+--- a/qwebdav.h
++++ b/qwebdav.h
+@@ -97,6 +97,9 @@ public:
+ void acceptSslCertificate(const QString &sslCertDigestMd5 = "",
+ const QString &sslCertDigestSha1 = "");
+
++ void addSslCa(QSslCertificate certificate);
++ void addSslCa(const QList& certificates);
++
+ QNetworkReply* list(const QString& path);
+ QNetworkReply* list(const QString& path, int depth);
+
+@@ -125,6 +128,8 @@ public:
+ QNetworkReply* lock(const QString& path, qint64 secs, const QString& token = QString(), QWebdavLockScope scope = LOCK_SCOPE_EXCLUSIVE, QWebdavLockDepth depth = LOCK_DEPTH_ZERO, const QString& owner = QString());
+ QNetworkReply* unlock(const QString& path, const QString& token);
+
++ void setVerifyCa(const bool value);
++
+ //! converts a digest from QByteArray to hexadecimal format ( XX:XX:XX:... with X in [0-9,A-F] )
+ static QString digestToHex(const QByteArray &input);
+ //! converts a digest from hexadecimal format ( XX:XX:XX:... with X in [0-9,A-F] ) to QByteArray
+@@ -156,6 +161,8 @@ private:
+ private:
+ QMap m_outDataDevices;
+ QMap m_inDataDevices;
++ QList m_sslCa;
++ bool m_verifyCa = true;
+
+ QString m_rootPath;
+ QString m_username;
diff --git a/resources/flatpak/de.gonicus.gonnect.metainfo.xml b/resources/flatpak/de.gonicus.gonnect.metainfo.xml
index d41a5ae6..aaab7d3f 100644
--- a/resources/flatpak/de.gonicus.gonnect.metainfo.xml
+++ b/resources/flatpak/de.gonicus.gonnect.metainfo.xml
@@ -126,7 +126,7 @@
https://github.com/gonicus/gonnect
https://github.com/gonicus/gonnect/issues
- https://docs.gonicus.de/gonnect/v2.1.x
+ https://docs.gonicus.de/gonnect
https://gonnect-project.org
https://hosted.weblate.org/engage/gonnect/
https://github.com/gonicus/gonnect#contributing-ov-file
diff --git a/resources/flatpak/de.gonicus.gonnect.releases.xml b/resources/flatpak/de.gonicus.gonnect.releases.xml
index 875afdc4..86cec82e 100644
--- a/resources/flatpak/de.gonicus.gonnect.releases.xml
+++ b/resources/flatpak/de.gonicus.gonnect.releases.xml
@@ -1,5 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
Changes:
diff --git a/resources/flatpak/de.gonicus.gonnect.yml b/resources/flatpak/de.gonicus.gonnect.yml
index 96c2802c..a98aa646 100644
--- a/resources/flatpak/de.gonicus.gonnect.yml
+++ b/resources/flatpak/de.gonicus.gonnect.yml
@@ -8,7 +8,7 @@ command: gonnect
add-extensions:
de.gonicus.gonnect.plugin:
- version: "2"
+ version: '2'
directory: plugins
subdirectories: true
no-autodownload: true
@@ -133,6 +133,7 @@ modules:
- name: pjsip
buildsystem: autotools
+ no-parallel-make: true
config-opts:
- --disable-video
- --enable-ext-sound
@@ -142,11 +143,11 @@ modules:
sources:
- type: git
url: https://github.com/pjsip/pjproject.git
- tag: "2.16"
- commit: 6cab30cec44af36ba7c8a45ff7af2f74a8ed288c
+ tag: '2.17'
+ commit: 5a457451fa2712ba18e12b01738e8ff3af2b26fd
x-checker-data:
type: git
- tag-pattern: ^([0-9]+\.[0-9]+\.[0-9]+)$
+ tag-pattern: ^([0-9]+\.[0-9]+(\.[0-9]+)?)$
- type: patch
path: patches/pjproject-site-config.patch
@@ -169,7 +170,7 @@ modules:
type: anitya
stable-only: true
project-id: 2551
- url-template: "https://www.openldap.org/software/download/OpenLDAP/openldap-release/openldap-${major}.${minor}.${patch}.tgz"
+ url-template: https://www.openldap.org/software/download/OpenLDAP/openldap-release/openldap-${major}.${minor}.${patch}.tgz
- name: qtwebdav
buildsystem: cmake-ninja
@@ -181,6 +182,8 @@ modules:
commit: ac39687b8ae16118d385d3694e900becd108a0f2
- type: patch
path: patches/qtwebdav-cmake.patch
+ - type: patch
+ path: patches/qtwebdav-ssl-certificates.patch
- name: qtkeychain
buildsystem: cmake-ninja
@@ -190,8 +193,8 @@ modules:
sources:
- type: git
url: https://github.com/frankosterfeld/qtkeychain.git
- tag: 0.15.0
- commit: ad7344c45a86a4f66cbafc4b081b5f7b876cb0b7
+ tag: 0.16.0
+ commit: aa6da344e1a20b9194e12bace3665caeea6b6304
x-checker-data:
type: git
tag-pattern: ^([0-9]+\.[0-9]+\.[0-9]+)$
@@ -249,8 +252,8 @@ modules:
buildsystem: cmake-ninja
sources:
- type: archive
- url: https://download.gnome.org/sources/evolution-data-server/3.59/evolution-data-server-3.59.2.tar.xz
- sha256: 15bd798c85dee923462bebe880761b4668b6c5065584e840900988389add83bf
+ url: https://download.gnome.org/sources/evolution-data-server/3.60/evolution-data-server-3.60.1.tar.xz
+ sha256: 33f92d3b8822eba04c313796c0778cbb65a1a38472e857edc5f98854cca9b34c
x-checker-data:
type: gnome
name: evolution-data-server
@@ -282,8 +285,8 @@ modules:
sources:
- type: git
url: https://github.com/jgaa/logfault.git
- tag: v0.8.1
- commit: 9851bceb50e53de21cbbf27fef0b79c19667d3ec
+ tag: v0.8.5
+ commit: 846e8a11abd88a6780591864fb37d182e33793b7
x-checker-data:
type: git
tag-pattern: ^(v[0-9.]+)$
diff --git a/resources/flatpak/patches/pjproject-site-config.patch b/resources/flatpak/patches/pjproject-site-config.patch
index fb2b619c..5943adc7 100644
--- a/resources/flatpak/patches/pjproject-site-config.patch
+++ b/resources/flatpak/patches/pjproject-site-config.patch
@@ -1,8 +1,9 @@
diff -Naur a/pjlib/include/pj/config_site.h b/pjlib/include/pj/config_site.h
--- a/pjlib/include/pj/config_site.h 1970-01-01 01:00:00.000000000 +0100
-+++ b/pjlib/include/pj/config_site.h 2026-02-21 11:01:42.405437418 +0100
-@@ -0,0 +1,4 @@
++++ b/pjlib/include/pj/config_site.h 2026-05-27 18:08:31.468851416 +0200
+@@ -0,0 +1,5 @@
+#define PJ_HAS_IPV6 1
+#define PJSIP_MAX_PKT_LEN 8192
+#define PJMEDIA_HAS_RTCP_XR 1
+#define PJMEDIA_HAS_RTT 0
++#define PJMEDIA_HAS_DTMF_FLASH 0
diff --git a/resources/flatpak/patches/qtwebdav-ssl-certificates.patch b/resources/flatpak/patches/qtwebdav-ssl-certificates.patch
new file mode 100644
index 00000000..9e9b0afc
--- /dev/null
+++ b/resources/flatpak/patches/qtwebdav-ssl-certificates.patch
@@ -0,0 +1,77 @@
+diff --git a/qwebdav.cpp b/qwebdav.cpp
+index 091500d..f3fa4b8 100644
+--- a/qwebdav.cpp
++++ b/qwebdav.cpp
+@@ -160,6 +160,16 @@ void QWebdav::acceptSslCertificate(const QString &sslCertDigestMd5,
+ m_sslCertDigestSha1 = hexToDigest(sslCertDigestSha1);
+ }
+
++void QWebdav::addSslCa(QSslCertificate certificate)
++{
++ m_sslCa += certificate;
++}
++
++void QWebdav::addSslCa(const QList &certificates)
++{
++ m_sslCa += certificates;
++}
++
+ void QWebdav::replyReadyRead()
+ {
+ auto reply = qobject_cast(QObject::sender());
+@@ -692,9 +702,23 @@ QNetworkReply* QWebdav::remove(const QString& path)
+ return createRequest("DELETE", req);
+ }
+
++void QWebdav::setVerifyCa(const bool value) {
++ m_verifyCa = value;
++}
++
+ QNetworkRequest QWebdav::buildRequest() {
+ QNetworkRequest req;
+ if (isSSL()) {
++
++ QSslConfiguration sslConfig = QSslConfiguration::defaultConfiguration();
++ if (!m_verifyCa) {
++ sslConfig.setPeerVerifyMode(QSslSocket::PeerVerifyMode::VerifyNone);
++ }
++ if (!m_sslCa.isEmpty()) {
++ sslConfig.addCaCertificates(m_sslCa);
++ }
++ req.setSslConfiguration(sslConfig);
++
+ QString concatenated = m_username + ":" + m_password;
+ QByteArray data = concatenated.toLocal8Bit().toBase64();
+ QString headerData = "Basic " + data;
+diff --git a/qwebdav.h b/qwebdav.h
+index 7111f05..3e8cbcb 100644
+--- a/qwebdav.h
++++ b/qwebdav.h
+@@ -97,6 +97,9 @@ public:
+ void acceptSslCertificate(const QString &sslCertDigestMd5 = "",
+ const QString &sslCertDigestSha1 = "");
+
++ void addSslCa(QSslCertificate certificate);
++ void addSslCa(const QList& certificates);
++
+ QNetworkReply* list(const QString& path);
+ QNetworkReply* list(const QString& path, int depth);
+
+@@ -125,6 +128,8 @@ public:
+ QNetworkReply* lock(const QString& path, qint64 secs, const QString& token = QString(), QWebdavLockScope scope = LOCK_SCOPE_EXCLUSIVE, QWebdavLockDepth depth = LOCK_DEPTH_ZERO, const QString& owner = QString());
+ QNetworkReply* unlock(const QString& path, const QString& token);
+
++ void setVerifyCa(const bool value);
++
+ //! converts a digest from QByteArray to hexadecimal format ( XX:XX:XX:... with X in [0-9,A-F] )
+ static QString digestToHex(const QByteArray &input);
+ //! converts a digest from hexadecimal format ( XX:XX:XX:... with X in [0-9,A-F] ) to QByteArray
+@@ -156,6 +161,8 @@ private:
+ private:
+ QMap m_outDataDevices;
+ QMap m_inDataDevices;
++ QList m_sslCa;
++ bool m_verifyCa = true;
+
+ QString m_rootPath;
+ QString m_username;
diff --git a/resources/templates/1und1.conf b/resources/templates/1und1.conf
new file mode 100644
index 00000000..e3cb99de
--- /dev/null
+++ b/resources/templates/1und1.conf
@@ -0,0 +1,70 @@
+[template]
+name=1und1
+
+[templateField0]
+name=Phonenumber
+name[de]=Rufnummer
+description=Your local phonenumber
+description[de]=Zu registrierende Telefonnummer
+regex=[0-9]+
+target=PHONENUMBER
+type=text
+
+[ua]
+stunTryIpv6=false
+stunIgnoreFailure=true
+mwiUnsolicitedEnabled=true
+enableUpnp=false
+upnpIfName=
+maxCalls=10
+natTypeInSdp=1
+stunServers=stun.1und1.de
+
+[media]
+noVad=false
+clockRate=16000
+sndClockRate=
+sndRecLatency=100
+sndPlayLatency=160
+quality=4
+audioFramePtime=20
+jbInit=-1
+jbMinPre=-1
+jbMaxPre=-1
+jbMax=-1
+ecTailLen=200
+
+[account0]
+userUri=sip:%TPL[PHONENUMBER]%@tls-sip.1und1.de
+registrarUri=sip:tls-sip.1und1.de
+proxies=sip:tls-sip.1und1.de
+srtpUse=mandatory
+srtpSecureSignaling=0
+lockCodecEnabled=false
+port=5061
+verifyServer=false
+contactRewriteUse=1
+contactRewriteMethod=always-update
+sipStunUse=false
+mediaStunUse=true
+sipUpnpUse=true
+nat64Opt=false
+iceEnabled=true
+iceAggressiveNomination=true
+iceNoRtcp=false
+iceAlwaysUpdate=true
+viaRewriteUse=true
+sdpNatRewriteUse=false
+sipOutboundUse=false
+sipOutboundInstanceId=
+sipOutboundRegId=
+auth=auth0
+transport=tls
+network=ipv4
+
+[auth0]
+scheme=Plain
+username=%TPL[PHONENUMBER]%
+realm=*
+type=plain
+data=
diff --git a/resources/templates/sample.conf b/resources/templates/sample.conf
index 7589e53d..bbbf90e5 100644
--- a/resources/templates/sample.conf
+++ b/resources/templates/sample.conf
@@ -33,6 +33,14 @@ autostart=false
## default: false
#showCallWindowOnStartup=false
+## Whether an own window decoration or the default decoration of the system shall be used.
+## possible values:
+## true: use the custom window decoration
+## false: use the system window decoration
+## auto: try to auto detect what is best (e.g. custom decoration on Gnome and system decoration on KDE)
+## (optional, default: "auto")
+#useOwnWindowDecoration=auto
+
## signal 486 Busy here when already on an active call
## default: false
busyOnBusy=true
@@ -55,6 +63,16 @@ busyOnBusy=true
## default: false
#disableGlobalShortcuts=false
+## Defines the maximum number of times a calendar/contact plugin will attempt
+## to fetch data before stopping and reporting a permanent failure.
+## (optional, default: 5)
+#feederPluginRetryCount=5
+
+## Specifies the delay (in milliseconds) before calendar/contact plugins attempt
+## to fetch and process data again after a previously failed attempt.
+## (optional, default: 10000)
+#feederPluginRetryInterval=10000
+
[sip]
## Encode SIP headers in their short forms to reduce size. By default, SIP headers in outgoing messages will
## be encoded in their full names. If this option is enabled, then SIP headers for outgoing messages will be
@@ -428,6 +446,11 @@ port=5061
## default: ""
#voiceMailUri=
+## Enable RTT functionality for all calls regardless of peer support. If enabled, the RTT console is always
+## visible in the call interface. Otherwise, the RTT console only appears after receiving an RTT message.
+## default: false
+#showRealTimeTextConsole=false
+
#[auth0]
## The authentication scheme (e.g. “digest”).
@@ -572,10 +595,50 @@ port=5061
## found for this LDAP attribute will be used for that subscription.
## This is a performance optimization: when numbers saved under a specific attribute can and will never be subscriptable for SIP states (e.g. "mobile"),
## the client does not need to try. While not an excessive overhead, it might affect performance on slow systems and a large number of subscriptions.
-## Multiple values must be comma-seperated, e.g. "telephoneNumber,mobile"
+## Multiple values must be comma-seperated, e.g. "telephoneNumber,mobile". When custom attribute names are configured below, the values listed here
+## must match those configured names exactly.
## (optional)
#sipStatusSubscriptableAttributes="telephoneNumber"
+## Map the semantic contact roles to the LDAP attribute names actually used by
+## the directory. Defaults match the standard inetOrgPerson schema and need only
+## be overridden for servers that publish phonebook entries under custom names
+## (e.g. Grandstream UCM uses CallerIDName / AccountNumber / MobileNumber / ...).
+## Setting a key to the empty string disables that role for this source.
+## Comparison against the directory is ASCII-case-insensitive (per RFC 4512).
+
+## Attribute holding the contact's display name.
+## (optional, default: "cn")
+#attrName="cn"
+
+## Attribute holding a stable per-contact identifier (used for change detection).
+## (optional, default: "uid")
+#attrUid="uid"
+
+## Attribute holding the contact's organisation / company.
+## (optional, default: "o")
+#attrCompany="o"
+
+## Attribute holding the contact's primary email address.
+## (optional, default: "mail")
+#attrEmail="mail"
+
+## Attribute holding the commercial / office phone number.
+## (optional, default: "telephoneNumber")
+#attrCommercial="telephoneNumber"
+
+## Attribute holding the mobile phone number.
+## (optional, default: "mobile")
+#attrMobile="mobile"
+
+## Attribute holding the home phone number.
+## (optional, default: "homePhone")
+#attrHome="homePhone"
+
+## Attribute holding the binary contact photo. Set empty to skip avatar lookup.
+## (optional, default: "jpegPhoto")
+#attrAvatar="jpegPhoto"
+
## Realm as it might be required for SASL LDAP bind
## default: ""
## (optional)
@@ -660,3 +723,16 @@ port=5061
## (mandatory if 'authorizationMode' includes 'jwt', igonred otherwise)
# baseUrl=https://meet.gonicus.de/auth/token
+
+## Pre-configure global keyboard shortcuts on windows using the keys
+## * dial - shows the dialing window
+## * redial - dials the last number again
+## * hangup - hangs up the current call
+## * toggle-hold - toggles the hold state for the call
+## and the values as standard key sequences, detailed in the Qt documentation:
+## https://doc.qt.io/qt-6/qkeysequence.html#details
+#[windows_shortcuts]
+#dial=Ctrl+Shift+D
+#redial=Ctrl+Shift+R
+#hangup=Ctrl+Shift+H
+#toggle-hold=Ctrl+Shift+M
diff --git a/resources/templates/templates.qrc b/resources/templates/templates.qrc
index ab9e570e..380e5314 100644
--- a/resources/templates/templates.qrc
+++ b/resources/templates/templates.qrc
@@ -8,5 +8,6 @@
telekom.conf
easybell_phoneline.conf
easybell_pbx.conf
+ 1und1.conf
diff --git a/scripts/GOnnectlog2pcap.md b/scripts/GOnnectlog2pcap.md
new file mode 100644
index 00000000..da1e904e
--- /dev/null
+++ b/scripts/GOnnectlog2pcap.md
@@ -0,0 +1,50 @@
+# GOnnectlog2pcap.py
+
+Extract SIP messages from GOnnect/pjsua log files and write them to a PCAP file for analysis in Wireshark or tshark.
+
+## Features
+
+- Handles multiple log formats:
+ - File dump (ISO date + timezone)
+ - Console output (ANSI escape codes)
+ - journalctl dumps (locale-agnostic)
+ - Mixed timezone formats
+- Supports IPv4 and IPv6 addresses
+- Real timestamps extracted from log entries
+- PCAP output with LINK_TYPE 228 (Wireshark auto-detects IPv4/IPv6)
+
+## Usage
+
+```bash
+python3 GOnnectlog2pcap.py [output.pcap]
+```
+
+- `log_file` — path to the GOnnect/pjsua log file
+- `output.pcap` — optional, defaults to `sip_messages.pcap`
+
+## Examples
+
+```bash
+# Extract from a journalctl log
+python3 GOnnectlog2pcap.py gonnect-journal.log
+
+# Extract with custom output filename
+python3 GOnnectlog2pcap.py gonnect-journal.log capture.pcap
+
+# Inspect with tshark
+tshark -r sip_messages.pcap -Y sip
+```
+
+## Supported Log Formats
+
+| Format | Example |
+|--------|---------|
+| File dump | `2026-05-21 13:37:16.128 CEST DEBUG ...` |
+| Console | `[32m10:04:38.593[32m gonnect.pjsip: ...` |
+| journalctl | `Mai 26 16:00:26 host app[pid]: 16:00:26.071 ...` |
+| ISO + TZ | `2026-03-19 13:51:15.883 Mitteleuropäische Zeit ...` |
+
+## Requirements
+
+- Python 3.10+
+- No external dependencies (stdlib only)
diff --git a/scripts/GOnnectlog2pcap.py b/scripts/GOnnectlog2pcap.py
new file mode 100644
index 00000000..44bf05f2
--- /dev/null
+++ b/scripts/GOnnectlog2pcap.py
@@ -0,0 +1,266 @@
+#!/usr/bin/env python3
+"""Extract SIP messages from GOnnect/pjsua logs into a PCAP file for Wireshark.
+
+Handles multiple log formats:
+ - File dump: 2026-05-21 13:37:16.128 CEST DEBUG ...
+ - Console: [32m10:04:38.593[32m gonnect.pjsip: ...
+ - Journalctl: Mai 26 16:00:26 host app[pid]: 16:00:26.071 gonnect.pjsip: ...
+ - ISO date + local TZ: 2026-03-19 13:51:15.883 Mitteleuropäische Zeit ...
+
+Supports IPv4 and IPv6 addresses.
+"""
+
+import datetime
+import ipaddress
+import re
+import struct
+import sys
+
+# ANSI escape codes
+ANSI_RE = re.compile(r"\x1b\[[0-9;]*[a-zA-Z]")
+
+# journalctl prefix: