{{ $releases->links() }}
\ No newline at end of file
diff --git a/Modules/Licensing/Resources/views/downloads/product.blade.php b/Modules/Licensing/Resources/views/downloads/product.blade.php
new file mode 100644
index 0000000..ee0080a
--- /dev/null
+++ b/Modules/Licensing/Resources/views/downloads/product.blade.php
@@ -0,0 +1 @@
+{{ $product->name }}← All downloads
{{ $product->name }}
Version {{ $product->version }} · {{ $product->platform }}
\ No newline at end of file
diff --git a/Modules/Licensing/Resources/views/downloads/release.blade.php b/Modules/Licensing/Resources/views/downloads/release.blade.php
new file mode 100644
index 0000000..fa5a415
--- /dev/null
+++ b/Modules/Licensing/Resources/views/downloads/release.blade.php
@@ -0,0 +1 @@
+SonarDesk {{ $release->version }}← All downloads
macOS {{ $release->minimum_macos ?: 'See application documentation' }} or later.
SHA-256: {{ $release->sha256 }}
Download {{ $release->original_filename }}
\ No newline at end of file
diff --git a/Modules/Licensing/Routes/distribution.php b/Modules/Licensing/Routes/distribution.php
new file mode 100644
index 0000000..c3a094d
--- /dev/null
+++ b/Modules/Licensing/Routes/distribution.php
@@ -0,0 +1,19 @@
+prefix('sonardesk')->name('sonardesk.')->group(function(){
+ Route::get('/downloads',[PublicDownloads::class,'index'])->name('downloads');
+ Route::get('/downloads/releases/{release}',[PublicDownloads::class,'release'])->name('releases.show');
+ Route::get('/downloads/products/{product}',[PublicDownloads::class,'product'])->name('products.show');
+ Route::get('/downloads/latest',[PublicDownloads::class,'latest'])->name('latest');
+ Route::get('/downloads/releases/{release}/file',[PublicDownloads::class,'download'])->name('releases.download');
+ Route::get('/downloads/products/{product}/file',[PublicDownloads::class,'productDownload'])->name('products.download');
+ Route::get('/updates/appcast.xml',[PublicDownloads::class,'appcast'])->name('updates.appcast');
+});
+Route::middleware(['web','auth','verified','can:manage-sonardesk-licensing'])->prefix('administration/sonardesk')->name('administration.sonardesk.')->group(function(){
+ Route::get('/distribution',[AdminDownloads::class,'index'])->name('distribution');
+ Route::post('/distribution/releases',[AdminDownloads::class,'release'])->name('distribution.releases.store');
+ Route::post('/distribution/products',[AdminDownloads::class,'product'])->name('distribution.products.store');
+ Route::patch('/distribution/releases/{release}/publish',[AdminDownloads::class,'publish'])->name('distribution.releases.publish');
+});
diff --git a/integration/PHASE11.md b/integration/PHASE11.md
new file mode 100644
index 0000000..49a504b
--- /dev/null
+++ b/integration/PHASE11.md
@@ -0,0 +1,21 @@
+# Phase 11 — SonarDesk distribution
+Install patch at ABSDEV root; all paths are relative to the project root. No root-level module duplicates are included.
+
+```sh
+php artisan migrate
+composer dump-autoload
+php artisan optimize:clear
+php artisan route:list --path=sonardesk
+php artisan route:list --path=administration/sonardesk/distribution
+```
+Admin: `/administration/sonardesk/distribution`; public: `/sonardesk/downloads`; feed: `/sonardesk/updates/appcast.xml`.
+
+Release and download binaries are stored on the private `local` disk in `sonardesk-distribution/`. Ensure the storage directory is persistent across deployments, backed up, and writable by PHP. Do not put it in public webroot. Public download responses use the Laravel controller.
+
+The database schema preserves the existing legacy `sonardesk_releases` and `download_products` column names. If those tables already exist, the migration does not recreate them. Legacy files and records are **not** automatically imported; migrate their storage paths into `sonardesk-distribution/` before enabling public downloads.
+
+Sparkle appcast includes only stable published releases with a non-empty Sparkle signature. Generate signatures with the official Sparkle signing tool; SHA-256 is not a substitute. Configure the macOS client to point to this feed only after validating compatibility. Existing live appcast and checkout remain unchanged.
+
+The patch includes release creation, publication toggle, separate product upload and read-only public details. Editing existing releases, deletion, detailed per-platform requirements, and automatic client-side updates are not implemented here. Uploaded files are limited to 500 MiB by Laravel validation and additionally by PHP/nginx upload limits. Review your server upload limits.
+
+Do not apply to production before testing staging, storage persistence, URLs, signatures and permissions. No database data is deleted on rollback.
diff --git a/package-lock.json b/package-lock.json
index a0a27f5..4bd8d28 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,5 +1,5 @@
{
- "name": "Content_Manager",
+ "name": "ABSDEV",
"lockfileVersion": 3,
"requires": true,
"packages": {