github community-scripts/ProxmoxVE-Local v1.0.0-pre1

pre-release9 hours ago

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 → ServerPresets with full CRUD, DB migration, per-server templates
  • Closes #509 — Private and shared notes per script → ScriptNotesPanel, scriptNotes tRPC router, script_notes DB table
  • Closes #495 — Configurable APT-Cacher-NG proxy → APT proxy field in server presets + /api/settings/apt-proxy route
  • Closes #159 — Add ordering by last updated → FilterBar with sort options (name, date, updated)
  • Closes #113 — Add current script version → VersionDisplay in navbar with GitHub release comparison

Partially Addresses

  • Closes #484 — Auto-Detect → 0 Running LXC — SSH batchDetectContainerTypes restored with DB-only fallback heuristic; now runs non-blocking via splitLink
  • 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_methods when selecting an existing script
  • Resource configuration (CPU, RAM, Disk), networking, and advanced options

Script Notes

  • Per-script notes system with CRUD via scriptNotes tRPC router
  • ScriptNotesPanel component on script detail view
  • New script_notes DB table (Prisma migration 20260401113636)

Server Presets

  • Save/load server configuration presets per server
  • serverPresets tRPC router with full CRUD
  • New server_presets DB table (same migration)
  • APT proxy support (/api/settings/apt-proxy route)

Sync Modal

  • SyncModal with real-time progress, stats, and retry capability
  • Replaces the old simple ResyncButton

Appearance Modal

  • Extracted from SettingsModal into standalone AppearanceModal
  • Persisted UI preferences (theme, layout density, etc.)

Server Status Indicator

  • ServerStatusIndicator component in navbar showing live Proxmox host reachability
  • Green (all online) / amber (partial) / red (all offline) pulsing dot
  • checkServersStatus tRPC procedure via SSH connectivity check
  • 30s auto-refresh, independent of page queries

Version Display & Release Notes

  • Compact VersionDisplay in navbar with update detection
  • ReleaseNotesModal auto-shows after version change
  • getVersionStatus queries GitHub API for latest release comparison

Branding & Favicon

  • Full favicon set (16/32/192/512px, apple-touch, webmanifest)
  • New logo.png asset
  • Removed legacy favicon.png

Arcane Script

  • New tool script: scripts/tools/addon/arcane.sh (220 lines)

Performance Optimizations

tRPC Split Link Architecture

  • Replaced single httpBatchLink with splitLink routing
  • SSH-heavy queries (checkServersStatus, getAllInstalledScripts) and external API calls (getVersionStatus) route through separate non-batched httpLink
  • 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

  • getAllInstalledScripts and getAllBackupsGrouped only 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, GeneratorTab loaded via next/dynamic
  • Only the active tab's JS is loaded

Component Memoization

  • ScriptCard and ScriptCardList wrapped in React.memo
  • useCallback for event handlers, useMemo for computed values throughout page.tsx
  • Tabs array memoized to prevent re-renders

Query Client Tuning

  • staleTime: 30 min (was 5 min)
  • gcTime: 1 hour
  • refetchOnWindowFocus, refetchOnMount, refetchOnReconnect all disabled

Eliminated Save-on-Mount

  • ScriptsGrid and DownloadedScriptsTab no longer POST save-filter/view-mode back 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

  • ModalStackProvider with 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)
  • TextViewer dark mode fix: uses vscDarkPlus theme (was invisible tomorrow theme)
  • Icon-only action buttons throughout
  • Dev badge styling fix: count + smaller "dev" subscript (was ugly "9 dev")

Footer

  • Redesigned footer component

Accessibility

  • role="button" and aria-label on ScriptCard
  • role="checkbox" + aria-checked on selection checkboxes
  • aria-label on close buttons in 8 modals: ScriptDetailModal, ConfigurationModal, GeneralSettingsModal, HelpModal, LXCSettingsModal, AppearanceModal, DiffViewer, TextViewer

Security

CodeQL Fixes

  • URL substring sanitization: Changed string.includes('github.com') to new URL().hostname === 'github.com' in both .ts and .js files (fixed alerts #5, #6, #7)
  • Workflow permissions: Added explicit permissions: contents: read to node.js.yml, permissions: contents: write, pull-requests: read to release-drafter.yml (fixed alerts #1, #3)
  • server.js: Sanitized env var escaping in shell commands

Hydration Fix

  • Added suppressHydrationWarning to <html> tag in layout.tsx

Code Quality

Structured Logger Migration

  • Migrated console.log/console.errorlogger.info/logger.error in 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.log calls 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_notes table: per-script notes with sharing support
  • server_presets table: reusable server configuration templates
  • Indexes on script_slug and server_id

Schema Additions

  • ScriptNote and ServerPreset models in schema.prisma

Backend / API

New tRPC Routers

  • scriptNotes — CRUD for script notes
  • serverPresets — CRUD for server presets
  • servers.checkServersStatus — SSH-based server reachability

New API Routes

  • GET/POST /api/settings/apt-proxy — APT proxy configuration

Modified Routers

  • scripts.getScriptCardsWithCategories — parallelized PB queries
  • scripts.resyncScripts — invalidates server-side PB cache
  • installedScripts.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.sh

The 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 procedure

Rollback

If something goes wrong, the updater script creates a timestamped backup in /tmp/pve-prerelease-backup-*. Restore from there and restart the service.

Don't miss a new ProxmoxVE-Local release

NewReleases is sending notifications on new releases.