- Removed the `onComplete` prop from the `ActivationModal` component to streamline its functionality.
- Deleted several unused pages including `apikeys.vue`, `changelog.vue`, `flashbackup.vue`, `index.vue`, `login.query.ts`, `login.vue`, `redirect.vue`, `welcome.vue`, `apikeyauthorize.vue`, and `test-update-modal.vue` to improve codebase maintainability.
- This update enhances the clarity and performance of the application by eliminating unnecessary files and simplifying the component structure.
- Changed the time format in the logging configuration from 'HH:mm:ss' to 'SYS:HH:MM:ss' to ensure compatibility with system time settings.
- This update improves the accuracy of log timestamps, enhancing the overall logging functionality.
- Added functionality to the OnboardingTracker to manage first boot completion state, ensuring accurate onboarding flow.
- Introduced tests to verify the behavior of first boot completion logic, including scenarios for both new and existing states.
- Updated the OnboardingService to utilize the new first boot completion check, enhancing the onboarding process by preventing redundant setups.
This update improves the onboarding experience by accurately tracking first boot completion, ensuring a smoother initialization process for users.
- Introduced unlink functionality to manage the upgrade marker file, allowing for better cleanup during onboarding processes.
- Updated the OnboardingTracker to conditionally write the upgrade marker based on the completion of required steps, improving version tracking accuracy.
- Added logic to clear the upgrade marker when all onboarding steps are completed, ensuring a clean state for future upgrades.
- Enhanced tests to verify the correct behavior of version persistence and upgrade marker management during application shutdown.
This update improves the onboarding experience by ensuring accurate version tracking and state management during upgrades.
- Added functionality to read and write an upgrade marker file, allowing the OnboardingTracker to manage version states more effectively.
- Enhanced the OnboardingTracker to infer the last tracked version from the upgrade marker, improving the onboarding experience during version upgrades.
- Updated tests to verify the correct behavior of the upgrade marker handling, ensuring that version information is accurately persisted and retrieved.
This update enhances the onboarding process by providing a reliable mechanism for tracking version upgrades, improving user experience during transitions between versions.
- Added a test to infer config type from file extension when not provided, improving flexibility in config loading.
- Introduced a normalization function for file extensions to ensure consistent validation of config types.
- Refactored state file update handling in the StateManager to streamline event processing and improve error logging.
- Enhanced OnboardingTracker to handle cases where the version is unavailable, ensuring onboarding steps are still surfaced.
This update improves the robustness and maintainability of the configuration and onboarding processes.
- Eliminated the unused `useI18n` import from the `WelcomeModal.standalone.vue` file to clean up the code.
- This update enhances the clarity and maintainability of the component by removing unnecessary dependencies.
- Introduced a new test case in `customization.resolver.spec.ts` to verify that upgrade metadata is omitted when snapshot versions are incomplete.
- Updated the `CustomizationResolver` logic to handle cases where either `currentVersion` or `lastTrackedVersion` is undefined, ensuring accurate response structure.
- This update enhances the robustness of the onboarding process by ensuring correct behavior under incomplete version scenarios.
- Introduced permission checks for the `completeUpgradeStep` mutation in the onboarding process.
- Utilized `UsePermissions` directive to enforce authorization based on `AuthAction.UPDATE_ANY` for the `Resource.WELCOME`.
- This update enhances security by ensuring only authorized users can mark onboarding steps as completed.
- Replaced direct state access with ConfigService in SystemTimeService to improve dependency management and testability.
- Updated unit tests to mock ConfigService for retrieving system time settings, enhancing test isolation.
- Removed unnecessary getters and store dispatch calls, streamlining the service logic.
This update enhances the maintainability and clarity of the SystemTimeService by leveraging NestJS's configuration management capabilities.
- Removed `title`, `description`, and `icon` fields from the `UpgradeStep` type in the GraphQL schema and related TypeScript definitions to simplify the onboarding process.
- Updated documentation to reflect changes in how onboarding steps are tracked and displayed.
- Adjusted related tests and components to ensure compatibility with the updated schema.
This update streamlines the onboarding experience by focusing on essential information for upgrade steps.
- Updated the `activationCodeModal.test.ts` file to integrate Vue app setup for testing the activation code modal store.
- Refactored test initialization to use a defined component and mount the app, improving the test structure and ensuring proper store usage.
- Added cleanup logic to unmount the app after each test, enhancing test isolation and reliability.
This update improves the testing framework for the activation code modal, ensuring better integration with Vue's reactivity system.
- Refactored activation-related components to utilize new translation keys for better localization support.
- Updated `ActivationModal`, `ActivationLicenseStep`, `ActivationPluginsStep`, and others to replace hardcoded strings with translation keys.
- Enhanced test cases to reflect changes in localization, ensuring consistency across the activation flow.
- Added new translation keys in `en.json` for various activation steps and messages.
This update improves the internationalization of the activation process, making it easier to manage translations and enhancing the user experience for non-English speakers.
- Refactored `OnboardingTracker` to utilize a configurable OS version file path based on the data directory.
- Enhanced tests to verify behavior when the data directory is unavailable, ensuring fallback to the default version path.
- Updated related logic to improve version tracking and persistence during application bootstrap.
This update improves flexibility in OS version management and enhances the reliability of onboarding processes.
- Moved RClone related types and inputs back into the generated schema for better structure and clarity.
- Removed legacy references to RClone tracking in the onboarding tracker module to streamline the codebase.
- Updated API configuration to ensure proper formatting and consistency.
This update enhances the organization of the API schema and improves maintainability by removing outdated code references.
- Introduced `OnboardingMutations` to manage the completion of upgrade onboarding steps.
- Added `completeUpgradeStep` mutation to mark specific onboarding steps as completed, returning relevant upgrade information.
- Enhanced `UpgradeInfo` type to include completed steps for better tracking of user progress during OS upgrades.
- Updated `OsVersionTracker` to persist completed onboarding steps alongside OS version tracking.
- Integrated new GraphQL queries and mutations in the frontend to support the onboarding process.
This update improves the user experience by providing a structured way to track and manage onboarding steps during OS upgrades, ensuring users receive appropriate guidance throughout the process.
- Introduced `OsVersionTracker` to manage and persist the current OS version during application bootstrap.
- Updated `ApiConfigPersistence` to remove shutdown handling for OS version tracking, streamlining the logic.
- Enhanced tests for `ApiConfigPersistence` and added tests for `OsVersionTracker` to ensure proper functionality.
- Registered `OsVersionTrackerModule` in `ApiConfigModule` to facilitate OS version management.
This update improves the reliability of OS version tracking and simplifies the configuration persistence logic.
- Added `OnApplicationShutdown` lifecycle hook to `ApiConfigPersistence` for managing OS version tracking during application shutdown.
- Removed the previous method for tracking OS version upgrades and streamlined the logic to set the last seen OS version directly during shutdown.
- Introduced a private variable to store the current OS version for improved state management.
This update improves the reliability of OS version tracking by ensuring it is properly handled during application shutdown, enhancing overall configuration persistence.
- Added `ActivationPluginsStep` component to the activation process, allowing users to select and install essential plugins.
- Updated `ActivationModal` and related test files to incorporate the new plugins step, ensuring proper navigation and functionality.
- Improved state management for selected plugins in `ActivationPluginsStep.vue` to optimize performance.
- Mocked new upgrade onboarding store in tests to support the latest activation flow.
This update improves the activation experience by integrating plugin selection, streamlining the setup process for users.
- Added `UpgradeInfo` type to track OS version changes, including current and previous versions.
- Enhanced `InfoVersions` and GraphQL resolvers to expose upgrade information.
- Introduced `upgradeOnboarding` store to manage visibility and steps for users upgrading their OS.
- Updated `ActivationModal` to handle both fresh installs and upgrade onboarding, displaying relevant steps based on the user's upgrade path.
- Created configuration for defining upgrade steps and conditions in `releaseConfigs.ts`.
- Added new components and logic to facilitate the upgrade onboarding experience, improving user guidance during OS upgrades.
This update streamlines the upgrade process, ensuring users receive contextual onboarding steps when upgrading their Unraid OS, enhancing overall user experience.
- Updated the error logging in the `readCsrfTokenFromVarIni` function to log the error object directly, enhancing the clarity and detail of the logs when CSRF token retrieval fails.
This change improves debugging capabilities by providing more structured error information.
- Introduced a new `ActivationPluginsStep` component for selecting and installing essential plugins during the activation process.
- Updated the `ActivationModal` to include the new plugins step, allowing users to navigate to it after the timezone selection.
- Enhanced the `ActivationSteps` component to reflect the new step in the activation flow.
- Added a button in the test pages to facilitate testing of the new plugins step functionality.
- Improved visibility logic and step handling in the activation modal to accommodate the new workflow.
This update enhances the user experience by allowing for plugin installation as part of the activation process, streamlining setup and configuration.
- Enhanced `ActivationModal.test.ts` to verify rendering of the new `ActivationTimezoneStep` when an activation code is present.
- Modified `ActivationSteps.test.ts` to reflect the addition of a fourth step and updated titles/descriptions accordingly.
- Adjusted visibility logic in `activationCodeModal.test.ts` to ensure the modal is visible during fresh installs when the activation code is missing, aligning with the new user flow.
These changes improve test coverage and ensure the activation process behaves as expected with the recent updates.
- Added a new `ActivationTimezoneStep` component for selecting time zones during the activation process.
- Integrated timezone selection with the `updateSystemTime` mutation to update the system's timezone settings.
- Updated the `ActivationModal` and `ActivationSteps` components to accommodate the new timezone step.
- Improved visibility logic for the activation modal based on the presence of an activation code.
- Introduced a new GraphQL mutation for updating system time, enhancing the API's capability to manage time settings.
This update streamlines the activation process by allowing users to set their timezone, ensuring accurate timestamps across the system.
- Introduced a new GraphQL type `SystemTime` to manage system time settings, including current time, timezone, NTP status, and NTP servers.
- Added `systemTime` query to retrieve current system time configuration.
- Implemented `updateSystemTime` mutation to modify system time settings.
- Created corresponding service and resolver for handling system time logic.
- Added input validation for updating system time, including manual date/time handling.
- Integrated new module into the main resolver module for accessibility.
This update enhances the API's capability to manage and retrieve system time configurations effectively.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
## Release Notes v4.29.2
* **New Features**
* Added iframe mode support with UI adjustments for embedded deployments
* Introduced modal portal system with dark mode integration
* **Bug Fixes**
* Fixed log line deduplication sync issue in Docker log viewer to
prevent orphaned entries
* **Improvements**
* Enhanced table header rendering for consistent behavior and resizing
* Improved notification subscription handling for better stability
* Optimized log viewer initialization behavior
* Simplified organizer API parameter handling
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: Pujit Mehrotra <pujit@lime-technology.com>
Previously, api plugins could only be installed as `peerDependencies` in
the api. This change allows them to be listed as `dependencies` as well.
This makes plugin loading (eg loading Connect) more robust.
Tests:
- [x] Re-logging on 7.3.0-beta.0.5
- Replaced BrandLoading with BrandButton in UpdateOs component for
better user interaction.
- Updated test cases to reflect changes in rendering logic, ensuring the
account button is displayed when no reboot is pending.
- Added functionality to navigate to account update when the button is
clicked.
- Introduced WEBGUI_REDIRECT URL for handling update installations in
the store logic.
Raised by [MitchellThompkins](https://github.com/MitchellThompkins) in
#1848
- Documents how to use Docker to build a local Connect plugin
- Local Plugin flow will now build workspace packages before proceeding
with plugin infra + build
- Removes recommendation to run `pnpm build:watch` from root, as this
race conditions and build cache issues.
- Makes `pnpm dev` from root parallel, preventing servers from blocking
each other.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Documentation**
* Updated development workflow documentation to emphasize Docker-based
plugin builds
* Restructured development modes into three workflows: local Docker
builds, direct deployment, and development servers
* Updated build and deployment instructions
* **Chores**
* Modified dev script for parallel execution
* Refactored build scripts with improved dependency handling
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Fixes#1848
## Background
The `build:dev` script is used for the `unraid:deploy` workflow, and it
implicitly triggered the `predev` script to build the `unraid-ui`
package as needed.
`web` builds depend on `unraid-ui`. In the past, `unraid-ui` was built
during `pnpm install` via a `prepare` step in its `package.json`.
However, this approach doesn't ensure that `web` builds correctly; stale
`unraid-ui` builds could cause false-positives.
So, instead of doing that, we call `predev` from `prebuild`, ensuring
that both local builds and the `unraid:deploy` workflow lazily get the
correct build of `unraid-ui`.
## Summary
Introduces a new Vue-based Docker container management interface
replacing the legacy webgui table.
### Container Management
- Start, stop, pause, resume, and remove containers via GraphQL
mutations
- Bulk actions for managing multiple containers at once
- Container update detection with one-click updates
- Real-time container statistics (CPU, memory, I/O)
### Organization & Navigation
- Folder-based container organization with drag-and-drop support
- Accessible reordering via keyboard controls
- Customizable column visibility with persistent preferences
- Column resizing and reordering
- Filtering and search across container properties
### Auto-start Configuration
- Dedicated autostart view with delay configuration
- Drag-and-drop reordering of start/stop sequences
### Logs & Console
- Integrated log viewer with filtering and download
- Persistent console sessions with shell selection
- Slideover panel for quick access
### Networking
- Port conflict detection and alerts
- Tailscale integration for container networking status
- LAN IP and port information display
### Additional Features
- Orphaned container detection and cleanup
- Template mapping management
- Critical notifications system
- WebUI visit links with Tailscale support
<sub>PR Summary by Claude Opus 4.5</sub>
`myservers.cfg` no longer gets written to or read (except for migration
purposes), so it'd be better to read from the new values instead of
continuing to use the old ones @elibosley @Squidly271 .
unless i'm missing something! see #1805
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Switches to a centralized remote-access configuration with a legacy
fallback and richer client-side handling.
* Optional GraphQL submission path for applying remote settings when
available.
* **Bug Fixes**
* Normalized boolean and port handling to prevent incorrect values
reaching the UI.
* Improved error handling and UI state restoration during save/apply
flows.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
On errors, a `console.error` message should be emitted from the browser
console, tagged `[ReplaceCheck.check]`.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added retry capability for license eligibility checks with a
contextual "Retry" button that appears in error states.
* **Bug Fixes**
* Fixed license status initialization to correctly default to ready
state.
* Enhanced error messaging with specific messages for different failure
scenarios (missing credentials, access denied, server errors).
* Improved status display handling to prevent potential runtime errors.
* **Localization**
* Added "Retry" text translation.
* **Tests**
* Updated and added tests for reset functionality and error handling.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Updated the total startup budget, bootstrap reserved time, and maximum
operation timeout values to enhance API startup reliability. The total
startup budget is now set to 30 seconds, with 20 seconds reserved for
bootstrap and a maximum operation timeout of 5 seconds.
## Summary
Fixes the `estimatedRuntime` field in the UPS GraphQL query to return
values in **seconds** as documented, instead of **minutes**.
## Problem
The `TIMELEFT` value from `apcupsd` is returned in minutes (e.g., `6.0`
for 6 minutes), but the GraphQL schema documentation states:
> Estimated runtime remaining on battery power. **Unit: seconds**.
Example: 3600 means 1 hour of runtime remaining
Currently, the API returns `6` (minutes) instead of `360` (seconds).
## Solution
Convert the `TIMELEFT` value from minutes to seconds by multiplying by
60:
```typescript
// Before
estimatedRuntime: parseInt(upsData.TIMELEFT || '3600', 10),
// After
estimatedRuntime: Math.round(parseFloat(upsData.TIMELEFT || '60') * 60),
```
## Testing
1. Query `upsDevices` before the fix → `estimatedRuntime: 6` (incorrect
- minutes)
2. Query `upsDevices` after the fix → `estimatedRuntime: 360` (correct -
seconds)
Tested on Unraid server with APC UPS connected via apcupsd.
## Related Issues
Fixes#1821
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Corrected UPS battery runtime calculation to interpret provider
TIMELEFT as minutes, convert to seconds, and use a sensible default when
missing—improves displayed battery runtime accuracy.
* **Tests**
* Updated UPS test fixtures to match the minute-based TIMELEFT format
used by the UPS provider.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Necessary for "clean" upgrades to api orchestration (eg changing how the
api is daemonized).
Prior to this, `rc.unraid-api start` would also restart a running api,
which sufficed for application updates, but is insufficient for
orchestration updates.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Improved update reliability by ensuring services are properly stopped
before system modifications occur.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
…on and pnpm-lock.yaml
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added a standalone redirect page that shows "Redirecting..." and
navigates automatically.
* **Improvements**
* Redirect preserves hash callback data, validates targets, and logs the
computed redirect.
* Purchase callback origin changed to a different account host.
* Date/time formatting now tolerates missing or empty server formats
with safe fallbacks.
* Redirect page included in backup/restore.
* **Tests**
* Added tests covering date/time formatting fallbacks.
* **Chores**
* Dependency @unraid/shared-callbacks upgraded.
* Removed multiple demo/debug pages and related test UIs.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
- Added PHP logic to determine if the current theme is dark and set a
CSS variable accordingly.
- Introduced a new function to retrieve the dark mode state from the CSS
variable in JavaScript.
- Updated the theme store to initialize dark mode based on the CSS
variable, ensuring consistent theme application across the application.
This improves user experience by ensuring the correct theme is applied
based on user preferences.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Server-persisted theme mutation and client action to fetch/apply
themes
* **Improvements**
* Safer theme parsing and multi-source initialization (CSS var, storage,
cookie, server)
* Robust dark-mode detection and propagation across document, modals and
teleport containers
* Responsive banner/header gradient handling with tunable CSS variables
and fallbacks
* **Tests**
* Expanded tests for theme flows, dark-mode detection, banner gradients
and manifest robustness
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->