Skip to content

v1.0.0-pre1 Major UI/UX Overhaul, Performance & New Features#566

Open
MickLesk wants to merge 93 commits intomainfrom
v1.0.0
Open

v1.0.0-pre1 Major UI/UX Overhaul, Performance & New Features#566
MickLesk wants to merge 93 commits intomainfrom
v1.0.0

Conversation

@MickLesk
Copy link
Copy Markdown
Member

@MickLesk MickLesk commented Apr 20, 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.error to logger.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

  • 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

  • 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 30 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.
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)
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.
MickLesk added 30 commits April 21, 2026 16:49
- FloatingShell: support backup task mode (isBackup Terminal when
  session.backupStorage is set); adds HardDrive icon, onComplete callback
- ShellContext: extend ShellSession with backupStorage, title, onComplete
- BackupsTab: replace blocking createBackupMutation with FloatingShell backup;
  add 'New Backup' dialog (server -> container -> storage selection)
- InstalledScriptsTab: fix fetchStorages to not show blocking error modal
- VERSION: bump to 1.0.0-pre3, fixed UTF-8 BOM encoding
- FloatingShell is now a single always-mounted window instead of
  conditional branches — visibility:hidden on minimize keeps the
  xterm.js WebSocket alive so 'starting shell session' no longer
  appears on restore
- Header acts as drag handle: mouse-drag repositions the floating
  window freely so the background remains usable
- Maximize still covers full viewport; restore returns to last
  dragged position (or CSS-centered if never dragged)
…ver after backup, local generator command, addon execute_in
Refactor the Backups create dialog for clarity and better state handling: reorganized JSX, normalized formatting, extract typed container lists, and ensure closing the dialog clears selected storage. Adjust server/container/storage selection flows and button behaviors to improve readability and UX. Also apply small readability/formatting fixes in DownloadedScriptsTab (expand onClick), FloatingShell (simplify Math.min expression), and GeneratorTab (wrap ternary for containerId). These are mostly non-functional cleanup and UI clarity changes across the mentioned components.
- GeneratorTab: remove && !!selectedServer from execInContainer so addon
  scripts work in local mode (pct exec works without SSH)
- InstallCommandBlock: add executeIn prop + container picker via tRPC
  listContainersOnServer; pass executeInContainer/containerId/containerType
  to Terminal so addon scripts run inside the container, not on the host
- InstallCommandBlock: remove GitHub/Gitea source toggle; promote
  My Defaults + App Defaults to top-level tabs alongside Default/Alpine/Advanced
- ScriptDetailModal: pass execute_in to InstallCommandBlock; add Runs In
  badges to Details panel
- route.ts: also set process.env.GITHUB_TOKEN in memory after writing to
  .env file - tokens saved via UI now take effect immediately without restart
- github.ts: read process.env.GITHUB_TOKEN directly instead of the frozen
  t3-env snapshot (env.GITHUB_TOKEN is captured once at startup)
- github.ts: switch Authorization to 'Bearer' scheme (works for both classic
  ghp_ and fine-grained github_pat_ tokens per GitHub docs)
- GeneralSettingsModal: fix text-success-foreground / text-error-foreground
  -> text-success / text-error so messages are readable in light mode
  (success-foreground is white, which is invisible on bg-success/10)
- GeneralSettingsModal: update PAT description to mention both token types
- InstallCommandBlock: fix trpc input type for listContainersOnServer
  (serverId now numeric fallback instead of string)
- InstallCommandBlock: align container list mapping to API response shape
  (use id/name instead of vmid)
- InstallCommandBlock: narrow running.containerType type to 'lxc' | 'vm'
- VERSION: bump to 1.0.0-pre5
- package.json: bump app version to 1.0.0-pre5 (installer/build logs)

This resolves the pre4 updater build failures reported in PR comments.
Backups:
- render create-backup dialog in portal with full-screen backdrop
- fix multi-select flow: explicit steps (server -> containers -> storage)
- keep container selection until user clicks Continue
- show storage free capacity (GB) from pvesm status
- show estimated max backup size from selected container disk templates

Generator:
- remove 'This machine (local)' execution option
- require node selection; execute over SSH only
- generated command now always uses local script path (scripts/...)
  instead of remote curl command
- add install mode tabs: Default / My Defaults / App Defaults / Advanced
- apply mode to command/envVars (mode=default|mydefaults|appdefaults|generated)
- use selected container resources as template defaults (cpu/ram/disk)

API:
- getBackupStorages now enriches storages with available/used/total GB
- add getContainersResourceTemplates for per-container cpu/ram/disk templates
Expose many new advanced/container, network and feature settings in GeneratorTab: password, tags, timezone, container/template storage, protection, IPv6 method/ip/gateway, search domain, nameserver, TUN, keyctl, mknod, verbose, APT cacher (with IP), mount filesystems and SSH authorized key. Wire these into command overrides, env-vars generation, export/import and reset logic. UI updated with grouped sections, IPv6 selector buttons, new inputs and toggles, and FieldInput now supports input type and hint. Also minor refactor to templateDefaults lookup formatting.
Apply code style/formatting updates across BackupsTab.tsx and GeneralSettingsModal.tsx: reflow JSX props and elements, add consistent line breaks/commas and minor spacing adjustments (including a spacing fix in the GitHub token text). No logic or behavioral changes.
- Add UNSUPPORTED_TYPES constant ['addon', 'pve'] in scripts router
- Filter these types from getScriptCards, getScriptCardsWithCategories
- Block loadScript and loadMultipleScripts for unsupported types
- Remove addon/pve filter options from FilterBar UI
- Remove unused Wrench/Server icon imports from FilterBar
Close a mismatched <span> in CategorySidebar so the inner "dev" badge is properly nested and rendered. Also reformat several single-line conditionals and adjust className ordering/formatting in GeneratorTab for improved readability; these are stylistic changes with no functional behavior changes.
…ession state

Instead of unmounting FloatingShellWindow (which destroyed xterm + WebSocket),
all session windows are now kept in the DOM and hidden via CSS (display: none)
when minimized. This preserves the terminal session, history, and WebSocket
connection across minimize/restore cycles.
Shell buttons now appear everywhere an installed container is recognized:

- ScriptDetailModal sidebar: 'Containers' section shows each matching
  installed container with a direct Shell button (covers Scripts +
  Downloaded tabs via the modal)
- ScriptsGrid / ScriptCard: shell button appears on cards (card and list
  view) for scripts that have an installed container
- DownloadedScriptsTab: same shell button on cards and list rows
- ScriptCardList: shell button in the header row alongside website link

Matching is done by normalizing the installed script_name against the
card slug (lowercase, strip extension, replace non-alphanumeric with dash).
Only containers with a valid container_id and non-failed status are shown.
The UNSUPPORTED_TYPES filter was applied at the router level in
getScriptCardsWithCategories and getScriptCards. Since DownloadedScriptsTab
builds its list by cross-referencing local files against the GitHub cards
from this endpoint, addon/pve scripts that were already downloaded locally
were invisibly dropped.

Fix: remove the filter from the router, apply it client-side in
ScriptsGrid's combinedScripts memo instead. This means:
- Scripts grid: still hides addon/pve (can't install them)
- Downloaded tab: shows ALL locally downloaded scripts regardless of type
- loadScript / loadMultipleScripts: still block new addon/pve downloads
Reformat code in DownloadedScriptsTab.tsx and ScriptDetailModal.tsx for readability: split the React import across multiple lines, adjust placement/indentation of eslint-disable comments, and reflow object property lines in ScriptDetailModal. These are stylistic changes only and do not modify runtime behavior.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment