mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 02:12:49 +00:00 
			
		
		
		
	Compare commits
	
		
			19 Commits
		
	
	
		
			2025-08-30
			...
			2025-09-01
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					57ae4a48a7 | ||
| 
						 | 
					06e8460851 | ||
| 
						 | 
					9713c95bf4 | ||
| 
						 | 
					705748bba5 | ||
| 
						 | 
					022f079821 | ||
| 
						 | 
					80d75731a8 | ||
| 
						 | 
					227721a72f | ||
| 
						 | 
					5572a7a0ab | ||
| 
						 | 
					6a69185a2d | ||
| 
						 | 
					77441b6189 | ||
| 
						 | 
					4aa337c2f2 | ||
| 
						 | 
					4bd2f6866a | ||
| 
						 | 
					377de80103 | ||
| 
						 | 
					1c62d4614e | ||
| 
						 | 
					a91f7410a4 | ||
| 
						 | 
					528c0a8de5 | ||
| 
						 | 
					988bd3ef19 | ||
| 
						 | 
					99d9664ae4 | ||
| 
						 | 
					09649eb5b1 | 
							
								
								
									
										30
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -10,8 +10,38 @@
 | 
			
		||||
> [!CAUTION]
 | 
			
		||||
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
 | 
			
		||||
 | 
			
		||||
## 2025-09-02
 | 
			
		||||
 | 
			
		||||
## 2025-09-01
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - Update configarr.sh to mv backep up .env correctly [@finkerle](https://github.com/finkerle) ([#7323](https://github.com/community-scripts/ProxmoxVE/pull/7323))
 | 
			
		||||
 | 
			
		||||
  - #### ✨ New Features
 | 
			
		||||
 | 
			
		||||
    - Refactor + Feature Bump: HomeAssistant OS [@MickLesk](https://github.com/MickLesk) ([#7336](https://github.com/community-scripts/ProxmoxVE/pull/7336))
 | 
			
		||||
    - UmbrelOS: Refactor / use q35 / better import [@MickLesk](https://github.com/MickLesk) ([#7329](https://github.com/community-scripts/ProxmoxVE/pull/7329))
 | 
			
		||||
    - Harmonize GH Release Check (excl. Pre-Releases & Migrate old "_version.txt" [@MickLesk](https://github.com/MickLesk) ([#7328](https://github.com/community-scripts/ProxmoxVE/pull/7328))
 | 
			
		||||
 | 
			
		||||
### 🌐 Website
 | 
			
		||||
 | 
			
		||||
  - Bump next from 15.2.4 to 15.5.2 in /frontend [@dependabot[bot]](https://github.com/dependabot[bot]) ([#7309](https://github.com/community-scripts/ProxmoxVE/pull/7309))
 | 
			
		||||
 | 
			
		||||
  - #### 📝 Script Information
 | 
			
		||||
 | 
			
		||||
    - booklore: add note for start-up in frontend [@MickLesk](https://github.com/MickLesk) ([#7331](https://github.com/community-scripts/ProxmoxVE/pull/7331))
 | 
			
		||||
 | 
			
		||||
## 2025-08-31
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 | 
			
		||||
  - #### 🐞 Bug Fixes
 | 
			
		||||
 | 
			
		||||
    - n8n: Increase disk size [@tremor021](https://github.com/tremor021) ([#7320](https://github.com/community-scripts/ProxmoxVE/pull/7320))
 | 
			
		||||
 | 
			
		||||
## 2025-08-30
 | 
			
		||||
 | 
			
		||||
### 🚀 Updated Scripts
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,7 @@ function update_script() {
 | 
			
		||||
    mv /opt/configarr/{config.yml,secrets.yml,.env} "/opt/backup/"
 | 
			
		||||
    rm -rf /opt/configarr
 | 
			
		||||
    fetch_and_deploy_gh_release "configarr" "raydak-labs/configarr"
 | 
			
		||||
    mv /opt/backup/* /opt/configarr/
 | 
			
		||||
    mv /opt/backup/{config.yml,secrets.yml,.env} "/opt/configarr/"
 | 
			
		||||
    cd /opt/configarr
 | 
			
		||||
    $STD pnpm install
 | 
			
		||||
    $STD pnpm run build
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ APP="n8n"
 | 
			
		||||
var_tags="${var_tags:-automation}"
 | 
			
		||||
var_cpu="${var_cpu:-2}"
 | 
			
		||||
var_ram="${var_ram:-2048}"
 | 
			
		||||
var_disk="${var_disk:-6}"
 | 
			
		||||
var_disk="${var_disk:-10}"
 | 
			
		||||
var_os="${var_os:-debian}"
 | 
			
		||||
var_version="${var_version:-12}"
 | 
			
		||||
var_unprivileged="${var_unprivileged:-1}"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										578
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										578
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -33,7 +33,7 @@
 | 
			
		||||
        "fuse.js": "^7.1.0",
 | 
			
		||||
        "lucide-react": "^0.453.0",
 | 
			
		||||
        "mini-svg-data-uri": "^1.4.4",
 | 
			
		||||
        "next": "15.2.4",
 | 
			
		||||
        "next": "15.5.2",
 | 
			
		||||
        "next-themes": "^0.4.4",
 | 
			
		||||
        "nuqs": "^2.4.1",
 | 
			
		||||
        "pocketbase": "^0.21.5",
 | 
			
		||||
@@ -742,9 +742,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@emnapi/runtime": {
 | 
			
		||||
      "version": "1.4.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz",
 | 
			
		||||
      "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==",
 | 
			
		||||
      "version": "1.5.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz",
 | 
			
		||||
      "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
@@ -1900,6 +1900,22 @@
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@img/sharp-libvips-linux-ppc64": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "ppc64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "LGPL-3.0-or-later",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@img/sharp-libvips-linux-s390x": {
 | 
			
		||||
      "version": "1.0.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz",
 | 
			
		||||
@@ -2008,6 +2024,28 @@
 | 
			
		||||
        "@img/sharp-libvips-linux-arm64": "1.0.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@img/sharp-linux-ppc64": {
 | 
			
		||||
      "version": "0.34.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz",
 | 
			
		||||
      "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "ppc64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@img/sharp-libvips-linux-ppc64": "1.2.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@img/sharp-linux-s390x": {
 | 
			
		||||
      "version": "0.33.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz",
 | 
			
		||||
@@ -2115,6 +2153,25 @@
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@img/sharp-win32-arm64": {
 | 
			
		||||
      "version": "0.34.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz",
 | 
			
		||||
      "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "Apache-2.0 AND LGPL-3.0-or-later",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "win32"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@img/sharp-win32-ia32": {
 | 
			
		||||
      "version": "0.33.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz",
 | 
			
		||||
@@ -2244,9 +2301,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/env": {
 | 
			
		||||
      "version": "15.2.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/env/-/env-15.2.4.tgz",
 | 
			
		||||
      "integrity": "sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==",
 | 
			
		||||
      "version": "15.5.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.2.tgz",
 | 
			
		||||
      "integrity": "sha512-Qe06ew4zt12LeO6N7j8/nULSOe3fMXE4dM6xgpBQNvdzyK1sv5y4oAP3bq4LamrvGCZtmRYnW8URFCeX5nFgGg==",
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/eslint-plugin-next": {
 | 
			
		||||
@@ -2260,9 +2317,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-darwin-arm64": {
 | 
			
		||||
      "version": "15.2.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.4.tgz",
 | 
			
		||||
      "integrity": "sha512-1AnMfs655ipJEDC/FHkSr0r3lXBgpqKo4K1kiwfUf3iE68rDFXZ1TtHdMvf7D0hMItgDZ7Vuq3JgNMbt/+3bYw==",
 | 
			
		||||
      "version": "15.5.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.2.tgz",
 | 
			
		||||
      "integrity": "sha512-8bGt577BXGSd4iqFygmzIfTYizHb0LGWqH+qgIF/2EDxS5JsSdERJKA8WgwDyNBZgTIIA4D8qUtoQHmxIIquoQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -2276,9 +2333,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-darwin-x64": {
 | 
			
		||||
      "version": "15.2.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.4.tgz",
 | 
			
		||||
      "integrity": "sha512-3qK2zb5EwCwxnO2HeO+TRqCubeI/NgCe+kL5dTJlPldV/uwCnUgC7VbEzgmxbfrkbjehL4H9BPztWOEtsoMwew==",
 | 
			
		||||
      "version": "15.5.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.2.tgz",
 | 
			
		||||
      "integrity": "sha512-2DjnmR6JHK4X+dgTXt5/sOCu/7yPtqpYt8s8hLkHFK3MGkka2snTv3yRMdHvuRtJVkPwCGsvBSwmoQCHatauFQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -2292,9 +2349,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-linux-arm64-gnu": {
 | 
			
		||||
      "version": "15.2.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.4.tgz",
 | 
			
		||||
      "integrity": "sha512-HFN6GKUcrTWvem8AZN7tT95zPb0GUGv9v0d0iyuTb303vbXkkbHDp/DxufB04jNVD+IN9yHy7y/6Mqq0h0YVaQ==",
 | 
			
		||||
      "version": "15.5.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.2.tgz",
 | 
			
		||||
      "integrity": "sha512-3j7SWDBS2Wov/L9q0mFJtEvQ5miIqfO4l7d2m9Mo06ddsgUK8gWfHGgbjdFlCp2Ek7MmMQZSxpGFqcC8zGh2AA==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -2308,9 +2365,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-linux-arm64-musl": {
 | 
			
		||||
      "version": "15.2.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.4.tgz",
 | 
			
		||||
      "integrity": "sha512-Oioa0SORWLwi35/kVB8aCk5Uq+5/ZIumMK1kJV+jSdazFm2NzPDztsefzdmzzpx5oGCJ6FkUC7vkaUseNTStNA==",
 | 
			
		||||
      "version": "15.5.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.2.tgz",
 | 
			
		||||
      "integrity": "sha512-s6N8k8dF9YGc5T01UPQ08yxsK6fUow5gG1/axWc1HVVBYQBgOjca4oUZF7s4p+kwhkB1bDSGR8QznWrFZ/Rt5g==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -2324,9 +2381,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-linux-x64-gnu": {
 | 
			
		||||
      "version": "15.2.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.4.tgz",
 | 
			
		||||
      "integrity": "sha512-yb5WTRaHdkgOqFOZiu6rHV1fAEK0flVpaIN2HB6kxHVSy/dIajWbThS7qON3W9/SNOH2JWkVCyulgGYekMePuw==",
 | 
			
		||||
      "version": "15.5.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.2.tgz",
 | 
			
		||||
      "integrity": "sha512-o1RV/KOODQh6dM6ZRJGZbc+MOAHww33Vbs5JC9Mp1gDk8cpEO+cYC/l7rweiEalkSm5/1WGa4zY7xrNwObN4+Q==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -2340,9 +2397,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-linux-x64-musl": {
 | 
			
		||||
      "version": "15.2.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.4.tgz",
 | 
			
		||||
      "integrity": "sha512-Dcdv/ix6srhkM25fgXiyOieFUkz+fOYkHlydWCtB0xMST6X9XYI3yPDKBZt1xuhOytONsIFJFB08xXYsxUwJLw==",
 | 
			
		||||
      "version": "15.5.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.2.tgz",
 | 
			
		||||
      "integrity": "sha512-/VUnh7w8RElYZ0IV83nUcP/J4KJ6LLYliiBIri3p3aW2giF+PAVgZb6mk8jbQSB3WlTai8gEmCAr7kptFa1H6g==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -2356,9 +2413,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-win32-arm64-msvc": {
 | 
			
		||||
      "version": "15.2.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.4.tgz",
 | 
			
		||||
      "integrity": "sha512-dW0i7eukvDxtIhCYkMrZNQfNicPDExt2jPb9AZPpL7cfyUo7QSNl1DjsHjmmKp6qNAqUESyT8YFl/Aw91cNJJg==",
 | 
			
		||||
      "version": "15.5.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.2.tgz",
 | 
			
		||||
      "integrity": "sha512-sMPyTvRcNKXseNQ/7qRfVRLa0VhR0esmQ29DD6pqvG71+JdVnESJaHPA8t7bc67KD5spP3+DOCNLhqlEI2ZgQg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -2372,9 +2429,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@next/swc-win32-x64-msvc": {
 | 
			
		||||
      "version": "15.2.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.4.tgz",
 | 
			
		||||
      "integrity": "sha512-SbnWkJmkS7Xl3kre8SdMF6F/XDh1DTFEhp0jRTj/uB8iPKoU2bb2NDfcu+iifv1+mxQEd1g2vvSxcZbXSKyWiQ==",
 | 
			
		||||
      "version": "15.5.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.2.tgz",
 | 
			
		||||
      "integrity": "sha512-W5VvyZHnxG/2ukhZF/9Ikdra5fdNftxI6ybeVKYvBPDtyx7x4jPPSNduUkfH5fo3zG0JQ0bPxgy41af2JX5D4Q==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
@@ -3739,12 +3796,6 @@
 | 
			
		||||
        "eslint": ">=9.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@swc/counter": {
 | 
			
		||||
      "version": "0.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
 | 
			
		||||
      "license": "Apache-2.0"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@swc/helpers": {
 | 
			
		||||
      "version": "0.5.15",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
 | 
			
		||||
@@ -5091,17 +5142,6 @@
 | 
			
		||||
        "url": "https://github.com/sponsors/sindresorhus"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/busboy": {
 | 
			
		||||
      "version": "1.6.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
 | 
			
		||||
      "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "streamsearch": "^1.1.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=10.16.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/cac": {
 | 
			
		||||
      "version": "6.7.14",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
 | 
			
		||||
@@ -10385,15 +10425,13 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next": {
 | 
			
		||||
      "version": "15.2.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/next/-/next-15.2.4.tgz",
 | 
			
		||||
      "integrity": "sha512-VwL+LAaPSxEkd3lU2xWbgEOtrM8oedmyhBqaVNmgKB+GvZlCy9rgaEc+y2on0wv+l0oSFqLtYD6dcC1eAedUaQ==",
 | 
			
		||||
      "version": "15.5.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/next/-/next-15.5.2.tgz",
 | 
			
		||||
      "integrity": "sha512-H8Otr7abj1glFhbGnvUt3gz++0AF1+QoCXEBmd/6aKbfdFwrn0LpA836Ed5+00va/7HQSDD+mOoVhn3tNy3e/Q==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@next/env": "15.2.4",
 | 
			
		||||
        "@swc/counter": "0.1.3",
 | 
			
		||||
        "@next/env": "15.5.2",
 | 
			
		||||
        "@swc/helpers": "0.5.15",
 | 
			
		||||
        "busboy": "1.6.0",
 | 
			
		||||
        "caniuse-lite": "^1.0.30001579",
 | 
			
		||||
        "postcss": "8.4.31",
 | 
			
		||||
        "styled-jsx": "5.1.6"
 | 
			
		||||
@@ -10405,19 +10443,19 @@
 | 
			
		||||
        "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@next/swc-darwin-arm64": "15.2.4",
 | 
			
		||||
        "@next/swc-darwin-x64": "15.2.4",
 | 
			
		||||
        "@next/swc-linux-arm64-gnu": "15.2.4",
 | 
			
		||||
        "@next/swc-linux-arm64-musl": "15.2.4",
 | 
			
		||||
        "@next/swc-linux-x64-gnu": "15.2.4",
 | 
			
		||||
        "@next/swc-linux-x64-musl": "15.2.4",
 | 
			
		||||
        "@next/swc-win32-arm64-msvc": "15.2.4",
 | 
			
		||||
        "@next/swc-win32-x64-msvc": "15.2.4",
 | 
			
		||||
        "sharp": "^0.33.5"
 | 
			
		||||
        "@next/swc-darwin-arm64": "15.5.2",
 | 
			
		||||
        "@next/swc-darwin-x64": "15.5.2",
 | 
			
		||||
        "@next/swc-linux-arm64-gnu": "15.5.2",
 | 
			
		||||
        "@next/swc-linux-arm64-musl": "15.5.2",
 | 
			
		||||
        "@next/swc-linux-x64-gnu": "15.5.2",
 | 
			
		||||
        "@next/swc-linux-x64-musl": "15.5.2",
 | 
			
		||||
        "@next/swc-win32-arm64-msvc": "15.5.2",
 | 
			
		||||
        "@next/swc-win32-x64-msvc": "15.5.2",
 | 
			
		||||
        "sharp": "^0.34.3"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "@opentelemetry/api": "^1.1.0",
 | 
			
		||||
        "@playwright/test": "^1.41.2",
 | 
			
		||||
        "@playwright/test": "^1.51.1",
 | 
			
		||||
        "babel-plugin-react-compiler": "*",
 | 
			
		||||
        "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
 | 
			
		||||
        "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
 | 
			
		||||
@@ -10448,6 +10486,367 @@
 | 
			
		||||
        "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-darwin-arm64": {
 | 
			
		||||
      "version": "0.34.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz",
 | 
			
		||||
      "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "darwin"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@img/sharp-libvips-darwin-arm64": "1.2.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-darwin-x64": {
 | 
			
		||||
      "version": "0.34.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz",
 | 
			
		||||
      "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "darwin"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@img/sharp-libvips-darwin-x64": "1.2.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-libvips-darwin-arm64": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "LGPL-3.0-or-later",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "darwin"
 | 
			
		||||
      ],
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-libvips-darwin-x64": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "LGPL-3.0-or-later",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "darwin"
 | 
			
		||||
      ],
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-libvips-linux-arm": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "LGPL-3.0-or-later",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-libvips-linux-arm64": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "LGPL-3.0-or-later",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-libvips-linux-s390x": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "s390x"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "LGPL-3.0-or-later",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-libvips-linux-x64": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "LGPL-3.0-or-later",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-libvips-linuxmusl-arm64": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "LGPL-3.0-or-later",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-libvips-linuxmusl-x64": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "LGPL-3.0-or-later",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-linux-arm": {
 | 
			
		||||
      "version": "0.34.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz",
 | 
			
		||||
      "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@img/sharp-libvips-linux-arm": "1.2.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-linux-arm64": {
 | 
			
		||||
      "version": "0.34.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz",
 | 
			
		||||
      "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@img/sharp-libvips-linux-arm64": "1.2.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-linux-s390x": {
 | 
			
		||||
      "version": "0.34.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz",
 | 
			
		||||
      "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "s390x"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@img/sharp-libvips-linux-s390x": "1.2.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-linux-x64": {
 | 
			
		||||
      "version": "0.34.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz",
 | 
			
		||||
      "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@img/sharp-libvips-linux-x64": "1.2.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-linuxmusl-arm64": {
 | 
			
		||||
      "version": "0.34.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz",
 | 
			
		||||
      "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "arm64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@img/sharp-libvips-linuxmusl-arm64": "1.2.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-linuxmusl-x64": {
 | 
			
		||||
      "version": "0.34.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz",
 | 
			
		||||
      "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "linux"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@img/sharp-libvips-linuxmusl-x64": "1.2.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-wasm32": {
 | 
			
		||||
      "version": "0.34.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz",
 | 
			
		||||
      "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "wasm32"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@emnapi/runtime": "^1.4.4"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-win32-ia32": {
 | 
			
		||||
      "version": "0.34.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz",
 | 
			
		||||
      "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "ia32"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "Apache-2.0 AND LGPL-3.0-or-later",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "win32"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/@img/sharp-win32-x64": {
 | 
			
		||||
      "version": "0.34.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz",
 | 
			
		||||
      "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==",
 | 
			
		||||
      "cpu": [
 | 
			
		||||
        "x64"
 | 
			
		||||
      ],
 | 
			
		||||
      "license": "Apache-2.0 AND LGPL-3.0-or-later",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "os": [
 | 
			
		||||
        "win32"
 | 
			
		||||
      ],
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/postcss": {
 | 
			
		||||
      "version": "8.4.31",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
 | 
			
		||||
@@ -10476,6 +10875,49 @@
 | 
			
		||||
        "node": "^10 || ^12 || >=14"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/next/node_modules/sharp": {
 | 
			
		||||
      "version": "0.34.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz",
 | 
			
		||||
      "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==",
 | 
			
		||||
      "hasInstallScript": true,
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "color": "^4.2.3",
 | 
			
		||||
        "detect-libc": "^2.0.4",
 | 
			
		||||
        "semver": "^7.7.2"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@img/sharp-darwin-arm64": "0.34.3",
 | 
			
		||||
        "@img/sharp-darwin-x64": "0.34.3",
 | 
			
		||||
        "@img/sharp-libvips-darwin-arm64": "1.2.0",
 | 
			
		||||
        "@img/sharp-libvips-darwin-x64": "1.2.0",
 | 
			
		||||
        "@img/sharp-libvips-linux-arm": "1.2.0",
 | 
			
		||||
        "@img/sharp-libvips-linux-arm64": "1.2.0",
 | 
			
		||||
        "@img/sharp-libvips-linux-ppc64": "1.2.0",
 | 
			
		||||
        "@img/sharp-libvips-linux-s390x": "1.2.0",
 | 
			
		||||
        "@img/sharp-libvips-linux-x64": "1.2.0",
 | 
			
		||||
        "@img/sharp-libvips-linuxmusl-arm64": "1.2.0",
 | 
			
		||||
        "@img/sharp-libvips-linuxmusl-x64": "1.2.0",
 | 
			
		||||
        "@img/sharp-linux-arm": "0.34.3",
 | 
			
		||||
        "@img/sharp-linux-arm64": "0.34.3",
 | 
			
		||||
        "@img/sharp-linux-ppc64": "0.34.3",
 | 
			
		||||
        "@img/sharp-linux-s390x": "0.34.3",
 | 
			
		||||
        "@img/sharp-linux-x64": "0.34.3",
 | 
			
		||||
        "@img/sharp-linuxmusl-arm64": "0.34.3",
 | 
			
		||||
        "@img/sharp-linuxmusl-x64": "0.34.3",
 | 
			
		||||
        "@img/sharp-wasm32": "0.34.3",
 | 
			
		||||
        "@img/sharp-win32-arm64": "0.34.3",
 | 
			
		||||
        "@img/sharp-win32-ia32": "0.34.3",
 | 
			
		||||
        "@img/sharp-win32-x64": "0.34.3"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/node-releases": {
 | 
			
		||||
      "version": "2.0.19",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
 | 
			
		||||
@@ -12257,14 +12699,6 @@
 | 
			
		||||
        "node": ">= 0.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/streamsearch": {
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=10.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/string-ts": {
 | 
			
		||||
      "version": "2.2.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/string-ts/-/string-ts-2.2.1.tgz",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								frontend/package.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								frontend/package.json
									
									
									
										generated
									
									
									
								
							@@ -40,7 +40,7 @@
 | 
			
		||||
    "fuse.js": "^7.1.0",
 | 
			
		||||
    "lucide-react": "^0.453.0",
 | 
			
		||||
    "mini-svg-data-uri": "^1.4.4",
 | 
			
		||||
    "next": "15.2.4",
 | 
			
		||||
    "next": "15.5.2",
 | 
			
		||||
    "next-themes": "^0.4.4",
 | 
			
		||||
    "nuqs": "^2.4.1",
 | 
			
		||||
    "pocketbase": "^0.21.5",
 | 
			
		||||
 
 | 
			
		||||
@@ -31,5 +31,10 @@
 | 
			
		||||
    "username": null,
 | 
			
		||||
    "password": null
 | 
			
		||||
  },
 | 
			
		||||
  "notes": []
 | 
			
		||||
  "notes": [
 | 
			
		||||
    {
 | 
			
		||||
      "text": "Starting Booklore (Web UI) may take up to 2 minutes after a restart or fresh installation.",
 | 
			
		||||
      "type": "info"
 | 
			
		||||
    }
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@
 | 
			
		||||
      "resources": {
 | 
			
		||||
        "cpu": 2,
 | 
			
		||||
        "ram": 2048,
 | 
			
		||||
        "hdd": 6,
 | 
			
		||||
        "hdd": 10,
 | 
			
		||||
        "os": "debian",
 | 
			
		||||
        "version": "12"
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,199 @@
 | 
			
		||||
[
 | 
			
		||||
  {
 | 
			
		||||
    "name": "MediaBrowser/Emby.Releases",
 | 
			
		||||
    "version": "4.9.1.2",
 | 
			
		||||
    "date": "2025-06-26T22:08:00Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "booklore-app/booklore",
 | 
			
		||||
    "version": "v1.1.1",
 | 
			
		||||
    "date": "2025-09-01T22:05:26Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "syncthing/syncthing",
 | 
			
		||||
    "version": "v2.0.3",
 | 
			
		||||
    "date": "2025-08-22T08:12:47Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "runtipi/runtipi",
 | 
			
		||||
    "version": "nightly",
 | 
			
		||||
    "date": "2025-09-01T19:23:40Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "project-zot/zot",
 | 
			
		||||
    "version": "v2.1.8",
 | 
			
		||||
    "date": "2025-09-01T19:20:42Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Koenkk/zigbee2mqtt",
 | 
			
		||||
    "version": "2.6.1",
 | 
			
		||||
    "date": "2025-09-01T19:05:18Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "firefly-iii/firefly-iii",
 | 
			
		||||
    "version": "v6.3.2",
 | 
			
		||||
    "date": "2025-08-19T04:08:36Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "outline/outline",
 | 
			
		||||
    "version": "v0.87.3",
 | 
			
		||||
    "date": "2025-09-01T16:25:43Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "home-assistant/operating-system",
 | 
			
		||||
    "version": "16.1",
 | 
			
		||||
    "date": "2025-08-13T07:58:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "seanmorley15/AdventureLog",
 | 
			
		||||
    "version": "v0.11.0",
 | 
			
		||||
    "date": "2025-09-01T16:19:38Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "n8n-io/n8n",
 | 
			
		||||
    "version": "n8n@1.108.2",
 | 
			
		||||
    "date": "2025-08-27T13:05:35Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "grafana/grafana",
 | 
			
		||||
    "version": "rrc_steady_12.2.0-17245430286.patch1",
 | 
			
		||||
    "date": "2025-09-01T14:19:14Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "apache/tomcat",
 | 
			
		||||
    "version": "9.0.109",
 | 
			
		||||
    "date": "2025-09-01T12:36:02Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "fallenbagel/jellyseerr",
 | 
			
		||||
    "version": "preview-issue-description",
 | 
			
		||||
    "date": "2025-09-01T12:21:58Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "nzbgetcom/nzbget",
 | 
			
		||||
    "version": "v25.3",
 | 
			
		||||
    "date": "2025-09-01T09:47:06Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "zitadel/zitadel",
 | 
			
		||||
    "version": "v4.1.0",
 | 
			
		||||
    "date": "2025-09-01T12:03:04Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "VictoriaMetrics/VictoriaMetrics",
 | 
			
		||||
    "version": "pmm-6401-v1.125.0",
 | 
			
		||||
    "date": "2025-09-01T11:01:54Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "grokability/snipe-it",
 | 
			
		||||
    "version": "v8.3.1",
 | 
			
		||||
    "date": "2025-09-01T11:00:07Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "home-assistant/core",
 | 
			
		||||
    "version": "2025.8.3",
 | 
			
		||||
    "date": "2025-08-21T18:23:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "crowdsecurity/crowdsec",
 | 
			
		||||
    "version": "v1.6.11",
 | 
			
		||||
    "date": "2025-07-22T12:11:38Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Checkmk/checkmk",
 | 
			
		||||
    "version": "v2.4.0p11-rc1",
 | 
			
		||||
    "date": "2025-09-01T07:55:46Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "readeck/readeck",
 | 
			
		||||
    "version": "0.20.1",
 | 
			
		||||
    "date": "2025-09-01T07:35:48Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Jackett/Jackett",
 | 
			
		||||
    "version": "v0.22.2390",
 | 
			
		||||
    "date": "2025-09-01T05:57:06Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "moghtech/komodo",
 | 
			
		||||
    "version": "v1.19.2",
 | 
			
		||||
    "date": "2025-09-01T02:33:52Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "steveiliop56/tinyauth",
 | 
			
		||||
    "version": "v3.6.2",
 | 
			
		||||
    "date": "2025-07-17T12:08:03Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "jeedom/core",
 | 
			
		||||
    "version": "4.4.19",
 | 
			
		||||
    "date": "2025-09-01T00:27:07Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "crafty-controller/crafty-4",
 | 
			
		||||
    "version": "v4.5.2",
 | 
			
		||||
    "date": "2025-08-31T22:21:50Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "YunoHost/yunohost",
 | 
			
		||||
    "version": "debian/12.1.17.1",
 | 
			
		||||
    "date": "2025-08-31T21:38:21Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "rcourtman/Pulse",
 | 
			
		||||
    "version": "v4.12.1",
 | 
			
		||||
    "date": "2025-08-31T21:33:41Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "wizarrrr/wizarr",
 | 
			
		||||
    "version": "2025.8.5",
 | 
			
		||||
    "date": "2025-08-31T17:56:37Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "karakeep-app/karakeep",
 | 
			
		||||
    "version": "ios/v1.8.0-1",
 | 
			
		||||
    "date": "2025-08-31T16:06:00Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "LibreTranslate/LibreTranslate",
 | 
			
		||||
    "version": "v1.7.3",
 | 
			
		||||
    "date": "2025-08-31T15:59:43Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Part-DB/Part-DB-server",
 | 
			
		||||
    "version": "v2.0.1",
 | 
			
		||||
    "date": "2025-08-30T23:49:53Z"
 | 
			
		||||
    "version": "v2.0.2",
 | 
			
		||||
    "date": "2025-08-31T13:52:49Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "forgejo/forgejo",
 | 
			
		||||
    "version": "v12.0.2",
 | 
			
		||||
    "date": "2025-08-31T13:15:47Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "fuma-nama/fumadocs",
 | 
			
		||||
    "version": "fumadocs-openapi@9.3.4",
 | 
			
		||||
    "date": "2025-08-31T11:48:08Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "keycloak/keycloak",
 | 
			
		||||
    "version": "26.0.15",
 | 
			
		||||
    "date": "2025-08-27T12:12:03Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Lidarr/Lidarr",
 | 
			
		||||
    "version": "v2.13.3.4711",
 | 
			
		||||
    "date": "2025-08-28T20:06:24Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "authelia/authelia",
 | 
			
		||||
    "version": "v4.39.7",
 | 
			
		||||
    "date": "2025-08-31T06:43:13Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "jhuckaby/Cronicle",
 | 
			
		||||
    "version": "v0.9.91",
 | 
			
		||||
    "date": "2025-08-30T21:49:57Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "YunoHost/yunohost",
 | 
			
		||||
    "version": "debian/12.1.16",
 | 
			
		||||
    "date": "2025-08-30T20:09:13Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "immich-app/immich",
 | 
			
		||||
    "version": "v1.140.1",
 | 
			
		||||
@@ -24,46 +204,11 @@
 | 
			
		||||
    "version": "v5.14.0",
 | 
			
		||||
    "date": "2025-08-30T18:41:03Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "fuma-nama/fumadocs",
 | 
			
		||||
    "version": "fumadocs-mdx@11.8.2",
 | 
			
		||||
    "date": "2025-08-30T13:36:36Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "rcourtman/Pulse",
 | 
			
		||||
    "version": "v4.10.2",
 | 
			
		||||
    "date": "2025-08-30T12:44:11Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "bunkerity/bunkerweb",
 | 
			
		||||
    "version": "v1.6.4",
 | 
			
		||||
    "date": "2025-08-18T20:22:07Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "readeck/readeck",
 | 
			
		||||
    "version": "0.20.0",
 | 
			
		||||
    "date": "2025-08-30T08:26:43Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Jackett/Jackett",
 | 
			
		||||
    "version": "v0.22.2374",
 | 
			
		||||
    "date": "2025-08-30T05:55:07Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "jeedom/core",
 | 
			
		||||
    "version": "4.4.19",
 | 
			
		||||
    "date": "2025-08-30T00:27:11Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "steveiliop56/tinyauth",
 | 
			
		||||
    "version": "v3.6.2",
 | 
			
		||||
    "date": "2025-07-17T12:08:03Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "booklore-app/booklore",
 | 
			
		||||
    "version": "v1.0.0",
 | 
			
		||||
    "date": "2025-08-29T21:59:46Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "henrygd/beszel",
 | 
			
		||||
    "version": "v0.12.6",
 | 
			
		||||
@@ -85,25 +230,15 @@
 | 
			
		||||
    "date": "2025-08-29T19:14:25Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "home-assistant/core",
 | 
			
		||||
    "version": "2025.8.3",
 | 
			
		||||
    "date": "2025-08-21T18:23:10Z"
 | 
			
		||||
    "name": "emqx/emqx",
 | 
			
		||||
    "version": "e6.0.0-alpha.1",
 | 
			
		||||
    "date": "2025-08-29T13:59:45Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "silverbulletmd/silverbullet",
 | 
			
		||||
    "version": "2.0.0",
 | 
			
		||||
    "date": "2025-08-29T13:38:35Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "nzbgetcom/nzbget",
 | 
			
		||||
    "version": "v25.2",
 | 
			
		||||
    "date": "2025-07-04T08:21:42Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "keycloak/keycloak",
 | 
			
		||||
    "version": "26.0.15",
 | 
			
		||||
    "date": "2025-08-27T12:12:03Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Forceu/Gokapi",
 | 
			
		||||
    "version": "v2.1.0",
 | 
			
		||||
@@ -124,11 +259,6 @@
 | 
			
		||||
    "version": "v2.16.19",
 | 
			
		||||
    "date": "2025-08-29T05:53:48Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "firefly-iii/firefly-iii",
 | 
			
		||||
    "version": "v6.3.2",
 | 
			
		||||
    "date": "2025-08-19T04:08:36Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "openobserve/openobserve",
 | 
			
		||||
    "version": "v0.15.0",
 | 
			
		||||
@@ -164,11 +294,6 @@
 | 
			
		||||
    "version": "0.50.11",
 | 
			
		||||
    "date": "2025-08-28T20:12:30Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Lidarr/Lidarr",
 | 
			
		||||
    "version": "v2.13.3.4711",
 | 
			
		||||
    "date": "2025-08-28T20:06:24Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "ollama/ollama",
 | 
			
		||||
    "version": "v0.11.8",
 | 
			
		||||
@@ -184,11 +309,6 @@
 | 
			
		||||
    "version": "1.7.0",
 | 
			
		||||
    "date": "2025-08-28T18:10:59Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "grokability/snipe-it",
 | 
			
		||||
    "version": "v8.3.0",
 | 
			
		||||
    "date": "2025-08-28T17:49:06Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "gristlabs/grist-core",
 | 
			
		||||
    "version": "v1.7.3",
 | 
			
		||||
@@ -204,21 +324,11 @@
 | 
			
		||||
    "version": "1.2.37",
 | 
			
		||||
    "date": "2025-08-28T16:25:55Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "home-assistant/operating-system",
 | 
			
		||||
    "version": "16.1",
 | 
			
		||||
    "date": "2025-08-13T07:58:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "influxdata/influxdb",
 | 
			
		||||
    "version": "v3.4.1",
 | 
			
		||||
    "date": "2025-08-28T13:56:00Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "zitadel/zitadel",
 | 
			
		||||
    "version": "v4.0.3",
 | 
			
		||||
    "date": "2025-08-22T07:43:52Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "open-webui/open-webui",
 | 
			
		||||
    "version": "v0.6.26",
 | 
			
		||||
@@ -234,11 +344,6 @@
 | 
			
		||||
    "version": "4.1.10-tentative",
 | 
			
		||||
    "date": "2025-08-28T10:02:40Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "n8n-io/n8n",
 | 
			
		||||
    "version": "n8n@1.108.2",
 | 
			
		||||
    "date": "2025-08-27T13:05:35Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "garethgeorge/backrest",
 | 
			
		||||
    "version": "v1.9.2",
 | 
			
		||||
@@ -314,11 +419,6 @@
 | 
			
		||||
    "version": "v1.137.0",
 | 
			
		||||
    "date": "2025-08-26T09:51:47Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "MediaBrowser/Emby.Releases",
 | 
			
		||||
    "version": "4.9.1.2",
 | 
			
		||||
    "date": "2025-06-26T22:08:00Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "evcc-io/evcc",
 | 
			
		||||
    "version": "0.207.5",
 | 
			
		||||
@@ -354,21 +454,11 @@
 | 
			
		||||
    "version": "v3.1.2",
 | 
			
		||||
    "date": "2025-08-25T18:00:52Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Checkmk/checkmk",
 | 
			
		||||
    "version": "v2.3.0p36",
 | 
			
		||||
    "date": "2025-08-25T15:32:14Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "wazuh/wazuh",
 | 
			
		||||
    "version": "coverity-w35-4.13.0",
 | 
			
		||||
    "date": "2025-08-25T15:17:33Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "crowdsecurity/crowdsec",
 | 
			
		||||
    "version": "v1.6.11",
 | 
			
		||||
    "date": "2025-07-22T12:11:38Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "sabnzbd/sabnzbd",
 | 
			
		||||
    "version": "4.5.3",
 | 
			
		||||
@@ -379,11 +469,6 @@
 | 
			
		||||
    "version": "7.4.2",
 | 
			
		||||
    "date": "2025-08-25T12:38:14Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "emqx/emqx",
 | 
			
		||||
    "version": "e5.10.1-beta.2",
 | 
			
		||||
    "date": "2025-08-25T08:51:40Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "FlareSolverr/FlareSolverr",
 | 
			
		||||
    "version": "v3.4.0",
 | 
			
		||||
@@ -394,26 +479,11 @@
 | 
			
		||||
    "version": "8.2.10",
 | 
			
		||||
    "date": "2025-08-25T01:26:55Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "crafty-controller/crafty-4",
 | 
			
		||||
    "version": "v4.5.1",
 | 
			
		||||
    "date": "2025-08-24T23:58:52Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Ombi-app/Ombi",
 | 
			
		||||
    "version": "v4.47.1",
 | 
			
		||||
    "date": "2025-01-05T21:14:23Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "moghtech/komodo",
 | 
			
		||||
    "version": "v1.19.1",
 | 
			
		||||
    "date": "2025-08-24T20:16:32Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "runtipi/runtipi",
 | 
			
		||||
    "version": "nightly",
 | 
			
		||||
    "date": "2025-08-24T18:27:58Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "wavelog/wavelog",
 | 
			
		||||
    "version": "2.1",
 | 
			
		||||
@@ -479,11 +549,6 @@
 | 
			
		||||
    "version": "version/2025.8.1",
 | 
			
		||||
    "date": "2025-08-22T14:55:30Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "syncthing/syncthing",
 | 
			
		||||
    "version": "v2.0.3",
 | 
			
		||||
    "date": "2025-08-22T08:12:47Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "mattermost/mattermost",
 | 
			
		||||
    "version": "v10.11.2",
 | 
			
		||||
@@ -569,11 +634,6 @@
 | 
			
		||||
    "version": "v5.8.0",
 | 
			
		||||
    "date": "2025-08-19T16:46:00Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "fallenbagel/jellyseerr",
 | 
			
		||||
    "version": "preview-dns-cache-manager",
 | 
			
		||||
    "date": "2025-08-19T11:57:00Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "chrisvel/tududi",
 | 
			
		||||
    "version": "v0.80",
 | 
			
		||||
@@ -599,11 +659,6 @@
 | 
			
		||||
    "version": "8.2.1",
 | 
			
		||||
    "date": "2025-08-18T15:42:48Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "VictoriaMetrics/VictoriaMetrics",
 | 
			
		||||
    "version": "pmm-6401-v1.124.0",
 | 
			
		||||
    "date": "2025-08-18T12:14:50Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "jupyter/notebook",
 | 
			
		||||
    "version": "@jupyter-notebook/ui-components@7.5.0-alpha.2",
 | 
			
		||||
@@ -614,11 +669,6 @@
 | 
			
		||||
    "version": "v0.6.2",
 | 
			
		||||
    "date": "2025-08-17T22:07:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "wizarrrr/wizarr",
 | 
			
		||||
    "version": "2025.8.3",
 | 
			
		||||
    "date": "2025-08-14T22:05:27Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "deluge-torrent/deluge",
 | 
			
		||||
    "version": "deluge-2.2.1.dev0",
 | 
			
		||||
@@ -659,11 +709,6 @@
 | 
			
		||||
    "version": "v2.2.1",
 | 
			
		||||
    "date": "2025-08-13T19:49:01Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "grafana/grafana",
 | 
			
		||||
    "version": "v12.1.1",
 | 
			
		||||
    "date": "2025-08-13T17:54:07Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "go-gitea/gitea",
 | 
			
		||||
    "version": "v1.24.5",
 | 
			
		||||
@@ -724,21 +769,11 @@
 | 
			
		||||
    "version": "v4.2.3",
 | 
			
		||||
    "date": "2025-08-10T05:53:43Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "outline/outline",
 | 
			
		||||
    "version": "v0.86.1",
 | 
			
		||||
    "date": "2025-08-09T22:05:10Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Stirling-Tools/Stirling-PDF",
 | 
			
		||||
    "version": "v1.2.0",
 | 
			
		||||
    "date": "2025-08-09T14:30:52Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "authelia/authelia",
 | 
			
		||||
    "version": "v4.39.6",
 | 
			
		||||
    "date": "2025-08-09T08:11:44Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "kimai/kimai",
 | 
			
		||||
    "version": "2.38.0",
 | 
			
		||||
@@ -804,26 +839,11 @@
 | 
			
		||||
    "version": "v2.0.116",
 | 
			
		||||
    "date": "2025-08-05T04:45:21Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "apache/tomcat",
 | 
			
		||||
    "version": "10.1.44",
 | 
			
		||||
    "date": "2025-08-04T13:17:59Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Tautulli/Tautulli",
 | 
			
		||||
    "version": "v2.15.3",
 | 
			
		||||
    "date": "2025-08-03T17:27:16Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "project-zot/zot",
 | 
			
		||||
    "version": "v2.1.7",
 | 
			
		||||
    "date": "2025-08-03T16:35:59Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "karakeep-app/karakeep",
 | 
			
		||||
    "version": "mcp/v0.26.0",
 | 
			
		||||
    "date": "2025-08-03T16:21:47Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "linuxserver/Heimdall",
 | 
			
		||||
    "version": "v2.7.4",
 | 
			
		||||
@@ -849,11 +869,6 @@
 | 
			
		||||
    "version": "v0.22.2",
 | 
			
		||||
    "date": "2025-08-01T23:27:06Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "Koenkk/zigbee2mqtt",
 | 
			
		||||
    "version": "2.6.0",
 | 
			
		||||
    "date": "2025-08-01T15:42:21Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "alexta69/metube",
 | 
			
		||||
    "version": "2025.07.31",
 | 
			
		||||
@@ -919,11 +934,6 @@
 | 
			
		||||
    "version": "2.9.0",
 | 
			
		||||
    "date": "2025-07-25T14:20:25Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "forgejo/forgejo",
 | 
			
		||||
    "version": "v12.0.1",
 | 
			
		||||
    "date": "2025-07-25T11:54:30Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "minio/minio",
 | 
			
		||||
    "version": "RELEASE.2025-07-23T15-54-02Z",
 | 
			
		||||
@@ -984,11 +994,6 @@
 | 
			
		||||
    "version": "v2.0.22",
 | 
			
		||||
    "date": "2025-07-11T21:34:20Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "LibreTranslate/LibreTranslate",
 | 
			
		||||
    "version": "v1.7.2",
 | 
			
		||||
    "date": "2025-07-10T19:29:26Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "NginxProxyManager/nginx-proxy-manager",
 | 
			
		||||
    "version": "v2.12.6",
 | 
			
		||||
@@ -1109,11 +1114,6 @@
 | 
			
		||||
    "version": "v0.8.4",
 | 
			
		||||
    "date": "2025-06-10T07:57:14Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "seanmorley15/AdventureLog",
 | 
			
		||||
    "version": "v0.10.0",
 | 
			
		||||
    "date": "2025-06-09T13:37:07Z"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    "name": "jordan-dalby/ByteStash",
 | 
			
		||||
    "version": "v1.5.8",
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										140
									
								
								misc/tools.func
									
									
									
									
									
								
							
							
						
						
									
										140
									
								
								misc/tools.func
									
									
									
									
									
								
							@@ -1944,8 +1944,9 @@ function setup_ffmpeg() {
 | 
			
		||||
check_for_gh_release() {
 | 
			
		||||
  local app="$1"
 | 
			
		||||
  local source="$2"
 | 
			
		||||
  local pinned_version="${3:-}" # optional
 | 
			
		||||
  local current_file="$HOME/.${app,,}"
 | 
			
		||||
  local pinned_version_in="${3:-}" # optional
 | 
			
		||||
  local app_lc="${app,,}"
 | 
			
		||||
  local current_file="$HOME/.${app_lc}"
 | 
			
		||||
 | 
			
		||||
  msg_info "Checking for update: ${app}"
 | 
			
		||||
 | 
			
		||||
@@ -1964,82 +1965,83 @@ check_for_gh_release() {
 | 
			
		||||
    }
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Fetch releases (newest → oldest)
 | 
			
		||||
  local releases
 | 
			
		||||
  releases=$(
 | 
			
		||||
    curl -fsSL --max-time 15 \
 | 
			
		||||
      -H 'Accept: application/vnd.github+json' \
 | 
			
		||||
      -H 'X-GitHub-Api-Version: 2022-11-28' \
 | 
			
		||||
      "https://api.github.com/repos/${source}/releases" |
 | 
			
		||||
      jq -r '.[].tag_name' | sed 's/^v//'
 | 
			
		||||
  ) || true
 | 
			
		||||
 | 
			
		||||
  if [[ -z "$releases" ]]; then
 | 
			
		||||
  # Fetch releases and exclude drafts/prereleases
 | 
			
		||||
  local releases_json
 | 
			
		||||
  releases_json=$(curl -fsSL --max-time 20 \
 | 
			
		||||
    -H 'Accept: application/vnd.github+json' \
 | 
			
		||||
    -H 'X-GitHub-Api-Version: 2022-11-28' \
 | 
			
		||||
    "https://api.github.com/repos/${source}/releases") || {
 | 
			
		||||
    msg_error "Unable to fetch releases for ${app}"
 | 
			
		||||
    return 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Define current and latest versions
 | 
			
		||||
  local latest current
 | 
			
		||||
  latest=$(echo "$releases" | head -n1)
 | 
			
		||||
  current=""
 | 
			
		||||
  [[ -f "$current_file" ]] && current="$(<"$current_file")"
 | 
			
		||||
 | 
			
		||||
  # Helper: get index of a version (lower = newer)
 | 
			
		||||
  get_index() {
 | 
			
		||||
    local ver="${1:-}"
 | 
			
		||||
    [[ -z "$ver" ]] && return 1
 | 
			
		||||
    nl -ba <<<"$releases" | awk -v v="$ver" '$2==v{print $1; exit}'
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  # Pinning enabled
 | 
			
		||||
  if [[ -n "$pinned_version" ]]; then
 | 
			
		||||
    if ! grep -qxF "$pinned_version" <<<"$releases"; then
 | 
			
		||||
      msg_error "Pinned version v${pinned_version} not found upstream"
 | 
			
		||||
      return 1
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if [[ -z "$current" ]]; then
 | 
			
		||||
      msg_info "${app} pinned to v${pinned_version}, no local version → install required"
 | 
			
		||||
      CHECK_UPDATE_RELEASE="$pinned_version"
 | 
			
		||||
      return 0
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if [[ "$current" == "$pinned_version" ]]; then
 | 
			
		||||
      if [[ "$pinned_version" == "$latest" ]]; then
 | 
			
		||||
        msg_ok "${app} pinned to v${pinned_version} (up to date)"
 | 
			
		||||
      else
 | 
			
		||||
        msg_ok "${app} pinned to v${pinned_version} (already installed, upstream v${latest})"
 | 
			
		||||
      fi
 | 
			
		||||
      return 1
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    local pinned_index current_index
 | 
			
		||||
    pinned_index="$(get_index "$pinned_version" || true)"
 | 
			
		||||
    current_index="$(get_index "$current" || true)"
 | 
			
		||||
 | 
			
		||||
    if [[ -z "$current_index" ]] || [[ "$current_index" -gt "$pinned_index" ]]; then
 | 
			
		||||
      msg_info "${app} pinned to v${pinned_version} (installed v${current:-none}) → update required"
 | 
			
		||||
      CHECK_UPDATE_RELEASE="$pinned_version"
 | 
			
		||||
      return 0
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if [[ "$current_index" -lt "$pinned_index" ]]; then
 | 
			
		||||
      msg_info "${app} pinned to v${pinned_version} (installed newer v${current}) → downgrade required"
 | 
			
		||||
      CHECK_UPDATE_RELEASE="$pinned_version"
 | 
			
		||||
      return 0
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
  mapfile -t raw_tags < <(jq -r '.[] | select(.draft==false and .prerelease==false) | .tag_name' <<<"$releases_json")
 | 
			
		||||
  if ((${#raw_tags[@]} == 0)); then
 | 
			
		||||
    msg_error "No stable releases found for ${app}"
 | 
			
		||||
    return 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # No pinning → compare against latest
 | 
			
		||||
  if [[ -z "$current" || "$current" != "$latest" ]]; then
 | 
			
		||||
    CHECK_UPDATE_RELEASE="$latest"
 | 
			
		||||
    msg_info "New release available: v${latest} (current: v${current:-none})"
 | 
			
		||||
  local clean_tags=()
 | 
			
		||||
  for t in "${raw_tags[@]}"; do
 | 
			
		||||
    clean_tags+=("${t#v}")
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  local latest_raw="${raw_tags[0]}"
 | 
			
		||||
  local latest_clean="${clean_tags[0]}"
 | 
			
		||||
 | 
			
		||||
  # current installed (stored without v)
 | 
			
		||||
  local current=""
 | 
			
		||||
  if [[ -f "$current_file" ]]; then
 | 
			
		||||
    current="$(<"$current_file")"
 | 
			
		||||
  else
 | 
			
		||||
    # Migration: search for any /opt/*_version.txt
 | 
			
		||||
    local legacy_files
 | 
			
		||||
    mapfile -t legacy_files < <(find /opt -maxdepth 1 -type f -name "*_version.txt" 2>/dev/null)
 | 
			
		||||
    if ((${#legacy_files[@]} == 1)); then
 | 
			
		||||
      current="$(<"${legacy_files[0]}")"
 | 
			
		||||
      echo "${current#v}" >"$current_file"
 | 
			
		||||
      rm -f "${legacy_files[0]}"
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
  current="${current#v}"
 | 
			
		||||
 | 
			
		||||
  # Pinned version handling
 | 
			
		||||
  if [[ -n "$pinned_version_in" ]]; then
 | 
			
		||||
    local pin_clean="${pinned_version_in#v}"
 | 
			
		||||
    local match_raw=""
 | 
			
		||||
    for i in "${!clean_tags[@]}"; do
 | 
			
		||||
      if [[ "${clean_tags[$i]}" == "$pin_clean" ]]; then
 | 
			
		||||
        match_raw="${raw_tags[$i]}"
 | 
			
		||||
        break
 | 
			
		||||
      fi
 | 
			
		||||
    done
 | 
			
		||||
 | 
			
		||||
    if [[ -z "$match_raw" ]]; then
 | 
			
		||||
      msg_error "Pinned version ${pinned_version_in} not found upstream"
 | 
			
		||||
      return 1
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if [[ "$current" != "$pin_clean" ]]; then
 | 
			
		||||
      msg_info "${app} pinned to ${pinned_version_in} (installed ${current:-none}) → update required"
 | 
			
		||||
      CHECK_UPDATE_RELEASE="$match_raw"
 | 
			
		||||
      return 0
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if [[ "$pin_clean" == "$latest_clean" ]]; then
 | 
			
		||||
      msg_ok "${app} pinned to ${pinned_version_in} (up to date)"
 | 
			
		||||
    else
 | 
			
		||||
      msg_ok "${app} pinned to ${pinned_version_in} (already installed, upstream ${latest_raw})"
 | 
			
		||||
    fi
 | 
			
		||||
    return 1
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # No pinning → use latest
 | 
			
		||||
  if [[ -z "$current" || "$current" != "$latest_clean" ]]; then
 | 
			
		||||
    CHECK_UPDATE_RELEASE="$latest_raw"
 | 
			
		||||
    msg_info "New release available: ${latest_raw} (current: v${current:-none})"
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  msg_ok "${app} is up to date (v${latest})"
 | 
			
		||||
  msg_ok "${app} is up to date (${latest_raw})"
 | 
			
		||||
  return 1
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										153
									
								
								vm/haos-vm.sh
									
									
									
									
									
								
							
							
						
						
									
										153
									
								
								vm/haos-vm.sh
									
									
									
									
									
								
							@@ -208,11 +208,11 @@ function exit-script() {
 | 
			
		||||
function default_settings() {
 | 
			
		||||
  BRANCH="$stable"
 | 
			
		||||
  VMID=$(get_valid_nextid)
 | 
			
		||||
  FORMAT=",efitype=4m"
 | 
			
		||||
  MACHINE=""
 | 
			
		||||
  DISK_CACHE="cache=writethrough,"
 | 
			
		||||
  HN="haos$stable"
 | 
			
		||||
  CPU_TYPE=" -cpu host"
 | 
			
		||||
  MACHINE="q35"
 | 
			
		||||
  FORMAT=""
 | 
			
		||||
  DISK_SIZE="32G"
 | 
			
		||||
  HN="haos-${BRANCH}"
 | 
			
		||||
  CPU_TYPE=""
 | 
			
		||||
  CORE_COUNT="2"
 | 
			
		||||
  RAM_SIZE="4096"
 | 
			
		||||
  BRG="vmbr0"
 | 
			
		||||
@@ -222,9 +222,8 @@ function default_settings() {
 | 
			
		||||
  START_VM="yes"
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
			
		||||
  echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
 | 
			
		||||
  echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}q35${CL}"
 | 
			
		||||
  echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}"
 | 
			
		||||
  echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}"
 | 
			
		||||
  echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}"
 | 
			
		||||
  echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}"
 | 
			
		||||
  echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}"
 | 
			
		||||
@@ -268,16 +267,16 @@ function advanced_settings() {
 | 
			
		||||
    fi
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \
 | 
			
		||||
    "i440fx" "Machine i440fx" ON \
 | 
			
		||||
    "q35" "Machine q35" OFF \
 | 
			
		||||
  if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Machine Type" 10 58 2 \
 | 
			
		||||
    "q35" "Modern (PCIe, UEFI, default)" ON \
 | 
			
		||||
    "i440fx" "Legacy (older compatibility)" OFF \
 | 
			
		||||
    3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ $MACH = q35 ]; then
 | 
			
		||||
      echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}"
 | 
			
		||||
    if [ "$MACH" = "q35" ]; then
 | 
			
		||||
      echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}q35${CL}"
 | 
			
		||||
      FORMAT=""
 | 
			
		||||
      MACHINE=" -machine q35"
 | 
			
		||||
    else
 | 
			
		||||
      echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}"
 | 
			
		||||
      echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
 | 
			
		||||
      FORMAT=",efitype=4m"
 | 
			
		||||
      MACHINE=""
 | 
			
		||||
    fi
 | 
			
		||||
@@ -327,17 +326,20 @@ function advanced_settings() {
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \
 | 
			
		||||
    "0" "KVM64" OFF \
 | 
			
		||||
    "1" "Host (Default)" ON \
 | 
			
		||||
  if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose CPU Model" --cancel-button Exit-Script 10 58 2 \
 | 
			
		||||
    "KVM64" "Default – safe for migration/compatibility" ON \
 | 
			
		||||
    "Host" "Use host CPU features (faster, no migration)" OFF \
 | 
			
		||||
    3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ $CPU_TYPE1 = "1" ]; then
 | 
			
		||||
    case "$CPU_TYPE1" in
 | 
			
		||||
    Host)
 | 
			
		||||
      echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}"
 | 
			
		||||
      CPU_TYPE=" -cpu host"
 | 
			
		||||
    else
 | 
			
		||||
      ;;
 | 
			
		||||
    *)
 | 
			
		||||
      echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}"
 | 
			
		||||
      CPU_TYPE=""
 | 
			
		||||
    fi
 | 
			
		||||
      ;;
 | 
			
		||||
    esac
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
@@ -484,51 +486,70 @@ msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}."
 | 
			
		||||
var_version="${BRANCH}"
 | 
			
		||||
msg_info "Retrieving the URL for Home Assistant ${BRANCH} Disk Image"
 | 
			
		||||
if [ "$BRANCH" == "$dev" ]; then
 | 
			
		||||
  URL=https://os-artifacts.home-assistant.io/${BRANCH}/haos_ova-${BRANCH}.qcow2.xz
 | 
			
		||||
  URL="https://os-artifacts.home-assistant.io/${BRANCH}/haos_ova-${BRANCH}.qcow2.xz"
 | 
			
		||||
else
 | 
			
		||||
  URL=https://github.com/home-assistant/operating-system/releases/download/${BRANCH}/haos_ova-${BRANCH}.qcow2.xz
 | 
			
		||||
  URL="https://github.com/home-assistant/operating-system/releases/download/${BRANCH}/haos_ova-${BRANCH}.qcow2.xz"
 | 
			
		||||
fi
 | 
			
		||||
sleep 2
 | 
			
		||||
 | 
			
		||||
CACHE_DIR="/var/lib/vz/template/cache"
 | 
			
		||||
CACHE_FILE="$CACHE_DIR/$(basename "$URL")"
 | 
			
		||||
FILE_IMG="/var/lib/vz/template/tmp/${CACHE_FILE##*/%.xz}" # .qcow2
 | 
			
		||||
 | 
			
		||||
mkdir -p "$CACHE_DIR" "$(dirname "$FILE_IMG")"
 | 
			
		||||
msg_ok "${CL}${BL}${URL}${CL}"
 | 
			
		||||
curl -f#SL -o "$(basename "$URL")" "$URL"
 | 
			
		||||
echo -en "\e[1A\e[0K"
 | 
			
		||||
FILE=$(basename $URL)
 | 
			
		||||
msg_ok "Downloaded ${CL}${BL}haos_ova-${BRANCH}.qcow2.xz${CL}"
 | 
			
		||||
 | 
			
		||||
msg_info "Extracting KVM Disk Image"
 | 
			
		||||
unxz $FILE
 | 
			
		||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}')
 | 
			
		||||
case $STORAGE_TYPE in
 | 
			
		||||
nfs | dir)
 | 
			
		||||
  DISK_EXT=".raw"
 | 
			
		||||
  DISK_REF="$VMID/"
 | 
			
		||||
  DISK_IMPORT="-format raw"
 | 
			
		||||
  THIN=""
 | 
			
		||||
  ;;
 | 
			
		||||
btrfs | local-zfs)
 | 
			
		||||
  DISK_EXT=".raw"
 | 
			
		||||
  DISK_REF="$VMID/"
 | 
			
		||||
  DISK_IMPORT="-format raw"
 | 
			
		||||
  FORMAT=",efitype=4m"
 | 
			
		||||
  THIN=""
 | 
			
		||||
  ;;
 | 
			
		||||
esac
 | 
			
		||||
for i in {0,1}; do
 | 
			
		||||
  disk="DISK$i"
 | 
			
		||||
  eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-}
 | 
			
		||||
  eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk}
 | 
			
		||||
done
 | 
			
		||||
msg_ok "Extracted KVM Disk Image"
 | 
			
		||||
if [[ ! -s "$CACHE_FILE" ]]; then
 | 
			
		||||
  curl -f#SL -o "$CACHE_FILE" "$URL"
 | 
			
		||||
  msg_ok "Downloaded ${CL}${BL}$(basename "$CACHE_FILE")${CL}"
 | 
			
		||||
else
 | 
			
		||||
  msg_ok "Using cached image ${CL}${BL}$(basename "$CACHE_FILE")${CL}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
msg_info "Creating Homeassistant OS VM"
 | 
			
		||||
qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \
 | 
			
		||||
  -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
 | 
			
		||||
pvesm alloc $STORAGE $VMID $DISK0 4M 1>&/dev/null
 | 
			
		||||
qm importdisk $VMID ${FILE%.*} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null
 | 
			
		||||
qm set $VMID \
 | 
			
		||||
  -efidisk0 ${DISK0_REF}${FORMAT} \
 | 
			
		||||
  -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=32G \
 | 
			
		||||
  -boot order=scsi0 >/dev/null
 | 
			
		||||
if ! command -v pv &>/dev/null; then
 | 
			
		||||
  apt-get update -qq &>/dev/null && apt-get install -y pv &>/dev/null
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
set -o pipefail
 | 
			
		||||
msg_info "Creating Home Assistant OS VM shell"
 | 
			
		||||
qm create "$VMID" -machine q35 -bios ovmf -agent 1 -tablet 0 -localtime 1 ${CPU_TYPE} \
 | 
			
		||||
  -cores "$CORE_COUNT" -memory "$RAM_SIZE" -name "$HN" -tags community-script \
 | 
			
		||||
  -net0 "virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU" -onboot 1 -ostype l26 -scsihw virtio-scsi-pci >/dev/null
 | 
			
		||||
msg_ok "Created VM shell"
 | 
			
		||||
 | 
			
		||||
msg_info "Decompressing $(basename "$CACHE_FILE") to $FILE_IMG"
 | 
			
		||||
xz -dc "$CACHE_FILE" | pv -N "Extracting" >"$FILE_IMG"
 | 
			
		||||
msg_ok "Decompressed to $FILE_IMG"
 | 
			
		||||
 | 
			
		||||
msg_info "Importing disk into storage ($STORAGE)"
 | 
			
		||||
if qm disk import --help >/dev/null 2>&1; then
 | 
			
		||||
  IMPORT_CMD=(qm disk import)
 | 
			
		||||
else
 | 
			
		||||
  IMPORT_CMD=(qm importdisk)
 | 
			
		||||
fi
 | 
			
		||||
IMPORT_OUT="$("${IMPORT_CMD[@]}" "$VMID" "$FILE_IMG" "$STORAGE" --format raw 2>&1 || true)"
 | 
			
		||||
DISK_REF="$(printf '%s\n' "$IMPORT_OUT" | sed -n "s/.*successfully imported disk '\([^']\+\)'.*/\1/p" | tr -d "\r\"'")"
 | 
			
		||||
[[ -z "$DISK_REF" ]] && DISK_REF="$(pvesm list "$STORAGE" | awk -v id="$VMID" '$5 ~ ("vm-"id"-disk-") {print $1":"$5}' | sort | tail -n1)"
 | 
			
		||||
[[ -z "$DISK_REF" ]] && {
 | 
			
		||||
  msg_error "Unable to determine imported disk reference."
 | 
			
		||||
  echo "$IMPORT_OUT"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
msg_ok "Imported disk (${CL}${BL}${DISK_REF}${CL})"
 | 
			
		||||
 | 
			
		||||
rm -f "$FILE_IMG"
 | 
			
		||||
 | 
			
		||||
msg_info "Attaching EFI and root disk"
 | 
			
		||||
qm set "$VMID" \
 | 
			
		||||
  --efidisk0 "${STORAGE}:0,efitype=4m" \
 | 
			
		||||
  --scsi0 "${DISK_REF},ssd=1,discard=on" \
 | 
			
		||||
  --boot order=scsi0 \
 | 
			
		||||
  --serial0 socket >/dev/null
 | 
			
		||||
qm set "$VMID" --agent enabled=1 >/dev/null
 | 
			
		||||
msg_ok "Attached EFI and root disk"
 | 
			
		||||
 | 
			
		||||
msg_info "Resizing disk to $DISK_SIZE"
 | 
			
		||||
qm resize "$VMID" scsi0 "${DISK_SIZE}" >/dev/null
 | 
			
		||||
msg_ok "Resized disk"
 | 
			
		||||
 | 
			
		||||
DESCRIPTION=$(
 | 
			
		||||
  cat <<EOF
 | 
			
		||||
@@ -560,17 +581,17 @@ DESCRIPTION=$(
 | 
			
		||||
</div>
 | 
			
		||||
EOF
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
qm set "$VMID" -description "$DESCRIPTION" >/dev/null
 | 
			
		||||
if [ -n "$DISK_SIZE" ]; then
 | 
			
		||||
  msg_info "Resizing disk to $DISK_SIZE GB"
 | 
			
		||||
  qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null
 | 
			
		||||
msg_ok "Created Homeassistant OS VM ${CL}${BL}(${HN})"
 | 
			
		||||
 | 
			
		||||
if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Image Cache" \
 | 
			
		||||
  --yesno "Keep downloaded Home Assistant OS image for future VMs?\n\nFile: $CACHE_FILE" 10 70; then
 | 
			
		||||
  msg_ok "Keeping cached image"
 | 
			
		||||
else
 | 
			
		||||
  msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB"
 | 
			
		||||
  qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null
 | 
			
		||||
  rm -f "$CACHE_FILE"
 | 
			
		||||
  msg_ok "Deleted cached image"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
msg_ok "Created Homeassistant OS VM ${CL}${BL}(${HN})"
 | 
			
		||||
if [ "$START_VM" == "yes" ]; then
 | 
			
		||||
  msg_info "Starting Home Assistant OS VM"
 | 
			
		||||
  qm start $VMID
 | 
			
		||||
 
 | 
			
		||||
@@ -203,10 +203,9 @@ function exit-script() {
 | 
			
		||||
 | 
			
		||||
function default_settings() {
 | 
			
		||||
  VMID=$(get_valid_nextid)
 | 
			
		||||
  FORMAT=",efitype=4m"
 | 
			
		||||
  MACHINE=""
 | 
			
		||||
  MACHINE="q35"
 | 
			
		||||
  FORMAT=""
 | 
			
		||||
  DISK_SIZE="32G"
 | 
			
		||||
  DISK_CACHE=""
 | 
			
		||||
  HN="umbrelos"
 | 
			
		||||
  CPU_TYPE=""
 | 
			
		||||
  CORE_COUNT="2"
 | 
			
		||||
@@ -218,9 +217,8 @@ function default_settings() {
 | 
			
		||||
  START_VM="yes"
 | 
			
		||||
  METHOD="default"
 | 
			
		||||
  echo -e "${CONTAINERID}${BOLD}${DGN}Virtual Machine ID: ${BGN}${VMID}${CL}"
 | 
			
		||||
  echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
 | 
			
		||||
  echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}q35${CL}"
 | 
			
		||||
  echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}${CL}"
 | 
			
		||||
  echo -e "${DISKSIZE}${BOLD}${DGN}Disk Cache: ${BGN}None${CL}"
 | 
			
		||||
  echo -e "${HOSTNAME}${BOLD}${DGN}Hostname: ${BGN}${HN}${CL}"
 | 
			
		||||
  echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}"
 | 
			
		||||
  echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}"
 | 
			
		||||
@@ -253,16 +251,16 @@ function advanced_settings() {
 | 
			
		||||
    fi
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Type" 10 58 2 \
 | 
			
		||||
    "i440fx" "Machine i440fx" ON \
 | 
			
		||||
    "q35" "Machine q35" OFF \
 | 
			
		||||
  if MACH=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "MACHINE TYPE" --radiolist --cancel-button Exit-Script "Choose Machine Type" 10 58 2 \
 | 
			
		||||
    "q35" "Modern (PCIe, UEFI, default)" ON \
 | 
			
		||||
    "i440fx" "Legacy (older compatibility)" OFF \
 | 
			
		||||
    3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ $MACH = q35 ]; then
 | 
			
		||||
      echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}"
 | 
			
		||||
    if [ "$MACH" = "q35" ]; then
 | 
			
		||||
      echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}q35${CL}"
 | 
			
		||||
      FORMAT=""
 | 
			
		||||
      MACHINE=" -machine q35"
 | 
			
		||||
    else
 | 
			
		||||
      echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}$MACH${CL}"
 | 
			
		||||
      echo -e "${CONTAINERTYPE}${BOLD}${DGN}Machine Type: ${BGN}i440fx${CL}"
 | 
			
		||||
      FORMAT=",efitype=4m"
 | 
			
		||||
      MACHINE=""
 | 
			
		||||
    fi
 | 
			
		||||
@@ -312,17 +310,20 @@ function advanced_settings() {
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose" --cancel-button Exit-Script 10 58 2 \
 | 
			
		||||
    "0" "KVM64 (Default)" ON \
 | 
			
		||||
    "1" "Host" OFF \
 | 
			
		||||
  if CPU_TYPE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CPU MODEL" --radiolist "Choose CPU Model" --cancel-button Exit-Script 10 58 2 \
 | 
			
		||||
    "KVM64" "Default – safe for migration/compatibility" ON \
 | 
			
		||||
    "Host" "Use host CPU features (faster, no migration)" OFF \
 | 
			
		||||
    3>&1 1>&2 2>&3); then
 | 
			
		||||
    if [ $CPU_TYPE1 = "1" ]; then
 | 
			
		||||
    case "$CPU_TYPE1" in
 | 
			
		||||
    "Host")
 | 
			
		||||
      echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}Host${CL}"
 | 
			
		||||
      CPU_TYPE=" -cpu host"
 | 
			
		||||
    else
 | 
			
		||||
      ;;
 | 
			
		||||
    *)
 | 
			
		||||
      echo -e "${OS}${BOLD}${DGN}CPU Model: ${BGN}KVM64${CL}"
 | 
			
		||||
      CPU_TYPE=""
 | 
			
		||||
    fi
 | 
			
		||||
      ;;
 | 
			
		||||
    esac
 | 
			
		||||
  else
 | 
			
		||||
    exit-script
 | 
			
		||||
  fi
 | 
			
		||||
@@ -433,86 +434,71 @@ pve_check
 | 
			
		||||
ssh_check
 | 
			
		||||
start_script
 | 
			
		||||
 | 
			
		||||
post_to_api_vm
 | 
			
		||||
msg_info "Validating Storage"
 | 
			
		||||
while read -r line; do
 | 
			
		||||
  TAG=$(echo $line | awk '{print $1}')
 | 
			
		||||
  TYPE=$(echo $line | awk '{printf "%-10s", $2}')
 | 
			
		||||
  FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}')
 | 
			
		||||
  ITEM="  Type: $TYPE Free: $FREE "
 | 
			
		||||
  OFFSET=2
 | 
			
		||||
  if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then
 | 
			
		||||
    MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET))
 | 
			
		||||
  fi
 | 
			
		||||
  STORAGE_MENU+=("$TAG" "$ITEM" "OFF")
 | 
			
		||||
done < <(pvesm status -content images | awk 'NR>1')
 | 
			
		||||
VALID=$(pvesm status -content images | awk 'NR>1')
 | 
			
		||||
if [ -z "$VALID" ]; then
 | 
			
		||||
STORAGE_MENU=()
 | 
			
		||||
while read -r tag type free; do
 | 
			
		||||
  ITEM="Type: $type Free: $free"
 | 
			
		||||
  STORAGE_MENU+=("$tag" "$ITEM" "OFF")
 | 
			
		||||
done < <(pvesm status -content images | awk 'NR>1 {printf "%s %s %s\n", $1, $2, $6}')
 | 
			
		||||
 | 
			
		||||
if [ ${#STORAGE_MENU[@]} -eq 0 ]; then
 | 
			
		||||
  msg_error "Unable to detect a valid storage location."
 | 
			
		||||
  exit
 | 
			
		||||
  exit 1
 | 
			
		||||
elif [ $((${#STORAGE_MENU[@]} / 3)) -eq 1 ]; then
 | 
			
		||||
  STORAGE=${STORAGE_MENU[0]}
 | 
			
		||||
else
 | 
			
		||||
  while [ -z "${STORAGE:+x}" ]; do
 | 
			
		||||
    STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \
 | 
			
		||||
      "Which storage pool would you like to use for ${HN}?\nTo make a selection, use the Spacebar.\n" \
 | 
			
		||||
      16 $(($MSG_MAX_LENGTH + 23)) 6 \
 | 
			
		||||
      16 70 6 \
 | 
			
		||||
      "${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3)
 | 
			
		||||
  done
 | 
			
		||||
fi
 | 
			
		||||
msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location."
 | 
			
		||||
msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}."
 | 
			
		||||
msg_info "Retrieving the URL for $APP"
 | 
			
		||||
URL="https://download.umbrel.com/release/latest/umbrelos-amd64.img.xz"
 | 
			
		||||
FILE="$(basename "$URL")"
 | 
			
		||||
sleep 2
 | 
			
		||||
msg_ok "${CL}${BL}${URL}${CL}"
 | 
			
		||||
curl -f#SL -o "$FILE" "$URL"
 | 
			
		||||
msg_ok "Downloaded ${CL}${BL}${FILE}${CL}"
 | 
			
		||||
 | 
			
		||||
if ! command -v pv &>/dev/null; then
 | 
			
		||||
  apt-get update &>/dev/null && apt-get install -y pv &>/dev/null
 | 
			
		||||
msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}."
 | 
			
		||||
 | 
			
		||||
URL="https://download.umbrel.com/release/latest/umbrelos-amd64.img.xz"
 | 
			
		||||
CACHE_DIR="/var/lib/vz/template/cache"
 | 
			
		||||
CACHE_FILE="$CACHE_DIR/$(basename "$URL")"
 | 
			
		||||
FILE_IMG="/var/lib/vz/template/tmp/${CACHE_FILE##*/%.xz}"
 | 
			
		||||
 | 
			
		||||
mkdir -p "$CACHE_DIR" "$(dirname "$FILE_IMG")"
 | 
			
		||||
 | 
			
		||||
if [[ ! -s "$CACHE_FILE" ]]; then
 | 
			
		||||
  msg_ok "Downloading Umbrel OS image"
 | 
			
		||||
  curl -f#SL -o "$CACHE_FILE" "$URL"
 | 
			
		||||
else
 | 
			
		||||
  msg_ok "Using cached Umbrel OS image"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
msg_info "Decompressing $FILE with progress${CL}\n"
 | 
			
		||||
FILE_IMG="${FILE%.xz}"
 | 
			
		||||
SIZE=$(xz --robot -l "$FILE" | awk -F '\t' '/^totals/ { print $5 }') &>/dev/null
 | 
			
		||||
xz -dc "$FILE" | pv -s "$SIZE" -N "Extracting" >"$FILE_IMG"
 | 
			
		||||
msg_ok "Decompressed to ${CL}${BL}${FILE%.xz}${CL}"
 | 
			
		||||
if ! command -v pv &>/dev/null; then
 | 
			
		||||
  apt-get update -qq &>/dev/null && apt-get install -y pv &>/dev/null
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}')
 | 
			
		||||
case $STORAGE_TYPE in
 | 
			
		||||
nfs | dir)
 | 
			
		||||
  DISK_EXT=".raw"
 | 
			
		||||
  DISK_REF="$VMID/"
 | 
			
		||||
  DISK_IMPORT="-format raw"
 | 
			
		||||
  THIN=""
 | 
			
		||||
  ;;
 | 
			
		||||
btrfs)
 | 
			
		||||
  DISK_EXT=".raw"
 | 
			
		||||
  DISK_REF="$VMID/"
 | 
			
		||||
  DISK_IMPORT="-format raw"
 | 
			
		||||
  FORMAT=",efitype=4m"
 | 
			
		||||
  THIN=""
 | 
			
		||||
  ;;
 | 
			
		||||
esac
 | 
			
		||||
for i in {0,1,2}; do
 | 
			
		||||
  disk="DISK$i"
 | 
			
		||||
  eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-}
 | 
			
		||||
  eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk}
 | 
			
		||||
done
 | 
			
		||||
set -o pipefail
 | 
			
		||||
qm create "$VMID" -machine q35 -bios ovmf -agent 1 -tablet 0 -localtime 1 ${CPU_TYPE} \
 | 
			
		||||
  -cores "$CORE_COUNT" -memory "$RAM_SIZE" -name "$HN" -tags community-script \
 | 
			
		||||
  -net0 "virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU" -onboot 1 -ostype l26 -scsihw virtio-scsi-pci >/dev/null
 | 
			
		||||
 | 
			
		||||
msg_info "Creating a Umbrel OS VM"
 | 
			
		||||
qm create $VMID -agent 1${MACHINE} -tablet 0 -localtime 1 -bios ovmf${CPU_TYPE} -cores $CORE_COUNT -memory $RAM_SIZE \
 | 
			
		||||
  -name $HN -tags community-script -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN$MTU -onboot 1 -ostype l26 -scsihw virtio-scsi-pci >/dev/null
 | 
			
		||||
pvesm alloc $STORAGE $VMID $DISK0 4M >/dev/null
 | 
			
		||||
qm importdisk $VMID ${FILE_IMG} $STORAGE ${DISK_IMPORT:-} >/dev/null
 | 
			
		||||
qm set $VMID \
 | 
			
		||||
  -efidisk0 ${DISK0_REF}${FORMAT} \
 | 
			
		||||
  -scsi0 ${DISK1_REF},${DISK_CACHE}${THIN}size=${DISK_SIZE} \
 | 
			
		||||
  -boot order=scsi0 \
 | 
			
		||||
  -serial0 socket >/dev/null
 | 
			
		||||
qm set $VMID --agent enabled=1 >/dev/null
 | 
			
		||||
xz -dc "$CACHE_FILE" | pv -N "Extracting" >"$FILE_IMG"
 | 
			
		||||
 | 
			
		||||
if qm disk import --help >/dev/null 2>&1; then
 | 
			
		||||
  IMPORT_CMD=(qm disk import)
 | 
			
		||||
else
 | 
			
		||||
  IMPORT_CMD=(qm importdisk)
 | 
			
		||||
fi
 | 
			
		||||
IMPORT_OUT="$("${IMPORT_CMD[@]}" "$VMID" "$FILE_IMG" "$STORAGE" --format raw 2>&1 || true)"
 | 
			
		||||
DISK_REF="$(printf '%s\n' "$IMPORT_OUT" | sed -n "s/.*imported disk '\([^']\+\)'.*/\1/p" | tr -d "\r\"'")"
 | 
			
		||||
[[ -z "$DISK_REF" ]] && DISK_REF="$(pvesm list "$STORAGE" | awk -v id="$VMID" '$5 ~ ("vm-"id"-disk-") {print $1":"$5}' | sort | tail -n1)"
 | 
			
		||||
 | 
			
		||||
qm set "$VMID" \
 | 
			
		||||
  --efidisk0 "${STORAGE}:0,efitype=4m" \
 | 
			
		||||
  --scsi0 "${DISK_REF},ssd=1,discard=on" \
 | 
			
		||||
  --boot order=scsi0 \
 | 
			
		||||
  --serial0 socket >/dev/null
 | 
			
		||||
qm set "$VMID" --agent enabled=1 >/dev/null
 | 
			
		||||
qm resize "$VMID" scsi0 "${DISK_SIZE}" >/dev/null
 | 
			
		||||
 | 
			
		||||
DESCRIPTION=$(
 | 
			
		||||
  cat <<EOF
 | 
			
		||||
@@ -546,13 +532,14 @@ EOF
 | 
			
		||||
)
 | 
			
		||||
qm set "$VMID" -description "$DESCRIPTION" >/dev/null
 | 
			
		||||
 | 
			
		||||
if [ -n "$DISK_SIZE" ]; then
 | 
			
		||||
  msg_info "Resizing disk to $DISK_SIZE GB"
 | 
			
		||||
  qm resize $VMID scsi0 ${DISK_SIZE} >/dev/null
 | 
			
		||||
if whiptail --backtitle "Proxmox VE Helper Scripts" --title "Image Cache" \
 | 
			
		||||
  --yesno "Keep downloaded Umbrel OS image for future VMs?\n\nFile: $CACHE_FILE" 10 70; then
 | 
			
		||||
  msg_ok "Keeping cached image"
 | 
			
		||||
else
 | 
			
		||||
  msg_info "Using default disk size of $DEFAULT_DISK_SIZE GB"
 | 
			
		||||
  qm resize $VMID scsi0 ${DEFAULT_DISK_SIZE} >/dev/null
 | 
			
		||||
  rm -f "$CACHE_FILE"
 | 
			
		||||
  msg_ok "Deleted cached image"
 | 
			
		||||
fi
 | 
			
		||||
rm -f "$FILE_IMG"
 | 
			
		||||
 | 
			
		||||
msg_ok "Created a Umbrel OS VM ${CL}${BL}(${HN})"
 | 
			
		||||
if [ "$START_VM" == "yes" ]; then
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user