Compare commits

..

154 Commits

Author SHA1 Message Date
Bram Suurd
d5f8d0af2c Updated tailwindcss to 4 2025-10-06 19:17:12 +02:00
Bram Suurd
4b9809dd70 Remove unused dependencies from package.json and package-lock.json, including jsdom and related packages, to streamline the project. 2025-10-06 19:12:57 +02:00
community-scripts-pr-app[bot]
a475eff11e Update CHANGELOG.md (#8149)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 13:01:13 +00:00
Slaviša Arežina
7245af7208 Update glpi-install.sh (#8148) 2025-10-06 15:00:50 +02:00
community-scripts-pr-app[bot]
c3a75d8a5d Update versions.json (#8147)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 14:07:40 +02:00
community-scripts-pr-app[bot]
3b81c36e75 Update CHANGELOG.md (#8146)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 11:47:41 +00:00
community-scripts-pr-app[bot]
588cebad26 Update CHANGELOG.md (#8145)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 11:47:34 +00:00
community-scripts-pr-app[bot]
830b2d9e37 Update CHANGELOG.md (#8144)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 11:47:18 +00:00
CanbiZ
2092c5bdce Node-Red: bump to Debian 13 (#8141) 2025-10-06 13:47:14 +02:00
CanbiZ
e87dc5dbbc NocoDB: bump to Debian 13 (#8140) 2025-10-06 13:46:57 +02:00
community-scripts-pr-app[bot]
479ce977e6 Update CHANGELOG.md (#8143)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 11:08:26 +00:00
CanbiZ
a2057d4302 Navidrome: Bump to Debian 13 (#8139) 2025-10-06 13:08:02 +02:00
community-scripts-pr-app[bot]
bbe509c334 Update CHANGELOG.md (#8142)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 10:41:32 +00:00
CanbiZ
563a69e68b pve-scripts-local: add update function (#8138) 2025-10-06 12:41:06 +02:00
community-scripts-pr-app[bot]
7ab2bcbb40 Update CHANGELOG.md (#8132)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 00:13:31 +00:00
community-scripts-pr-app[bot]
57031bdaad Update versions.json (#8131)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-06 02:13:10 +02:00
community-scripts-pr-app[bot]
833a369f61 Update CHANGELOG.md (#8130)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-05 22:12:08 +00:00
CanbiZ
8f8eb7aba5 ActualBudget: bump to debian 13 (#8124) 2025-10-06 00:11:49 +02:00
community-scripts-pr-app[bot]
942ff02d37 Update CHANGELOG.md (#8129)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-05 20:30:06 +00:00
CanbiZ
3e1753b3c7 2fauth: bump to debian 13 (#8123) 2025-10-05 22:29:43 +02:00
community-scripts-pr-app[bot]
6863c774fa Update CHANGELOG.md (#8128)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-05 20:28:49 +00:00
CanbiZ
965b8cb33e adventurelog: bump to debian 13 (#8125) 2025-10-05 22:28:23 +02:00
community-scripts-pr-app[bot]
0768456b2c Update CHANGELOG.md (#8121)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-05 15:41:02 +00:00
Gerhard Burger
9f531ef4a7 Update cockpit to Debian 13 (#8119) 2025-10-05 17:40:42 +02:00
community-scripts-pr-app[bot]
6491ec3f09 Update versions.json (#8120)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-05 14:04:25 +02:00
community-scripts-pr-app[bot]
9b5fa050c7 Update CHANGELOG.md (#8117)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-05 00:14:36 +00:00
community-scripts-pr-app[bot]
efb8e0f2f3 Update versions.json (#8116)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-05 02:14:14 +02:00
Tobias
07eda340ea fix: pve-scripts-local: typo (#8113) 2025-10-04 22:29:30 +02:00
community-scripts-pr-app[bot]
1a37c759c3 Update CHANGELOG.md (#8111)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-04 16:45:25 +00:00
Slaviša Arežina
e39dd5ffa3 PosgreSQL: Add version choice (#8103)
* Add version choice

* Update

* Update
2025-10-04 18:45:02 +02:00
community-scripts-pr-app[bot]
aded2cbd56 Update CHANGELOG.md (#8110)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-04 16:44:23 +00:00
mlongwell
2c791b9e41 immich: guard /dev/dri permissions so CPU-only installs don’t fail (#8094) 2025-10-04 18:44:00 +02:00
community-scripts-pr-app[bot]
d1786241ec Update versions.json (#8105)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-04 14:04:45 +02:00
community-scripts-pr-app[bot]
73cf6c66e3 Update CHANGELOG.md (#8099)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-04 00:12:21 +00:00
community-scripts-pr-app[bot]
efc9153926 Update versions.json (#8098)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-04 02:11:54 +02:00
community-scripts-pr-app[bot]
1f4b446788 Update CHANGELOG.md (#8093)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-03 19:40:20 +00:00
Slaviša Arežina
aeafbb1047 Update glpi-install.sh (#8092) 2025-10-03 21:39:59 +02:00
community-scripts-pr-app[bot]
938609d5eb Update CHANGELOG.md (#8091)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-03 18:55:21 +00:00
Chris
ae6ca4de23 Immich: bump version to 2.0.1 (#8090) 2025-10-03 20:54:58 +02:00
community-scripts-pr-app[bot]
dfdf8c0ddb Update CHANGELOG.md (#8089)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-03 17:23:52 +00:00
Bram Suurd
4136f5e7e3 Adjust navbar layout for large screen (#8087) 2025-10-03 19:23:26 +02:00
community-scripts-pr-app[bot]
51302d516e Update CHANGELOG.md (#8088)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-03 14:54:19 +00:00
Slaviša Arežina
ab995bd493 Increase resources (#8086) 2025-10-03 16:53:55 +02:00
community-scripts-pr-app[bot]
ac12051057 Update CHANGELOG.md (#8084)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-03 13:30:12 +00:00
push-app-to-main[bot]
c3cca616a4 pve-scripts-local (#8083)
* 'Add new script'

* Add rsync to installation dependencies

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: Michel Roegl-Brunner <73236783+michelroegl-brunner@users.noreply.github.com>
2025-10-03 15:29:46 +02:00
community-scripts-pr-app[bot]
b1bca924b9 Update versions.json (#8079)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-03 14:05:25 +02:00
community-scripts-pr-app[bot]
1909e35e62 Update CHANGELOG.md (#8075)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-03 11:10:11 +00:00
Slaviša Arežina
237349ef47 Fix glpi (#8074) 2025-10-03 13:09:41 +02:00
community-scripts-pr-app[bot]
e4cf50dfcd Update .app files (#8073)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-10-03 09:39:17 +00:00
Michel Roegl-Brunner
0c30d8e3e7 Remove Petio Script (#8071)
* Delete install/petio-install.sh

* Delete ct/petio.sh

* Delete frontend/public/json/petio.json
2025-10-03 11:38:32 +02:00
community-scripts-pr-app[bot]
92999b4db3 Update CHANGELOG.md (#8072)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-03 09:38:13 +00:00
Michel Roegl-Brunner
4a02986de1 Fix legacy count increment syntax in post-pve-install.sh (#8070) 2025-10-03 11:37:48 +02:00
community-scripts-pr-app[bot]
d06299685f Update CHANGELOG.md (#8069)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-03 08:36:58 +00:00
rcourtman
71f71fbca9 fix: ensure /etc/pulse exists before chown in update script (#8068)
* fix: ensure /etc/pulse exists before chown in update script

- Add mkdir -p /etc/pulse to create directory if missing
- Use non-recursive chown on /etc/pulse to preserve file permissions
- Keep recursive chown on /opt/pulse for binary ownership
- Add chmod 700 for security on config directory

Fixes #8064

* remove comments
2025-10-03 10:36:33 +02:00
community-scripts-pr-app[bot]
938fb6dc58 Update CHANGELOG.md (#8067)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-03 07:30:44 +00:00
CanbiZ
03d36a6c10 grist: remove unneeded var (#8060) 2025-10-03 09:30:18 +02:00
community-scripts-pr-app[bot]
8e25b70a25 Update CHANGELOG.md (#8062)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-03 00:12:10 +00:00
community-scripts-pr-app[bot]
1840cce15f Update versions.json (#8061)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-03 02:11:42 +02:00
community-scripts-pr-app[bot]
1d0ac4ca10 Update versions.json (#8055)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-02 14:05:34 +02:00
CanbiZ
deb85bd264 rm v in Version check 2025-10-02 13:18:59 +02:00
community-scripts-pr-app[bot]
348f8863a8 Update CHANGELOG.md (#8054)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-02 10:33:30 +00:00
CanbiZ
74b332b7ec EMQX: removal logic in emqx update (#8050)
Added conditional checks to remove either emqx or emqx-enterprise packages.
2025-10-02 12:33:08 +02:00
community-scripts-pr-app[bot]
2fe3ee667b Update CHANGELOG.md (#8053)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-02 10:32:45 +00:00
CanbiZ
48e3b66342 fix FlareSolverr version check to v3.3.25 (#8051) 2025-10-02 12:32:24 +02:00
community-scripts-pr-app[bot]
e93dccb0d5 Update CHANGELOG.md (#8045)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-02 00:13:27 +00:00
community-scripts-pr-app[bot]
168e7b7c2b Update versions.json (#8044)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-02 02:13:06 +02:00
community-scripts-pr-app[bot]
3f54d0d7f4 Update .app files (#8043)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-10-02 00:30:17 +02:00
community-scripts-pr-app[bot]
9477677385 Update CHANGELOG.md (#8042)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-01 22:29:30 +00:00
CanbiZ
e58d1dc3d2 Add conditional logic for EFI disk allocation (#8024) 2025-10-02 00:29:12 +02:00
Chris
2a765f58f0 Immich: bump version to 2.0.0 stable (#8041) 2025-10-02 00:28:51 +02:00
community-scripts-pr-app[bot]
8dfb632a4d Update CHANGELOG.md (#8036)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-01 15:07:56 +00:00
CanbiZ
42ae2a4cdc New Script: PhpMyAdmin (Addon) (#8030) 2025-10-01 17:07:28 +02:00
community-scripts-pr-app[bot]
36e41aca22 Update versions.json (#8031)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-01 14:07:20 +02:00
community-scripts-pr-app[bot]
6b1141f9de Update CHANGELOG.md (#8027)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-01 08:40:17 +00:00
community-scripts-pr-app[bot]
97f891d53b Update CHANGELOG.md (#8026)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-01 08:40:07 +00:00
Slaviša Arežina
0c63e64662 Pin version (#8023) 2025-10-01 10:39:55 +02:00
community-scripts-pr-app[bot]
d83a378af4 Update CHANGELOG.md (#8025)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-01 08:39:46 +00:00
Chris
6820bdcade Immich: bump version to 1.144.1 (#7994)
- small change during update to ensure the immich user can write to
uv.lock while building machine-learning
2025-10-01 10:39:20 +02:00
community-scripts-pr-app[bot]
8ff82d0c3c Update CHANGELOG.md (#8020)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-01 00:14:35 +00:00
community-scripts-pr-app[bot]
9e39c6cd2b Update versions.json (#8019)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-10-01 02:14:11 +02:00
community-scripts-pr-app[bot]
0bea24888e Update CHANGELOG.md (#8018)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-30 19:17:27 +00:00
CanbiZ
70d2be62e9 caddy: fix typo for setup_go (#8017) 2025-09-30 21:17:02 +02:00
community-scripts-pr-app[bot]
fe30e06a48 Update CHANGELOG.md (#8015)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-30 15:19:58 +00:00
community-scripts-pr-app[bot]
193a2ea2df Update CHANGELOG.md (#8014)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-30 15:19:46 +00:00
community-scripts-pr-app[bot]
ffbe0feee1 Update CHANGELOG.md (#8013)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-30 15:19:31 +00:00
Gerhard Burger
107865b06d Bump Guacamole to Debian 13 (#8010) 2025-09-30 17:19:22 +02:00
Hristo Stoyanov
0d33b38e29 Changedetection: Fix Browserless installation and update process (#8011)
* Fix the issue with changedetection.io install:
> @browserless.io/browserless@2.37.0 build:ts
> tsc

sh: 1: tsc: not found

[ERROR] in line 70: exit code 0: while executing command $STD npm run build --prefix /opt/browserless

* Just to verify the installation works

* Just to verify the installation works

* Try to fix typescript issues

* Try to fix TypeScript issues and update NodeJS

* Try to fix TypeScript issues

* Add more missing npm dependencies

* Cleanup test changes

* Revert testing changes and change the way dependencies are installed

* Revert testing changes and change the way dependencies are installed

* Revert manually added TypeScript and esbuild packages and tried to install them from the optional requirements

* Try the clean install

* Fix the update script and revert testing changes

* Added testing files again

* Revert testing repos again
2025-09-30 17:19:01 +02:00
CanbiZ
11ae7450c7 Add TypeScript and related packages installation 2025-09-30 16:07:34 +02:00
CanbiZ
598bfd291f Update npm install command to include dev dependencies 2025-09-30 14:26:13 +02:00
community-scripts-pr-app[bot]
1a38df4c12 Update CHANGELOG.md (#8007)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-30 12:17:18 +00:00
Slaviša Arežina
cfc85c1b79 Update n8n.sh (#8004) 2025-09-30 14:17:00 +02:00
community-scripts-pr-app[bot]
e7d41fecdc Update CHANGELOG.md (#8006)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-30 12:16:56 +00:00
CanbiZ
34ef80ac87 Changedetection: Bump nodejs to 24 (#8002) 2025-09-30 14:16:27 +02:00
community-scripts-pr-app[bot]
b18d45631f Update versions.json (#8005)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-30 14:06:34 +02:00
community-scripts-pr-app[bot]
efe1e1edb5 Update CHANGELOG.md (#7997)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-30 00:13:04 +00:00
community-scripts-pr-app[bot]
4567505c55 Update versions.json (#7996)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-30 02:12:43 +02:00
community-scripts-pr-app[bot]
42c87ba0d4 Update CHANGELOG.md (#7993)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-29 19:56:37 +00:00
Bram Suurd
b52c252553 fix sidebar loading issues and navbar on mobile (#7991)
* Refactor MobileSidebar to manage script and category selection based on current pathname. Introduced temporary state for non-scripts pages and updated logic for last viewed script handling. Improved accessibility by ensuring proper aria attributes and class management.

* Update API endpoint paths in data.ts to include ProxmoxVE prefix for category and version fetching functions.

* Refactor Navbar component layout for improved structure and responsiveness. Adjusted flex properties to ensure proper alignment of elements, enhancing the mobile and desktop user experience. Updated accessibility features and ensured consistent use of TailwindCSS classes.
2025-09-29 21:56:07 +02:00
community-scripts-pr-app[bot]
be5ac7153e Update CHANGELOG.md (#7989)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-29 16:17:00 +00:00
Bram Suurd
07f2849722 Improve mobile ui: added a hamburger navigation to the mobile view. (#7987)
* Update GitHubStarsButton component to be hidden on smaller screens

* feat: added a mobile navigation to the front-end.

* refactor: replace useQueryState with useSuspenseQueryState in ScriptContent and MobileSidebar components; add use-suspense-query-state hook

* Revert "refactor: replace useQueryState with useSuspenseQueryState in ScriptContent and MobileSidebar components; add use-suspense-query-state hook"

This reverts commit bfad01fc91.

* refactor: wrap MobileSidebar component in Suspense for improved loading handling

* Update mobile-sidebar.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-29 18:16:36 +02:00
community-scripts-pr-app[bot]
760299283a Update CHANGELOG.md (#7986)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-29 13:54:08 +00:00
community-scripts-pr-app[bot]
0bd2dd7a65 Update CHANGELOG.md (#7985)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-29 13:53:43 +00:00
community-scripts-pr-app[bot]
6591c30e66 Update date in json (#7984)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-09-29 13:53:39 +00:00
push-app-to-main[bot]
780e5c114c Ghostfolio (#7982)
* 'Add new script'

* Update frontend/public/json/ghostfolio.json

Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>

* Apply suggestion from @tremor021

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com>
Co-authored-by: Slaviša Arežina <58952836+tremor021@users.noreply.github.com>
2025-09-29 15:53:15 +02:00
community-scripts-pr-app[bot]
ba10ec721b Update .app files (#7981)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-09-29 14:29:49 +02:00
community-scripts-pr-app[bot]
f66dc834bd Update CHANGELOG.md (#7980)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-29 12:27:23 +00:00
community-scripts-pr-app[bot]
be36fc6a94 Update date in json (#7979)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-09-29 12:27:03 +00:00
push-app-to-main[bot]
65ada6e6f3 Warracker (#7977)
* 'Add new script'

* Correct application name casing in warracker.sh

---------

Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com>
2025-09-29 14:26:41 +02:00
community-scripts-pr-app[bot]
853eb40bba Update date in json (#7975)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-09-29 14:22:57 +02:00
community-scripts-pr-app[bot]
ace6265895 Update versions.json (#7978)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-29 14:05:52 +02:00
community-scripts-pr-app[bot]
639d4f2d53 Update CHANGELOG.md (#7976)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-29 11:49:12 +00:00
push-app-to-main[bot]
d7e77e232c 'Add new script' (#7974)
Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
2025-09-29 13:48:51 +02:00
community-scripts-pr-app[bot]
b850d3f79e Update CHANGELOG.md (#7973)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-29 10:38:15 +00:00
CanbiZ
72e5ac5c80 Remove Frigate from Website (#7972) 2025-09-29 12:37:47 +02:00
community-scripts-pr-app[bot]
587579b3a1 Update CHANGELOG.md (#7970)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-29 07:15:31 +00:00
community-scripts-pr-app[bot]
9b4e996d93 Update CHANGELOG.md (#7969)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-29 07:15:08 +00:00
community-scripts-pr-app[bot]
e6f317ede9 Update date in json (#7968)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-09-29 07:15:02 +00:00
push-app-to-main[bot]
3e4420e357 'Add new script' (#7967)
Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
2025-09-29 09:14:43 +02:00
community-scripts-pr-app[bot]
38f7e81d8b Update CHANGELOG.md (#7966)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-29 00:12:38 +00:00
community-scripts-pr-app[bot]
8f5d50a9fa Update versions.json (#7965)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-29 02:12:18 +02:00
community-scripts-pr-app[bot]
32048cff2d Update CHANGELOG.md (#7963)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-28 18:33:06 +00:00
Chris
5775f7cf33 Metube: remove uv flags (#7962) 2025-09-28 20:32:43 +02:00
community-scripts-pr-app[bot]
4d7c004810 Update CHANGELOG.md (#7960)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-28 14:22:51 +00:00
Tobias
d74131fe6f freshrss: fix for broken permissions after update (#7953)
Added permission check and fix for sensitive-log.sh.
2025-09-28 16:22:28 +02:00
community-scripts-pr-app[bot]
87b30f67fa Update versions.json (#7958)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-28 14:05:52 +02:00
community-scripts-pr-app[bot]
7ddc50bfe7 Update CHANGELOG.md (#7951)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-28 00:15:09 +00:00
community-scripts-pr-app[bot]
484a46beb1 Update versions.json (#7950)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-28 02:14:45 +02:00
community-scripts-pr-app[bot]
b85d1e5062 Update CHANGELOG.md (#7948)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-27 21:12:00 +00:00
Slaviša Arežina
05e41f67e1 Update goaway-install.sh (#7946) 2025-09-27 23:11:38 +02:00
community-scripts-pr-app[bot]
bfe6445c64 Update CHANGELOG.md (#7947)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-27 20:36:34 +00:00
Chris
ffde3a731c MeTube: Various fixes (#7936) 2025-09-27 22:36:14 +02:00
community-scripts-pr-app[bot]
d5b9da8f5f Update CHANGELOG.md (#7943)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-27 18:14:55 +00:00
Slaviša Arežina
1b8d790a14 Update odoo.sh (#7941) 2025-09-27 20:14:34 +02:00
community-scripts-pr-app[bot]
175b925ae4 Update versions.json (#7939)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-27 14:04:31 +02:00
community-scripts-pr-app[bot]
38a8773d2f Update CHANGELOG.md (#7934)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-27 00:13:08 +00:00
community-scripts-pr-app[bot]
e7dafcbf3e Update versions.json (#7933)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-27 02:12:41 +02:00
community-scripts-pr-app[bot]
380fb1cfb7 Update CHANGELOG.md (#7932)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-26 20:59:46 +00:00
Slaviša Arežina
10cd6c3f0b Odoo: Fix missing dependencies (#7931)
* Fix odoo

* Update
2025-09-26 22:59:21 +02:00
community-scripts-pr-app[bot]
710bd7f4e7 Update CHANGELOG.md (#7930)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-26 19:37:04 +00:00
Slaviša Arežina
4d72852e53 Clarify descriptions of update scripts (#7929) 2025-09-26 21:36:43 +02:00
community-scripts-pr-app[bot]
9ad538c2d2 Update CHANGELOG.md (#7926)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-26 16:42:24 +00:00
Michel Roegl-Brunner
ee3872e7e1 OpenWebUI: Update NODE_OPTIONS to increase memory limit (#7919) 2025-09-26 18:41:58 +02:00
community-scripts-pr-app[bot]
f6ca81833e Update versions.json (#7916)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-26 14:05:29 +02:00
community-scripts-pr-app[bot]
c41b18f083 Update CHANGELOG.md (#7909)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-26 00:13:48 +00:00
community-scripts-pr-app[bot]
f983f75b30 Update versions.json (#7908)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-26 02:13:21 +02:00
community-scripts-pr-app[bot]
137dd647dd Update CHANGELOG.md (#7903)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-25 13:03:41 +00:00
community-scripts-pr-app[bot]
2f5c608f45 Update CHANGELOG.md (#7902)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-25 13:03:20 +00:00
community-scripts-pr-app[bot]
b8e06c05d0 Update date in json (#7901)
Co-authored-by: GitHub Actions <github-actions[bot]@users.noreply.github.com>
2025-09-25 13:03:15 +00:00
push-app-to-main[bot]
2beb89055c 'Add new script' (#7900)
Co-authored-by: push-app-to-main[bot] <203845782+push-app-to-main[bot]@users.noreply.github.com>
2025-09-25 15:02:52 +02:00
community-scripts-pr-app[bot]
308897fdc7 Update versions.json (#7898)
Co-authored-by: GitHub Actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-25 14:07:08 +02:00
community-scripts-pr-app[bot]
5b73367c80 Update CHANGELOG.md (#7897)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-25 09:07:03 +00:00
Tobias
5c0eefa652 ntfy: bump to debian 13 (#7895)
Co-authored-by: CanbiZ <47820557+MickLesk@users.noreply.github.com>
2025-09-25 11:06:39 +02:00
community-scripts-pr-app[bot]
7c5c654dbe Update CHANGELOG.md (#7896)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-09-25 08:49:43 +00:00
Bram Suurd
984eeedf31 Enhance category metadata in JSON and update script accordion to display icons. Added 'icon' property to categories in metadata.json and modified script-accordion component to render corresponding icons for each category. (#7894) 2025-09-25 10:49:12 +02:00
131 changed files with 3867 additions and 2716 deletions

View File

@@ -10,8 +10,189 @@
> [!CAUTION]
Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit the project's popularity for potentially malicious purposes.
## 2025-10-06
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- GLPI: Revert fix for v11 [@tremor021](https://github.com/tremor021) ([#8148](https://github.com/community-scripts/ProxmoxVE/pull/8148))
- #### ✨ New Features
- Node-Red: bump to Debian 13 [@MickLesk](https://github.com/MickLesk) ([#8141](https://github.com/community-scripts/ProxmoxVE/pull/8141))
- NocoDB: bump to Debian 13 [@MickLesk](https://github.com/MickLesk) ([#8140](https://github.com/community-scripts/ProxmoxVE/pull/8140))
- Navidrome: bump to Debian 13 [@MickLesk](https://github.com/MickLesk) ([#8139](https://github.com/community-scripts/ProxmoxVE/pull/8139))
- pve-scripts-local: add update function [@MickLesk](https://github.com/MickLesk) ([#8138](https://github.com/community-scripts/ProxmoxVE/pull/8138))
## 2025-10-05
### 🚀 Updated Scripts
- #### ✨ New Features
- ActualBudget: bump to debian 13 [@MickLesk](https://github.com/MickLesk) ([#8124](https://github.com/community-scripts/ProxmoxVE/pull/8124))
- 2fauth: bump to debian 13 [@MickLesk](https://github.com/MickLesk) ([#8123](https://github.com/community-scripts/ProxmoxVE/pull/8123))
- AdventureLog: bump to debian 13 [@MickLesk](https://github.com/MickLesk) ([#8125](https://github.com/community-scripts/ProxmoxVE/pull/8125))
- Update cockpit to Debian 13 [@burgerga](https://github.com/burgerga) ([#8119](https://github.com/community-scripts/ProxmoxVE/pull/8119))
## 2025-10-04
### 🚀 Updated Scripts
- immich: guard /dev/dri permissions so CPU-only installs dont fail [@mlongwell](https://github.com/mlongwell) ([#8094](https://github.com/community-scripts/ProxmoxVE/pull/8094))
- #### ✨ New Features
- PosgreSQL: Add version choice [@tremor021](https://github.com/tremor021) ([#8103](https://github.com/community-scripts/ProxmoxVE/pull/8103))
## 2025-10-03
### 🆕 New Scripts
- pve-scripts-local ([#8083](https://github.com/community-scripts/ProxmoxVE/pull/8083))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- GLPI: Pin version to v10.0.20 [@tremor021](https://github.com/tremor021) ([#8092](https://github.com/community-scripts/ProxmoxVE/pull/8092))
- GLPI: Fix database setup [@tremor021](https://github.com/tremor021) ([#8074](https://github.com/community-scripts/ProxmoxVE/pull/8074))
- Overseerr: Increase resources [@tremor021](https://github.com/tremor021) ([#8086](https://github.com/community-scripts/ProxmoxVE/pull/8086))
- FIX: post-pve-install.sh just quitting [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#8070](https://github.com/community-scripts/ProxmoxVE/pull/8070))
- fix: ensure /etc/pulse exists before chown in update script [@rcourtman](https://github.com/rcourtman) ([#8068](https://github.com/community-scripts/ProxmoxVE/pull/8068))
- grist: remove unneeded var [@MickLesk](https://github.com/MickLesk) ([#8060](https://github.com/community-scripts/ProxmoxVE/pull/8060))
- #### 🔧 Refactor
- Immich: bump version to 2.0.1 [@vhsdream](https://github.com/vhsdream) ([#8090](https://github.com/community-scripts/ProxmoxVE/pull/8090))
### 🌐 Website
- #### 🐞 Bug Fixes
- Adjust navbar layout for large screen [@BramSuurdje](https://github.com/BramSuurdje) ([#8087](https://github.com/community-scripts/ProxmoxVE/pull/8087))
## 2025-10-02
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- EMQX: removal logic in emqx update [@MickLesk](https://github.com/MickLesk) ([#8050](https://github.com/community-scripts/ProxmoxVE/pull/8050))
- fix FlareSolverr version check to v3.3.25 [@MickLesk](https://github.com/MickLesk) ([#8051](https://github.com/community-scripts/ProxmoxVE/pull/8051))
## 2025-10-01
### 🆕 New Scripts
- New Script: PhpMyAdmin (Addon) [@MickLesk](https://github.com/MickLesk) ([#8030](https://github.com/community-scripts/ProxmoxVE/pull/8030))
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- openwrt: Add conditional logic for EFI disk allocation [@MickLesk](https://github.com/MickLesk) ([#8024](https://github.com/community-scripts/ProxmoxVE/pull/8024))
- Plant-IT: Pin version to v0.10.0 [@tremor021](https://github.com/tremor021) ([#8023](https://github.com/community-scripts/ProxmoxVE/pull/8023))
- #### ✨ New Features
- Immich: bump version to 2.0.0 stable [@vhsdream](https://github.com/vhsdream) ([#8041](https://github.com/community-scripts/ProxmoxVE/pull/8041))
- #### 🔧 Refactor
- Immich: bump version to 1.144.1 [@vhsdream](https://github.com/vhsdream) ([#7994](https://github.com/community-scripts/ProxmoxVE/pull/7994))
## 2025-09-30
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- caddy: fix typo for setup_go [@MickLesk](https://github.com/MickLesk) ([#8017](https://github.com/community-scripts/ProxmoxVE/pull/8017))
- Changedetection: Fix Browserless installation and update process [@h-stoyanov](https://github.com/h-stoyanov) ([#8011](https://github.com/community-scripts/ProxmoxVE/pull/8011))
- n8n: Update procedure workaround [@tremor021](https://github.com/tremor021) ([#8004](https://github.com/community-scripts/ProxmoxVE/pull/8004))
- Changedetection: Bump nodejs to 24 [@MickLesk](https://github.com/MickLesk) ([#8002](https://github.com/community-scripts/ProxmoxVE/pull/8002))
- #### ✨ New Features
- Bump Guacamole to Debian 13 [@burgerga](https://github.com/burgerga) ([#8010](https://github.com/community-scripts/ProxmoxVE/pull/8010))
## 2025-09-29
### 🆕 New Scripts
- Ghostfolio ([#7982](https://github.com/community-scripts/ProxmoxVE/pull/7982))
- Warracker ([#7977](https://github.com/community-scripts/ProxmoxVE/pull/7977))
- MyIP ([#7974](https://github.com/community-scripts/ProxmoxVE/pull/7974))
- Verdaccio ([#7967](https://github.com/community-scripts/ProxmoxVE/pull/7967))
### 🌐 Website
- #### 🐞 Bug Fixes
- fix sidebar loading issues and navbar on mobile [@BramSuurdje](https://github.com/BramSuurdje) ([#7991](https://github.com/community-scripts/ProxmoxVE/pull/7991))
- #### ✨ New Features
- Improve mobile ui: added a hamburger navigation to the mobile view. [@BramSuurdje](https://github.com/BramSuurdje) ([#7987](https://github.com/community-scripts/ProxmoxVE/pull/7987))
- #### 📝 Script Information
- Remove Frigate from Website [@MickLesk](https://github.com/MickLesk) ([#7972](https://github.com/community-scripts/ProxmoxVE/pull/7972))
## 2025-09-28
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Metube: remove uv flags [@vhsdream](https://github.com/vhsdream) ([#7962](https://github.com/community-scripts/ProxmoxVE/pull/7962))
- freshrss: fix for broken permissions after update [@CrazyWolf13](https://github.com/CrazyWolf13) ([#7953](https://github.com/community-scripts/ProxmoxVE/pull/7953))
## 2025-09-27
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- GoAway: Make admin password aquisition more reliable [@tremor021](https://github.com/tremor021) ([#7946](https://github.com/community-scripts/ProxmoxVE/pull/7946))
- MeTube: Various fixes [@vhsdream](https://github.com/vhsdream) ([#7936](https://github.com/community-scripts/ProxmoxVE/pull/7936))
- Oddo: Fix typo in update procedure [@tremor021](https://github.com/tremor021) ([#7941](https://github.com/community-scripts/ProxmoxVE/pull/7941))
## 2025-09-26
### 🚀 Updated Scripts
- #### 🐞 Bug Fixes
- Odoo: Fix missing dependencies [@tremor021](https://github.com/tremor021) ([#7931](https://github.com/community-scripts/ProxmoxVE/pull/7931))
- OpenWebUI: Update NODE_OPTIONS to increase memory limit [@michelroegl-brunner](https://github.com/michelroegl-brunner) ([#7919](https://github.com/community-scripts/ProxmoxVE/pull/7919))
### 🌐 Website
- #### 📝 Script Information
- Clarify descriptions of update scripts [@tremor021](https://github.com/tremor021) ([#7929](https://github.com/community-scripts/ProxmoxVE/pull/7929))
## 2025-09-25
### 🆕 New Scripts
- GoAway ([#7900](https://github.com/community-scripts/ProxmoxVE/pull/7900))
### 🚀 Updated Scripts
- #### ✨ New Features
- ntfy: bump to debian 13 [@CrazyWolf13](https://github.com/CrazyWolf13) ([#7895](https://github.com/community-scripts/ProxmoxVE/pull/7895))
### 🌐 Website
- #### ✨ New Features
- feat: add menu icons to website [@BramSuurdje](https://github.com/BramSuurdje) ([#7894](https://github.com/community-scripts/ProxmoxVE/pull/7894))
## 2025-09-24
### 🆕 New Scripts

View File

@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -29,8 +29,8 @@ function update_script() {
exit
fi
if check_for_gh_release "2fauth" "Bubka/2FAuth"; then
$STD apt-get update
$STD apt-get -y upgrade
$STD apt update
$STD apt -y upgrade
msg_info "Creating Backup"
mv "/opt/2fauth" "/opt/2fauth-backup"
@@ -60,10 +60,11 @@ function update_script() {
msg_info "Cleaning Up"
if dpkg -l | grep -q 'php8.2'; then
$STD apt-get remove --purge -y php8.2*
$STD apt remove --purge -y php8.2*
fi
$STD apt-get -y autoremove
$STD apt-get -y autoclean
$STD apt -y autoremove
$STD apt -y autoclean
$STD apt -y clean
msg_ok "Cleanup Completed"
msg_ok "Updated Successfully"
fi

View File

@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -28,8 +28,7 @@ function update_script() {
msg_error "No ${APP} Installation Found!"
exit
fi
NODE_VERSION="22"
setup_nodejs
NODE_VERSION="22" setup_nodejs
RELEASE=$(curl -fsSL https://api.github.com/repos/actualbudget/actual/releases/latest | grep "tag_name" | awk '{print substr($2, 3, length($2)-4) }')
if [[ -f /opt/actualbudget-data/config.json ]]; then
if [[ ! -f /opt/actualbudget_version.txt ]] || [[ "${RELEASE}" != "$(cat /opt/actualbudget_version.txt)" ]]; then

View File

@@ -11,7 +11,7 @@ var_disk="${var_disk:-7}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -28,8 +28,8 @@ function update_script() {
exit
fi
if ! command -v memcached >/dev/null 2>&1; then
$STD apt-get update
$STD apt-get install -y memcached libmemcached-tools
$STD apt update
$STD apt install -y memcached libmemcached-tools
fi
if check_for_gh_release "adventurelog" "seanmorley15/adventurelog"; then
msg_info "Stopping Services"
@@ -43,12 +43,12 @@ function update_script() {
msg_ok "Backup done"
fetch_and_deploy_gh_release "adventurelog" "seanmorley15/adventurelog"
PYTHON_VERSION="3.12" setup_uv
PYTHON_VERSION="3.13" setup_uv
msg_info "Updating ${APP}"
cp /opt/adventurelog-backup/backend/server/.env /opt/adventurelog/backend/server/.env
cp -r /opt/adventurelog-backup/backend/server/media /opt/adventurelog/backend/server/media
cd /opt/adventurelog/backend/server
cd /opt/adventurelog/backend/server || exit
if [[ ! -x .venv/bin/python ]]; then
$STD uv venv .venv
$STD .venv/bin/python -m ensurepip --upgrade
@@ -59,7 +59,7 @@ function update_script() {
$STD .venv/bin/python -m manage migrate
cp /opt/adventurelog-backup/frontend/.env /opt/adventurelog/frontend/.env
cd /opt/adventurelog/frontend
cd /opt/adventurelog/frontend || exit
$STD pnpm i
$STD pnpm build
msg_ok "Updated ${APP}"

View File

@@ -11,7 +11,7 @@ var_disk="${var_disk:-4}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-2048}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -38,4 +38,4 @@ description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/guacamole${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080/guacamole${CL}"

View File

@@ -33,7 +33,7 @@ function update_script() {
msg_ok "Updated $APP LXC"
if command -v xcaddy >/dev/null 2>&1; then
install_go
setup_go
msg_info "Updating xCaddy"
cd /opt
RELEASE=$(curl -fsSL https://api.github.com/repos/caddyserver/xcaddy/releases/latest | grep "tag_name" | awk -F '"' '{print $4}')

View File

@@ -36,6 +36,8 @@ function update_script() {
msg_ok "Updated Dependencies"
fi
NODE_VERSION="24" setup_nodejs
msg_info "Updating ${APP}"
$STD pip3 install changedetection.io --upgrade
msg_ok "Updated ${APP}"
@@ -49,6 +51,7 @@ function update_script() {
$STD git -C /opt/browserless/ fetch --all
$STD git -C /opt/browserless/ reset --hard origin/main
$STD npm update --prefix /opt/browserless
$STD npm ci --include=optional --include=dev --prefix /opt/browserless
$STD /opt/browserless/node_modules/playwright-core/cli.js install --with-deps
# Update Chrome separately, as it has to be done with the force option. Otherwise the installation of other browsers will not be done if Chrome is already installed.
$STD /opt/browserless/node_modules/playwright-core/cli.js install --force chrome

View File

@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -36,15 +36,15 @@ function update_script() {
if [ "$UPD" == "1" ]; then
msg_info "Updating ${APP} LXC"
$STD apt-get update
$STD apt-get -y upgrade
$STD apt update
$STD apt -y upgrade
msg_ok "Updated ${APP} LXC"
exit
fi
if [ "$UPD" == "2" ]; then
msg_info "Installing dependencies (patience)"
$STD apt-get install -y \
$STD apt install -y \
attr \
nfs-kernel-server \
samba \
@@ -56,7 +56,7 @@ function update_script() {
URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-file-sharing/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
FILE=$(basename "$URL")
curl -fsSL "$URL" -o "$FILE"
$STD dpkg -i "$FILE" || $STD apt-get install -f -y
$STD dpkg -i "$FILE" || $STD apt install -f -y
rm -f "$FILE"
msg_ok "Installed Cockpit file sharing"
exit
@@ -64,7 +64,7 @@ function update_script() {
if [ "$UPD" == "3" ]; then
msg_info "Installing dependencies (patience)"
$STD apt-get install -y \
$STD apt install -y \
psmisc \
samba \
samba-common-bin
@@ -73,7 +73,7 @@ function update_script() {
URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-identities/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
FILE=$(basename "$URL")
curl -fsSL "$URL" -o "$FILE"
$STD dpkg -i "$FILE" || $STD apt-get install -f -y
$STD dpkg -i "$FILE" || $STD apt install -f -y
rm -f "$FILE"
msg_ok "Installed Cockpit identities"
exit
@@ -81,7 +81,7 @@ function update_script() {
if [ "$UPD" == "4" ]; then
msg_info "Installing dependencies"
$STD apt-get install -y \
$STD apt install -y \
rsync \
zip
msg_ok "Installed dependencies"
@@ -89,7 +89,7 @@ function update_script() {
URL=$(curl -fsSL https://api.github.com/repos/45Drives/cockpit-navigator/releases/latest | grep download | grep focal_all.deb | cut -d\" -f4)
FILE=$(basename "$URL")
curl -fsSL "$URL" -o "$FILE"
$STD dpkg -i "$FILE" || $STD apt-get install -f -y
$STD dpkg -i "$FILE" || $STD apt install -f -y
rm -f "$FILE"
msg_ok "Installed Cockpit navigator"
exit

View File

@@ -31,7 +31,13 @@ function update_script() {
msg_ok "Stopped EMQX"
msg_info "Removing old EMQX"
$STD apt-get remove --purge -y emqx
if dpkg -l | grep -q "^ii\s\+emqx\s"; then
$STD apt-get remove --purge -y emqx
elif dpkg -l | grep -q "^ii\s\+emqx-enterprise\s"; then
$STD apt-get remove --purge -y emqx-enterprise
else
msg_ok "No old EMQX package found"
fi
msg_ok "Removed old EMQX"
msg_info "Downloading EMQX v${RELEASE}"

View File

@@ -28,7 +28,7 @@ function update_script() {
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "flaresolverr" "FlareSolverr/FlareSolverr" "3.3.5"; then
if check_for_gh_release "flaresolverr" "FlareSolverr/FlareSolverr" "3.3.25"; then
msg_info "Stopping service"
systemctl stop flaresolverr
msg_ok "Stopped service"

View File

@@ -27,8 +27,16 @@ function update_script() {
msg_error "No ${APP} Installation Found!"
exit
fi
msg_error "FreshRSS should be updated via the user interface."
exit
if [ ! -x /opt/freshrss/cli/sensitive-log.sh ]; then
msg_info "Fixing wrong permissions"
chmod +x /opt/freshrss/cli/sensitive-log.sh
systemctl restart apache2
msg_ok "Fixed wrong permissions"
else
msg_error "FreshRSS should be updated via the user interface."
exit
fi
}
start
@@ -38,4 +46,4 @@ description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"

75
ct/ghostfolio.sh Normal file
View File

@@ -0,0 +1,75 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: lucasfell
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://ghostfol.io/
APP="Ghostfolio"
var_tags="${var_tags:-finance;investment}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /opt/ghostfolio/dist/apps/api/main.js ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "ghostfolio" "ghostfolio/ghostfolio"; then
msg_info "Stopping Service"
systemctl stop ghostfolio
msg_ok "Stopped Service"
msg_info "Creating Backup"
tar -czf "/opt/ghostfolio_backup_$(date +%F).tar.gz" \
-C /opt \
--exclude="ghostfolio/node_modules" \
--exclude="ghostfolio/dist" \
ghostfolio
mv /opt/ghostfolio/.env /opt/env.backup
msg_ok "Backup Created"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ghostfolio" "ghostfolio/ghostfolio" "tarball" "latest" "/opt/ghostfolio"
msg_info "Updating Ghostfolio"
mv /opt/env.backup /opt/ghostfolio/.env
cd /opt/ghostfolio
$STD npm ci
$STD npm run build:production
$STD npx prisma migrate deploy
msg_ok "Updated Ghostfolio"
msg_info "Starting Service"
systemctl start ghostfolio
msg_ok "Started Service"
msg_info "Cleaning Up"
$STD npm cache clean --force
msg_ok "Cleanup Completed"
msg_ok "Updated Successfully"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3333${CL}"

54
ct/goaway.sh Normal file
View File

@@ -0,0 +1,54 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/pommee/goaway
APP="GoAway"
var_tags="${var_tags:-network}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/goaway ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "goaway" "pommee/goaway"; then
msg_info "Stopping Services"
systemctl stop goaway
msg_ok "Stopped Services"
fetch_and_deploy_gh_release "goaway" "pommee/goaway" "prebuild" "latest" "/opt/goaway" "goaway_*_linux_amd64.tar.gz"
msg_info "Starting Services"
systemctl start goaway
msg_ok "Started Services"
msg_ok "Updated Successfully"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:8080${CL}"

6
ct/headers/ghostfolio Normal file
View File

@@ -0,0 +1,6 @@
________ __ ____ ___
/ ____/ /_ ____ _____/ /_/ __/___ / (_)___
/ / __/ __ \/ __ \/ ___/ __/ /_/ __ \/ / / __ \
/ /_/ / / / / /_/ (__ ) /_/ __/ /_/ / / / /_/ /
\____/_/ /_/\____/____/\__/_/ \____/_/_/\____/

6
ct/headers/goaway Normal file
View File

@@ -0,0 +1,6 @@
______ ___
/ ____/___ / |_ ______ ___ __
/ / __/ __ \/ /| | | /| / / __ `/ / / /
/ /_/ / /_/ / ___ | |/ |/ / /_/ / /_/ /
\____/\____/_/ |_|__/|__/\__,_/\__, /
/____/

6
ct/headers/myip Normal file
View File

@@ -0,0 +1,6 @@
__ ___ ________
/ |/ /_ __/ _/ __ \
/ /|_/ / / / // // /_/ /
/ / / / /_/ // // ____/
/_/ /_/\__, /___/_/
/____/

View File

@@ -1,6 +0,0 @@
____ __ _
/ __ \___ / /_(_)___
/ /_/ / _ \/ __/ / __ \
/ ____/ __/ /_/ / /_/ /
/_/ \___/\__/_/\____/

View File

@@ -0,0 +1,6 @@
____ _ ________ _____ _ __ __ __
/ __ \ | / / ____/ / ___/__________(_)___ / /______ / / ____ _________ _/ /
/ /_/ / | / / __/______\__ \/ ___/ ___/ / __ \/ __/ ___/_____/ / / __ \/ ___/ __ `/ /
/ ____/| |/ / /__/_____/__/ / /__/ / / / /_/ / /_(__ )_____/ /___/ /_/ / /__/ /_/ / /
/_/ |___/_____/ /____/\___/_/ /_/ .___/\__/____/ /_____/\____/\___/\__,_/_/
/_/

6
ct/headers/verdaccio Normal file
View File

@@ -0,0 +1,6 @@
_ __ __ _
| | / /__ _________/ /___ ___________(_)___
| | / / _ \/ ___/ __ / __ `/ ___/ ___/ / __ \
| |/ / __/ / / /_/ / /_/ / /__/ /__/ / /_/ /
|___/\___/_/ \__,_/\__,_/\___/\___/_/\____/

6
ct/headers/warracker Normal file
View File

@@ -0,0 +1,6 @@
_ __ __
| | / /___ _______________ ______/ /_____ _____
| | /| / / __ `/ ___/ ___/ __ `/ ___/ //_/ _ \/ ___/
| |/ |/ / /_/ / / / / / /_/ / /__/ ,< / __/ /
|__/|__/\__,_/_/ /_/ \__,_/\___/_/|_|\___/_/

View File

@@ -74,7 +74,7 @@ function update_script() {
done
msg_ok "Image-processing libraries up to date"
fi
RELEASE="1.143.1"
RELEASE="2.0.1"
if check_for_gh_release "immich" "immich-app/immich" "${RELEASE}"; then
msg_info "Stopping Services"
systemctl stop immich-web
@@ -158,6 +158,7 @@ EOF
cd "$SRC_DIR"/machine-learning
mkdir -p "$ML_DIR" && chown -R immich:immich "$ML_DIR"
chown immich:immich ./uv.lock
export VIRTUAL_ENV="${ML_DIR}"/ml-venv
if [[ -f ~/.openvino ]]; then
msg_info "Updating HW-accelerated machine-learning"
@@ -190,6 +191,7 @@ EOF
msg_info "Cleaning up"
$STD apt-get -y autoremove
$STD apt-get -y autoclean
$STD apt clean -y
msg_ok "Cleaned"
systemctl restart immich-ml immich-web
fi

View File

@@ -29,59 +29,53 @@ function update_script() {
exit
fi
msg_info "Stopping ${APP} Service"
systemctl stop metube
msg_ok "Stopped ${APP} Service"
msg_info "Backing up Old Installation"
if [[ -d /opt/metube_bak ]]; then
rm -rf /opt/metube_bak
if [[ $(echo ":$PATH:" != *":/usr/local/bin:"*) ]]; then
echo 'export PATH="/usr/local/bin:$PATH"' >>~/.bashrc
source ~/.bashrc
if ! command -v deno &>/dev/null; then
export DENO_INSTALL="/usr/local"
curl -fsSL https://deno.land/install.sh | $STD sh -s -- -y
else
$STD deno upgrade
fi
fi
mv /opt/metube /opt/metube_bak
msg_ok "Backup created"
msg_info "Cloning Latest ${APP} Release"
$STD git clone https://github.com/alexta69/metube /opt/metube
msg_ok "Cloned ${APP}"
if check_for_gh_release "metube" "alexta69/metube"; then
msg_info "Stopping ${APP} Service"
systemctl stop metube
msg_ok "Stopped ${APP} Service"
msg_info "Building Frontend"
cd /opt/metube/ui
$STD npm install
$STD node_modules/.bin/ng build
msg_ok "Built Frontend"
msg_info "Backing up Old Installation"
if [[ -d /opt/metube_bak ]]; then
rm -rf /opt/metube_bak
fi
mv /opt/metube /opt/metube_bak
msg_ok "Backup created"
PYTHON_VERSION="3.13" setup_uv
fetch_and_deploy_gh_release "metube" "alexta69/metube" "tarball" "latest"
msg_info "Setting up Python Environment (uv)"
$STD uv venv /opt/metube/.venv
$STD /opt/metube/.venv/bin/python -m ensurepip --upgrade
$STD /opt/metube/.venv/bin/python -m pip install --upgrade pip
$STD /opt/metube/.venv/bin/python -m pip install pipenv
msg_ok "Python Environment Ready"
msg_info "Building Frontend"
cd /opt/metube/ui
$STD npm install
$STD node_modules/.bin/ng build
msg_ok "Built Frontend"
msg_info "Installing Backend Requirements"
cd /opt/metube
$STD /opt/metube/.venv/bin/pipenv install
msg_ok "Installed Backend"
msg_info "Restoring Environment File"
if [[ -f /opt/metube_bak/.env ]]; then
cp /opt/metube_bak/.env /opt/metube/.env
fi
msg_ok "Restored .env"
if [[ ! -d /opt/metube/.venv ]]; then
msg_info "Migrating to uv-based environment"
PYTHON_VERSION="3.13" setup_uv
$STD uv venv /opt/metube/.venv
$STD /opt/metube/.venv/bin/python -m ensurepip --upgrade
$STD /opt/metube/.venv/bin/python -m pip install --upgrade pip
$STD /opt/metube/.venv/bin/python -m pip install pipenv
$STD /opt/metube/.venv/bin/pipenv install
$STD /opt/metube/.venv/bin/pipenv update yt-dlp
msg_info "Patching systemd Service"
cat <<EOF >/etc/systemd/system/metube.service
msg_info "Installing Backend Requirements"
cd /opt/metube
$STD uv sync
msg_ok "Installed Backend"
msg_info "Restoring Environment File"
if [[ -f /opt/metube_bak/.env ]]; then
cp /opt/metube_bak/.env /opt/metube/.env
fi
msg_ok "Restored .env"
if grep -q 'pipenv' /etc/systemd/system/metube.service; then
msg_info "Patching systemd Service"
cat <<EOF >/etc/systemd/system/metube.service
[Unit]
Description=Metube - YouTube Downloader
After=network.target
@@ -90,30 +84,31 @@ After=network.target
Type=simple
WorkingDirectory=/opt/metube
EnvironmentFile=/opt/metube/.env
ExecStart=/opt/metube/.venv/bin/pipenv run python3 app/main.py
ExecStart=/opt/metube/.venv/bin/python3 app/main.py
Restart=always
User=root
[Install]
WantedBy=multi-user.target
EOF
msg_ok "Patched systemd Service"
msg_ok "Patched systemd Service"
fi
$STD systemctl daemon-reload
msg_ok "Service Updated"
msg_info "Cleaning up"
rm -rf /opt/metube_bak
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned Up"
msg_info "Starting ${APP} Service"
systemctl start metube
sleep 1
msg_ok "Started ${APP} Service"
msg_ok "Updated Successfully!"
fi
$STD systemctl daemon-reload
msg_ok "Service Updated"
msg_info "Cleaning up"
rm -rf /opt/metube_bak
$STD apt-get -y autoremove
$STD apt-get -y autoclean
msg_ok "Cleaned Up"
msg_info "Starting ${APP} Service"
systemctl enable -q --now metube
sleep 1
msg_ok "Started ${APP} Service"
msg_ok "Updated Successfully!"
}
start

55
ct/myip.sh Normal file
View File

@@ -0,0 +1,55 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: Slaviša Arežina (tremor021)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://ipcheck.ing/
APP="MyIP"
var_tags="${var_tags:-network}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/myip ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "myip" "jason5ng32/MyIP"; then
msg_info "Stopping Services"
systemctl stop myip
msg_ok "Stopped Services"
cp /opt/myip/.env /opt
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "myip" "jason5ng32/MyIP" "tarball"
mv /opt/.env /opt/myip
msg_info "Starting Services"
systemctl start myip
msg_ok "Started Services"
msg_ok "Updated Successfully"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:18966${CL}"

View File

@@ -41,7 +41,8 @@ EOF
NODE_VERSION="22" setup_nodejs
msg_info "Updating ${APP} LXC"
$STD npm update -g n8n
rm -rf /usr/lib/node_modules/.n8n-* /usr/lib/node_modules/n8n
$STD npm install -g n8n --force
systemctl restart n8n
msg_ok "Updated Successfully"
exit

View File

@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"

View File

@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"

View File

@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -32,25 +32,20 @@ function update_script() {
"2" "Install Themes" OFF \
3>&1 1>&2 2>&3)
if [ "$UPD" == "1" ]; then
if [[ "$(node -v | cut -d 'v' -f 2)" == "18."* ]]; then
if ! command -v npm >/dev/null 2>&1; then
msg_info "Installing NPM"
$STD apt-get install -y npm
msg_ok "Installed NPM"
fi
fi
msg_info "Stopping ${APP}"
NODE_VERSION="22" setup_nodejs
msg_info "Stopping Service"
systemctl stop nodered
msg_ok "Stopped ${APP}"
msg_ok "Stopped Service"
msg_info "Updating ${APP}"
msg_info "Updating Node-Red"
$STD npm install -g --unsafe-perm node-red
msg_ok "Updated ${APP}"
msg_ok "Updated Node-Red"
msg_info "Starting ${APP}"
msg_info "Starting Service"
systemctl start nodered
msg_ok "Started ${APP}"
msg_ok "Update Successful"
msg_ok "Started Service"
msg_ok "Update Successfully!"
exit
fi
if [ "$UPD" == "2" ]; then
@@ -99,4 +94,4 @@ description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:1880${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:1880${CL}"

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: CrazyWolf13
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://ntfy.sh/
@@ -11,7 +11,7 @@ var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-512}"
var_disk="${var_disk:-2}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
@@ -23,13 +23,31 @@ function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /var ]]; then
if [[ ! -d /etc/ntfy ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if [ -f /etc/apt/keyrings/archive.heckel.io.gpg ]; then
msg_info "Correcting old Ntfy Repository"
rm -f /etc/apt/keyrings/archive.heckel.io.gpg
rm -f /etc/apt/sources.list.d/archive.heckel.io.list
rm -f /etc/apt/sources.list.d/archive.heckel.io.list.bak
rm -f /etc/apt/sources.list.d/archive.heckel.io.sources
curl -fsSL -o /etc/apt/keyrings/ntfy.gpg https://archive.ntfy.sh/apt/keyring.gpg
cat <<'EOF' >/etc/apt/sources.list.d/ntfy.sources
Types: deb
URIs: https://archive.ntfy.sh/apt/
Suites: stable
Components: main
Signed-By: /etc/apt/keyrings/ntfy.gpg
EOF
msg_ok "Corrected old Ntfy Repository"
fi
msg_info "Updating $APP LXC"
$STD apt-get update
$STD apt-get -y upgrade
$STD apt update
$STD apt -y upgrade
msg_ok "Updated $APP LXC"
exit
}
@@ -41,4 +59,4 @@ description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"

View File

@@ -28,6 +28,13 @@ function update_script() {
msg_error "No ${APP} Installation Found!"
exit 1
fi
if ! [[ $(dpkg -s python3-lxml-html-clean 2>/dev/null) ]]; then
$STD apt-get install python3-lxml
curl -fsSL "http://archive.ubuntu.com/ubuntu/pool/universe/l/lxml-html-clean/python3-lxml-html-clean_0.1.1-1_all.deb" -o /opt/python3-lxml-html-clean.deb
$STD dpkg -i /opt/python3-lxml-html-clean.deb
rm -f /opt/python3-lxml-html-clean.deb
fi
RELEASE=$(curl -fsSL https://nightly.odoo.com/ | grep -oE 'href="[0-9]+\.[0-9]+/nightly"' | head -n1 | cut -d'"' -f2 | cut -d/ -f1)
LATEST_VERSION=$(curl -fsSL "https://nightly.odoo.com/${RELEASE}/nightly/deb/" |
grep -oP "odoo_${RELEASE}\.\d+_all\.deb" |

View File

@@ -64,7 +64,7 @@ function update_script() {
fi
systemctl stop open-webui.service
$STD npm install --force
export NODE_OPTIONS="--max-old-space-size=3584"
export NODE_OPTIONS="--max-old-space-size=6000"
$STD npm run build
cd ./backend
$STD pip install -r requirements.txt -U

View File

@@ -8,7 +8,7 @@ source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxV
APP="Overseerr"
var_tags="${var_tags:-media}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-12}"

View File

@@ -1,45 +0,0 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 tteck
# Author: tteck (tteckster)
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://petio.tv/
APP="Petio"
var_tags="${var_tags:-media}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-1024}"
var_disk="${var_disk:-4}"
var_os="${var_os:-ubuntu}"
var_version="${var_version:-20.04}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/Petio ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
msg_info "Updating $APP"
systemctl stop petio.service
curl -fsSL https://petio.tv/releases/latest -o petio-latest.zip
$STD unzip petio-latest.zip -d /opt/Petio
systemctl start petio.service
msg_ok "Updated $APP"
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:7777${CL}"

View File

@@ -32,8 +32,10 @@ function update_script() {
systemctl stop plant-it
msg_ok "Stopped $APP"
USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "plant-it" "MDeLuise/plant-it" "singlefile" "latest" "/opt/plant-it/backend" "server.jar"
fetch_and_deploy_gh_release "plant-it-front" "MDeLuise/plant-it" "prebuild" "latest" "/opt/plant-it/frontend" "client.tar.gz"
USE_ORIGINAL_FILENAME="true" fetch_and_deploy_gh_release "plant-it" "MDeLuise/plant-it" "singlefile" "0.10.0" "/opt/plant-it/backend" "server.jar"
fetch_and_deploy_gh_release "plant-it-front" "MDeLuise/plant-it" "prebuild" "0.10.0" "/opt/plant-it/frontend" "client.tar.gz"
msg_warn "Application is updated to latest Web version (v0.10.0). There will be no more updates available."
msg_warn "Please read: https://github.com/MDeLuise/plant-it/releases/tag/1.0.0"
msg_info "Starting $APP"
systemctl start plant-it

View File

@@ -40,7 +40,10 @@ function update_script() {
fetch_and_deploy_gh_release "pulse" "rcourtman/Pulse" "prebuild" "latest" "/opt/pulse" "*-linux-amd64.tar.gz"
ln -sf /opt/pulse/bin/pulse /usr/local/bin/pulse
chown -R pulse:pulse /etc/pulse /opt/pulse
mkdir -p /etc/pulse
chown pulse:pulse /etc/pulse
chown -R pulse:pulse /opt/pulse
chmod 700 /etc/pulse
if [[ -f "$SERVICE_PATH"/pulse-backend.service ]]; then
mv "$SERVICE_PATH"/pulse-backend.service "$SERVICE_PATH"/pulse.service
fi

75
ct/pve-scripts-local.sh Normal file
View File

@@ -0,0 +1,75 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: michelroegl-brunner
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://www.debian.org/
APP="PVE-Scripts-Local"
var_tags="${var_tags:-pve-scripts-local}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-4096}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/ProxmoxVE-Local ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "ProxmoxVE-Local" "community-scripts/ProxmoxVE-Local"; then
msg_info "Stopping Services"
systemctl stop pvescriptslocal
msg_ok "Stopped Services"
msg_info "Backup Data"
cp /opt/ProxmoxVE-Local/.env /opt/.env.bak
cp -r /opt/ProxmoxVE-Local/data /opt/data.bak
msg_ok "Backed up Data"
CLEAN_INSTALL=1 fetch_and_deploy_gh_release "ProxmoxVE-Local" "community-scripts/ProxmoxVE-Local"
msg_info "Restoring Data"
if [[ -f /opt/.env.bak ]]; then
mv /opt/.env.bak /opt/ProxmoxVE-Local/.env
fi
if [[ -d /opt/data.bak ]]; then
rm -rf /opt/ProxmoxVE-Local/data
mv /opt/data.bak /opt/ProxmoxVE-Local/data
fi
msg_ok "Restored Data"
msg_info "Updating PVE Scripts local"
cd /opt/ProxmoxVE-Local
chmod 755 data
$STD npm install
$STD npm run build
msg_ok "Updated PVE Scripts local"
msg_info "Starting Services"
systemctl start pvescriptslocal
msg_ok "Started Services"
msg_ok "Updated Successfully"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:3000${CL}"

49
ct/verdaccio.sh Normal file
View File

@@ -0,0 +1,49 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: BrynnJKnight
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://verdaccio.org/
APP="Verdaccio"
var_tags="${var_tags:-dev-tools;npm;registry}"
var_cpu="${var_cpu:-2}"
var_ram="${var_ram:-2048}"
var_disk="${var_disk:-8}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -f /etc/systemd/system/verdaccio.service ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
msg_info "Updating LXC Container"
$STD apt update
$STD apt -y upgrade
msg_ok "Updated LXC Container"
NODE_VERSION="22" NODE_MODULE="verdaccio" setup_nodejs
systemctl restart verdaccio
msg_ok "Updated Successfully"
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}:4873${CL}"

63
ct/warracker.sh Normal file
View File

@@ -0,0 +1,63 @@
#!/usr/bin/env bash
source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/build.func)
# Copyright (c) 2021-2025 community-scripts ORG
# Author: BvdBerg01
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# Source: https://github.com/sassanix/Warracker/
APP="Warracker"
var_tags="${var_tags:-warranty}"
var_cpu="${var_cpu:-1}"
var_ram="${var_ram:-512}"
var_disk="${var_disk:-4}"
var_os="${var_os:-debian}"
var_version="${var_version:-13}"
var_unprivileged="${var_unprivileged:-1}"
header_info "$APP"
variables
color
catch_errors
function update_script() {
header_info
check_container_storage
check_container_resources
if [[ ! -d /opt/warracker ]]; then
msg_error "No ${APP} Installation Found!"
exit
fi
if check_for_gh_release "warracker" "sassanix/Warracker"; then
msg_info "Stopping Services"
systemctl stop warrackermigration
systemctl stop warracker
systemctl stop nginx
msg_ok "Stopped Services"
fetch_and_deploy_gh_release "warracker" "sassanix/Warracker" "tarball" "latest" "/opt/warracker"
msg_info "Updating Warracker"
cd /opt/warracker/backend
$STD uv venv .venv
$STD source .venv/bin/activate
$STD uv pip install -r requirements.txt
msg_ok "Updated Warracker"
msg_info "Starting Services"
systemctl start warracker
systemctl start nginx
msg_ok "Started Services"
msg_ok "Updated Successfully"
fi
exit
}
start
build_container
description
msg_ok "Completed Successfully!\n"
echo -e "${CREATING}${GN}${APP} setup has been successfully initialized!${CL}"
echo -e "${INFO}${YW} Access it using the following URL:${CL}"
echo -e "${TAB}${GATEWAY}${BGN}http://${IP}${CL}"

File diff suppressed because it is too large Load Diff

9
frontend/package.json generated
View File

@@ -65,6 +65,7 @@
"@antfu/eslint-config": "^4.16.1",
"@eslint-react/eslint-plugin": "^1.52.2",
"@next/eslint-plugin-next": "^15.3.4",
"@tailwindcss/postcss": "^4.1.14",
"@tanstack/eslint-plugin-query": "^5.68.0",
"@types/node": "^22.13.16",
"@types/react": "npm:types-react@19.0.0-rc.1",
@@ -77,15 +78,13 @@
"eslint-plugin-format": "^1.0.1",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.20",
"jsdom": "^25.0.1",
"postcss": "^8.5.3",
"prettier": "^3.5.3",
"prettier-plugin-tailwindcss": "^0.6.11",
"tailwindcss": "^3.4.17",
"prettier-plugin-tailwindcss": "^0.6.14",
"tailwindcss": "^4.1.14",
"tailwindcss-animate": "^1.0.7",
"tailwindcss-animated": "^1.1.2",
"typescript": "^5.8.2",
"vite-tsconfig-paths": "^5.1.4"
"typescript": "^5.8.2"
},
"overrides": {
"@types/react": "npm:types-react@19.0.0-rc.1",

View File

@@ -1,7 +1,7 @@
/** @type {import('postcss-load-config').Config} */
const config = {
plugins: {
tailwindcss: {},
'@tailwindcss/postcss': {},
},
};

View File

@@ -23,7 +23,7 @@
"ram": 512,
"hdd": 2,
"os": "debian",
"version": "12"
"version": "13"
}
}
],

View File

@@ -23,7 +23,7 @@
"ram": 2048,
"hdd": 4,
"os": "debian",
"version": "12"
"version": "13"
}
}
],

View File

@@ -23,7 +23,7 @@
"ram": 2048,
"hdd": 7,
"os": "debian",
"version": "12"
"version": "13"
}
}
],

View File

@@ -23,7 +23,7 @@
"ram": 2048,
"hdd": 4,
"os": "debian",
"version": "12"
"version": "13"
}
}
],

View File

@@ -23,7 +23,7 @@
"ram": 1024,
"hdd": 4,
"os": "debian",
"version": "12"
"version": "13"
}
}
],

View File

@@ -13,7 +13,7 @@
"website": null,
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/proxmox.webp",
"config_path": "",
"description": "This script will add/remove a crontab schedule that updates all LXCs every Sunday at midnight.",
"description": "This script will add/remove a crontab schedule that updates the operating system of all LXCs every Sunday at midnight.",
"install_methods": [
{
"type": "default",

View File

@@ -0,0 +1,52 @@
{
"name": "Ghostfolio",
"slug": "ghostfolio",
"categories": [
23
],
"date_created": "2025-09-29",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 3333,
"documentation": "https://github.com/ghostfolio/ghostfolio?tab=readme-ov-file#self-hosting",
"website": "https://ghostfol.io/",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/ghostfolio.webp",
"config_path": "/opt/ghostfolio/.env",
"description": "Ghostfolio is an open source wealth management software built with web technology. The application empowers busy people to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.",
"install_methods": [
{
"type": "default",
"script": "ct/ghostfolio.sh",
"resources": {
"cpu": 2,
"ram": 4096,
"hdd": 8,
"os": "debian",
"version": "13"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "Create your first user account by visiting the web interface and clicking 'Get Started'. The first user will automatically get admin privileges.",
"type": "info"
},
{
"text": "Database and Redis credentials: `cat ~/ghostfolio.creds`",
"type": "info"
},
{
"text": "Optional: CoinGecko API keys can be added during installation or later in the .env file for enhanced cryptocurrency data.",
"type": "info"
},
{
"text": "Build process requires 4GB RAM (runtime: ~2GB). A temporary swap file will be created automatically if insufficient memory is detected.",
"type": "warning"
}
]
}

View File

@@ -0,0 +1,40 @@
{
"name": "GoAway",
"slug": "goaway",
"categories": [
5
],
"date_created": "2025-09-25",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 8080,
"documentation": "https://github.com/pommee/goaway#configuration-file",
"config_path": "/opt/goaway/config/settings.yaml",
"website": "https://github.com/pommee/goaway",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/goaway.webp",
"description": "Lightweight DNS sinkhole written in Go with a modern dashboard client. Very good looking new alternative to Pi-Hole and Adguard Home.",
"install_methods": [
{
"type": "default",
"script": "ct/goaway.sh",
"resources": {
"cpu": 1,
"ram": 1024,
"hdd": 4,
"os": "Debian",
"version": "13"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "Type `cat ~/goaway.creds` to see login credentials.",
"type": "info"
}
]
}

View File

@@ -1,31 +1,186 @@
{
"categories": [
{ "name": "Proxmox & Virtualization", "id": 1, "sort_order": 1.0, "description": "Tools and scripts to manage Proxmox VE and virtualization platforms effectively." },
{ "name": "Operating Systems", "id": 2, "sort_order": 2.0, "description": "Scripts for deploying and managing various operating systems." },
{ "name": "Containers & Docker", "id": 3, "sort_order": 3.0, "description": "Solutions for containerization using Docker and related technologies." },
{ "name": "Network & Firewall", "id": 4, "sort_order": 4.0, "description": "Enhance network security and configure firewalls with ease." },
{ "name": "Adblock & DNS", "id": 5, "sort_order": 5.0, "description": "Optimize your network with DNS and ad-blocking solutions." },
{ "name": "Authentication & Security", "id": 6, "sort_order": 6.0, "description": "Secure your infrastructure with authentication and security tools." },
{ "name": "Backup & Recovery", "id": 7, "sort_order": 7.0, "description": "Reliable backup and recovery scripts to protect your data." },
{ "name": "Databases", "id": 8, "sort_order": 8.0, "description": "Deploy and manage robust database systems with ease." },
{ "name": "Monitoring & Analytics", "id": 9, "sort_order": 9.0, "description": "Monitor system performance and analyze data seamlessly." },
{ "name": "Dashboards & Frontends", "id": 10, "sort_order": 10.0, "description": "Create interactive dashboards and user-friendly frontends." },
{ "name": "Files & Downloads", "id": 11, "sort_order": 11.0, "description": "Manage file sharing and downloading solutions efficiently." },
{ "name": "Documents & Notes", "id": 12, "sort_order": 12.0, "description": "Organize and manage documents and note-taking tools." },
{ "name": "Media & Streaming", "id": 13, "sort_order": 13.0, "description": "Stream and manage media effortlessly across devices." },
{ "name": "*Arr Suite", "id": 14, "sort_order": 14.0, "description": "Automated media management with the popular *Arr suite tools." },
{ "name": "NVR & Cameras", "id": 15, "sort_order": 15.0, "description": "Manage network video recorders and camera setups." },
{ "name": "IoT & Smart Home", "id": 16, "sort_order": 16.0, "description": "Control and automate IoT devices and smart home systems." },
{ "name": "ZigBee, Z-Wave & Matter", "id": 17, "sort_order": 17.0, "description": "Solutions for ZigBee, Z-Wave, and Matter-based device management." },
{ "name": "MQTT & Messaging", "id": 18, "sort_order": 18.0, "description": "Set up reliable messaging and MQTT-based communication systems." },
{ "name": "Automation & Scheduling", "id": 19, "sort_order": 19.0, "description": "Automate tasks and manage scheduling with powerful tools." },
{ "name": "AI / Coding & Dev-Tools", "id": 20, "sort_order": 20.0, "description": "Leverage AI and developer tools for smarter coding workflows." },
{ "name": "Webservers & Proxies", "id": 21, "sort_order": 21.0, "description": "Deploy and configure web servers and proxy solutions." },
{ "name": "Bots & ChatOps", "id": 22, "sort_order": 22.0, "description": "Enhance collaboration with bots and ChatOps integrations." },
{ "name": "Finance & Budgeting", "id": 23, "sort_order": 23.0, "description": "Track expenses and manage budgets efficiently." },
{ "name": "Gaming & Leisure", "id": 24, "sort_order": 24.0, "description": "Scripts for gaming servers and leisure-related tools." },
{ "name": "Business & ERP", "id": 25, "sort_order": 25.0, "description": "Streamline business operations with ERP and management tools." },
{ "name": "Miscellaneous", "id": 0, "sort_order": 99.0, "description": "General scripts and tools that don't fit into other categories." }
]
"categories": [
{
"name": "Proxmox & Virtualization",
"id": 1,
"sort_order": 1.0,
"description": "Tools and scripts to manage Proxmox VE and virtualization platforms effectively.",
"icon": "server"
},
{
"name": "Operating Systems",
"id": 2,
"sort_order": 2.0,
"description": "Scripts for deploying and managing various operating systems.",
"icon": "monitor"
},
{
"name": "Containers & Docker",
"id": 3,
"sort_order": 3.0,
"description": "Solutions for containerization using Docker and related technologies.",
"icon": "box"
},
{
"name": "Network & Firewall",
"id": 4,
"sort_order": 4.0,
"description": "Enhance network security and configure firewalls with ease.",
"icon": "shield"
},
{
"name": "Adblock & DNS",
"id": 5,
"sort_order": 5.0,
"description": "Optimize your network with DNS and ad-blocking solutions.",
"icon": "ban"
},
{
"name": "Authentication & Security",
"id": 6,
"sort_order": 6.0,
"description": "Secure your infrastructure with authentication and security tools.",
"icon": "lock"
},
{
"name": "Backup & Recovery",
"id": 7,
"sort_order": 7.0,
"description": "Reliable backup and recovery scripts to protect your data.",
"icon": "archive"
},
{
"name": "Databases",
"id": 8,
"sort_order": 8.0,
"description": "Deploy and manage robust database systems with ease.",
"icon": "database"
},
{
"name": "Monitoring & Analytics",
"id": 9,
"sort_order": 9.0,
"description": "Monitor system performance and analyze data seamlessly.",
"icon": "bar-chart"
},
{
"name": "Dashboards & Frontends",
"id": 10,
"sort_order": 10.0,
"description": "Create interactive dashboards and user-friendly frontends.",
"icon": "layout"
},
{
"name": "Files & Downloads",
"id": 11,
"sort_order": 11.0,
"description": "Manage file sharing and downloading solutions efficiently.",
"icon": "download"
},
{
"name": "Documents & Notes",
"id": 12,
"sort_order": 12.0,
"description": "Organize and manage documents and note-taking tools.",
"icon": "file-text"
},
{
"name": "Media & Streaming",
"id": 13,
"sort_order": 13.0,
"description": "Stream and manage media effortlessly across devices.",
"icon": "play"
},
{
"name": "*Arr Suite",
"id": 14,
"sort_order": 14.0,
"description": "Automated media management with the popular *Arr suite tools.",
"icon": "tv"
},
{
"name": "NVR & Cameras",
"id": 15,
"sort_order": 15.0,
"description": "Manage network video recorders and camera setups.",
"icon": "camera"
},
{
"name": "IoT & Smart Home",
"id": 16,
"sort_order": 16.0,
"description": "Control and automate IoT devices and smart home systems.",
"icon": "home"
},
{
"name": "ZigBee, Z-Wave & Matter",
"id": 17,
"sort_order": 17.0,
"description": "Solutions for ZigBee, Z-Wave, and Matter-based device management.",
"icon": "radio"
},
{
"name": "MQTT & Messaging",
"id": 18,
"sort_order": 18.0,
"description": "Set up reliable messaging and MQTT-based communication systems.",
"icon": "message-circle"
},
{
"name": "Automation & Scheduling",
"id": 19,
"sort_order": 19.0,
"description": "Automate tasks and manage scheduling with powerful tools.",
"icon": "clock"
},
{
"name": "AI / Coding & Dev-Tools",
"id": 20,
"sort_order": 20.0,
"description": "Leverage AI and developer tools for smarter coding workflows.",
"icon": "code"
},
{
"name": "Webservers & Proxies",
"id": 21,
"sort_order": 21.0,
"description": "Deploy and configure web servers and proxy solutions.",
"icon": "globe"
},
{
"name": "Bots & ChatOps",
"id": 22,
"sort_order": 22.0,
"description": "Enhance collaboration with bots and ChatOps integrations.",
"icon": "bot"
},
{
"name": "Finance & Budgeting",
"id": 23,
"sort_order": 23.0,
"description": "Track expenses and manage budgets efficiently.",
"icon": "dollar-sign"
},
{
"name": "Gaming & Leisure",
"id": 24,
"sort_order": 24.0,
"description": "Scripts for gaming servers and leisure-related tools.",
"icon": "gamepad-2"
},
{
"name": "Business & ERP",
"id": 25,
"sort_order": 25.0,
"description": "Streamline business operations with ERP and management tools.",
"icon": "building"
},
{
"name": "Miscellaneous",
"id": 0,
"sort_order": 99.0,
"description": "General scripts and tools that don't fit into other categories.",
"icon": "more-horizontal"
}
]
}

View File

@@ -0,0 +1,35 @@
{
"name": "MyIP",
"slug": "myip",
"categories": [
4
],
"date_created": "2025-09-29",
"type": "ct",
"updateable": true,
"privileged": false,
"config_path": "/opt/myip/.env",
"interface_port": 18966,
"documentation": "https://github.com/jason5ng32/MyIP#-environment-variable",
"website": "https://ipcheck.ing/",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/myip.webp",
"description": "The best IP Toolbox. Easy to check what's your IPs, IP geolocation, check for DNS leaks, examine WebRTC connections, speed test, ping test, MTR test, check website availability, whois search and more!",
"install_methods": [
{
"type": "default",
"script": "ct/myip.sh",
"resources": {
"cpu": 1,
"ram": 512,
"hdd": 2,
"os": "Debian",
"version": "13"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": []
}

View File

@@ -23,7 +23,7 @@
"ram": 1024,
"hdd": 4,
"os": "debian",
"version": "12"
"version": "13"
}
}
],

View File

@@ -23,7 +23,7 @@
"ram": 1024,
"hdd": 4,
"os": "debian",
"version": "12"
"version": "13"
}
}
],

View File

@@ -23,7 +23,7 @@
"ram": 1024,
"hdd": 4,
"os": "debian",
"version": "12"
"version": "13"
}
},
{

View File

@@ -23,7 +23,7 @@
"ram": 512,
"hdd": 2,
"os": "debian",
"version": "12"
"version": "13"
}
}
],

View File

@@ -1,6 +1,6 @@
{
"name": "Outline",
"slug": "outline",
"slug": "outline-solid",
"categories": [
12
],

View File

@@ -20,7 +20,7 @@
"script": "ct/overseerr.sh",
"resources": {
"cpu": 2,
"ram": 2048,
"ram": 4096,
"hdd": 8,
"os": "debian",
"version": "12"

View File

@@ -1,35 +0,0 @@
{
"name": "Petio",
"slug": "petio",
"categories": [
13
],
"date_created": "2024-06-12",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 7777,
"documentation": "https://docs.petio.tv/",
"website": "https://petio.tv/",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/petio.webp",
"config_path": "",
"description": "Petio is a third party companion app available to Plex server owners to allow their users to request, review and discover content.",
"install_methods": [
{
"type": "default",
"script": "ct/petio.sh",
"resources": {
"cpu": 2,
"ram": 1024,
"hdd": 4,
"os": "ubuntu",
"version": "20.04"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": []
}

View File

@@ -0,0 +1,44 @@
{
"name": "PhpMyAdmin",
"slug": "phpmyadmin",
"categories": [
8
],
"date_created": "2025-10-01",
"type": "addon",
"updateable": true,
"privileged": false,
"interface_port": null,
"documentation": "https://www.phpmyadmin.net/docs/",
"config_path": "Debian/Ubuntu: /var/www/html/phpMyAdmin | Alpine: /usr/share/phpmyadmin",
"website": "https://www.phpmyadmin.net/",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/phpmyadmin.webp",
"description": "phpMyAdmin is a free software tool written in PHP, intended to handle the administration of MySQL over the Web. phpMyAdmin supports a wide range of operations on MySQL and MariaDB. Frequently used operations (managing databases, tables, columns, relations, indexes, users, permissions, etc) can be performed via the user interface, while you still have the ability to directly execute any SQL statement.",
"install_methods": [
{
"type": "default",
"script": "tools/addon/phpmyadmin.sh",
"resources": {
"cpu": null,
"ram": null,
"hdd": null,
"os": null,
"version": null
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "Execute within an existing LXC Console",
"type": "warning"
},
{
"text": "To update or uninstall run bash call again",
"type": "info"
}
]
}

View File

@@ -46,6 +46,10 @@
{
"text": "Set a password after installation for postgres user by running `echo \"ALTER USER postgres with encrypted password 'your_password';\" | sudo -u postgres psql`",
"type": "info"
},
{
"text": "Debian script offers versions `15, 16, 17, 18`, while Alpine script offers versions `15, 16, 17`.",
"type": "info"
}
]
}

View File

@@ -0,0 +1,35 @@
{
"name": "PVEScriptsLocal",
"slug": "pve-scripts-local",
"categories": [
1
],
"date_created": "2025-10-03",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 3000,
"documentation": "https://github.com/community-scripts/ProxmoxVE-Local",
"config_path": "/opt/PVEScripts-Local/.env",
"website": "https://community-scripts.github.io/ProxmoxVE",
"logo": "https://raw.githubusercontent.com/community-scripts/ProxmoxVE-Local/refs/heads/main/.github/logo.png",
"description": "A modern web-based management interface for Proxmox VE (PVE) helper scripts. This tool provides a user-friendly way to discover, download, and execute community-sourced Proxmox scripts locally with real-time terminal output streaming.",
"install_methods": [
{
"type": "default",
"script": "ct/pve-scripts-local.sh",
"resources": {
"cpu": 2,
"ram": 4096,
"hdd": 4,
"os": "Debian",
"version": "13"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": []
}

View File

@@ -13,7 +13,7 @@
"website": null,
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/linuxcontainers.webp",
"config_path": "",
"description": "This script has been created to simplify and speed up the process of updating all LXC containers across various Linux distributions, such as Ubuntu, Debian, Devuan, Alpine Linux, CentOS-Rocky-Alma, Fedora, and ArchLinux. It's designed to automatically skip templates and specific containers during the update, enhancing its convenience and usability.",
"description": "This script has been created to simplify and speed up the process of updating the operating system running inside LXC containers across various Linux distributions, such as Ubuntu, Debian, Devuan, Alpine Linux, CentOS-Rocky-Alma, Fedora, and ArchLinux. It's designed to automatically skip templates and specific containers during the update, enhancing its convenience and usability.",
"install_methods": [
{
"type": "default",
@@ -35,6 +35,10 @@
{
"text": "Execute within the Proxmox shell",
"type": "info"
},
{
"text": "The script updates only the operating system of the LXC container. It DOES NOT update the application installed within the container!",
"type": "warning"
}
]
}

View File

@@ -0,0 +1,40 @@
{
"name": "Verdaccio",
"slug": "verdaccio",
"categories": [
20
],
"date_created": "2025-09-29",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 4873,
"documentation": "https://verdaccio.org/docs/what-is-verdaccio",
"website": "https://verdaccio.org/",
"logo": "https://verdaccio.org/img/logo/symbol/png/verdaccio-tiny.png",
"config_path": "/opt/verdaccio/config/config.yaml",
"description": "Verdaccio is a lightweight private npm proxy registry built with Node.js. It allows you to host your own npm registry with minimal configuration, providing a private npm repository for your projects. Verdaccio supports npm, yarn, and pnpm, and can cache packages from the public npm registry, allowing for faster installs and protection against npm registry outages. It includes a web interface for browsing packages, authentication and authorization features, and can be easily integrated into your development workflow.",
"install_methods": [
{
"type": "default",
"script": "ct/verdaccio.sh",
"resources": {
"cpu": 2,
"ram": 2048,
"hdd": 8,
"os": "debian",
"version": "13"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "To create the first user, run: npm adduser --registry http://<container-ip>:4873",
"type": "info"
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,40 @@
{
"name": "Warracker",
"slug": "warracker",
"categories": [
12
],
"date_created": "2025-09-29",
"type": "ct",
"updateable": true,
"privileged": false,
"interface_port": 80,
"documentation": null,
"config_path": "/opt/.env",
"website": "https://warracker.com/",
"logo": "https://cdn.jsdelivr.net/gh/selfhst/icons/webp/warracker.webp",
"description": "Warracker is an open source, self-hostable warranty tracker to monitor expirations, store receipts, files. You own the data, your rules!",
"install_methods": [
{
"type": "default",
"script": "ct/warracker.sh",
"resources": {
"cpu": 1,
"ram": 512,
"hdd": 4,
"os": "Debian",
"version": "13"
}
}
],
"default_credentials": {
"username": null,
"password": null
},
"notes": [
{
"text": "The first user you register will be the admin user.",
"type": "info"
}
]
}

View File

@@ -315,7 +315,7 @@ export default function JSONGenerator() {
</Button>
</div>
<pre className="mt-4 p-4 bg-secondary rounded shadow overflow-x-scroll">
<pre className="mt-4 p-4 bg-secondary rounded shadow-sm overflow-x-scroll">
{JSON.stringify(script, null, 2)}
</pre>
</div>

View File

@@ -103,18 +103,22 @@ export default function RootLayout({
<body className={inter.className}>
<ThemeProvider attribute="class" defaultTheme="dark" enableSystem disableTransitionOnChange>
<div className="flex w-full flex-col justify-center">
<Navbar />
<div className="flex min-h-screen flex-col justify-center">
<div className="flex w-full justify-center">
<div className="w-full max-w-[1440px] ">
<QueryProvider>
<NuqsAdapter>{children}</NuqsAdapter>
</QueryProvider>
<Toaster richColors />
<NuqsAdapter>
<QueryProvider>
<Navbar />
<div className="flex min-h-screen flex-col justify-center">
<div className="flex w-full justify-center">
<div className="w-full max-w-[1440px] ">
{children}
<Toaster richColors />
</div>
</div>
<Footer />
</div>
</div>
<Footer />
</div>
</QueryProvider>
</NuqsAdapter>
</div>
</ThemeProvider>
</body>

View File

@@ -47,8 +47,8 @@ export default function Page() {
<AnimatedGradientText>
<div
className={cn(
`absolute inset-0 block size-full animate-gradient bg-gradient-to-r from-[#ffaa40]/50 via-[#9c40ff]/50 to-[#ffaa40]/50 bg-[length:var(--bg-size)_100%] [border-radius:inherit] [mask:linear-gradient(#fff_0_0)_content-box,linear-gradient(#fff_0_0)]`,
`p-px ![mask-composite:subtract]`,
`absolute inset-0 block size-full animate-gradient bg-linear-to-r from-[#ffaa40]/50 via-[#9c40ff]/50 to-[#ffaa40]/50 bg-size-[var(--bg-size)_100%] rounded-[inherit] [mask:linear-gradient(#fff_0_0)_content-box,linear-gradient(#fff_0_0)]`,
`p-px mask-subtract!`,
)}
/>
@@ -56,7 +56,7 @@ export default function Page() {
<Separator className="mx-2 h-4" orientation="vertical" />
<span
className={cn(
`animate-gradient bg-gradient-to-r from-[#ffaa40] via-[#9c40ff] to-[#ffaa40] bg-[length:var(--bg-size)_100%] bg-clip-text text-transparent`,
`animate-gradient bg-linear-to-r from-[#ffaa40] via-[#9c40ff] to-[#ffaa40] bg-size-[var(--bg-size)_100%] bg-clip-text text-transparent`,
`inline`,
)}
>

View File

@@ -1,4 +1,5 @@
import { useCallback, useEffect, useRef, useState } from "react";
import * as Icons from "lucide-react";
import Image from "next/image";
import Link from "next/link";
@@ -9,18 +10,31 @@ import { formattedBadge } from "@/components/command-menu";
import { basePath } from "@/config/site-config";
import { cn } from "@/lib/utils";
function getCategoryIcon(iconName: string) {
// Convert kebab-case to PascalCase for Lucide icon names
const pascalCaseName = iconName
.split("-")
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
.join("");
const IconComponent = (Icons as any)[pascalCaseName];
return IconComponent ? <IconComponent className="size-4 text-[#0083c3] mr-2" /> : null;
}
export default function ScriptAccordion({
items,
selectedScript,
setSelectedScript,
selectedCategory,
setSelectedCategory,
onItemSelect,
}: {
items: Category[];
selectedScript: string | null;
setSelectedScript: (script: string | null) => void;
selectedCategory: string | null;
setSelectedCategory: (category: string | null) => void;
onItemSelect?: () => void;
}) {
const [expandedItem, setExpandedItem] = useState<string | undefined>(undefined);
const linkRefs = useRef<{ [key: string]: HTMLAnchorElement | null }>({});
@@ -65,7 +79,7 @@ export default function ScriptAccordion({
value={expandedItem}
onValueChange={handleAccordionChange}
collapsible
className="overflow-y-scroll max-h-[calc(100vh-225px)] overflow-x-hidden p-2"
className="overflow-y-scroll sm:max-h-[calc(100vh-209px)] overflow-x-hidden p-1"
>
{items.map(category => (
<AccordionItem
@@ -81,10 +95,13 @@ export default function ScriptAccordion({
)}
>
<div className="mr-2 flex w-full items-center justify-between">
<span className="pl-2 text-left">
{category.name}
{" "}
</span>
<div className="flex items-center pl-2 text-left">
{getCategoryIcon(category.icon)}
<span>
{category.name}
{" "}
</span>
</div>
<span className="rounded-full bg-gray-200 px-2 py-1 text-xs text-muted-foreground hover:no-underline dark:bg-blue-800/20">
{category.scripts.length}
</span>
@@ -103,14 +120,14 @@ export default function ScriptAccordion({
query: { id: script.slug, category: category.name },
}}
prefetch={false}
className={`flex cursor-pointer items-center justify-between gap-1 px-1 py-1 text-muted-foreground hover:rounded-lg hover:bg-accent/60 hover:dark:bg-accent/20 ${
selectedScript === script.slug
? "rounded-lg bg-accent font-semibold dark:bg-accent/30 dark:text-white"
: ""
className={`flex cursor-pointer items-center justify-between gap-1 px-1 py-1 text-muted-foreground hover:rounded-lg hover:bg-accent/60 dark:hover:bg-accent/20 ${selectedScript === script.slug
? "rounded-lg bg-accent font-semibold dark:bg-accent/30 dark:text-white"
: ""
}`}
onClick={() => {
handleSelected(script.slug);
setSelectedCategory(category.name);
onItemSelect?.();
}}
ref={(el) => {
linkRefs.current[script.slug] = el;

View File

@@ -84,7 +84,7 @@ export function LatestScripts({ items }: { items: Category[] }) {
)}
<div className="min-w flex w-full flex-row flex-wrap gap-4">
{latestScripts.slice(startIndex, endIndex).map(script => (
<Card key={script.slug} className="min-w-[250px] flex-1 flex-grow bg-accent/30">
<Card key={script.slug} className="min-w-[250px] flex-1 grow bg-accent/30">
<CardHeader>
<CardTitle className="flex items-center gap-3">
<div className="flex h-16 w-16 min-w-16 items-center justify-center rounded-lg bg-accent p-1">
@@ -148,7 +148,7 @@ export function MostViewedScripts({ items }: { items: Category[] }) {
)}
<div className="min-w flex w-full flex-row flex-wrap gap-4">
{mostViewedScripts.map(script => (
<Card key={script.slug} className="min-w-[250px] flex-1 flex-grow bg-accent/30">
<Card key={script.slug} className="min-w-[250px] flex-1 grow bg-accent/30">
<CardHeader>
<CardTitle className="flex items-center gap-3">
<div className="flex size-16 min-w-16 items-center justify-center rounded-lg bg-accent p-1">

View File

@@ -35,10 +35,10 @@ function ScriptHeader({ item }: { item: Script }) {
return (
<div className="flex flex-col lg:flex-row gap-6 w-full">
<div className="flex flex-col md:flex-row gap-6 flex-grow">
<div className="flex-shrink-0">
<div className="flex flex-col md:flex-row gap-6 grow">
<div className="shrink-0">
<Image
className="h-32 w-32 rounded-xl bg-gradient-to-br from-accent/40 to-accent/60 object-contain p-3 shadow-lg transition-transform hover:scale-105"
className="h-32 w-32 rounded-xl bg-linear-to-br from-accent/40 to-accent/60 object-contain p-3 shadow-lg transition-transform hover:scale-105"
src={item.logo || `/${basePath}/logo.png`}
width={400}
onError={e => ((e.currentTarget as HTMLImageElement).src = `/${basePath}/logo.png`)}
@@ -47,7 +47,7 @@ function ScriptHeader({ item }: { item: Script }) {
unoptimized
/>
</div>
<div className="flex flex-col justify-between flex-grow space-y-4">
<div className="flex flex-col justify-between grow space-y-4">
<div className="space-y-2">
<div className="flex items-start justify-between">
<div>
@@ -140,7 +140,7 @@ export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
</button>
</div>
<div className="rounded-xl border border-border bg-accent/30 backdrop-blur-sm shadow-sm">
<div className="rounded-xl border border-border bg-accent/30 backdrop-blur-xs shadow-xs">
<div className="p-6 space-y-6">
<Suspense fallback={<div className="animate-pulse h-32 bg-accent/20 rounded-xl" />}>
<ScriptHeader item={item} />
@@ -149,7 +149,7 @@ export function ScriptItem({ item, setSelectedScript }: ScriptItemProps) {
<Description item={item} />
<Alerts item={item} />
<div className="mt-4 rounded-lg border shadow-sm">
<div className="mt-4 rounded-lg border shadow-xs">
<div className="flex gap-3 px-4 py-2 bg-accent/25">
<h2 className="text-lg font-semibold">
How to

View File

@@ -16,7 +16,7 @@ export default function Alerts({ item }: { item: Script }) {
<>
{item?.notes?.length > 0
&& item.notes.map((note: NoteProps, index: number) => (
<div key={index} className="mt-4 flex flex-col shadow-sm gap-2">
<div key={index} className="mt-4 flex flex-col shadow-xs gap-2">
<p
className={cn(
"inline-flex items-center gap-2 rounded-lg border p-2 pl-4 text-sm",

View File

@@ -16,7 +16,7 @@ export default function DefaultPassword({ item }: { item: Script }) {
};
return (
<div className="mt-4 rounded-lg border shadow-sm">
<div className="mt-4 rounded-lg border shadow-xs">
<div className="flex gap-3 px-4 py-2 bg-accent/25">
<h2 className="text-lg font-semibold">Default Login Credentials</h2>
</div>

View File

@@ -2,21 +2,29 @@
import type { Category, Script } from "@/lib/types";
import { cn } from "@/lib/utils";
import ScriptAccordion from "./script-accordion";
type SidebarProps = {
items: Category[];
selectedScript: string | null;
setSelectedScript: (script: string | null) => void;
selectedCategory: string | null;
setSelectedCategory: (category: string | null) => void;
onItemSelect?: () => void;
className?: string;
};
function Sidebar({
items,
selectedScript,
setSelectedScript,
selectedCategory,
setSelectedCategory,
}: {
items: Category[];
selectedScript: string | null;
setSelectedScript: (script: string | null) => void;
selectedCategory: string | null;
setSelectedCategory: (category: string | null) => void;
}) {
onItemSelect,
className,
}: SidebarProps) {
const uniqueScripts = items.reduce((acc, category) => {
for (const script of category.scripts) {
if (!acc.some(s => s.name === script.name)) {
@@ -27,7 +35,7 @@ function Sidebar({
}, [] as Script[]);
return (
<div className="flex min-w-[350px] flex-col sm:max-w-[350px]">
<div className={cn("flex w-full flex-col sm:min-w-[350px] sm:max-w-[350px]", className)}>
<div className="flex items-end justify-between pb-4">
<h1 className="text-xl font-bold">Categories</h1>
<p className="text-xs italic text-muted-foreground">
@@ -43,6 +51,7 @@ function Sidebar({
setSelectedScript={setSelectedScript}
selectedCategory={selectedCategory}
setSelectedCategory={setSelectedCategory}
onItemSelect={onItemSelect}
/>
</div>
</div>

View File

@@ -14,19 +14,19 @@ import {
import { cn } from "@/lib/utils";
const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[box-shadow,_color,_background-color,_border-color,_outline-color,_text-decoration-color,_fill,_stroke] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[box-shadow,color,background-color,border-color,outline-color,text-decoration-color,fill,stroke] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-hidden focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
{
variants: {
variant: {
default:
"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
accent: "bg-accent text-accent-foreground shadow-xs hover:bg-accent/90",
"bg-primary text-primary-foreground shadow-2xs hover:bg-primary/90",
accent: "bg-accent text-accent-foreground shadow-2xs hover:bg-accent/90",
destructive:
"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
"bg-destructive text-white shadow-2xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
outline:
"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
"border bg-background shadow-2xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
secondary:
"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
"bg-secondary text-secondary-foreground shadow-2xs hover:bg-secondary/80",
ghost:
"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
link: "text-primary underline-offset-4 hover:underline",

View File

@@ -18,14 +18,14 @@ import { Button as ButtonPrimitive } from "@/components/animate-ui/primitives/bu
import { cn } from "@/lib/utils";
const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[box-shadow,_color,_background-color,_border-color,_outline-color,_text-decoration-color,_fill,_stroke] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[box-shadow,color,background-color,border-color,outline-color,text-decoration-color,fill,stroke] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-hidden focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
{
variants: {
variant: {
default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
accent: "bg-accent text-accent-foreground shadow-xs hover:bg-accent/90",
default: "bg-primary text-primary-foreground shadow-2xs hover:bg-primary/90",
accent: "bg-accent text-accent-foreground shadow-2xs hover:bg-accent/90",
outline:
"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
"border bg-background shadow-2xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
},
size: {

View File

@@ -1,5 +1,5 @@
"use client";
import { useEffect, useState } from "react";
import { Suspense, useEffect, useState } from "react";
import Image from "next/image";
import Link from "next/link";
@@ -8,6 +8,7 @@ import { navbarLinks } from "@/config/site-config";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./ui/tooltip";
import { GitHubStarsButton } from "./animate-ui/components/buttons/github-stars";
import { Button } from "./animate-ui/components/buttons/button";
import MobileSidebar from "./navigation/mobile-sidebar";
import { ThemeToggle } from "./ui/theme-toggle";
import CommandMenu from "./command-menu";
@@ -30,39 +31,45 @@ function Navbar() {
return (
<>
<div
className={`fixed left-0 top-0 z-50 flex w-screen justify-center px-4 xl:px-0 ${
isScrolled ? "glass border-b bg-background/50" : ""
className={`fixed left-0 top-0 z-50 flex w-screen justify-center px-4 xl:px-0 ${isScrolled ? "glass border-b bg-background/50" : ""
}`}
>
<div className="flex h-20 w-full max-w-[1440px] items-center justify-between sm:flex-row">
<Link
href="/"
className="flex cursor-pointer w-full justify-center sm:justify-start flex-row-reverse items-center gap-2 font-semibold sm:flex-row"
className="cursor-pointer w-full justify-center sm:justify-start flex-row-reverse hidden sm:flex items-center gap-2 font-semibold sm:flex-row"
>
<Image height={18} unoptimized width={18} alt="logo" src="/ProxmoxVE/logo.png" className="" />
<span className="hidden md:block">Proxmox VE Helper-Scripts</span>
<span className="">Proxmox VE Helper-Scripts</span>
</Link>
<div className="flex gap-2">
<CommandMenu />
<GitHubStarsButton username="community-scripts" repo="ProxmoxVE" />
{navbarLinks.map(({ href, event, icon, text, mobileHidden }) => (
<TooltipProvider key={event}>
<Tooltip delayDuration={100}>
<TooltipTrigger className={mobileHidden ? "hidden lg:block" : ""}>
<Button variant="ghost" size="icon" asChild>
<Link target="_blank" href={href} data-umami-event={event}>
{icon}
<span className="sr-only">{text}</span>
</Link>
</Button>
</TooltipTrigger>
<TooltipContent side="bottom" className="text-xs">
{text}
</TooltipContent>
</Tooltip>
</TooltipProvider>
))}
<ThemeToggle />
<div className="flex items-center justify-between sm:justify-end gap-2 w-full">
<div className="flex sm:hidden">
<Suspense>
<MobileSidebar />
</Suspense>
</div>
<div className="flex sm:gap-2">
<CommandMenu />
<GitHubStarsButton username="community-scripts" repo="ProxmoxVE" className="hidden md:flex" />
{navbarLinks.map(({ href, event, icon, text, mobileHidden }) => (
<TooltipProvider key={event}>
<Tooltip delayDuration={100}>
<TooltipTrigger className={mobileHidden ? "hidden lg:block" : ""}>
<Button variant="ghost" size="icon" asChild>
<Link target="_blank" href={href} data-umami-event={event}>
{icon}
<span className="sr-only">{text}</span>
</Link>
</Button>
</TooltipTrigger>
<TooltipContent side="bottom" className="text-xs">
{text}
</TooltipContent>
</Tooltip>
</TooltipProvider>
))}
<ThemeToggle />
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,133 @@
"use client";
import { useCallback, useEffect, useState } from "react";
import { usePathname } from "next/navigation";
import { useQueryState } from "nuqs";
import { Menu } from "lucide-react";
import type { Category, Script } from "@/lib/types";
import { ScriptItem } from "@/app/scripts/_components/script-item";
import Sidebar from "@/app/scripts/_components/sidebar";
import { fetchCategories } from "@/lib/data";
import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from "../ui/sheet";
import { Button } from "../ui/button";
function MobileSidebar() {
const [isOpen, setIsOpen] = useState(false);
const [isLoading, setIsLoading] = useState(false);
const [categories, setCategories] = useState<Category[]>([]);
const [lastViewedScript, setLastViewedScript] = useState<Script | undefined>(undefined);
const pathname = usePathname();
// Always call the hooks (React hooks can't be conditional)
const [selectedScript, setSelectedScript] = useQueryState("id");
const [selectedCategory, setSelectedCategory] = useQueryState("category");
// For non-scripts pages, we'll manage state locally
const [tempSelectedScript, setTempSelectedScript] = useState<string | null>(null);
const [tempSelectedCategory, setTempSelectedCategory] = useState<string | null>(null);
const isOnScriptsPage = pathname === "/scripts";
const currentSelectedScript = isOnScriptsPage ? selectedScript : tempSelectedScript;
const currentSelectedCategory = isOnScriptsPage ? selectedCategory : tempSelectedCategory;
const loadCategories = useCallback(async () => {
setIsLoading(true);
try {
const response = await fetchCategories();
setCategories(response);
}
catch (error) {
console.error(error);
}
finally {
setIsLoading(false);
}
}, []);
useEffect(() => {
void loadCategories();
}, [loadCategories]);
useEffect(() => {
if (!currentSelectedScript || categories.length === 0) {
return;
}
const scriptMatch = categories
.flatMap(category => category.scripts)
.find(script => script.slug === currentSelectedScript);
setLastViewedScript(scriptMatch);
}, [currentSelectedScript, categories]);
const handleOpenChange = (openState: boolean) => {
setIsOpen(openState);
};
const handleItemSelect = () => {
setIsOpen(false);
};
const hasLinks = categories.length > 0;
return (
<Sheet open={isOpen} onOpenChange={handleOpenChange}>
<SheetTrigger asChild>
<Button
variant="ghost"
size="icon"
aria-label="Open navigation menu"
tabIndex={0}
onKeyDown={(event) => {
if (event.key === "Enter" || event.key === " ") {
setIsOpen(true);
}
}}
>
<Menu className="size-5" aria-hidden="true" />
</Button>
</SheetTrigger>
<SheetHeader className="border-b border-border px-6 pb-4 pt-2 sr-only">
<SheetTitle className="sr-only">Categories</SheetTitle>
</SheetHeader>
<SheetContent side="left" className="flex w-full max-w-xs flex-col gap-4 overflow-hidden px-0 pb-6">
<div className="flex h-full flex-col gap-4 overflow-y-auto">
{isLoading && !hasLinks
? (
<div className="flex w-full flex-col items-center justify-center gap-2 px-6 py-4 text-sm text-muted-foreground">
Loading categories...
</div>
)
: (
<div className="flex flex-col gap-4 px-4">
<Sidebar
items={categories}
selectedScript={currentSelectedScript}
setSelectedScript={isOnScriptsPage ? setSelectedScript : setTempSelectedScript}
selectedCategory={currentSelectedCategory}
setSelectedCategory={isOnScriptsPage ? setSelectedCategory : setTempSelectedCategory}
onItemSelect={handleItemSelect}
/>
</div>
)}
{currentSelectedScript && lastViewedScript
? (
<div className="flex flex-col gap-3 px-4">
<p className="text-sm font-medium">Last Viewed</p>
<ScriptItem
item={lastViewedScript}
setSelectedScript={isOnScriptsPage ? setSelectedScript : setTempSelectedScript}
/>
</div>
)
: null}
</div>
</SheetContent>
</Sheet>
);
}
export default MobileSidebar;

View File

@@ -12,12 +12,12 @@ export default function AnimatedGradientText({
return (
<div
className={cn(
"group relative mx-auto flex max-w-fit flex-row items-center justify-center rounded-2xl bg-white/40 px-4 py-1.5 text-sm font-medium shadow-[inset_0_-8px_10px_#8fdfff1f] backdrop-blur-sm transition-shadow duration-500 ease-out [--bg-size:300%] hover:shadow-[inset_0_-5px_10px_#8fdfff3f] dark:bg-black/40",
"group relative mx-auto flex max-w-fit flex-row items-center justify-center rounded-2xl bg-white/40 px-4 py-1.5 text-sm font-medium shadow-[inset_0_-8px_10px_#8fdfff1f] backdrop-blur-xs transition-shadow duration-500 ease-out [--bg-size:300%] hover:shadow-[inset_0_-5px_10px_#8fdfff3f] dark:bg-black/40",
className,
)}
>
<div
className="absolute inset-0 block h-full w-full animate-gradient bg-gradient-to-r from-[#ffaa40]/50 via-[#9c40ff]/50 to-[#ffaa40]/50 bg-[length:var(--bg-size)_100%] p-[1px] [border-radius:inherit] ![mask-composite:subtract] [mask:linear-gradient(#fff_0_0)_content-box,linear-gradient(#fff_0_0)]"
className="absolute inset-0 block h-full w-full animate-gradient bg-linear-to-r from-[#ffaa40]/50 via-[#9c40ff]/50 to-[#ffaa40]/50 bg-size-[var(--bg-size)_100%] p-px rounded-[inherit] mask-subtract! [mask:linear-gradient(#fff_0_0)_content-box,linear-gradient(#fff_0_0)]"
/>
{children}

View File

@@ -6,7 +6,7 @@ import * as React from "react";
import { cn } from "@/lib/utils";
const badgeVariants = cva(
"inline-flex items-center rounded-full border px-1.5 py-0.1 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
"inline-flex items-center rounded-full border px-1.5 py-0.1 text-xs font-semibold transition-colors focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2",
{
variants: {
variant: {

View File

@@ -7,7 +7,7 @@ import * as React from "react";
import { cn } from "@/lib/utils";
const buttonVariants = cva(
"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
{
variants: {
variant: {
@@ -25,15 +25,15 @@ const buttonVariants = cva(
ringHover:
"bg-primary text-primary-foreground transition-all duration-300 hover:bg-primary/90 hover:ring-2 hover:ring-primary/90 hover:ring-offset-2",
shine:
"text-primary-foreground animate-shine bg-gradient-to-r from-primary via-primary/75 to-primary bg-[length:400%_100%] ",
"text-primary-foreground animate-shine bg-linear-to-r from-primary via-primary/75 to-primary bg-size-[400%_100%] ",
gooeyRight:
"text-primary-foreground relative bg-primary z-0 overflow-hidden transition-all duration-500 before:absolute before:inset-0 before:-z-10 before:translate-x-[150%] before:translate-y-[150%] before:scale-[2.5] before:rounded-[100%] before:bg-gradient-to-r from-zinc-400 before:transition-transform before:duration-1000 hover:before:translate-x-[0%] hover:before:translate-y-[0%] ",
"text-primary-foreground relative bg-primary z-0 overflow-hidden transition-all duration-500 before:absolute before:inset-0 before:-z-10 before:translate-x-[150%] before:translate-y-[150%] before:scale-[2.5] before:rounded-[100%] before:bg-linear-to-r from-zinc-400 before:transition-transform before:duration-1000 hover:before:translate-x-[0%] hover:before:translate-y-[0%] ",
gooeyLeft:
"text-primary-foreground relative bg-primary z-0 overflow-hidden transition-all duration-500 after:absolute after:inset-0 after:-z-10 after:translate-x-[-150%] after:translate-y-[150%] after:scale-[2.5] after:rounded-[100%] after:bg-gradient-to-l from-zinc-400 after:transition-transform after:duration-1000 hover:after:translate-x-[0%] hover:after:translate-y-[0%] ",
"text-primary-foreground relative bg-primary z-0 overflow-hidden transition-all duration-500 after:absolute after:inset-0 after:-z-10 after:translate-x-[-150%] after:translate-y-[150%] after:scale-[2.5] after:rounded-[100%] after:bg-linear-to-l from-zinc-400 after:transition-transform after:duration-1000 hover:after:translate-x-[0%] hover:after:translate-y-[0%] ",
linkHover1:
"relative after:absolute after:bg-primary after:bottom-2 after:h-[1px] after:w-2/3 after:origin-bottom-left after:scale-x-100 hover:after:origin-bottom-right hover:after:scale-x-0 after:transition-transform after:ease-in-out after:duration-300",
"relative after:absolute after:bg-primary after:bottom-2 after:h-px after:w-2/3 after:origin-bottom-left after:scale-x-100 hover:after:origin-bottom-right hover:after:scale-x-0 after:transition-transform after:ease-in-out after:duration-300",
linkHover2:
"relative after:absolute after:bg-primary after:bottom-2 after:h-[1px] after:w-2/3 after:origin-bottom-right after:scale-x-0 hover:after:origin-bottom-left hover:after:scale-x-100 after:transition-transform after:ease-in-out after:duration-300",
"relative after:absolute after:bg-primary after:bottom-2 after:h-px after:w-2/3 after:origin-bottom-right after:scale-x-0 hover:after:origin-bottom-left hover:after:scale-x-100 after:transition-transform after:ease-in-out after:duration-300",
},
size: {
default: "h-10 px-4 py-2",
@@ -96,7 +96,7 @@ const Button = React.forwardRef<
)}
<Slottable>{props.children}</Slottable>
{Icon && iconPlacement === "right" && (
<div className="w-0 translate-x-[100%] pl-0 opacity-0 transition-all duration-200 group-hover:w-5 group-hover:translate-x-0 group-hover:pl-2 group-hover:opacity-100">
<div className="w-0 translate-x-full pl-0 opacity-0 transition-all duration-200 group-hover:w-5 group-hover:translate-x-0 group-hover:pl-2 group-hover:opacity-100">
<Icon />
</div>
)}

View File

@@ -9,7 +9,7 @@ const Card = React.forwardRef<
<div
ref={ref}
className={cn(
"rounded-lg border text-card-foreground shadow-sm",
"rounded-lg border text-card-foreground shadow-xs",
className,
)}
{...props}

View File

@@ -15,7 +15,7 @@ import { Separator } from "./separator";
import { Button } from "./button";
const buttonVariants = cva(
"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
{
variants: {
variant: {

View File

@@ -6,7 +6,7 @@ import { Command as CommandPrimitive } from "cmdk";
import { Search } from "lucide-react";
import * as React from "react";
import { Dialog, DialogContent } from "@/components/ui/dialog";
import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog";
import { cn } from "@/lib/utils";
const Command = React.forwardRef<
@@ -47,7 +47,7 @@ const CommandInput = React.forwardRef<
<CommandPrimitive.Input
ref={ref}
className={cn(
"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-hidden placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
className,
)}
{...props}
@@ -118,7 +118,7 @@ const CommandItem = React.forwardRef<
<CommandPrimitive.Item
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected='true']:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50",
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden data-[disabled=true]:pointer-events-none data-[selected='true']:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50",
className,
)}
{...props}

View File

@@ -44,7 +44,7 @@ const DialogContent = React.forwardRef<
{...props}
>
{children}
<DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
<DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
<X className="h-4 w-4" />
<span className="sr-only">Close</span>
</DialogPrimitive.Close>

View File

@@ -27,7 +27,7 @@ const DropdownMenuSubTrigger = React.forwardRef<
<DropdownMenuPrimitive.SubTrigger
ref={ref}
className={cn(
"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",
"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden focus:bg-accent data-[state=open]:bg-accent",
inset && "pl-8",
className,
)}
@@ -47,7 +47,7 @@ const DropdownMenuSubContent = React.forwardRef<
<DropdownMenuPrimitive.SubContent
ref={ref}
className={cn(
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
"z-50 min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className,
)}
{...props}
@@ -65,7 +65,7 @@ const DropdownMenuContent = React.forwardRef<
ref={ref}
sideOffset={sideOffset}
className={cn(
"glass z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover/50 p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
"glass z-50 min-w-32 overflow-hidden rounded-md border bg-popover/50 p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className,
)}
{...props}
@@ -83,7 +83,7 @@ const DropdownMenuItem = React.forwardRef<
<DropdownMenuPrimitive.Item
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
inset && "pl-8",
className,
)}
@@ -99,7 +99,7 @@ const DropdownMenuCheckboxItem = React.forwardRef<
<DropdownMenuPrimitive.CheckboxItem
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
className,
)}
checked={checked}
@@ -123,7 +123,7 @@ const DropdownMenuRadioItem = React.forwardRef<
<DropdownMenuPrimitive.RadioItem
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
className,
)}
{...props}

View File

@@ -10,7 +10,7 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
<input
type={type}
className={cn(
"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
className,
)}
ref={ref}

View File

@@ -41,7 +41,7 @@ NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;
const NavigationMenuItem = NavigationMenuPrimitive.Item;
const navigationMenuTriggerStyle = cva(
"group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50",
"group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-hidden disabled:pointer-events-none disabled:opacity-50 data-active:bg-accent/50 data-[state=open]:bg-accent/50",
);
const NavigationMenuTrigger = React.forwardRef<
@@ -56,7 +56,7 @@ const NavigationMenuTrigger = React.forwardRef<
{children}
{" "}
<ChevronDown
className="relative top-[1px] ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180"
className="relative top-px ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180"
aria-hidden="true"
/>
</NavigationMenuPrimitive.Trigger>
@@ -87,7 +87,7 @@ const NavigationMenuViewport = React.forwardRef<
<div className={cn("absolute left-0 top-full flex justify-center")}>
<NavigationMenuPrimitive.Viewport
className={cn(
"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]",
"origin-top-center relative mt-1.5 h-(--radix-navigation-menu-viewport-height) w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-(--radix-navigation-menu-viewport-width)",
className,
)}
ref={ref}
@@ -105,7 +105,7 @@ const NavigationMenuIndicator = React.forwardRef<
<NavigationMenuPrimitive.Indicator
ref={ref}
className={cn(
"top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in",
"top-full z-1 flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in",
className,
)}
{...props}

View File

@@ -19,7 +19,7 @@ const PopoverContent = React.forwardRef<
align={align}
sideOffset={sideOffset}
className={cn(
"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-hidden data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className,
)}
{...props}

View File

@@ -19,7 +19,7 @@ const SelectTrigger = React.forwardRef<
<SelectPrimitive.Trigger
ref={ref}
className={cn(
"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
className,
)}
{...props}
@@ -75,7 +75,7 @@ const SelectContent = React.forwardRef<
<SelectPrimitive.Content
ref={ref}
className={cn(
"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
"relative z-50 max-h-96 min-w-32 overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
position === "popper"
&& "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
className,
@@ -88,7 +88,7 @@ const SelectContent = React.forwardRef<
className={cn(
"p-1",
position === "popper"
&& "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]",
&& "h-(--radix-select-trigger-height) w-full min-w-(--radix-select-trigger-width)",
)}
>
{children}
@@ -118,7 +118,7 @@ const SelectItem = React.forwardRef<
<SelectPrimitive.Item
ref={ref}
className={cn(
"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",
className,
)}
{...props}

View File

@@ -19,7 +19,7 @@ const Separator = React.forwardRef<
orientation={orientation}
className={cn(
"shrink-0 bg-border",
orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
orientation === "horizontal" ? "h-px w-full" : "h-full w-px",
className,
)}
{...props}

View File

@@ -65,7 +65,7 @@ const SheetContent = React.forwardRef<
{...props}
>
{children}
<SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary">
<SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary">
<X className="h-4 w-4" />
<span className="sr-only">Close</span>
</SheetPrimitive.Close>

View File

@@ -11,7 +11,7 @@ const Switch = React.forwardRef<
>(({ className, ...props }, ref) => (
<SwitchPrimitives.Root
className={cn(
"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",
"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",
className,
)}
{...props}

View File

@@ -43,7 +43,7 @@ const TableFooter = React.forwardRef<
<tfoot
ref={ref}
className={cn(
"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",
"border-t bg-muted/50 font-medium last:[&>tr]:border-b-0",
className,
)}
{...props}

View File

@@ -29,7 +29,7 @@ const TabsTrigger = React.forwardRef<
<TabsPrimitive.Trigger
ref={ref}
className={cn(
"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",
"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-xs",
className,
)}
{...props}
@@ -44,7 +44,7 @@ const TabsContent = React.forwardRef<
<TabsPrimitive.Content
ref={ref}
className={cn(
"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
"mt-2 ring-offset-background focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
className,
)}
{...props}

View File

@@ -9,7 +9,7 @@ const Textarea = React.forwardRef<
return (
<textarea
className={cn(
"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background placeholder:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
className,
)}
ref={ref}

View File

@@ -19,7 +19,7 @@ const TooltipContent = React.forwardRef<
ref={ref}
sideOffset={sideOffset}
className={cn(
"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",
"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-(--radix-tooltip-content-transform-origin)",
className,
)}
{...props}

View File

@@ -1,7 +1,7 @@
import type { Category } from "./types";
export async function fetchCategories() {
const response = await fetch("api/categories");
const response = await fetch(`/ProxmoxVE/api/categories`);
if (!response.ok) {
throw new Error(`Failed to fetch categories: ${response.statusText}`);
}
@@ -10,7 +10,7 @@ export async function fetchCategories() {
}
export async function fetchVersions() {
const response = await fetch(`api/versions`);
const response = await fetch(`/ProxmoxVE/api/versions`);
if (!response.ok) {
throw new Error(`Failed to fetch versions: ${response.statusText}`);
}

View File

@@ -41,6 +41,8 @@ export type Category = {
name: string;
id: number;
sort_order: number;
description: string;
icon: string;
scripts: Script[];
};

View File

@@ -1,6 +1,147 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@import 'tailwindcss';
@custom-variant dark (&:is(.dark *));
@utility container {
margin-inline: auto;
padding-inline: 2rem;
@media (width >= --theme(--breakpoint-sm)) {
max-width: none;
}
@media (width >= 1400px) {
max-width: 1400px;
}
}
@theme {
--color-border: hsl(var(--border));
--color-input: hsl(var(--input));
--color-ring: hsl(var(--ring));
--color-background: hsl(var(--background));
--color-foreground: hsl(var(--foreground));
--color-primary: hsl(var(--primary));
--color-primary-foreground: hsl(var(--primary-foreground));
--color-secondary: hsl(var(--secondary));
--color-secondary-foreground: hsl(var(--secondary-foreground));
--color-destructive: hsl(var(--destructive));
--color-destructive-foreground: hsl(var(--destructive-foreground));
--color-muted: hsl(var(--muted));
--color-muted-foreground: hsl(var(--muted-foreground));
--color-accent: hsl(var(--accent));
--color-accent-foreground: hsl(var(--accent-foreground));
--color-popover: hsl(var(--popover));
--color-popover-foreground: hsl(var(--popover-foreground));
--color-card: hsl(var(--card));
--color-card-foreground: hsl(var(--card-foreground));
--radius-lg: var(--radius);
--radius-md: calc(var(--radius) - 2px);
--radius-sm: calc(var(--radius) - 4px);
--animate-accordion-down: accordion-down 0.2s ease-out;
--animate-accordion-up: accordion-up 0.2s ease-out;
--animate-shine: shine 8s ease-in-out infinite;
--animate-gradient: gradient 8s linear infinite;
@keyframes accordion-down {
from {
height: 0;
}
to {
height: var(--radix-accordion-content-height);
}
}
@keyframes accordion-up {
from {
height: var(--radix-accordion-content-height);
}
to {
height: 0;
}
}
@keyframes shine {
from {
background-position: 200% 0;
}
to {
background-position: -200% 0;
}
}
@keyframes gradient {
to {
background-position: var(--bg-size) 0;
}
}
@keyframes shine-pulse {
0% {
background-position: 0% 0%;
}
50% {
background-position: 100% 100%;
}
to {
background-position: 0% 0%;
}
}
@keyframes moveHorizontal {
0% {
transform: translateX(-50%) translateY(-10%);
}
50% {
transform: translateX(50%) translateY(10%);
}
100% {
transform: translateX(-50%) translateY(-10%);
}
}
@keyframes moveInCircle {
0% {
transform: rotate(0deg);
}
50% {
transform: rotate(180deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes moveVertical {
0% {
transform: translateY(-50%);
}
50% {
transform: translateY(50%);
}
100% {
transform: translateY(-50%);
}
}
}
/*
The default border color has changed to `currentcolor` in Tailwind CSS v4,
so we've added these compatibility styles to make sure everything still
looks the same as it did with Tailwind CSS v3.
If we ever want to remove these styles, we need to add an explicit border
color utility to any element that depends on these defaults.
*/
@layer base {
*,
::after,
::before,
::backdrop,
::file-selector-button {
border-color: var(--color-gray-200, currentcolor);
}
}
@layer base {
:root {

Some files were not shown because too many files have changed in this diff Show More