Skip to content

v1.0.0 Major UI/UX Overhaul, Performance & New Features#545

Draft
MickLesk wants to merge 33 commits intomainfrom
v.1.0.0
Draft

v1.0.0 Major UI/UX Overhaul, Performance & New Features#545
MickLesk wants to merge 33 commits intomainfrom
v.1.0.0

Conversation

@MickLesk
Copy link
Copy Markdown
Member

@MickLesk MickLesk commented Apr 1, 2026

✍️ Description

V.1.0.0 —

Closes Issues

Partially Addresses


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 (pushed to main)

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

🔗 Related PR / Issue

Fixes: #

✅ Prerequisites (X in brackets)

  • Self-review completed – Code follows project standards.
  • Tested thoroughly – Changes work as expected.
  • No security risks – No hardcoded secrets, unnecessary privilege escalations, or permission issues.

Screenshot for frontend Change


🛠️ Type of Change (X in brackets)

  • 🐞 Bug fix – Resolves an issue without breaking functionality.
  • New feature – Adds new, non-breaking functionality.
  • 💥 Breaking change – Alters existing functionality in a way that may require updates.

MickLesk added 4 commits April 1, 2026 13:31
Introduce a full-featured GeneratorTab component for building and exporting script configuration (script selector, CPU/RAM/Disk sliders, advanced networking/features, generate/copy/export/import, and execute). Apply visual and structural UI refactors: new glass-card styles across ScriptCard, ScriptCardList, ScriptDetailModal, Terminal and Footer; update button variants and interaction classes; add Heart icon and extra footer links; update layout to use Manrope + JetBrains Mono fonts, sticky navbar, ambient backgrounds and metadata tweaks. Wire GeneratorTab into the main page and add related icon imports. Misc: small code-style/formatting adjustments and improved deriveScriptPath / handler signatures for clarity.
Add persistent script notes and server presets, plus APT proxy settings and various UI/behavior improvements.

- DB: new migration adds script_notes and server_presets tables and indexes; Prisma schema updated with ScriptNote and ServerPreset models.
- Notes: new client component ScriptNotesPanel with CRUD using a new TRPC router (scriptNotes) and integration into ScriptDetailModal to show/manage private/shared notes.
- APT proxy: new Next.js API route /api/settings/apt-proxy that reads/writes .env vars; GeneralSettingsModal and ConfigurationModal load/save the proxy and pre-fill advanced install vars.
- UX/UI: add copyable install command, version badges on script cards/detail, container ID input in advanced configuration, and styling tweaks (glass-card-static).
- Server/script detection: installedScripts router now attempts to resolve the actual Proxmox node name via SSH and relaxes ID parsing to numeric-only.
- Notifications: appriseService extended to support Gotify endpoints and allow gotify:// scheme, and URL validation adjusted accordingly.

These changes enable user-maintained notes/presets, persistent APT-cacher defaults, improved install UX, better server detection, and additional notification backend support.
Introduce server presets and silent batch update support across API, server, and UI. Added a new serverPresets TRPC router and wired it into the API root. ConfigurationModal now lets users save/load/delete presets tied to a server. InstalledScriptsTab adds a "Silent update" option, a sequential "Update All Containers" batch flow that runs updates with PHS_SILENT=1, and passes envVars into update executions. ScriptExecutionHandler (server.js) now accepts envVars for updates and injects export commands into both local and SSH update flows so environment flags (e.g. PHS_SILENT) are honored. Also added "updated" sort handling in ScriptsGrid, DownloadedScriptsTab and FilterBar, and small typing fixes in appriseService.
Replace usage of the shared prisma import with per-router PrismaClient instances configured with @prisma/adapter-better-sqlite3. Add getNotesDb/getPresetsDb helpers (with DATABASE_URL fallback) and update scriptNotes and serverPresets to use the new client. Also add error handling in read endpoints to return empty arrays on DB failures and ensure create/update/delete use the new client.
MickLesk added 25 commits April 1, 2026 14:31
Convert HelpButton, ResyncButton, ServerSettingsButton and SettingsButton from labeled outline controls to compact ghost icon-only buttons with aria-labels and smaller icons/spinners for a more compact header UI. Simplify ResyncButton markup (smaller spinner/SVG, removed extra contextual text/lastSync layout) and tweak sync message styling. Add Server icon import in ServerSettingsButton. In serverPresets router, replace direct prisma calls with getPresetsDb() and use the returned db instance for all queries and mutations to support the presets DB connection.
Introduce quick filter support and visual indicators for developer/ARM scripts. Added QuickFilter type and quickFilter to FilterState (getDefaultFilters/mergeFiltersWithDefaults) and a quick-filter UI in FilterBar (All, New, Updated, In Dev, ARM). Implemented filtering logic in ScriptsGrid and added category dev counts to surface per-category "dev" counts in CategorySidebar. Added DevBadge and ArmBadge components, used in ScriptCard and ScriptDetailModal; ScriptCard also gets a subtle violet highlight when script.is_dev is true. Fixed script path generation in GeneratorTab to include a `scripts/` prefix. Minor dark-theme adjustments to .glass-card/.glass-card-static background and border-color for improved contrast.
Introduce an Appearance tab in the Settings modal to control theme, text size and layout width (default vs wide). Preferences are saved to localStorage and applied immediately via helper functions (applyTextSize/applyLayoutWidth) and a small inline script injected into <head> to apply saved settings on first paint. Add CSS utility classes for text-size variants and wire up theme buttons (using lucide icons). Also include minor cleanup: optional chaining fix in CategorySidebar and removal of an unused import in ResyncButton.
Apply consistent formatting across several components: convert single quotes to double quotes, reformat the QuickFilter union type and quick-filters array in FilterBar, adjust JSX prop and className string formatting in HelpButton, ScriptCard, ServerSettingsButton, and SettingsButton. These are cosmetic/formatting changes only and do not alter runtime behavior.
Normalize formatting and strengthen typings for Badge; convert single quotes to double, expand variant/type unions, and tidy JSX/props and helper badge components. Rework CategorySidebar: refactor CategoryIcon SVGs for readability, standardize className usage, improve collapsed-state layout and buttons, and ensure categories are filtered/sorted by count with correct icon mapping and counts display. Overall cleanup improves consistency, readability, and type safety across these components.
Introduce a modal stacking system and portal to ensure modals escape parent stacking contexts. ModalStackProvider now computes a zIndex for each registered modal and returns an unregister handle; useRegisterModal returns the zIndex. A ModalPortal component (createPortal to document.body) was added and all modal components were updated to: capture the returned zIndex, wrap their markup in <ModalPortal>, and apply the dynamic zIndex instead of a hardcoded z-50 class. This improves correct layering of multiple modals and avoids backdrop-filter / transform stacking issues.
Use ModalPortal and zIndex values from useRegisterModal across modal components to avoid hardcoded z-50 stacking. Updated ExecutionModeModal, LXCSettingsModal, PublicKeyModal, ReleaseNotesModal, SetupModal, StorageSelectionModal, and TextViewer to import ModalPortal, capture the zIndex returned by useRegisterModal, wrap modal markup in <ModalPortal>, and apply style={{ zIndex }} to backdrops; LXC result overlay uses zIndex + 10 for proper stacking. Also changed LoadingOverlay in VersionDisplay to render with createPortal(document.body) and added the import. These changes centralize stacking behavior and prevent z-index conflicts when multiple modals/overlays are present.
Update CategorySidebar.tsx to derive non-selected icon color classes from categoryIconColorMap for both the "template" and per-category icons. Selected icons still use text-primary; fallbacks preserve previous muted and group-hover classes to retain existing styling when a mapping is absent.
Refactor modal markup across many components to use a consistent wrapper structure and unified Tailwind utility ordering (moved zIndex to outer container, standardized backdrop and centering). Clean up form layouts: align icons, labels and inputs, normalize spacing, error styling, and button variants (including icon/ghost adjustments). Improve AuthModal and CloneCountInputModal UX (loading/error states, closer placement, validation), and normalize BackupWarningModal and other modal presentations. Update ConfigurationModal advanced UI: reorganize network fields and add/handle extra options (IPv6 static, gateway, MTU, MAC, VLAN, DNS), refine presets save/cancel flow, and apply general formatting/whitespace cleanups.
Fix shell escaping when building env export commands by escaping backslashes and quotes (prevents broken exported values) in ScriptExecutionHandler (two locations). Update app metadata to point to favicon files under /favicon, add site manifest, and replace the header Package icon with a next/image using the android-chrome PNG (import Image and adjust markup) for consistent asset handling.
Replace legacy root favicon.png with a full favicon set under public/favicon (android-chrome 192/512, apple-touch-icon, favicon-16x16, favicon-32x32, favicon.ico, favicon.png) and add site.webmanifest. Also add public/logo.png. This organizes favicon assets for multiple platforms and adds a webmanifest for PWA/icon declarations.
Render the script selector dropdown into document.body via createPortal to escape stacking/overflow contexts. Add triggerRef/dropdownRef, compute fixed position from the trigger on open, and attach an outside-click handler to close the dropdown. Also import useRef/useEffect and createPortal; preserve existing search, selection, and reset behaviors while adjusting z-index/positioning.
Replace favicon and logo image files with updated versions to refresh branding. Updated files: public/favicon/android-chrome-192x192.png, public/favicon/android-chrome-512x512.png, public/favicon/apple-touch-icon.png, public/favicon/favicon-16x16.png, public/favicon/favicon-32x32.png, public/favicon/favicon.ico, public/logo.png.
Add an AppearanceModal and AppearanceButton to let users change theme, text size and layout width (persisted in localStorage). Enhance FilterBar with category filtering (selectedCategory, dropdown UI, counts, and outside-click handling). Heavily refactor ScriptDetailModal: layout and visual refresh, new icons, better loading/update/delete/install flows, memoized install command, improved copy behavior, keyboard navigation between scripts (using orderedSlugs + onSelectSlug), clearer status/messages, and various performance/UX tweaks. Wire DownloadedScriptsTab to pass orderedSlugs and onSelectSlug into the ScriptDetailModal. Overall small UI/UX and state-management improvements across components.
Performance and UX improvements: memoize computed values in InstalledScriptsTab (scriptsWithStatus, filteredScripts, uniqueServers) and use useCallback/useMemo in ScriptsGrid to avoid unnecessary re-renders. Memoize ScriptCard and ScriptCardList components and tighten their ScriptCard type alias. Introduce a new SyncModal (ResyncButton) component to run/resync scripts with a progress UI and retry/close behavior, and replace the previous ResyncButton import in page.tsx. Lazy-load heavy tab components (Downloaded, Installed, Backups, Generator) with next/dynamic and add a TabSkeleton loader; consolidate tab definitions into a memoized tabs array. Misc: small prop/prop-name fixes and minor JSX formatting adjustments.
Multiple changes improving UX, reliability, and CI permissions:

- Add scripts/tools/addon/arcane.sh: installer/update/uninstall helper for Arcane (Docker Compose), creates update helper and generates secrets.
- Add ServerStatusIndicator component and integrate into header (src/app/_components/ServerStatusIndicator.tsx, src/app/page.tsx); adjust hero/layout to accommodate inline version + status.
- Enhance GeneratorTab (src/app/_components/GeneratorTab.tsx): fetch full script details by slug, derive and apply default resource values from install_methods, and show an App Defaults info panel.
- Harden repo provider detection (src/server/lib/repositoryUrlValidation.js/.ts): use URL parsing for hostname matching with safe fallback to 'custom'.
- Tune client caching (src/trpc/query-client.ts): increase staleTime to 30min, set gcTime to 1h, and disable automatic refetches on mount/window focus/reconnect.
- Update GitHub Actions permissions: node.js.yml grants contents: read; release-drafter.yml grants contents: write and pull-requests: read.

These changes aim to provide better default resource handling for scripts, visible server reachability, more robust URL parsing, improved client-side cache behavior, and explicit workflow permissions.
Add the React prop suppressHydrationWarning to the <html> element in RootLayout (src/app/layout.tsx) to suppress hydration mismatch warnings. This helps avoid noisy console warnings when server-rendered markup and client rendering differ (e.g., due to dynamic font class injection or other runtime-only differences).
Rework GeneratorTab rendering and small UI/format fixes: tidy the scriptDetail useMemo formatting and restructure the Script Defaults block so defaults (CPU, RAM, HDD) are always shown and OS/version/variant badges render correctly. Minor formatting change to ServerStatusIndicator's fetch call and a small spacing fix on the home page title. Also add imports for getSSHService and the Server type to servers router in preparation for SSH-related functionality.
Annotate the `servers` variable with an explicit array type (id, name, ip, online) and cast `data?.servers` to that type, defaulting to an empty array. This clarifies TypeScript inference and prevents `servers` from being undefined for downstream logic without changing runtime behavior.
Replace the large inline SVG icon map with a compact iconPaths mapping and fallback path, simplifying CategoryIcon rendering. Tighten the dev-count badge markup/styles for better layout. Remove leftover console.debug/log statements from InstalledScriptsTab and LXCSettingsModal. Pin Next.js version to 16.2.1 in package.json (deps and devDeps). Slightly adjust dark glass-card background opacity/hover values in globals.css.
…ecific data

- getAllInstalledScripts: removed SSH batchDetectContainerTypes, use DB-only
  heuristic (lxc_config presence) for VM/LXC detection
- Defer installedScripts + backups queries until their tab is activated
- Initial batch now only fires 3 fast DB queries instead of 7 (incl. SSH)
- Use splitLink to route servers.checkServersStatus through a separate
  non-batched httpLink. SSH queries no longer block fast DB queries from
  returning (was causing 14s+ batch response holding all data hostage).
- Add initialization refs in ScriptsGrid and DownloadedScriptsTab so
  save-filter/view-mode POST effects skip their first fire after load,
  eliminating 2-4 unnecessary network requests per tab mount.
…unts

- Restore batchDetectContainerTypes SSH calls in getAllInstalledScripts
  (shows real VM/LXC state, not just DB heuristic)
- Route getAllInstalledScripts through splitLink (non-batched) so SSH
  never blocks fast DB queries
- Cache installed/backups badge counts in localStorage so tabs show
  last-known counts instantly, updated when fresh data arrives
- Query still deferred until tab is visited (no eager SSH on page load)
MickLesk added 3 commits April 1, 2026 18:17
Make several small refactors and updates across the app:

- Expand single-line early-return checks into multi-line blocks in DownloadedScriptsTab and ScriptsGrid for clarity when skipping initial effect triggers.
- Update Footer links: add separate GitHub (ProxmoxVE-Local) and GitHub (ProxmoxVE) buttons and change the site link to community-scripts.org.
- Minor formatting tweaks in page.tsx (useState initializer and backups ternary) for readability.
- In the scripts API router, fetch script cards and metadata in parallel via Promise.all to reduce latency and return both together.

These changes improve readability and slightly optimize the scripts fetch path.
Introduce a simple server-side in-memory cache for PocketBase data with a 10-minute TTL to reduce PB requests for rarely-changing data. Adds getCached/setCache helpers and a shared _cache store, and exports invalidatePbCache() to clear cached entries. Apply caching to getScriptCards, getCategories, and getScriptTypes, and call invalidatePbCache() in the resyncScripts mutation so fresh data is fetched after a resync.
@MickLesk MickLesk changed the title V.1.0.0 v1.0.0 Major UI/UX Overhaul, Performance & New Features Apr 1, 2026
GeneratorTab: add detection of locally downloaded scripts (query + mutation), compute a slug set for O(1) lookup, and gate selection/execution on download state. Update script list UI to indicate downloadable items, grayscale/opacity non-downloaded entries, and show a download confirmation modal that triggers loadScript mutation and invalidates cache. Add Loader2 and AlertTriangle icons and disable Execute when the selected script isn't downloaded.

ServerStatusIndicator: change from a single aggregate dot to per-node indicators showing each host name and status (green online with ping animation, red offline). Improve handling of loading vs no-configured-servers states and update tooltip/title text for clarity.
@Kaputtnique
Copy link
Copy Markdown

grafik :(

Also, why putting away the good console advanced menu with some infos what the settings do..

Bridges which were avaiable and and and :(

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

3 participants