# Brain Shell -- PR: Improvements and New Features#61
Open
leriart wants to merge 14 commits into
Open
Conversation
…g fixes over upstream v0.1.0 ## Files added (not in upstream) - src/windows/Wallpaper.qml — Native QML wallpaper renderer (Image/GIF/Video) - src/windows/ScreenCorners.qml — Rounded screen corner masks - src/shapes/RoundCorner.qml — Corner mask shape - src/services/AppSearch.qml — Native DesktopEntries app provider + fuzzy search - src/services/FocusGrabManager.qml — Popup focus coordination - src/services/GpuDetector.qml — GPU vendor detection (NVIDIA/AMD/Intel) - src/services/HyprlandService.qml — Centralized Hyprland compositor integration - src/services/HyprlandSyncService.qml — Keybind sync to hyprland.lua - src/services/IdleService.qml — User idle time monitoring - src/services/ScreenshotTool.qml — Screenshot capture tool - src/services/ShellConfigService.qml — Reactive JSON config persistence - src/services/UsageTracker.qml — App launch frequency tracking - src/services/VideoWallpaperService.qml — HW-accelerated video optimization - src/theme/Anim.qml — Unified animation system (durations, easing curves) - src/components/AnimatedBehavior.qml — Reusable animation Behavior wrapper - src/components/StateLayer.qml — M3 interaction overlay (hover/press/ripple) - src/components/StyledRect.qml — Themed rectangle container - src/components/Surface.qml — Elevated surface component - src/components/qmldir — Component type registrations - src/scripts/colorpicker.py — Screen color picker - src/scripts/lockwall.py — Lockscreen wallpaper frame generator - src/scripts/thumbgen.py + thumbgen_batch.py — Thumbnail generators - src/config/shaders/video/ — Motion interpolation + palette tint shaders - src/config/templates/ — App theming templates (discord, gtk, kitty, nvchad) - src/config/matugen-apps.toml — matugen app theming config - cli.sh — Standalone CLI launcher & manager - wrapper.sh — QS wrapper script - version + .gitignore + AGENTS.md ## Files removed (from upstream) - src/scripts/list_apps.py — Replaced by native AppSearch DesktopEntries ## Files modified - shell.qml — Added Wallpaper, ScreenCorners, HyprlandSyncService - src/qmldir — 12 new singleton registrations - src/services/qmldir — IdleService, GpuDetector, AppSearch, UsageTracker - src/services/WallpaperService.qml — Thumbnails, per-screen, filters, watcher, matugen -j fix - src/services/UpdateService.qml — Git repo pre-check - src/services/config_tab/KeybindService.qml — Disabled duplicate _ensureInclude - src/services/config_tab/ShellConfig.qml — Restored upstream placeholder tabs - src/services/system/EnvyControlService.qml — Binary pre-check - src/services/HyprlandSyncService.qml — Disabled bind skipping, overrides fix - src/state/IpcManager.qml — QVariant IPC fix, removed dead commands - src/state/Popups.qml — Removed aiOpen - src/state/ShellState.qml — Wallpaper rendering toggles - src/theme/ColorLoader.qml — 3s polling fallback - src/theme/Metrics.qml — Reactive barEnabled from ShellConfigService - src/theme/Theme.qml + qmldir — Aggregated Colors + Metrics + Anim - src/popups/Dashboard.qml — Restored original visibility-toggle pattern - src/popups/WallpaperPopup.qml — Thumbnails, filters, viewport-aware loading - src/popups/PopupLayer.qml — Removed AssistantSidebar - src/components/TabSwitcher.qml — Anim.standardSmall + theme import - src/windows/TopBar.qml, Border.qml — Minor improvements - flake.nix — PR#60: flake-utils follows nixpkgs, NixOS module cleanup - flake.lock — Updated nixpkgs-unstable + flake-utils - Various popups — Animation fixes (Theme.animDuration → Anim.*)
This fork extends the upstream Brain_Shell with native wallpaper rendering (QML Image/Video/GIF, per-screen wallpapers, thumbnails), per-monitor configuration, Nix flake reproducibility fixes, and dual-format Hyprland bind generation (.lua + .conf). Shell behavior improvements include corrected video playback during idle, reliable matugen color extraction, elimination of duplicate keybind registration, and graceful fallbacks where system tools are unavailable. Unused assets and code paths carried over from earlier experiments have been pruned to match the upstream feature surface.
- Replace deprecated windowrulev2 with windowrule v1 syntax (.conf) using match:class and match:namespace per Hyprland 0.54 wiki - Add window and layer rules to generated .lua files - Fix bind modifier/key separation for multi-modifier combos - Add $mainMod = SUPER definition to generated configs - Fix hypridle.conf redundant lock_cmd fallback chain - Change wallpaper selector to two-click: first selects, second applies - Add grow-from-below transition curtain to wallpaper changes - Fix video/GIF previews filling card area via anchors.fill - Enable cardContent layer for proper MultiEffect mask rendering - Increase thumbnail generation size to 400px for sharper previews - Allow GIFs to use original file as thumbnail fallback
- Save popup open state before closeAll() so toggles actually close on repress
(affected: audio, network, notifications, clipboard, wallpaper, arch-menu, quick-settings)
- Add hl.define_submap('BrainShell_clean') to generated .lua and cli.sh
so keybind interception submap dispatch works correctly
- Fix hypridle.conf redundant lock_cmd fallback chain
- Load apps on Component.onCompleted instead of waiting for launcher visibility - Listen to AppSearch.onListChanged to refresh when new apps are discovered - Replace loadTimer with direct _loadApps() call — no more 150ms delay - Align animation durations with Ambxst: base 300ms (was 250ms) - Add outQuart, outCubic, outSine easing presets from Ambxst - Standard easing now matches OutQuart [0.25,0,0,1] — Ambxst's main curve
- Replace function-call-based easing/duration with pre-computed QtObject properties - Anim.easing() now returns cached QtObject with .type/.bezierCurve (was JS object) - Anim.duration() reads pre-computed int properties (was switch with /speed math) - AnimatedBehavior reads Anim properties directly, no _getEasing() cache needed - Durations return 0 when enabled=false (Ambxst Pattern: Behavior.enabled: Anim.enabled) - Add outQuart, outCubic, outSine presets from Ambxst - Rename spatial easing to spatialEase to avoid name collision with spatial duration
## Animation System (Ambxst-inspired)
### New: FMath.qml — Low-Level Math Engine
- Quake III fast inverse square root (Carmack, Float32Array type-punning)
- 12-bit sin/cos lookup tables (4096 samples, O(1) array access)
- Organic noise: value noise + fractal Brownian motion
- Spring-damper semi-implicit Euler physics integration
- Hermite/quintic smoothstep, ease poly approximations
- Breathe/jitter/settle organic presets
### New: Anim.qml v2 — Physics-Based Animation
- 5 spring presets: Snappy, Bouncy, Gentle, Wobbly, Settle
- 3 micro-interaction curves: Grow, Shrink, Pulse
- Popup open/close pairs, fade in/out, hover on/off
- Dynamic spring(k,d) builder with auto easing selection
- All bezierCurve: var → list<real> (fixes QVariant→QList<double>)
### New: ShellPopupBase.qml — Global Popup Animation
- Single component controlling ALL 7 popup entrance/exit animations
- Open: scale 0.88→1.0 + opacity 0→1 (OutBack + 1.12 overshoot)
- Close: scale 1.0→0.88 + opacity 1→0 (InQuad, faster)
- TransformOrigin anchored to logical edge (Top/Bottom/Left/Right)
- Qt.callLater pattern for first-frame reset
- disableAutoHide for parent-managed lifecycle
### PopupSlide Enhancements
- Added scale+opacity combo during slide (not just translation)
- Open: scale 0.94→1.0 + opacity 0.6→1.0 with OutBack
- Close: smooth scale+opacity fade out
### Global Easing Upgrade
- All sizer width/height: OutQuart→OutBack (organic overshoot)
- All 9 popup sizers animate with unified OutBack feel
- Notch cWidth syncs with dashboard sizer (same OutBack easing)
- TabSwitcher tabs scale 1.04x on hover with OutBack
- IconBtn: scale 1.08x hover / 0.92x press with OutBack
## IPC & Keybind System
### Pipe Reader Optimization
- Old: while true; cat pipe; done (fork per keypress)
- New: while IFS= read -r line; done < pipe (persistent, zero fork)
- Latency: ~50ms→~1ms per keypress
### Missing Command Handlers
- Added _toggleNetwork() helper + cases: wifi-toggle, bt-toggle, vpn-toggle, hotspot-toggle
- All 4 network tab toggles now work via keybinds
### HyprlandSyncService
- Debounce: 1000ms→150ms, initTimer: 3000ms→500ms
- Auto-reload after sync (200ms delay for file write)
- Direct Connections{target: KeybindService} (no 5s timer)
- saveAndReload() only saves (sync handles reload, no race)
## Dashboard Fixes
### Black Gap Elimination
- clip:false + flareHeight: Theme.notchHeight (40px)
- PopupShape flare extends into notch area (was clipped at y=0)
- Dashboard appears to grow FROM inside the notch
### First-Click Dead Zone
- Reverted wantsFocus timer pattern (15ms delay broke interaction)
- Direct keyboardFocus binding: no timing hole
### QFont::setPointSize(0) Warnings
- Sizer close states: height 0→1px (invisible, but prevents font calc at 0)
- Applied to ClipboardPopup, NetworkPopup, WallpaperPopup
## Video Wallpaper
### VP9→H.264 Transcoding (Intel GPU)
- VP9 has no VAAPI decode on Intel → every frame was CPU-decoded
- VideoWallpaperService always outputs H.264 MP4 cache
- needsTranscode() API checks source codec
- Wallpaper.qml blocks original VP9 playback during cache generation
- Preview in WallpaperPopup uses cached H.264, not original VP9
- ffmpeg: -hwaccel none (suppresses VAAPI/Vulkan error spam)
### Grow-From-Below Transition (creator's vision)
- Theme.background curtain covers old wallpaper
- Shrinks upward revealing new wallpaper from bottom
- OutQuart easing, works with all media types
### Two-Click Wallpaper Behavior (creator's vision)
- First click: select/preview
- Second click: apply and close
## Performance
### Adaptive System Timers
- Dashboard open: normal speed (1-2s polling)
- Dashboard closed: reduced (5-8s polling)
- CpuService, MemService, NetService, CpuFreqService, ThermalService, GpuService
### Battery Desktop Detection
- visible: bat.ready && bat.isLaptopBattery
- Auto-hides on desktop, collapses spacing in bar
- implicitWidth/Height → 0 when invisible
### Desktop Bar Gap
- rNotchMinWidth: 200→160 (matches content without battery)
## Fixes
- PopupSlide: added missing import '../theme' (Anim reference)
- qmldir load order: FMath→Anim→Theme→Colors→Metrics (dependency chain)
- NotificationsPopup: duplicate id fix (ShellPopupBase + NotificationList)
- Theme.animDuration added as single tuning point (280ms)
- WallpaperPopup: preview video uses cached H.264 path
- Various brace/id corrections after batch shellpopupbase application
- Fix pipe reader dying after first message by wrapping read loop in infinite while-true so it reopens the FIFO on EOF instead of exiting - Fix send_ipc to use qs ipc as primary (more reliable) and fall back to the named pipe only when qs is unavailable - Align target names across HyprlandSyncService, IpcManager, and CLI: bt-toggle -> bluetooth-toggle notifications-toggle -> notification-toggle - Give each audio tab its own CLI command (audioOut-toggle, audioIn-toggle, audioMix-toggle) so the correct tab opens instead of all three binds opening the output tab - Add missing IPC_MAP entries for bluetooth-toggle, notification-toggle, and the three audio tab targets
…ding - Replace grow-from-below curtain transition with proper snapshot crossfade: ShaderEffectSource freezes the old wallpaper frame, then crossfades it out (opacity 1→0 over 500ms) while the new wallpaper loads underneath. Works seamlessly across all media types (static, GIF, video). - Fix animated video wallpapers sometimes not loading: the Video source binding now falls back to the original path while waiting for the transcoded cache instead of returning an empty source. The _waitingForCache flag is properly set/cleared during cache resolution. - Add content-ready detection so crossfade waits for the new wallpaper to finish loading (Image.Ready / AnimatedImage.Ready / Video Loaded) before starting the transition. A 2s timeout ensures the transition completes even if content detection misses the event. - Remove unused curtain transition code.
…rmats Two root causes fixed: 1. Race condition in snapshot crossfade: Qt.callLater could execute _performSwap before the ShaderEffectSource finished capturing the old frame. Now uses a 50ms frame-delay Timer to guarantee the snapshot is rendered before the wallpaper swap underneath. 2. Stale content-ready detection: the readonly _contentReady binding would return true from the PREVIOUS media type's status (e.g. videoPlayer still Playing when switching to an image). Replaced with explicit Connections on each media element's onStatusChanged that check _expectedPath matches the current type before signaling ready. Added _resetMediaState() to clear sources of unused media elements so their status resets to Null/Loading. Also: crossfade in-progress transitions now queue the incoming path instead of dropping it, ensuring rapid wallpaper changes don't leave a stale snapshot visible.
Replace the three separate always-present media elements (Image, AnimatedImage, Video) that caused stale-state bugs when switching between formats with a Loader-based architecture: - wallImageContainer holds the current wallpaper path as 'source' - wallImageLoader picks the right component (staticImageComponent for images, videoComponent for GIFs/videos) based on file type - On type change the Loader destroys the old component and creates a fresh one — no stale bindings, no source-clearing races - Binding + Connections keep sourceFile synced to the loaded item - Scale+opacity pulse transition on wallpaper change (from NothingLess) - GIF and video share the videoComponent wrapper which delegates to gifPlayerComp or videoPlayerComp sub-loaders - Idle-based pause/resume preserved for animated content - VideoWallpaperService cache support preserved
…views - Replace pulse animation with proper two-layer crossfade system (layerA/layerB alternate, old fades out while new fades in with subtle zoom reveal via Easing.OutBack) - Signal-driven readiness detection instead of blind polling: staticImageComponent, gifPlayerComp, and videoPlayerComp each emit contentReady() when the actual media is decoded and ready to display (Image.Ready, AnimatedImage.Ready, or Video Loaded/ Buffered). A 2.5s safety timeout forces the crossfade if the signal never fires. - Fix video-to-video and gif-to-gif transitions that previously loaded abruptly — the crossfade now waits for the inner Video/ AnimatedImage element to be truly ready before animating. - Use polling Timer (60ms) for Video readiness since onStatusChanged is unavailable on this QtMultimedia/Quickshell Video type. - WallpaperPopup: remove live Video/AnimatedImage preview decoders (heavy GPU cost). All preview cards now use static JPEG thumbnails only, sourceSize reduced 512→256, cardContent set to opacity:0 (single render via MultiEffect mask), removed redundant background Rectangle and QtMultimedia import. - WallpaperPopup: fix rounded-corner mask edges — maskThresholdMin 0.5→0.4, maskSpreadAtMin 1.0→0.0 for crisp corners matching the border frame (radius 10). - Thumbnail generation: --size 400→256, JPEG quality 85→80, add -strip to remove metadata for smaller file sizes.
…and rendering optimizations - feat(wallpaper): instant wallpaper apply with background color extraction - feat(wallpaper): two-layer crossfade transitions with GPU-optimized caching - feat(wallpaper): deterministic thumbnail paths using proxy directory structure - feat(wallpaper): subfolder scanning, directory auto-refresh, and fallback wallpapers - feat(wallpaper): lockscreen frame generation for video/GIF wallpapers - perf(shell): add UseQApplication, NativeTextRendering, DropExpensiveFonts pragmas - perf(render): GPU caching on Speedometer Canvas - perf(theme): remove redundant 3s ColorLoader poll timer - refactor(wallpaper): simplify WallpaperPopup card delegate and PopupLayer imports
- perf(ipc): reduce pipe check from 1s to 30s fallback after startup - perf(services): tie QuickSettings/QuickControl polls to dashboard visibility - perf(services): slow system poll intervals to 30-60s when dashboard closed - perf(network): reduce status poll to 30s when popup closed - fix(video): restore sync getEffectivePath, remove broken async callback queue - fix(installer): remove awww from AUR deps and hyprland autostart blocks - fix(installer): remove duplicate hyprland config block handled by cli.sh - style(anim): replace OutBack with OutCubic across all popup and bar animations - perf(render): GPU caching and pixel rounding on SeamlessBar, Border, RoundCorner - perf(render): GPU caching on ClockCard timer canvas
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Executive Summary
This PR introduces significant improvements across four major areas:
Anim.qmlmodule replacing hardcoded values throughout the shellawwwdependency, with video/GIF support, lazy loading, and thumbnailsbrain-shellcommandNew Files (28)
CLI & Tooling
cli.shwrapper.sh/usr/local/bin/brain-shellthat configures PATH and QML_IMPORT_PATH before delegating tocli.shversion0.1.0).gitignoresrc/config/colors.conf(generated by matugen)Unified Animation System
src/theme/Anim.qmlstandard(Small/Normal/Large/ExtraLarge),emphasized,spatial,spring. Includes global kill-switch (animationsEnabled) and speed multiplier (ShellConfigService.animationSpeed). Pre-defined easing curves (Material 3, decelerate, accelerate, sharp, etc.)src/components/AnimatedBehavior.qmlNumberAnimationwith easing curve cache, spring support, and kill-switch awarenessMaterial 3 Components
src/components/StyledRect.qmltransparent,bg,popup,focus,primary,secondary,error,surface,surfaceVariant,bar. Replaces repeated Rectangle patterns across the shellsrc/components/Surface.qmlsrc/components/StateLayer.qmlsrc/components/qmldirNative Wallpaper (removes awww dependency)
src/windows/Wallpaper.qmlawww. Supports images (Image), videos (Video/QtMultimedia), GIFs (AnimatedImage). Includes crossfade, pause on idle (>30s), and optional palette tint (ported from NothingLess, OFF by default)src/services/VideoWallpaperService.qml~/.cache/Brain_Shell/video-cache/, and multi-monitor dedupsrc/services/GpuDetector.qml/sys/class/drm(NVIDIA/AMD/Intel), exposeshasHardwareDecoderand codecs per vendorNew Services
src/services/HyprlandService.qmlsrc/services/HyprlandSyncService.qmlhyprland.luawhen keybinds change. Readskeybinds.jsonand writeshl.bind()entries to~/.local/share/Brain_Shell/hyprland.luasrc/services/AppSearch.qmlQuickshell.DesktopEntries+ fuzzy search. Replaces thelist_apps.pyPython script. Includes icon cache and 200ms debouncesrc/services/FocusGrabManager.qmlsrc/services/ShellConfigService.qmlshell_config.json) for animation speed, bar enabled, dashboard dimensions, focus mode, auto-updatesrc/services/UsageTracker.qmlusage.jsonsrc/services/IdleService.qmlxprintidlewith timer fallback. EmitsidleTimeout()andactivityResumed()signalssrc/services/ScreenshotTool.qmlRounded Screen Corners
src/shapes/RoundCorner.qmlsrc/windows/ScreenCorners.qmlWlrLayer.Overlaymasking monitor edges with the theme background colorPython Scripts
src/scripts/colorpicker.pygrim+slurp+magick. Copies hex to clipboard and shows notification with previewsrc/scripts/lockwall.pyhyprlocksrc/scripts/thumbgen.pysrc/scripts/thumbgen_batch.pyConfig
src/config/colors.confModified Files (48)
Installer (
install.sh) -- Major Rewritefedora,debian,ubuntu,popgit,curl,bashbefore continuingchmod +x "$REPO_DIR/cli.sh"qsis not in PATH after installing dependencies, clones and builds from source with cmake+ninja. Installs build tools on-demand per distro/usr/local/bin/brain-shellthat configures PATH + QML_IMPORT_PATH before executingcli.sh. Detects and replaces old symlinks~/Pictures/Wallpapers/brain-shell install hyprlandautomaticallyqs,quickshell,hyprctl,matugenbrain-shell,brain-shell help,brain-shell run launchershell.qmlHyprlandSyncServiceWallpaperatWlrLayer.Background(replaces awww)ScreenCornersfor rounded monitor edgesAnimation System (mass migration)
37 files migrated from hardcoded
Theme.animDuration+Easing.InOutCubicto the unifiedAnim.qmlsystem:src/components/TabSwitcher.qml120toAnim.standardSmallsrc/modules/Right/Audio.qmlTheme.animDurationtoAnim.standardNormalsrc/modules/Right/RightContent.qml150toAnim.standardSmall+ easingsrc/modules/Right/SysTray.qmlTheme.animDurationtoAnim.standardSmallsrc/popups/ArchMenu.qmlTheme.animDurationtoAnim.standardNormalsrc/popups/AudioPopup.qmlTheme.animDurationtoAnim.standardNormalsrc/popups/ClipboardPopup.qmlTheme.animDurationtoAnim.standardNormalsrc/popups/Dashboard.qmlTheme.animDurationtoAnim.standardNormalsrc/popups/NetworkPopup.qmlTheme.animDurationtoAnim.standardNormalsrc/popups/NotificationsPopup.qmlTheme.animDurationtoAnim.standardNormalsrc/popups/NotificationToast.qmlTheme.animDurationtoAnim.standardNormalsrc/popups/QuickControl.qmlTheme.animDurationtoAnim.standardNormalsrc/popups/WallpaperPopup.qmlTheme.animDurationtoAnim.standardNormal/Largesrc/services/AppLauncher.qml100/120toAnim.standardSmallsrc/services/BatteryStatus.qmlTheme.animDurationtoAnim.standardNormalsrc/state/Popups.qmlTheme.animDurationtoAnim.standardNormalsrc/windows/Border.qmlTheme.animDurationtoAnim.standardNormalsrc/windows/TopBar.qmlTheme.animDurationtoAnim.standardNormalUpdated theme files:
src/theme/Metrics.qml-- removedanimDuration, linkedbarEnabled,dashboardWidth,dashboardHeighttoShellConfigServicesrc/theme/Theme.qml-- removedanimDuration, added typography system (fontSize("body"|"headline"|"title"|etc))src/theme/qmldir-- registeredAnimsingletonWallpaper & Thumbnails
src/services/WallpaperService.qmlexpressive,rainbow), apply pipeline uses ffmpeg for videos, saveConfig includesperScreensrc/popups/WallpaperPopup.qmlNotifications
src/services/notifications/NotificationService.qmlmaxHistory: 50), JSON persistence innotification_history.json, save debounce,clearHistory()src/services/notifications/NotificationList.qmlViewSection.FullString, header with app icon and name,cacheBuffer: 2000src/popups/NotificationsPopup.qmlAnim.standardNormalClipboard
src/popups/ClipboardPopup.qmlsrc/popups/HistoryTab.qmlcacheBuffer: 2000App Launcher
src/services/AppLauncher.qmlProcesscallinglist_apps.py, now uses nativeAppSearch.fuzzyQuery(). Integration withDesktopEntries,UsageTracker,FocusGrabManager. UsesStyledRectinstead of hardcodedRectanglesrc/services/AppSearch.qmlHyprland & IPC
src/state/IpcManager.qmlscreenshot-screen,screenshot-window,screenshot-region,color-picker,lockscreen. Unified command dispatcher (_dispatchCommand) with switch for all popups. Named pipe reader (/tmp/brain_shell_ipc.pipe) for zero-latency CLI-to-shell IPCsrc/services/HyprlandService.qmlsrc/services/HyprlandSyncService.qmlsrc/services/config_tab/KeybindService.qml_ensureInclude()--HyprlandSyncServicenow handles the unified bind fileSystem Tray
src/modules/Right/SysTray.qmlFlickablewith horizontal scrolling when many items are present. Maximum width of 260px.sourceSizehints for icons. Animations migrated toAnim.standardSmallPerformance
src/modules/Center/CenterContent.qmlsourceSize+asynchronous: truefor iconssrc/services/home/PlayerCard.qmlsourceSize+asynchronous: true, margin fixsrc/services/home/ProfileCard.qmlsourceSize+asynchronous: truesrc/services/home/ClockCard.qmlcacheBuffer: 500src/services/CavaService.qmlisPlaying(previously always active)src/services/UpdateService.qmlsrc/services/system/EnvyControlService.qmlenvycontrolavailability before usesrc/popups/BluetoothTab.qmlsrc/popups/NotificationToast.qmlCanvas & Shapes
src/shapes/PopupShape.qmlantialiasing: true,smooth: true,renderStrategy: Canvas.Cooperative,renderTarget: Canvas.Image,ctx.reset()toctx.clearRect()src/shapes/SeamlessBarShape.qmlsrc/windows/Border.qmlLayout & Shell State
src/theme/ColorLoader.qmlProcesstoTimerpolling (3s) for colors.json path -- more reliable across all filesystemssrc/state/ShellState.qmlsrc/qmldirWallpaperService,VideoWallpaperService,ShellConfigService,HyprlandSyncService,UpdateService,FocusGrabManagersrc/services/qmldirShellConfigService,HyprlandSyncService,AppSearch,UsageTracker,IdleService,GpuDetectorsrc/services/home/CalendarCard.qmlsrc/services/config_tab/ShellConfig.qmlsrc/popups/Dashboard.qmlNix
flake.nixflake-utilswithinputs.nixpkgs.follows, removedexec-oncefrom NixOS module (unreliable via Home Manager -- documented with comment)flake.lockCI
.github/workflows/ci.ymllist_apps.pycheck (file deleted)Removed Files (1)
src/scripts/list_apps.pyAppSearch.qml-- native Quickshell DesktopEntries implementation, faster with no Python process overheadBug Fixes
FocusGrabManager.qml+AppLauncher.qmlQt.callLater()to avoid race conditions with opening animationsSysTray.qmlFlickablewrapper with horizontal scrolling, max width 260pxIpcManager.qmlEnvyControlService.qmlenvycontrolif absentUpdateService.qmlBluetoothTab.qmlPopups.networkOpenCavaService.qmlisPlayingPopupShape.qml,SeamlessBarShape.qml,Border.qmlctx.reset()toctx.clearRect()+ antialiasing + Cooperative render strategyColorLoader.qmlProcessfor path resolutionCalendarCard.qmlNotificationToast.qmlKeybindService.qml_ensureInclude()disabled --HyprlandSyncServicehandles unificationNew Features
1. Standalone CLI (
cli.sh)2. Native Wallpaper Rendering
awwwdependency for renderingShellState.wallpaperTint)3. Native App Launcher
DesktopEntries4. Grouped Notifications
5. Clipboard Search
6. Rounded Screen Corners
WlrLayer.Overlayfollowing the theme color7. Screenshot Tool
8. Color Picker
9. Multi-Distro Installer
brain-shellcommandRefactoring & Code Quality
Unified Animation System
Anim.qmlComponent System
StyledRect.qml-- replaces repeated Rectangle patterns across the shellSurface.qml-- standardized M3 elevationStateLayer.qml-- consistent interaction feedbackAnimatedBehavior.qml-- reusable animations with easing cacheTypography System
Theme.fontSize()replaces hardcodedfont.pixelSizevaluesDecoupled Services
HyprlandServicecentralizes allhyprctlcallsHyprlandSyncServicedecouples bind generation from the keybind editorShellConfigServiceextracts configuration to persistent JSONFocusGrabManagersolves the focus problem centrallyDependency Removal
awww-- replaced by nativeWallpaper.qmllist_apps.py(Python) -- replaced by nativeAppSearch.qml(Quickshell)PR Statistics
Suggested Testing
brain-shell help)hyprland.luaregeneratesqsin PATHBreaking Changes
awwwno longer used for renderingawwwdaemon is still useful formatugen, but wallpaper is rendered nativelylist_apps.pyremovedAppSearch.qmlor QuickshellDesktopEntriesTheme.animDurationremoved from Metrics.qmlMetrics.animDurationAnim.standardNormalorAnim.duration("standard", "normal")_ensureInclude()disabled in KeybindServiceHyprlandSyncService~/.local/share/Brain_Shell/hyprland.lua