V1.0.0-pre1 — Major UI/UX Overhaul, Performance & New Features
⚠️ This is a pre-release for testing purposes.
Please report any issues you encounter. Do not use this in production.How to install this pre-release:
curl -fsSL https://github.com/community-scripts/ProxmoxVE-Local/releases/download/v1.0.0-pre1/pre-release-updater.sh \ -o /opt/pve-local-prerelease-updater.sh && \ chmod +x /opt/pve-local-prerelease-updater.sh && \ bash /opt/pve-local-prerelease-updater.sh
Closes Issues
- Closes #91 — Preset Configurations per PVE Server →
ServerPresetswith full CRUD, DB migration, per-server templates - Closes #509 — Private and shared notes per script →
ScriptNotesPanel,scriptNotestRPC router,script_notesDB table - Closes #495 — Configurable APT-Cacher-NG proxy → APT proxy field in server presets +
/api/settings/apt-proxyroute - Closes #159 — Add ordering by last updated →
FilterBarwith sort options (name, date, updated) - Closes #113 — Add current script version →
VersionDisplayin navbar with GitHub release comparison
Partially Addresses
- Closes #484 — Auto-Detect → 0 Running LXC — SSH
batchDetectContainerTypesrestored with DB-only fallback heuristic; now runs non-blocking viasplitLink - Closes #92 — Updates without user interaction — Silent batch update support via server presets
New Features
Generator Tab
- Full script generator UI for creating custom LXC/VM provisioning scripts
- Pre-fills defaults from PocketBase
install_methodswhen selecting an existing script - Resource configuration (CPU, RAM, Disk), networking, and advanced options
Script Notes
- Per-script notes system with CRUD via
scriptNotestRPC router ScriptNotesPanelcomponent on script detail view- New
script_notesDB table (Prisma migration20260401113636)
Server Presets
- Save/load server configuration presets per server
serverPresetstRPC router with full CRUD- New
server_presetsDB table (same migration) - APT proxy support (
/api/settings/apt-proxyroute)
Sync Modal
SyncModalwith real-time progress, stats, and retry capability- Replaces the old simple
ResyncButton
Appearance Modal
- Extracted from
SettingsModalinto standaloneAppearanceModal - Persisted UI preferences (theme, layout density, etc.)
Server Status Indicator
ServerStatusIndicatorcomponent in navbar showing live Proxmox host reachability- Green (all online) / amber (partial) / red (all offline) pulsing dot
checkServersStatustRPC procedure via SSH connectivity check- 30s auto-refresh, independent of page queries
Version Display & Release Notes
- Compact
VersionDisplayin navbar with update detection ReleaseNotesModalauto-shows after version changegetVersionStatusqueries GitHub API for latest release comparison
Branding & Favicon
- Full favicon set (16/32/192/512px, apple-touch, webmanifest)
- New
logo.pngasset - Removed legacy
favicon.png
Arcane Script
- New tool script:
scripts/tools/addon/arcane.sh(220 lines)
Performance Optimizations
tRPC Split Link Architecture
- Replaced single
httpBatchLinkwithsplitLinkrouting - SSH-heavy queries (
checkServersStatus,getAllInstalledScripts) and external API calls (getVersionStatus) route through separate non-batchedhttpLink - Fast DB queries batch together and return instantly without being blocked by slow SSH/API calls
- Result: Page data visible in <1s instead of 14-25s
Server-Side PocketBase Cache
- In-memory cache with 10min TTL for
getScriptCards,getCategories,getScriptTypes - Cold start: PB requests now parallelized via
Promise.all(was sequential) - Cache auto-invalidated on resync
- Result: Subsequent loads <200ms (was 4s+ every time)
Deferred Tab Queries
getAllInstalledScriptsandgetAllBackupsGroupedonly fire when their tab is visited- Badge counts cached in
localStorage— show last-known count immediately, update on tab visit
Lazy-Loaded Tabs
DownloadedScriptsTab,InstalledScriptsTab,BackupsTab,GeneratorTabloaded vianext/dynamic- Only the active tab's JS is loaded
Component Memoization
ScriptCardandScriptCardListwrapped inReact.memouseCallbackfor event handlers,useMemofor computed values throughoutpage.tsx- Tabs array memoized to prevent re-renders
Query Client Tuning
staleTime: 30 min (was 5 min)gcTime: 1 hourrefetchOnWindowFocus,refetchOnMount,refetchOnReconnectall disabled
Eliminated Save-on-Mount
ScriptsGridandDownloadedScriptsTabno longer POSTsave-filter/view-modeback to server on mount- Init refs skip the first effect fire, saving 2-4 unnecessary network requests per tab
CategorySidebar Icon Optimization
- Hoisted 25 SVG icon elements from React components to a static
iconPaths: Record<string, string>map at module scope - Single SVG template renders path data — eliminates re-creation on every render
UI/UX Improvements
Compact Header
- Removed hero section, moved version display + server status into sticky navbar
- Cleaner layout with branding, status indicators, and action buttons
Script Detail Modal Rewrite
- 2-column layout with keyboard navigation (arrow keys, Escape)
- Portalized dropdown menus for proper z-index handling
Modal System Overhaul
ModalStackProviderwith portal support and proper z-index stacking- All modals standardized with consistent layout and form styles
- Portalized modals prevent overflow clipping
Filter Bar Enhancements
- Category dropdown filter
- Quick filters for Dev/ARM badges
- Persistent filter state with debounced save
Theme & Styling
- Dark mode glass-card opacity tuned (0.06 → 0.04, hover 0.08 → 0.06)
TextViewerdark mode fix: usesvscDarkPlustheme (was invisibletomorrowtheme)- Icon-only action buttons throughout
- Dev badge styling fix: count + smaller "dev" subscript (was ugly "9 dev")
Footer
- Redesigned footer component
Accessibility
role="button"andaria-labelonScriptCardrole="checkbox"+aria-checkedon selection checkboxesaria-labelon close buttons in 8 modals:ScriptDetailModal,ConfigurationModal,GeneralSettingsModal,HelpModal,LXCSettingsModal,AppearanceModal,DiffViewer,TextViewer
Security
CodeQL Fixes
- URL substring sanitization: Changed
string.includes('github.com')tonew URL().hostname === 'github.com'in both.tsand.jsfiles (fixed alerts #5, #6, #7) - Workflow permissions: Added explicit
permissions: contents: readtonode.js.yml,permissions: contents: write, pull-requests: readtorelease-drafter.yml(fixed alerts #1, #3) - server.js: Sanitized env var escaping in shell commands
Hydration Fix
- Added
suppressHydrationWarningto<html>tag inlayout.tsx
Code Quality
Structured Logger Migration
- Migrated
console.log/console.error→logger.info/logger.errorin 5 server TS files:scripts.ts,github.ts,githubJsonService.ts,repositoryService.ts,db.ts
- Structured JSON format with level/msg/time/meta/err fields
Client Console Cleanup
- Removed 11+
console.logcalls from client components
Dependency Pinning
- Next.js pinned to exact
16.2.1(was>=16.2.1)
Database Changes
New Migration: 20260401113636_add_notes_and_presets
script_notestable: per-script notes with sharing supportserver_presetstable: reusable server configuration templates- Indexes on
script_slugandserver_id
Schema Additions
ScriptNoteandServerPresetmodels inschema.prisma
Backend / API
New tRPC Routers
scriptNotes— CRUD for script notesserverPresets— CRUD for server presetsservers.checkServersStatus— SSH-based server reachability
New API Routes
GET/POST /api/settings/apt-proxy— APT proxy configuration
Modified Routers
scripts.getScriptCardsWithCategories— parallelized PB queriesscripts.resyncScripts— invalidates server-side PB cacheinstalledScripts.getAllInstalledScripts— SSH batch detection restored, routed non-batched
File Summary
85 files changed, 11,211 insertions(+), 6,736 deletions(-)
New files: AppearanceModal, AppearanceButton, GeneratorTab, ScriptNotesPanel, ServerStatusIndicator, SyncModal, filterUtils.ts, scriptNotes.ts router, serverPresets.ts router, apt-proxy/route.ts, favicon assets, logo.png, arcane.sh
Major rewrites: ScriptDetailModal, ConfigurationModal, LXCSettingsModal, InstalledScriptsTab, CategorySidebar, page.tsx, globals.css
How to Test This Pre-Release
Option 1: Automated (recommended)
curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE-Local/development/pre-release-updater.sh \
-o /opt/pve-local-prerelease-updater.sh && \
chmod +x /opt/pve-local-prerelease-updater.sh && \
bash /opt/pve-local-prerelease-updater.shThe script will:
- Show all available pre-releases (newest first)
- Let you pick which one to install
- Backup your data, .env, and database
- Download, install, migrate, and build automatically
Option 2: Manual
cd /opt/pve-scripts-local
# Backup
cp -r data /tmp/pve-backup-data
cp .env /tmp/pve-backup-env
# Download & extract
curl -L https://github.com/community-scripts/ProxmoxVE-Local/archive/refs/tags/v1.0.0-pre1.tar.gz | tar xz
# ... follow standard update procedureRollback
If something goes wrong, the updater script creates a timestamped backup in /tmp/pve-prerelease-backup-*. Restore from there and restart the service.