Skip to content

Releases: xchwarze/frieren

1.4.1 - Yakui

12 Jun 19:10

Choose a tag to compare

Frieren Release Notes - Version 1.4.1

A small follow-up to 1.4.0. The panel got a new shared console that any gadget can plug into, plus some color polish.
Keeping the tradition, here's a track:
‘futility’ by Yakui the Maid - Bandcamp Helltube

This is a focused patch on top of 1.4.0: a reusable read-only console any module can embed, terminal theme contrast polish, a single-source version scheme, and a couple of fixes.

New Features

  • Embeddable Console Output (LogView): A new shared, render-only terminal pane promoted to the core, so any module (or panel surface) can show live, ANSI-coloured tool output without shipping its own terminal. Built on a stripped-down TerminalLiteViewer (xterm with no websocket, input, zmodem, flow-control or webgl) exposed through window.Frieren.TerminalCore. It renders in the operator's configured terminal theme and font automatically (shared terminal-settings), supports both append (streamed/drained deltas) and snapshot (full re-read) feed modes, swallows keystrokes so browser shortcuts like F12 keep working with the view focused, and hides the cursor.

Major Improvements

  • Terminal Theme Polish (WCAG): Reviewed every built-in terminal scheme for contrast against its background. Tuned the custom default theme (red / brightRed now clear AA) and lifted Gruvbox's hard-to-read normal red to its own bright variant. Schemes whose low contrast is intentional design — Nord, Solarized, comment greys and the ANSI black slots — were deliberately left faithful rather than de-identified. The theme map is now shared from terminal-core, so the panel terminal and any module's LogView render identical schemes.

  • Single-Source App Version: The app version is now derived from package.json at build time and injected as VITE_APP_VERSION, instead of being duplicated across the .env files. Bump it in one place and every surface (About, update check, bundle) follows.

  • Terminal CSS Consolidated: xterm styles now load from a single App.jsx import instead of being scattered across the terminal feature and the UMD support shim.

Bug Fixes

  • Deep-Linkable Module Tabs: Dynamic module routes now accept an optional :tab? segment (#/:module/:tab?), so third-party UMD modules get the same bookmarkable, reload-surviving tabs as the built-in pages.

  • Internet Check Tolerance: hasInternetConnection now pings with -c2, so a single dropped packet no longer falsely reports the device as offline before network-dependent operations.

Developer Experience

  • terminal-core as a shared library: Now a first-class shared lib on window.Frieren.TerminalCore. Module authors can drop in a live, themed read-only output pane in a few lines via the core LogView — no per-module terminal plumbing.

Full Changelog: 1.4.0...1.4.1

1.4.0 - Yakui

11 Jun 04:02

Choose a tag to compare

Frieren Release Notes - Version 1.4.0

The panel lived up to my expectations, allowing me to put my gadgets together. So, in keeping with an old tradition, I’m sharing a track with you to celebrate.
‘Youth’ by Yakui the Maid - Bandcamp Helltube

This release is the largest UI and feature pass since launch: a brand-new Network module, a full init.d service manager, a ground-up redesign built on a custom icon font and a shared layout/component system, and a substantial round of backend security hardening — plus deep-linkable tabs, module search/pagination, and a repaired, expanded end-to-end test suite.

New Features

  • Network Module: New top-level Network section (#/network) with three tabs — Interfaces (status, addressing and a single up/down toggle, edit via protocol-aware form modal), DHCP (active leases + configured static-lease reservations with add/delete), and Diagnostics (ping / traceroute / nslookup runner with live output, plus the ARP neighbor table). Backed by a new network backend module with strict host/MAC/IP/interface validation.

  • Init Service Manager: New Services tab under System lists init.d services with boot-enabled and running state, start/stop/restart controls, and an enable-on-boot switch. Disruptive actions against critical services (network, dropbear, uhttpd, firewall) are gated behind a confirmation modal to prevent locking yourself out. Search + pagination over the service list.

  • Custom Icon Font (frieren-icons): Reworked, self-hosted icon font generated with fantasticon, adopted across the whole app in place of Feather. The unused Feather font was dropped, trimming bundle size; icons are optically centered in card titles and buttons.

  • Deep-Linkable Tabs: Tabbed pages (System, Network, Wireless) drive the active tab from the URL (#/system/:tab), so every tab is bookmarkable, shareable and survives reloads. Tab content is rendered conditionally.

  • Module Search & Pagination: Available/installed module cards gained search (by name and description) and pagination, at parity with the package cards.

Major Improvements

  • Design System & Layout Conventions: A unified component layer — PanelCard (now owns its title→content spacing), PanelStack (card-to-card gaps), PanelTable, ActionButtons, FormActions, StatusBadge, ReadOnlyField, and a universal Button wrapper that routes every button through one component. Consistent card icons, panel shadow, spacing and subtitles applied across dashboard, system, network, wireless, packages, modules and settings. (See docs/UI-LAYOUT-CONVENTIONS.md.)

  • API Security Hardening: The backend now serves same-origin only (CORS headers dropped), requires an application/json request body, and disables PHP error display in production. CSRF uses an X-XSRF-TOKEN header double-submit (hash_equals) with SameSite=Lax cookies and centralized token writing. Request timeout raised to 15s.

  • Self-Healing Auth/CSRF Errors: On an auth or CSRF error the client clears its session, redirects to login and shows a single de-duplicated toast (no toast spam from concurrent requests).

  • Minimal-OpenWrt Compatibility: Removed the mbstring dependency (SSID UTF-8 now validated via preg_match) and replaced filter_var usage (the filter PHP extension is absent on minimal OpenWrt images), so Frieren runs on stripped-down builds.

  • System Update Flow: The update wait is now driven through SystemStatusModal, giving a consistent reboot/update progress experience.

UI/UX Improvements

  • Accessibility: titles/aria-labels on all icon-only buttons, keyboard-operable sortable table headers (aria-sort), labeled diagnostics textarea
  • Wireless: red toggle for an enabled interface (was warning color), stable row keys
  • Sidebar reads its collapsed state on init to avoid a load-time animation flash
  • Fixed the gap leaking between tab nav and tab content; tighter, consistent card spacing throughout
  • Form validation feedback now shows for password and switch fields
  • Loading spinner aligned to icon baseline; no tooltip on buttons that already have a visible label
  • News empty-state and assorted card spacing/key fixes across every feature

Bug Fixes

  • Fix first-open terminal race by polling for ttyd startup
  • Stable, order-based module sort
  • Packages/modules search now matches name and description
  • Unique keys for filesystem rows; explicit button type on the search-clear button
  • QA spacing/state fixes across dashboard, system, network, wireless, packages, modules, settings, login

Developer Experience

  • Repaired & Expanded E2E Suite: Playwright battery fixed after the UI refactor (stale selectors, subtitles, tab changes, deep-link nav) and extended to cover the Network module, System Services and the dashboard update alert. The recorded mock fixture is now sanitized (no real MACs/IPs/hostnames/SSIDs/keys) and trimmed, with sanitize+trim applied automatically by the response recorder; a dedicated record project keeps it out of test:all.
  • Config-driven tab containers for Network/Wireless
  • Module template updated to the shared layout conventions, the app Button, and refreshed tooling/deps/docs
  • Terminal moved to port 5001 (-i br-lan), with the front websocket and OpenWrt installer (postinst stops/disables the stock ttyd) updated to match

Full Changelog: 1.3.0...1.4.0

1.3.0

05 Jun 05:27

Choose a tag to compare

Frieren Release Notes - Version 1.3.0

This release centers on the module dependency installation flow — fully rebuilt on top of the unified BackgroundTaskHelper — plus a new shared loading component, an end-to-end test suite, and a round of backend hardening and developer-experience improvements.

New Features

  • Reworked Module Dependency Installation: Dependency installs now run through the standard BackgroundTaskHelper instead of the legacy dependency-installer.sh flag/log scheme. The backend checks internet connectivity and rejects concurrent installs (BackgroundTaskHelper::isRunning), the frontend polls via the shared useBackgroundTask hook, streams live output into a collapsible log panel, and the "installing" module state is persisted (installingModuleAtom) so it survives navigation and reloads.

  • Shared Loading Component: New Loading component renders the spinning loading image. The PNG asset is provided at runtime via window.Frieren.loadingImage (set by umdSupport) instead of being imported directly, so module UMD bundles no longer each inline a base64 copy of the image. Used in RouterProvider (auth bootstrap), SystemStatusModal (reboot/shutdown), and the dependencies alert.

  • HTML Support in News: NewsCard now renders item.description as HTML, allowing links and formatting in dashboard news entries.

  • End-to-End Test Suite: Added a full Playwright setup (playwright.config.js, global/mock setup) with three layers of specs — live API contract tests, mocked-API UI flows, and full UI specs — covering login, navigation, dashboard, hardware, modules, packages, settings, and wireless. Includes a recorded-responses fixture and a response recorder for offline mock runs.

Major Improvements

  • Background Task Concurrency Guards: PackagesController now blocks updateLists while a module dependency install is in progress, and the dependency installer refuses to start when another install is already running — preventing opkg/apk clashes.

  • Backend Refactor: Removed dead manual task-management code and the old modules/bin/dependency-installer.sh (101 lines); dependency installation now lives under packages/bin and streams output through BackgroundTaskHelper::start. installDependency takes a taskName and properly escapes each dependency via escapeshellarg. Controllers reference BackgroundTaskHelper by fully-qualified name instead of per-file use imports.

  • UCI Getter Hardening: uciGet/uciGetJson calls across settings, wireless, and modules now pass the explicit "don't throw on missing key" flag and supply sensible defaults (terminal theme default, font size 13, cursor style block), so missing config no longer errors and validation lookups behave predictably.

  • Package Manager --dest Support: package-manager-call.sh now understands --dest: ignored on apk (no per-destination install), forwarded as --dest <target> where supported — enabling SD-card dependency installs through the shared script.

  • Module Deploy Support: tools/deploy.sh gained a module <name> <src-path> mode that builds a module with yarn and uploads it to the device, alongside the existing back/front/terminal targets.

UI/UX Improvements

  • Dependencies alert shows a collapsible live log panel that auto-scrolls to the latest output, and auto-expands on install failure
  • Reboot/shutdown modal and auth bootstrap screen use the new spinning Loading image instead of the Bootstrap spinner
  • Available/installed module lists sorted by name via the new sortModulesByName helper

Bug Fixes

  • Fix ErrorBoundary bug
  • Fix setupUMDSupport bug (ReactContentLoader export shape)
  • QA fixes across modules and dependency flow

Developer Experience

  • Playwright e2e harness with API-contract, mocked-UI, and full-UI test layers plus a response recorder for regenerating mocks
  • tools/deploy.sh module target for one-command module build + deploy
  • sortModulesByName extracted to a reusable helper
  • installingModuleAtom (persisted) replaces the old dependencyInstallStatusAtom / useGetDependencyInstallationStatus hook
  • BackgroundTaskHelper::isRunning helper for in-progress task detection
  • Module template version bump

Full Changelog: 1.2.0...1.3.0

1.2.0

28 May 04:12

Choose a tag to compare

Frieren Release Notes - Version 1.2.0

This release focuses on polish, reliability, and developer experience — with skeleton loaders across the entire UI, comprehensive toast feedback, cache busting for builds and modules, backend security hardening, and major frontend/backend refactors to standardize patterns.

New Features

  • System Update from Dashboard: Download, install, and reboot directly from the dashboard when an update URL is present in news.json.
    Backend runs the update script in the background with status polling. Frontend shows an update button in the UpdateAlert component with a
    confirmation dialog before proceeding.

  • Skeleton Loaders: Integrated react-content-loader across the entire webapp — wireless, dashboard, settings, and all data-dependent
    views now display skeleton placeholders while loading.

  • Search in Logs: New reusable SearchInput component with clear button, applied to SystemLogsCard for filtering log entries.

  • Wireless Interface Status Feedback: Backend polls wpa_supplicant for STA connection state and network.wireless for AP/monitor status.
    Frontend polls after save and shows success/failure toast with automatic overview refresh.

  • Internet Connectivity Check: Network-dependent operations now verify internet connectivity before proceeding.

  • Package Autoremove: Added autoremove flag support to the package manager.

Major Improvements

  • Backend Refactor: Moved script paths and BackgroundTaskHelper calls from Helpers to Controllers (dashboard, packages) following the
    Hardware pattern. Added escapeshellcmd as default to OpenWrtHelper::exec with a raw flag bypass for commands with pipes/redirects.
    Removed dead code and duplicate constants.

  • Frontend Refactor: Renamed hooks and atoms for clarity (useRouterRulesuseHashLocation, selectedRemoteModuleAtom
    installModuleAtom). Extracted validation schemas and wireless constants to dedicated helper files. Standardized polling interval to 2000ms
    across all useBackgroundTask consumers.

  • Background Task Standardization: New BackgroundTaskHelper on the backend and shared useBackgroundTask hook on the frontend. All
    polling patterns now go through a single, consistent implementation with a 1-hour default timeout to prevent infinite polling.

  • Toast Feedback Everywhere: Added success/error toast notifications to all settings mutations (hostname, timezone, theme, terminal,
    datetime, password) and wireless mutations (toggle, radio config, interface removal). Fixed misleading system action messages on
    shutdown/reboot.

  • Cache Busting: Vite build plugin appends timestamp query parameters to JS/CSS assets. UMD module loading now uses version-based cache
    busting to ensure fresh module loads.

  • Shell Script Hardening: Added error handling to shell scripts, fixed SSH host key verification and SCP protocol issues.

UI/UX Improvements

  • About page replaced with a modal in the system actions dropdown
  • Enhanced reset/shutdown UX flow
  • Sidebar CSS transitions refactored for cleaner expand animation
  • Interface status spinner moved from card title to RadioSection row with a "checking" label
  • Install modal now locks during module installation to prevent accidental closure
  • Bold package name and line break in removal confirmation dialog
  • ConfirmationModal supports loading state with spinner, disabled buttons, and locked backdrop
  • Buttons auto-generate aria-label from label or icon name for accessibility
  • SearchInput clear button is keyboard accessible (tab + enter/space)
  • ErrorFallback now includes a Try Again button
  • Empty state messages for UsbDevicesCard and FileSystemUsageCard
  • Password form clears fields after successful change
  • Dark theme detector logic exported for reuse

Bug Fixes

  • Fix double escaping in exec calls that use escapeshellarg internally
  • Fix form provider reload bug
  • Fix useShutDownMutation internal export name
  • Fix double-encoded HTML entity in ErrorFallback
  • Fix api-test.sh unbound variable with set -u
  • Fix misleading "Logoff user" message on shutdown/reboot actions
  • Multiple QA fixes

Developer Experience

  • BackgroundTaskHelper provides a standard backend pattern for background task polling
  • Validation schemas extracted to reusable helper files
  • Wireless constants (MODE_OPTIONS, NETWORK_OPTIONS, ENCRYPTION_OPTIONS) centralized
  • WPA passphrase max 63 character validation added
  • Cryptic single-letter variables renamed to descriptive names in wireless feature
  • index.php added to backend deploy script

Full Changelog: 1.1.0...1.2.0

1.1.0

26 May 08:21

Choose a tag to compare

Frieren Release Notes - Version 1.1.0

This release represents a major evolution of Frieren, with extensive rewrites across the wireless module, terminal system, and module template tooling — alongside entirely new features like the package manager and news feed.

New Features

  • Packages Manager: Full opkg package management interface. Browse available packages, search, install, and remove packages directly from the web UI. Background task execution for non-blocking installs with real-time status feedback.

  • News Feed: Dashboard now displays project news and update alerts, keeping users informed about new releases and announcements.

  • Terminal Autologin: New setting in Settings module to enable automatic terminal login, removing the need to authenticate each session.

  • Terminal Theme Support: The embedded terminal now supports multiple color themes, configurable from the UI.

Major Improvements

  • Wireless Module Rewrite: Completely rebuilt wireless management. New radio configuration modal, interface form editor with mode-aware fields, wireless scanning modal, association list view, wireless overview with per-radio sections, advanced configuration card, and raw wireless config editing. Full CRUD for wireless interfaces — add, configure, toggle, and remove.

  • Terminal Rewrite: The frieren-terminal subproject was rewritten. New core architecture with xterm.js integration, resize bug fixes, additional options support, and a proper build pipeline that produces inline HTML for ttyd.

  • Module Template Overhaul: New CLI tools for module development — wizard (scaffolding), validate (module checks), update-module (sync dependencies with template), and version-bump (bump version in package.json + manifest.json). Updated Vite config with UMD build, external deps mapping, and compression support.

  • UI/UX Refresh: Revised CSS rules across the framework. Updated general layout and settings layout for improved usability. Toast notifications now follow the active theme. High-resolution favicon.

Bug Fixes & Quality

  • Multiple QA passes on wireless and packages features
  • Module dependency installation fixes
  • Backend refactoring and API core improvements
  • SQLite helper updates

Developer Experience

  • New api-test.sh — CLI tool for testing backend APIs via curl with session management
  • New deploy.sh — SCP-based deployment for backend and frontend to device
  • New ssh-cmd.sh — Run commands on device via SSH
  • Configurable VITE_DEV_PROXY_TARGET for frontend dev proxy
  • License updated

Dependencies

  • Frontend dependencies upgraded across the board
  • Module template pinned to Yarn 4.14.1, Node >=22, Vite 7

Full Changelog: 1.0.0...1.1.0

1.0.0

23 Apr 22:26

Choose a tag to compare

Frieren Release Notes - Version 1.0.0

We're thrilled to unveil Frieren 1.0.0, the inaugural version of our micro-framework tailored for security gadgets. This release brings forward a collection of features optimized for empowering users to manage routers and Single Board Computers (SBCs) with enhanced efficiency and insight. Let’s dive into what’s new:

Features at a Glance:

  • Dashboard: Presenting a snapshot of your system’s health with live data on system load and memory utilization to gauge the current operational state.

  • Hardware: A diagnostic hub presenting system logs, a list of connected USB devices (lsusb), and disk space usage (df). It includes a diagnostic tool to generate system reports.

  • Login: A robust authentication mechanism to protect the management interface from unauthorized access with reinforced security protocols.

  • Modules: An adaptable module framework that enables straightforward installation and management of specialized features to cater to diverse security operations.

  • Settings: Streamline your device’s operations with customizable settings for network identification, interface theming, time synchronization, and secure access controls. Adjust your hostname, select dashboard themes, sync time directly from your browser, configure time zones, and update user credentials effortlessly.

  • Terminal: An embedded terminal emulator that offers direct access to command-line interface (CLI) for advanced device configuration and management tasks.

  • Wireless: A full-fledged toolkit for wireless management, equipped to handle network scanning, connectivity settings, and encryption standards setup for secure wireless operations.

This first release is the result of a concerted effort to ensure each feature not only integrates seamlessly but also performs optimally under various conditions. Your exploration and feedback are invaluable for the continuous enhancement of Frieren.