All notable changes to deskify will be documented in this file.
The format is based on Keep a Changelog,
and this project follows early MVP/alpha versioning (e.g. v0.1.1-alpha.2).
- Updated documentation to describe Chromium as the default backend consistently.
doctornow treatscargo taurias optional unless the user chooses--backend tauri.
- Added
deskify updatedisable flags for persisted boolean options:--no-fullscreen--decorations--light-mode
- Added tests for update boolean option resolution and icon link parsing.
- Icon discovery now accepts
<link>tags wherehrefappears beforerel.
- Major internal refactoring of XDG / Base Directory handling:
- Introduced dedicated
src/xdg.rsmodule to centralize all path resolution logic. - Removed duplicated
BaseDirsusage acrossapp.rs,desktop.rs,chromium.rs,doctor.rs, andinstall.rs.
- Introduced dedicated
- Moved remaining unit tests out of
main.rsinto their proper modules (desktop.rs,chromium.rs,tauri.rs,types.rs,validation.rs). - Updated
rust-versionfrom 1.85 to 1.95 to match the project's documented requirements inAGENTS.md. - Changed the default backend from
tauritochromium(the Chromium backend is now the recommended default for most users).
- Fixed a bug in the Chromium backend where writing the icon would fail with
ENOENTbecause the temporary directory was dropped too early. Thanks to @shocklateboy92 for the fix in #1.
- Temporary refactoring artifacts and internal "work-in-progress" comments from the xdg centralization phase (preparation for public repository).
- Significantly reduced code duplication in path handling.
- Cleaner and more maintainable project structure for future development.
- Comprehensive unit test suite (37 tests covering desktop entry escaping, Tauri config generation, validation, Chromium backend, and app config serialization)
- Module refactoring: code split into 10 focused modules (types, validation, tauri, chromium, icon, desktop, install, app, doctor)
- Test coverage gaps resolved with tests for:
desktop_exec_escapehandling of empty strings, whitespace, quotes, and backslashesvalidate_remove_idrejection of uppercase, special characters, and path traversal attempts- Tauri config generation (fullscreen, no-decorations, dark-mode, user-agent, window dimensions, CSP)
- App config serialization roundtrip
- Split
main.rs(~1900 lines) into modular structure:src/types.rs- CLI definitions and typessrc/validation.rs- ID sanitization and validationsrc/tauri.rs- Tauri config and project generationsrc/chromium.rs- Browser detection and exec buildingsrc/icon.rs- Icon fetching and processingsrc/desktop.rs- Desktop entry utilitiessrc/install.rs- App installation logicsrc/app.rs- App management (list/remove/config)src/doctor.rs- Diagnosticssrc/main.rs- Entry point and orchestration
- Accept legacy
profile_scope=defaultin persisted app configs (treated asisolated) and fall back to desktop metadata when a config is invalid - Validate Chromium browser binaries before installing
.desktopentries (prevents silent failures with wrapper scripts)
- AUR publish automation (PKGBUILD generator + GitHub Actions workflow) for
deskify-bin
- Quick Start improvements and Chromium backend troubleshooting notes
- AUR install instructions and alpha warning (
yay -S deskify-bin)
- Persisted app metadata under
~/.local/share/deskify/apps/<id>.json deskify list --verboseto show URL/backend when metadata is available
deskify update <id>no longer requires--urlwhen metadata exists (migrates older installs on first update/build)
- AUR
deskify-binpackaging template with checksums
chromiumcompatibility backend via--backend chromiumusing an installed Chromium-based browser in app mode (no local Tauri build for generated apps)build/updateflags for Chromium backend selection and runtime control:--backend <tauri|chromium>--browser-bin <PATH>--profile-scope <isolated|shared>
- Chromium app install flow with XDG
.desktoplaunchers and per-app metadata (X-Deskify-Backend=chromium) - Optional isolated Chromium profiles under
~/.local/share/deskify/profiles/<id> doctornow reports whether a Chromium-based browser is available inPATH
update <id>now keeps the internal app ID stable even when the display name changeslistnow derives the internal ID from the.desktopfilename (works for both Tauri and Chromium backends)removenow also cleans up Chromium profile directories (when present)updatekeeps Chromium isolated profiles by default to preserve sessions/cookies during reinstall
- Tauri wrapper generation now consistently uses the existing internal ID for generated app identifiers (prevents accidental ID drift during updates)
.desktopcommand generation for Chromium backend now escapes arguments (URLs / user agents with spaces or special characters)
- README now documents backend modes (
taurivschromium) and recommends--backend chromiumfor sites that fail in the system WebView backend - Added Chromium backend usage examples (
--browser-bin,--profile-scope) and updated compatibility notes
build --no-decorationsoption to create frameless windows (decorations: false) for kiosk/dashboard-style setups- README screenshots for KDE/Arch showing launcher integration, running app window, and
deskify listworkflow
- Icon handling now normalizes downloaded and custom icons to RGBA PNG before Tauri build (prevents
icon ... is not RGBAbuild failures)
- Resolved a CI failure caused by Clippy (
items_after_test_module) by moving the test module to the end ofsrc/main.rs
- No functional CLI behavior changes; this is a release/CI correctness follow-up to
v0.1.0-alpha.1
- Initial public MVP/alpha release of
deskify(Linux-only) - CLI commands:
deskify build --url <URL> --name <NAME>deskify listdeskify remove <internal-id>
buildsupports advanced options:--icon--fullscreen--user-agent--dark-mode--width--height
- Tauri-based wrapper generation in a temporary build directory
- XDG desktop integration:
- installs wrapper binary into local executable directory (
~/.local/binfallback) - creates
.desktoplauncher in~/.local/share/applications - installs app icon into
~/.local/share/icons/hicolor/128x128/apps
- installs wrapper binary into local executable directory (
- Automatic favicon download from Google Favicon API with dummy-icon fallback
.desktopmetadata marker (X-Deskify-Managed=true) for more reliable app discovery- Unit tests for:
- app ID sanitization
removeID validation- Deskify desktop entry detection (marker + legacy fallback)
- GitHub CI workflow (
cargo fmt --check,cargo clippy,cargo test,cargo check) - Tag-based GitHub Release workflow to upload a Linux
deskifyCLI binary - GitHub PR template and release-note categorization config
tauri.conf.jsongeneration now uses structured JSON serialization (serde_json) instead of manual string interpolation- App discovery in
listprefers the Deskify marker and keeps a legacy heuristic fallback for older installs - Documentation updated for alpha/MVP positioning, known limitations, smoke tests, and release tagging (
v0.1.0-alpha.N)
removenow validates internal IDs and rejects unsafe values (for example path traversal inputs like../foo)- Generated Tauri config creation is more robust for names/URLs/user agents containing special characters