Repository: qarmin/czkawka
Branch: master
Commit: 28ae8bae1ebe
Files: 452
Total size: 4.4 MB
Directory structure:
gitextract_ixrhqrgv/
├── .cargo/
│ └── config.toml
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ └── workflows/
│ ├── android.yml
│ ├── linux.yml
│ ├── mac.yml
│ ├── quality.yml
│ └── windows.yml
├── .gitignore
├── .mailmap
├── .rustfmt.toml
├── Cargo.toml
├── Changelog.md
├── LICENSE_CC_BY_4_ICONS
├── LICENSE_MIT_EVERYTHING_OUTSIDE_ANY_CARGO_APP_LIBRARY
├── README.md
├── cedinia/
│ ├── Cargo.toml
│ ├── LICENSE_CC_BY_4_ICONS
│ ├── LICENSE_GPL_APP
│ ├── LICENSE_MIT_CODE
│ ├── README.md
│ ├── TMP_INSTALL.md
│ ├── build.rs
│ ├── i18n/
│ │ ├── en/
│ │ │ └── cedinia.ftl
│ │ └── pl/
│ │ └── cedinia.ftl
│ ├── i18n.toml
│ ├── java/
│ │ ├── CediniaActivity.java
│ │ └── CediniaFilePicker.java
│ ├── res/
│ │ ├── drawable/
│ │ │ ├── ic_launcher_background.xml
│ │ │ └── ic_launcher_foreground.xml
│ │ ├── mipmap-anydpi-v26/
│ │ │ └── ic_launcher.xml
│ │ └── values/
│ │ └── strings.xml
│ ├── src/
│ │ ├── app.rs
│ │ ├── bin/
│ │ │ └── cedinia.rs
│ │ ├── callbacks/
│ │ │ ├── directories.rs
│ │ │ ├── misc.rs
│ │ │ ├── scan.rs
│ │ │ └── selection.rs
│ │ ├── callbacks.rs
│ │ ├── common.rs
│ │ ├── file_picker_android.rs
│ │ ├── lib.rs
│ │ ├── localizer_cedinia.rs
│ │ ├── model.rs
│ │ ├── scan_runner.rs
│ │ ├── scanners.rs
│ │ ├── set_initial_gui_infos.rs
│ │ ├── settings/
│ │ │ ├── gui_settings_values.rs
│ │ │ └── mod.rs
│ │ ├── thumbnail_loader.rs
│ │ ├── translations.rs
│ │ └── volumes.rs
│ └── ui/
│ ├── app_state.slint
│ ├── bottom_nav.slint
│ ├── colors.slint
│ ├── common.slint
│ ├── components.slint
│ ├── directories_screen.slint
│ ├── home_screen.slint
│ ├── main_window.slint
│ ├── results_list.slint
│ ├── scan_progress.slint
│ ├── settings_components.slint
│ ├── settings_screen.slint
│ ├── similar_images_gallery.slint
│ ├── top_bar.slint
│ └── translations.slint
├── ci_tester/
│ ├── Cargo.toml
│ └── src/
│ └── main.rs
├── clippy.toml
├── czkawka_cli/
│ ├── Cargo.toml
│ ├── LICENSE_MIT
│ ├── README.md
│ └── src/
│ ├── commands.rs
│ ├── main.rs
│ └── progress.rs
├── czkawka_core/
│ ├── Cargo.toml
│ ├── LICENSE_CC_BY_4_TEST_FILES
│ ├── LICENSE_MIT
│ ├── README.md
│ ├── benches/
│ │ └── hash_calculation_benchmark.rs
│ ├── build.rs
│ ├── i18n/
│ │ ├── ar/
│ │ │ └── czkawka_core.ftl
│ │ ├── bg/
│ │ │ └── czkawka_core.ftl
│ │ ├── cs/
│ │ │ └── czkawka_core.ftl
│ │ ├── de/
│ │ │ └── czkawka_core.ftl
│ │ ├── el/
│ │ │ └── czkawka_core.ftl
│ │ ├── en/
│ │ │ └── czkawka_core.ftl
│ │ ├── es-ES/
│ │ │ └── czkawka_core.ftl
│ │ ├── fa/
│ │ │ └── czkawka_core.ftl
│ │ ├── fr/
│ │ │ └── czkawka_core.ftl
│ │ ├── it/
│ │ │ └── czkawka_core.ftl
│ │ ├── ja/
│ │ │ └── czkawka_core.ftl
│ │ ├── ko/
│ │ │ └── czkawka_core.ftl
│ │ ├── nl/
│ │ │ └── czkawka_core.ftl
│ │ ├── no/
│ │ │ └── czkawka_core.ftl
│ │ ├── pl/
│ │ │ └── czkawka_core.ftl
│ │ ├── pt-BR/
│ │ │ └── czkawka_core.ftl
│ │ ├── pt-PT/
│ │ │ └── czkawka_core.ftl
│ │ ├── ro/
│ │ │ └── czkawka_core.ftl
│ │ ├── ru/
│ │ │ └── czkawka_core.ftl
│ │ ├── sv-SE/
│ │ │ └── czkawka_core.ftl
│ │ ├── tr/
│ │ │ └── czkawka_core.ftl
│ │ ├── uk/
│ │ │ └── czkawka_core.ftl
│ │ ├── zh-CN/
│ │ │ └── czkawka_core.ftl
│ │ └── zh-TW/
│ │ └── czkawka_core.ftl
│ ├── i18n.toml
│ └── src/
│ ├── common/
│ │ ├── basic_gui_cli.rs
│ │ ├── cache/
│ │ │ └── cleaning.rs
│ │ ├── cache.rs
│ │ ├── config_cache_path.rs
│ │ ├── consts.rs
│ │ ├── dir_traversal.rs
│ │ ├── directories.rs
│ │ ├── extensions.rs
│ │ ├── ffmpeg_utils.rs
│ │ ├── image.rs
│ │ ├── items.rs
│ │ ├── logger.rs
│ │ ├── mod.rs
│ │ ├── model.rs
│ │ ├── process_utils.rs
│ │ ├── progress_data.rs
│ │ ├── progress_stop_handler.rs
│ │ ├── tool_data.rs
│ │ ├── traits.rs
│ │ └── video_utils.rs
│ ├── helpers/
│ │ ├── audio_checker.rs
│ │ ├── debug_timer.rs
│ │ ├── delayed_sender.rs
│ │ ├── ffprobe.rs
│ │ ├── messages.rs
│ │ └── mod.rs
│ ├── lib.rs
│ ├── localizer_core.rs
│ └── tools/
│ ├── bad_extensions/
│ │ ├── core.rs
│ │ ├── mod.rs
│ │ ├── tests.rs
│ │ ├── traits.rs
│ │ └── workarounds.rs
│ ├── bad_names/
│ │ ├── core.rs
│ │ ├── mod.rs
│ │ ├── tests.rs
│ │ └── traits.rs
│ ├── big_file/
│ │ ├── core.rs
│ │ ├── mod.rs
│ │ ├── tests.rs
│ │ └── traits.rs
│ ├── broken_files/
│ │ ├── core.rs
│ │ ├── mod.rs
│ │ ├── tests.rs
│ │ └── traits.rs
│ ├── duplicate/
│ │ ├── core.rs
│ │ ├── mod.rs
│ │ ├── tests.rs
│ │ └── traits.rs
│ ├── empty_files/
│ │ ├── core.rs
│ │ ├── mod.rs
│ │ ├── tests.rs
│ │ └── traits.rs
│ ├── empty_folder/
│ │ ├── core.rs
│ │ ├── mod.rs
│ │ ├── tests.rs
│ │ └── traits.rs
│ ├── exif_remover/
│ │ ├── core.rs
│ │ ├── mod.rs
│ │ ├── tests.rs
│ │ └── traits.rs
│ ├── invalid_symlinks/
│ │ ├── core.rs
│ │ ├── mod.rs
│ │ ├── tests.rs
│ │ └── traits.rs
│ ├── mod.rs
│ ├── same_music/
│ │ ├── core.rs
│ │ ├── mod.rs
│ │ ├── tests.rs
│ │ └── traits.rs
│ ├── similar_images/
│ │ ├── core.rs
│ │ ├── mod.rs
│ │ ├── tests.rs
│ │ └── traits.rs
│ ├── similar_videos/
│ │ ├── core.rs
│ │ ├── mod.rs
│ │ ├── tests.rs
│ │ └── traits.rs
│ ├── temporary/
│ │ ├── core.rs
│ │ ├── mod.rs
│ │ └── traits.rs
│ └── video_optimizer/
│ ├── core/
│ │ ├── video_converter.rs
│ │ └── video_cropper.rs
│ ├── core.rs
│ ├── mod.rs
│ ├── tests.rs
│ └── traits.rs
├── czkawka_gui/
│ ├── Cargo.toml
│ ├── LICENSE_CC_BY_4_ICONS
│ ├── LICENSE_MIT_APP_CODE
│ ├── LICENSE_MIT_WINDOWS_THEME
│ ├── README.md
│ ├── i18n/
│ │ ├── ar/
│ │ │ └── czkawka_gui.ftl
│ │ ├── bg/
│ │ │ └── czkawka_gui.ftl
│ │ ├── cs/
│ │ │ └── czkawka_gui.ftl
│ │ ├── de/
│ │ │ └── czkawka_gui.ftl
│ │ ├── el/
│ │ │ └── czkawka_gui.ftl
│ │ ├── en/
│ │ │ └── czkawka_gui.ftl
│ │ ├── es-ES/
│ │ │ └── czkawka_gui.ftl
│ │ ├── fa/
│ │ │ └── czkawka_gui.ftl
│ │ ├── fr/
│ │ │ └── czkawka_gui.ftl
│ │ ├── it/
│ │ │ └── czkawka_gui.ftl
│ │ ├── ja/
│ │ │ └── czkawka_gui.ftl
│ │ ├── ko/
│ │ │ └── czkawka_gui.ftl
│ │ ├── nl/
│ │ │ └── czkawka_gui.ftl
│ │ ├── no/
│ │ │ └── czkawka_gui.ftl
│ │ ├── pl/
│ │ │ └── czkawka_gui.ftl
│ │ ├── pt-BR/
│ │ │ └── czkawka_gui.ftl
│ │ ├── pt-PT/
│ │ │ └── czkawka_gui.ftl
│ │ ├── ro/
│ │ │ └── czkawka_gui.ftl
│ │ ├── ru/
│ │ │ └── czkawka_gui.ftl
│ │ ├── sv-SE/
│ │ │ └── czkawka_gui.ftl
│ │ ├── tr/
│ │ │ └── czkawka_gui.ftl
│ │ ├── uk/
│ │ │ └── czkawka_gui.ftl
│ │ ├── zh-CN/
│ │ │ └── czkawka_gui.ftl
│ │ └── zh-TW/
│ │ └── czkawka_gui.ftl
│ ├── i18n.toml
│ ├── src/
│ │ ├── compute_results.rs
│ │ ├── connect_things/
│ │ │ ├── connect_about_buttons.rs
│ │ │ ├── connect_button_compare.rs
│ │ │ ├── connect_button_delete.rs
│ │ │ ├── connect_button_hardlink.rs
│ │ │ ├── connect_button_move.rs
│ │ │ ├── connect_button_save.rs
│ │ │ ├── connect_button_search.rs
│ │ │ ├── connect_button_select.rs
│ │ │ ├── connect_button_sort.rs
│ │ │ ├── connect_button_stop.rs
│ │ │ ├── connect_change_language.rs
│ │ │ ├── connect_duplicate_buttons.rs
│ │ │ ├── connect_header_buttons.rs
│ │ │ ├── connect_krokiet_info_dialog.rs
│ │ │ ├── connect_notebook_tabs.rs
│ │ │ ├── connect_popovers_select.rs
│ │ │ ├── connect_popovers_sort.rs
│ │ │ ├── connect_progress_window.rs
│ │ │ ├── connect_same_music_mode_changed.rs
│ │ │ ├── connect_selection_of_directories.rs
│ │ │ ├── connect_settings.rs
│ │ │ ├── connect_show_hide_ui.rs
│ │ │ ├── connect_similar_image_size_change.rs
│ │ │ ├── file_chooser_helpers.rs
│ │ │ └── mod.rs
│ │ ├── gtk_traits.rs
│ │ ├── gui_structs/
│ │ │ ├── common_tree_view.rs
│ │ │ ├── common_upper_tree_view.rs
│ │ │ ├── gui_about.rs
│ │ │ ├── gui_bottom_buttons.rs
│ │ │ ├── gui_compare_images.rs
│ │ │ ├── gui_data.rs
│ │ │ ├── gui_header.rs
│ │ │ ├── gui_main_notebook.rs
│ │ │ ├── gui_popovers_select.rs
│ │ │ ├── gui_popovers_sort.rs
│ │ │ ├── gui_progress_dialog.rs
│ │ │ ├── gui_settings.rs
│ │ │ ├── gui_upper_notebook.rs
│ │ │ └── mod.rs
│ │ ├── help_combo_box.rs
│ │ ├── help_functions.rs
│ │ ├── helpers/
│ │ │ ├── enums.rs
│ │ │ ├── image_operations.rs
│ │ │ ├── list_store_operations.rs
│ │ │ ├── mod.rs
│ │ │ └── model_iter.rs
│ │ ├── initialize_gui.rs
│ │ ├── language_functions.rs
│ │ ├── localizer_gui.rs
│ │ ├── main.rs
│ │ ├── notebook_enums.rs
│ │ ├── notebook_info.rs
│ │ ├── opening_selecting_records.rs
│ │ ├── saving_loading.rs
│ │ ├── taskbar_progress.rs
│ │ ├── taskbar_progress_dummy.rs
│ │ └── taskbar_progress_win.rs
│ └── ui/
│ ├── about_dialog.ui
│ ├── compare_images.ui
│ ├── czkawka.cmb
│ ├── main_window.ui
│ ├── popover_right_click.ui
│ ├── popover_select.ui
│ ├── popover_sort.ui
│ ├── progress.ui
│ └── settings.ui
├── data/
│ ├── com.github.qarmin.czkawka.desktop
│ ├── com.github.qarmin.czkawka.metainfo.xml
│ ├── io.github.qarmin.krokiet.desktop
│ └── io.github.qarmin.krokiet.metainfo.xml
├── instructions/
│ ├── Instruction.md
│ └── Translations.md
├── justfile
├── krokiet/
│ ├── Cargo.toml
│ ├── LICENSE_CC_BY_4_AUDIO_FILES
│ ├── LICENSE_CC_BY_4_ICONS
│ ├── LICENSE_GPL_APP
│ ├── LICENSE_MIT_CODE
│ ├── README.md
│ ├── build.rs
│ ├── i18n/
│ │ ├── ar/
│ │ │ └── krokiet.ftl
│ │ ├── bg/
│ │ │ └── krokiet.ftl
│ │ ├── cs/
│ │ │ └── krokiet.ftl
│ │ ├── de/
│ │ │ └── krokiet.ftl
│ │ ├── el/
│ │ │ └── krokiet.ftl
│ │ ├── en/
│ │ │ └── krokiet.ftl
│ │ ├── es-ES/
│ │ │ └── krokiet.ftl
│ │ ├── fa/
│ │ │ └── krokiet.ftl
│ │ ├── fr/
│ │ │ └── krokiet.ftl
│ │ ├── it/
│ │ │ └── krokiet.ftl
│ │ ├── ja/
│ │ │ └── krokiet.ftl
│ │ ├── ko/
│ │ │ └── krokiet.ftl
│ │ ├── nl/
│ │ │ └── krokiet.ftl
│ │ ├── no/
│ │ │ └── krokiet.ftl
│ │ ├── pl/
│ │ │ └── krokiet.ftl
│ │ ├── pt-BR/
│ │ │ └── krokiet.ftl
│ │ ├── pt-PT/
│ │ │ └── krokiet.ftl
│ │ ├── ro/
│ │ │ └── krokiet.ftl
│ │ ├── ru/
│ │ │ └── krokiet.ftl
│ │ ├── sv-SE/
│ │ │ └── krokiet.ftl
│ │ ├── tr/
│ │ │ └── krokiet.ftl
│ │ ├── uk/
│ │ │ └── krokiet.ftl
│ │ ├── zh-CN/
│ │ │ └── krokiet.ftl
│ │ └── zh-TW/
│ │ └── krokiet.ftl
│ ├── i18n.toml
│ ├── src/
│ │ ├── audio_player.rs
│ │ ├── clear_outdated_video_thumbnails.rs
│ │ ├── common.rs
│ │ ├── connect_clean_cache.rs
│ │ ├── connect_directories_changes.rs
│ │ ├── connect_open.rs
│ │ ├── connect_progress_receiver.rs
│ │ ├── connect_rfd.rs
│ │ ├── connect_row_selection.rs
│ │ ├── connect_save.rs
│ │ ├── connect_scan/
│ │ │ ├── bad_extensions.rs
│ │ │ ├── bad_names.rs
│ │ │ ├── big_files.rs
│ │ │ ├── broken_files.rs
│ │ │ ├── duplicate.rs
│ │ │ ├── empty_files.rs
│ │ │ ├── empty_folders.rs
│ │ │ ├── exif_remover.rs
│ │ │ ├── invalid_symlinks.rs
│ │ │ ├── same_music.rs
│ │ │ ├── similar_images.rs
│ │ │ ├── similar_videos.rs
│ │ │ ├── temporary_files.rs
│ │ │ └── video_optimizer.rs
│ │ ├── connect_scan.rs
│ │ ├── connect_select/
│ │ │ ├── custom_select.rs
│ │ │ └── mod.rs
│ │ ├── connect_show_confirmation.rs
│ │ ├── connect_show_preview.rs
│ │ ├── connect_sort.rs
│ │ ├── connect_stop.rs
│ │ ├── connect_tab_changed.rs
│ │ ├── connect_translation.rs
│ │ ├── create_calculate_task_size.rs
│ │ ├── file_actions/
│ │ │ ├── connect_clean_exif.rs
│ │ │ ├── connect_delete.rs
│ │ │ ├── connect_hardlink.rs
│ │ │ ├── connect_move.rs
│ │ │ ├── connect_optimize_video.rs
│ │ │ ├── connect_rename.rs
│ │ │ ├── connect_symlink.rs
│ │ │ └── mod.rs
│ │ ├── localizer_krokiet.rs
│ │ ├── main.rs
│ │ ├── model_operations/
│ │ │ ├── mod.rs
│ │ │ └── model_processor.rs
│ │ ├── set_initial_gui_info.rs
│ │ ├── set_initial_scroll_list_data_indexes.rs
│ │ ├── settings/
│ │ │ ├── combo_box.rs
│ │ │ ├── mod.rs
│ │ │ └── model.rs
│ │ ├── shared_models.rs
│ │ ├── simpler_model.rs
│ │ └── test_common.rs
│ └── ui/
│ ├── about.slint
│ ├── action_buttons.slint
│ ├── bottom_panel.slint
│ ├── callabler.slint
│ ├── color_palette.slint
│ ├── common.slint
│ ├── fonts.slint
│ ├── gui_state.slint
│ ├── included_paths.slint
│ ├── left_side_panel.slint
│ ├── main_lists.slint
│ ├── main_window.slint
│ ├── popup_action_confirm.slint
│ ├── popup_base.slint
│ ├── popup_centered_text.slint
│ ├── popup_clean_cache.slint
│ ├── popup_clean_exif.slint
│ ├── popup_crop_video.slint
│ ├── popup_custom_select.slint
│ ├── popup_delete.slint
│ ├── popup_move_folders.slint
│ ├── popup_new_directories.slint
│ ├── popup_optimize.slint
│ ├── popup_rename_bad_extensions.slint
│ ├── popup_rename_bad_file_names.slint
│ ├── popup_save.slint
│ ├── popup_select_results.slint
│ ├── popup_sort.slint
│ ├── preview.slint
│ ├── progress.slint
│ ├── selectable_tree_view.slint
│ ├── settings.slint
│ ├── settings_list.slint
│ ├── tool_settings.slint
│ └── translations.slint
└── misc/
├── add_icon_exe/
│ └── Cargo.toml
├── ai_translate/
│ ├── ftl_utils.py
│ ├── pyproject.toml
│ ├── translate.py
│ └── validate_translations.py
├── cargo/
│ ├── PublishCore.sh
│ └── PublishOther.sh
├── compare_files.sh
├── delete_unused_krokiet_slint_imports.py
├── docker/
│ └── Dockerfile
├── find_unused_callbacks.py
├── find_unused_fluent_translations.py
├── find_unused_settings_properties.py
├── find_unused_slint_translations.py
├── flathub.sh
├── gen_android_icons.py
├── nix/
│ ├── flake.nix
│ └── packages.nix
├── remove_comments.py
├── run_checks.sh
├── simplify_and_minify_svg.py
├── test_compilation_speed_size/
│ ├── Cargo.toml
│ ├── README.md
│ ├── generate_md_and_plots.py
│ └── src/
│ ├── main.rs
│ ├── model.rs
│ └── new_chart.rs
├── test_image_perf/
│ ├── Cargo.toml
│ └── src/
│ └── main.rs
└── test_read_perf/
├── Cargo.toml
└── src/
└── main.rs
================================================
FILE CONTENTS
================================================
================================================
FILE: .cargo/config.toml
================================================
[target.x86_64-pc-windows-msvc]
# Increase default stack size to avoid running out of stack
# space in debug builds. The size matches Linux's default.
rustflags = ["-C", "link-arg=/STACK:8000000"]
[target.aarch64-pc-windows-msvc]
# Increase default stack size to avoid running out of stack
# space in debug builds. The size matches Linux's default.
rustflags = ["-C", "link-arg=/STACK:8000000"]
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: qarmin # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve app
title: ''
labels: bug
assignees: ''
---
**Bug Description**
**Steps to reproduce:**
**Terminal output** (optional):
```
Debug log
# UNCOMMENT DETAILS AND PUT LOGS HERE
```
**System**
- Czkawka/Krokiet version:
- OS version:
- Installation method:
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Feature Description**
...
================================================
FILE: .github/workflows/android.yml
================================================
name: 🤖 Android APK
on:
push:
branches: [ master, main ]
pull_request:
branches: [ master, main ]
workflow_dispatch:
jobs:
build-apk:
name: Build Android APK
runs-on: ubuntu-latest
env:
NDK_VERSION: 26.3.11579264
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Java (required by Android SDK)
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'
- name: Set up Android SDK
uses: android-actions/setup-android@v3
- name: Cache Android SDK
uses: actions/cache@v4
with:
path: |
${{ env.ANDROID_SDK_ROOT }}/cmdline-tools
${{ env.ANDROID_SDK_ROOT }}/ndk
${{ env.ANDROID_SDK_ROOT }}/platforms
${{ env.ANDROID_SDK_ROOT }}/platform-tools
${{ env.ANDROID_SDK_ROOT }}/build-tools
key: ${{ runner.os }}-android-sdk-${{ env.NDK_VERSION }}
restore-keys: |
${{ runner.os }}-android-sdk-
- name: Install Android NDK and tools
run: |
rustup target add aarch64-linux-android
cargo install cargo-apk || true
yes | sdkmanager --install "ndk;${NDK_VERSION}"
echo "ANDROID_NDK_ROOT=$ANDROID_HOME/ndk/${NDK_VERSION}" >> $GITHUB_ENV
- name: Cache Cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-android-v1
restore-keys: |
${{ runner.os }}-cargo-
- name: Generate keystores
run: |
sudo apt update || true
sudo apt install -y just
just gen_keystores
- name: Build APK (release)
if: ${{ github.ref == 'refs/heads/master' || github.ref == 'refs/heads/main' }}
run: |
echo "VERS=release" >> $GITHUB_ENV
cargo apk build -p cedinia --lib --release
mv target/release/apk/cedinia.apk cedinia.apk
- name: Build APK (debug)
if: ${{ github.ref != 'refs/heads/master' && github.ref != 'refs/heads/main' }}
run: |
echo "VERS=debug" >> $GITHUB_ENV
cargo apk build -p cedinia --lib
mv target/debug/apk/cedinia.apk cedinia.apk
- name: Upload APK artifact
uses: actions/upload-artifact@v4
with:
name: cedinia-${{ env.VERS }}
path: cedinia.apk
- name: Release
uses: softprops/action-gh-release@v2
if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
with:
tag_name: "Nightly"
files: |
cedinia.apk
token: ${{ secrets.PAT_REPOSITORY }}
================================================
FILE: .github/workflows/linux.yml
================================================
name: 🐧 Linux
on:
push:
pull_request:
schedule:
- cron: '0 0 * * 2'
env:
CARGO_TERM_COLOR: always
CZKAWKA_OFFICIAL_BUILD: ${{ vars.CZKAWKA_OFFICIAL_BUILD }}
jobs:
linux-all:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-22.04, ubuntu-22.04-arm]
steps:
- uses: actions/checkout@v4
- name: Setup env
run: |
ARCHNAME=$([ "${{ runner.arch }}" = "ARM64" ] && echo arm64 || echo x86_64)
echo "ARCHNAME=$ARCHNAME" >> $GITHUB_ENV
- name: Install basic libraries
run: sudo apt update || true; sudo apt install libheif-dev libraw-dev ffmpeg libgtk-4-dev p7zip-full -y
- name: Setup rust version
run: rustup default 1.92.0
- name: Build Release
if: ${{ github.ref == 'refs/heads/master' }}
run: |
sed -i 's/#lto = /lto = /g' Cargo.toml
sed -i 's/#codegen-units /codegen-units /g' Cargo.toml
echo "VERS=release" >> $GITHUB_ENV
cargo build --release
mv target/release/czkawka_cli linux_czkawka_cli_${{ env.ARCHNAME }}
mv target/release/czkawka_gui linux_czkawka_gui_${{ env.ARCHNAME }}
mv target/release/krokiet linux_krokiet_${{ env.ARCHNAME }}
cargo build --release --bin krokiet --no-default-features --features "winit_skia_opengl,winit_software"
mv target/release/krokiet linux_krokiet_skia_opengl_${{ env.ARCHNAME }}
cargo build --release --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software"
mv target/release/krokiet linux_krokiet_skia_vulkan_${{ env.ARCHNAME }}
cargo build --release --bin krokiet --no-default-features --features "femtovg_wgpu"
mv target/release/krokiet linux_krokiet_femtovg_wgpu_${{ env.ARCHNAME }}
cargo build --release --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu"
mv target/release/krokiet linux_krokiet_all_backends_${{ env.ARCHNAME }}
# Fast CI profile, to avoid out of disk space errors
# I doubt that anyone would use debug builds from here, because they are slow and contains not final changes
- name: Build Debug
if: ${{ github.ref != 'refs/heads/master' }}
run: |
sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
echo "VERS=debug" >> $GITHUB_ENV
cargo build --profile fastci
mv target/fastci/czkawka_cli linux_czkawka_cli_${{ env.ARCHNAME }}
mv target/fastci/czkawka_gui linux_czkawka_gui_${{ env.ARCHNAME }}
mv target/fastci/krokiet linux_krokiet_${{ env.ARCHNAME }}
cargo build --bin krokiet --no-default-features --features "winit_skia_opengl,winit_software" --profile fastci
mv target/fastci/krokiet linux_krokiet_skia_opengl_${{ env.ARCHNAME }}
cargo build --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software" --profile fastci
mv target/fastci/krokiet linux_krokiet_skia_vulkan_${{ env.ARCHNAME }}
cargo build --bin krokiet --no-default-features --features "femtovg_wgpu" --profile fastci
mv target/fastci/krokiet linux_krokiet_femtovg_wgpu_${{ env.ARCHNAME }}
cargo build --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu" --profile fastci
mv target/fastci/krokiet linux_krokiet_all_backends_${{ env.ARCHNAME }}
- name: Pack with 7z
run: |
# 7z -mx=3 in rust files, takes 40% less space but is 2x slower than zip -mx=1
# 7z -mx=3 is 8x faster than 7z -mx=5, but generates 20% bigger
# So looks that -mx=3 is the best option
time 7z a -t7z -mx=3 czkawka_all.7z \
linux_czkawka_cli_${{ env.ARCHNAME }} \
linux_czkawka_gui_${{ env.ARCHNAME }} \
linux_krokiet_${{ env.ARCHNAME }} \
linux_krokiet_skia_opengl_${{ env.ARCHNAME }} \
linux_krokiet_skia_vulkan_${{ env.ARCHNAME }} \
linux_krokiet_femtovg_wgpu_${{ env.ARCHNAME }} \
linux_krokiet_all_backends_${{ env.ARCHNAME }}
- name: Store
uses: actions/upload-artifact@v4
with:
name: all-${{ runner.os }}-${{ runner.arch }}-${{ env.VERS }}
path: |
czkawka_all.7z
- name: Release
if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
uses: softprops/action-gh-release@v2
with:
tag_name: "Nightly"
files: |
linux_czkawka_cli_${{ env.ARCHNAME }}
linux_czkawka_gui_${{ env.ARCHNAME }}
linux_krokiet_${{ env.ARCHNAME }}
linux_krokiet_skia_opengl_${{ env.ARCHNAME }}
linux_krokiet_skia_vulkan_${{ env.ARCHNAME }}
linux_krokiet_femtovg_wgpu_${{ env.ARCHNAME }}
linux_krokiet_all_backends_${{ env.ARCHNAME }}
token: ${{ secrets.PAT_REPOSITORY }}
# Some dependencies requires ubuntu 24.04
linux-all-extra:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-24.04, ubuntu-24.04-arm]
steps:
- uses: actions/checkout@v4
- name: Setup env
run: |
ARCHNAME=$([ "${{ runner.arch }}" = "ARM64" ] && echo arm64 || echo x86_64)
echo "ARCHNAME=$ARCHNAME" >> $GITHUB_ENV
- name: Install basic libraries
run: sudo apt update || true; sudo apt install libheif-dev libraw-dev ffmpeg libgtk-4-dev p7zip-full -y
- name: Setup rust version
run: rustup default 1.92.0
- name: Build Release
if: ${{ github.ref == 'refs/heads/master' }}
run: |
sed -i 's/#lto = /lto = /g' Cargo.toml
sed -i 's/#codegen-units /codegen-units /g' Cargo.toml
echo "VERS=release" >> $GITHUB_ENV
cargo build --release --features "heif,libraw"
mv target/release/czkawka_cli linux_czkawka_cli_heif_raw_${{ env.ARCHNAME }}
mv target/release/czkawka_gui linux_czkawka_gui_heif_raw_${{ env.ARCHNAME }}
mv target/release/krokiet linux_krokiet_heif_raw_${{ env.ARCHNAME }}
cargo build --release --bin krokiet --no-default-features --features "winit_skia_opengl,winit_software,heif,libraw"
mv target/release/krokiet linux_krokiet_heif_raw_skia_opengl_${{ env.ARCHNAME }}
cargo build --release --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software,heif,libraw"
mv target/release/krokiet linux_krokiet_heif_raw_skia_vulkan_${{ env.ARCHNAME }}
cargo build --release --bin krokiet --no-default-features --features "femtovg_wgpu,heif,libraw"
mv target/release/krokiet linux_krokiet_heif_raw_femtovg_wgpu_${{ env.ARCHNAME }}
cargo build --release --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu,heif,libraw"
mv target/release/krokiet linux_krokiet_heif_raw_all_backends_${{ env.ARCHNAME }}
# Fast CI profile, to avoid out of disk space errors
# I doubt that anyone would use debug builds from here, because they are slow and contains not final changes
- name: Build Debug
if: ${{ github.ref != 'refs/heads/master' }}
run: |
sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
echo "VERS=debug" >> $GITHUB_ENV
cargo build --features "heif,libraw" --profile fastci
mv target/fastci/czkawka_cli linux_czkawka_cli_heif_raw_${{ env.ARCHNAME }}
mv target/fastci/czkawka_gui linux_czkawka_gui_heif_raw_${{ env.ARCHNAME }}
mv target/fastci/krokiet linux_krokiet_heif_raw_${{ env.ARCHNAME }}
cargo build --bin krokiet --no-default-features --features "winit_skia_opengl,winit_software,heif,libraw" --profile fastci
mv target/fastci/krokiet linux_krokiet_heif_raw_skia_opengl_${{ env.ARCHNAME }}
cargo build --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software,heif,libraw" --profile fastci
mv target/fastci/krokiet linux_krokiet_heif_raw_skia_vulkan_${{ env.ARCHNAME }}
cargo build --bin krokiet --no-default-features --features "femtovg_wgpu,heif,libraw" --profile fastci
mv target/fastci/krokiet linux_krokiet_heif_raw_femtovg_wgpu_${{ env.ARCHNAME }}
cargo build --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu,heif,libraw" --profile fastci
mv target/fastci/krokiet linux_krokiet_heif_raw_all_backends_${{ env.ARCHNAME }}
- name: Pack with 7z
run: |
# 7z -mx=3 in rust files, takes 40% less space but is 2x slower than zip -mx=1
# 7z -mx=3 is 8x faster than 7z -mx=5, but generates 20% bigger
# So looks that -mx=3 is the best option
time 7z a -t7z -mx=3 czkawka_all.7z \
linux_czkawka_cli_heif_raw_${{ env.ARCHNAME }} \
linux_czkawka_gui_heif_raw_${{ env.ARCHNAME }} \
linux_krokiet_heif_raw_${{ env.ARCHNAME }} \
linux_krokiet_heif_raw_skia_opengl_${{ env.ARCHNAME }} \
linux_krokiet_heif_raw_skia_vulkan_${{ env.ARCHNAME }} \
linux_krokiet_heif_raw_femtovg_wgpu_${{ env.ARCHNAME }} \
linux_krokiet_heif_raw_all_backends_${{ env.ARCHNAME }}
- name: Store
uses: actions/upload-artifact@v4
with:
name: all-${{ runner.os }}-${{ runner.arch }}-${{ env.VERS }}-heif-libraw
path: |
czkawka_all.7z
- name: Release
if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
uses: softprops/action-gh-release@v2
with:
tag_name: "Nightly"
files: |
linux_czkawka_cli_heif_raw_${{ env.ARCHNAME }}
linux_czkawka_gui_heif_raw_${{ env.ARCHNAME }}
linux_krokiet_heif_raw_${{ env.ARCHNAME }}
linux_krokiet_heif_raw_skia_opengl_${{ env.ARCHNAME }}
linux_krokiet_heif_raw_skia_vulkan_${{ env.ARCHNAME }}
linux_krokiet_heif_raw_femtovg_wgpu_${{ env.ARCHNAME }}
linux_krokiet_heif_raw_all_backends_${{ env.ARCHNAME }}
token: ${{ secrets.PAT_REPOSITORY }}
### MUSL CLI and Krokiet Release and Debug
# GUI not works with MUSL :(
# https://github.com/slint-ui/slint/issues/7586
# https://github.com/rust-windowing/winit/issues/1818
linux-cli-musl:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Install basic libraries
run: |
sudo apt update || true; sudo apt install musl-tools -y
- name: Setup rust version
run: |
rustup default 1.92.0
rustup target add x86_64-unknown-linux-musl
- name: Build Release
if: ${{ github.ref == 'refs/heads/master' }}
run: |
sed -i 's/#lto = /lto = /g' Cargo.toml
sed -i 's/#codegen-units /codegen-units /g' Cargo.toml
cargo build --release --bin czkawka_cli --target x86_64-unknown-linux-musl
mv target/x86_64-unknown-linux-musl/release/czkawka_cli linux_czkawka_cli_musl
- name: Build Debug
if: ${{ github.ref != 'refs/heads/master' }}
run: |
sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
cargo build --bin czkawka_cli --target x86_64-unknown-linux-musl
mv target/x86_64-unknown-linux-musl/debug/czkawka_cli linux_czkawka_cli_musl
- name: Store Linux CLI
uses: actions/upload-artifact@v4
with:
name: czkawka_cli-${{ runner.os }}-musl
path: |
linux_czkawka_cli_musl
- name: Release
uses: softprops/action-gh-release@v2
if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
with:
tag_name: "Nightly"
files: |
linux_czkawka_cli_musl
token: ${{ secrets.PAT_REPOSITORY }}
### Below, builds that do not produce artifacts
### 32 bit CLI and Krokiet Release and Debug - TODO test also gtk gui but it requires gtk4:i386 and also would be good to test libraw and heif
linux-all-debug-32bit:
if: ${{ github.ref != 'refs/heads/master' }}
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Install basic libraries
run: |
sudo apt update || true
sudo apt install gcc-multilib -y
- name: Setup rust version and target
run: |
rustup default 1.92.0
rustup target add i686-unknown-linux-gnu
- name: Build Debug for 32-bit
run: |
sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
cargo build --target i686-unknown-linux-gnu --bin czkawka_cli --bin krokiet
mv target/i686-unknown-linux-gnu/debug/czkawka_cli linux_czkawka_cli_32bit
mv target/i686-unknown-linux-gnu/debug/krokiet linux_krokiet_32bit
- name: Store
uses: actions/upload-artifact@v4
with:
name: all-32bit-${{ runner.os }}-${{ runner.arch }}-debug
path: |
linux_czkawka_cli_32bit
linux_krokiet_32bit
linux-stability:
if: ${{ github.ref == 'refs/heads/master' }} # Runs only in master, because it is really time consuming
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Install basic libraries
run: sudo apt update || true; sudo apt install libgtk-4-dev libheif-dev libraw-dev -y
- name: Setup rust version
run: rustup default 1.92.0
- name: Build packages
run: |
rm -rf target || true
cargo build --features "heif,libraw"
mv target/debug/czkawka_cli czkawka_cli_debug_1
mv target/debug/czkawka_gui czkawka_gui_debug_1
mv target/debug/krokiet krokiet_debug_1
rm -rf target || true
cargo build --release --features "heif,libraw"
mv target/release/czkawka_cli czkawka_cli_release_1
mv target/release/czkawka_gui czkawka_gui_release_1
mv target/release/krokiet krokiet_release_1
rm -rf target || true
cargo build --features "heif,libraw"
mv target/debug/czkawka_cli czkawka_cli_debug_2
mv target/debug/czkawka_gui czkawka_gui_debug_2
mv target/debug/krokiet krokiet_debug_2
rm -rf target || true
cargo build --release --features "heif,libraw"
mv target/release/czkawka_cli czkawka_cli_release_2
mv target/release/czkawka_gui czkawka_gui_release_2
mv target/release/krokiet krokiet_release_2
bash misc/compare_files.sh
linux-tests:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Install basic libraries
run: sudo apt update || true; sudo apt install libgtk-4-dev libheif-dev libraw-dev -y
- name: Setup rust version
run: rustup default 1.92.0
- name: Test
run: |
sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
xvfb-run cargo test
linux-regression-tests-on-minimal-rust-version:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Install basic libraries
run: sudo apt update || true; sudo apt install libgtk-4-dev libheif-dev libraw-dev ffmpeg -y
- name: Setup rust version
run: rustup default 1.92.0
- name: Build test version
run: |
sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
cargo build --profile test --bin czkawka_cli
- name: Linux Regression Test
run: |
wget -q https://github.com/qarmin/czkawka/releases/download/6.0.0/TestFiles.zip
cd ci_tester
cargo build --release
cd ..
ci_tester/target/release/ci_tester target/debug/czkawka_cli
android:
if: ${{ github.ref == 'refs/heads/master' }}
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Setup rust version and target
run: |
rustup default 1.92.0
rustup target add aarch64-linux-android
- name: Check for Android
run: |
cd czkawka_core
cargo check --target aarch64-linux-android --features "blake_pure"
================================================
FILE: .github/workflows/mac.yml
================================================
name: 🍎 MacOS
on:
push:
pull_request:
schedule:
- cron: '0 0 * * 2'
env:
CARGO_TERM_COLOR: always
CZKAWKA_OFFICIAL_BUILD: ${{ vars.CZKAWKA_OFFICIAL_BUILD }}
jobs:
macos:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [macos-latest, macos-15-intel]
steps:
- uses: actions/checkout@v4
- name: Setup env
run: |
ARCHNAME=$([ "${{ runner.arch }}" = "ARM64" ] && echo arm64 || echo x86_64)
echo "ARCHNAME=$ARCHNAME" >> $GITHUB_ENV
- name: Setup rust version
run: rustup default 1.92.0
- name: Install Homebrew
run: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- name: Install GTK4
run: |
brew link --overwrite python@3.13
brew install gtk4 libheif libavif dav1d || true
# brew link --overwrite python@3.13
- name: Build Release
if: ${{ github.ref == 'refs/heads/master' }}
run: |
set -e
sed -i '' 's/#lto = "thin"/lto = "thin"/g' Cargo.toml
sed -i '' 's/#codegen-units /codegen-units /g' Cargo.toml
echo "VERS=release" >> $GITHUB_ENV
export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix)/lib
cargo build --release
mv target/release/czkawka_cli mac_czkawka_cli_${{ env.ARCHNAME }}
mv target/release/czkawka_gui mac_czkawka_gui_${{ env.ARCHNAME }}
mv target/release/krokiet mac_krokiet_${{ env.ARCHNAME }}
cargo build --release --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software"
mv target/release/krokiet mac_krokiet_skia_vulkan_${{ env.ARCHNAME }}
cargo build --release --bin krokiet --no-default-features --features "femtovg_wgpu"
mv target/release/krokiet mac_krokiet_femtovg_wgpu_${{ env.ARCHNAME }}
cargo build --release --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu"
mv target/release/krokiet mac_krokiet_all_backends_${{ env.ARCHNAME }}
cargo build --release --features "heif,libavif"
mv target/release/czkawka_cli mac_czkawka_cli_heif_avif_${{ env.ARCHNAME }}
mv target/release/czkawka_gui mac_czkawka_gui_heif_avif_${{ env.ARCHNAME }}
mv target/release/krokiet mac_krokiet_heif_avif_${{ env.ARCHNAME }}
cargo build --release --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software,heif,libavif"
mv target/release/krokiet mac_krokiet_skia_vulkan_heif_avif_${{ env.ARCHNAME }}
cargo build --release --bin krokiet --no-default-features --features "femtovg_wgpu,heif,libavif"
mv target/release/krokiet mac_krokiet_heif_avif_femtovg_wgpu_${{ env.ARCHNAME }}
cargo build --release --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu,heif,libavif"
mv target/release/krokiet mac_krokiet_heif_avif_all_backends_${{ env.ARCHNAME }}
- name: Build Debug
if: ${{ github.ref != 'refs/heads/master' }}
run: |
set -e
sed -i '' 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
sed -i '' 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
echo "VERS=debug" >> $GITHUB_ENV
export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix)/lib
cargo build --profile fastci
mv target/fastci/czkawka_cli mac_czkawka_cli_${{ env.ARCHNAME }}
mv target/fastci/czkawka_gui mac_czkawka_gui_${{ env.ARCHNAME }}
mv target/fastci/krokiet mac_krokiet_${{ env.ARCHNAME }}
cargo build --profile fastci --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software"
mv target/fastci/krokiet mac_krokiet_skia_vulkan_${{ env.ARCHNAME }}
cargo build --profile fastci --bin krokiet --no-default-features --features "femtovg_wgpu"
mv target/fastci/krokiet mac_krokiet_femtovg_wgpu_${{ env.ARCHNAME }}
cargo build --profile fastci --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu"
mv target/fastci/krokiet mac_krokiet_all_backends_${{ env.ARCHNAME }}
cargo build --profile fastci --features "heif,libavif"
mv target/fastci/czkawka_cli mac_czkawka_cli_heif_avif_${{ env.ARCHNAME }}
mv target/fastci/czkawka_gui mac_czkawka_gui_heif_avif_${{ env.ARCHNAME }}
mv target/fastci/krokiet mac_krokiet_heif_avif_${{ env.ARCHNAME }}
cargo build --profile fastci --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software,heif,libavif"
mv target/fastci/krokiet mac_krokiet_skia_vulkan_heif_avif_${{ env.ARCHNAME }}
cargo build --profile fastci --bin krokiet --no-default-features --features "femtovg_wgpu,heif,libavif"
mv target/fastci/krokiet mac_krokiet_heif_avif_femtovg_wgpu_${{ env.ARCHNAME }}
cargo build --profile fastci --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu,heif,libavif"
mv target/fastci/krokiet mac_krokiet_heif_avif_all_backends_${{ env.ARCHNAME }}
- name: Store MacOS
uses: actions/upload-artifact@v4
with:
name: all-${{ runner.os }}-${{ runner.arch }}-${{ env.VERS }}
path: |
mac_czkawka_cli_heif_avif_${{ env.ARCHNAME }}
mac_czkawka_gui_heif_avif_${{ env.ARCHNAME }}
mac_krokiet_heif_avif_${{ env.ARCHNAME }}
mac_krokiet_heif_avif_femtovg_wgpu_${{ env.ARCHNAME }}
mac_krokiet_heif_avif_all_backends_${{ env.ARCHNAME }}
mac_czkawka_cli_${{ env.ARCHNAME }}
mac_czkawka_gui_${{ env.ARCHNAME }}
mac_krokiet_${{ env.ARCHNAME }}
mac_krokiet_skia_vulkan_heif_avif_${{ env.ARCHNAME }}
mac_krokiet_skia_vulkan_${{ env.ARCHNAME }}
mac_krokiet_femtovg_wgpu_${{ env.ARCHNAME }}
mac_krokiet_all_backends_${{ env.ARCHNAME }}
- name: Release
if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
uses: softprops/action-gh-release@v2
with:
tag_name: "Nightly"
files: |
mac_czkawka_cli_heif_avif_${{ env.ARCHNAME }}
mac_czkawka_gui_heif_avif_${{ env.ARCHNAME }}
mac_krokiet_heif_avif_${{ env.ARCHNAME }}
mac_krokiet_heif_avif_femtovg_wgpu_${{ env.ARCHNAME }}
mac_krokiet_heif_avif_all_backends_${{ env.ARCHNAME }}
mac_czkawka_cli_${{ env.ARCHNAME }}
mac_czkawka_gui_${{ env.ARCHNAME }}
mac_krokiet_${{ env.ARCHNAME }}
mac_krokiet_skia_vulkan_heif_avif_${{ env.ARCHNAME }}
mac_krokiet_skia_vulkan_${{ env.ARCHNAME }}
mac_krokiet_femtovg_wgpu_${{ env.ARCHNAME }}
mac_krokiet_all_backends_${{ env.ARCHNAME }}
token: ${{ secrets.PAT_REPOSITORY }}
================================================
FILE: .github/workflows/quality.yml
================================================
name: 🧹 Quality
on:
push:
pull_request:
schedule:
- cron: '0 0 * * 2'
env:
CARGO_TERM_COLOR: always
jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Gtk 4
run: sudo apt update || true; sudo apt install -y libgtk-4-dev libraw-dev libheif-dev libavif-dev libdav1d-dev libasound2-dev -y
- name: Setup rust version
run: |
rustup default 1.92.0
rustup component add rustfmt
rustup component add clippy
- name: Disable optimizations
run: |
sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
- name: Check the format
run: cargo fmt --all -- --check
- name: Run clippy
run: |
cargo clippy --all-targets --all-features -- -D warnings
cargo clippy --all-targets -- -D warnings
- name: Check tools
run: |
cd misc/test_image_perf
cargo check
cd ../../
cd misc/test_read_perf
cargo check
cd ../../
================================================
FILE: .github/workflows/windows.yml
================================================
name: 🏁 Windows
on:
push:
pull_request:
schedule:
- cron: '0 0 * * 2'
env:
CARGO_TERM_COLOR: always
CZKAWKA_OFFICIAL_BUILD: ${{ vars.CZKAWKA_OFFICIAL_BUILD }}
jobs:
krokiet-compiled-on-linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt update || true
sudo apt install -y mingw-w64 mingw-w64-x86-64-dev wget wget2 curl wine || true
- name: Setup rust version
run: |
rustup default 1.92.0
rustup target add x86_64-pc-windows-gnu
- name: Download rcedit
run: |
curl -L https://github.com/electron/rcedit/releases/download/v2.0.0/rcedit-x64.exe -o rcedit-x64.exe
- name: Compile Krokiet Release
if: ${{ github.ref == 'refs/heads/master' }}
run: |
sed -i 's/#lto = /lto = /g' Cargo.toml
sed -i 's/#codegen-units /codegen-units /g' Cargo.toml
cargo build --release --target x86_64-pc-windows-gnu --bin krokiet
mv target/x86_64-pc-windows-gnu/release/krokiet.exe windows_krokiet_on_linux.exe
export WINEPREFIX=$(mktemp -d)
wine rcedit-x64.exe windows_krokiet_on_linux.exe --set-icon krokiet/icons/krokiet_logo_flag.ico
- name: Compile Krokiet Debug
if: ${{ github.ref != 'refs/heads/master' }}
run: |
sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
cargo build --target x86_64-pc-windows-gnu --bin krokiet
mv target/x86_64-pc-windows-gnu/debug/krokiet.exe windows_krokiet_on_linux.exe
export WINEPREFIX=$(mktemp -d)
wine rcedit-x64.exe windows_krokiet_on_linux.exe --set-icon krokiet/icons/krokiet_logo_flag.ico
- name: Pack with 7z
run: |
time 7z a -t7z -mx=3 czkawka_all.7z \
windows_krokiet_on_linux.exe
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: krokiet-windows-on-linux-${{ github.sha }}
path: |
czkawka_all.7z
if-no-files-found: error
- name: Release
uses: softprops/action-gh-release@v2
if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
with:
tag_name: "Nightly"
files: |
windows_krokiet_on_linux.exe
token: ${{ secrets.PAT_REPOSITORY }}
# Skia not provides support for gnu toolchain, which is easy to cross-compile - https://github.com/rust-skia/rust-skia/issues/345
# So need to compile krokiet on msvc Windows
krokiet-compiled-on-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Setup rust version
run: |
rustup default 1.92.0
- name: Download rcedit
run: |
curl -L https://github.com/electron/rcedit/releases/download/v2.0.0/rcedit-x64.exe -o rcedit-x64.exe
- name: Compile Krokiet Release
if: ${{ github.ref == 'refs/heads/master' }}
run: |
powershell -Command "(Get-Content Cargo.toml) -replace '#lto = ', 'lto = ' | Set-Content Cargo.toml; (Get-Content Cargo.toml) -replace '#codegen-units ', 'codegen-units ' | Set-Content Cargo.toml"
cargo build --release --bin krokiet --no-default-features --features "winit_skia_opengl,winit_software"
mv target/release/krokiet.exe windows_krokiet_on_windows_skia_opengl.exe
cargo build --release --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software"
mv target/release/krokiet.exe windows_krokiet_on_windows_skia_vulkan.exe
cargo build --release --bin krokiet --no-default-features --features "femtovg_wgpu"
mv target/release/krokiet.exe windows_krokiet_on_windows_femtovg_wgpu.exe
cargo build --release --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu"
mv target/release/krokiet.exe windows_krokiet_on_windows_all_backends.exe
Get-ChildItem windows_krokiet_on_windows_*.exe | ForEach-Object { ./rcedit-x64.exe $_.Name --set-icon krokiet/icons/krokiet_logo_flag.ico }
- name: Compile Krokiet Debug
if: ${{ github.ref != 'refs/heads/master' }}
run: |
(Get-Content Cargo.toml) -replace '#lto = ','lto = ' -replace '#codegen-units ','codegen-units ' -replace '^\[profile\.dev\.package','#\[profile.dev.package' -replace '^opt-level = 3 # OPT PACKAGES','#opt-level = 3 # OPT PACKAGES' | Set-Content Cargo.toml
cargo build --bin krokiet --no-default-features --features "winit_skia_opengl,winit_software"
mv target/debug/krokiet.exe windows_krokiet_on_windows_skia_opengl.exe
cargo build --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software"
mv target/debug/krokiet.exe windows_krokiet_on_windows_skia_vulkan.exe
cargo build --bin krokiet --no-default-features --features "femtovg_wgpu"
mv target/debug/krokiet.exe windows_krokiet_on_windows_femtovg_wgpu.exe
cargo build --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu"
mv target/debug/krokiet.exe windows_krokiet_on_windows_all_backends.exe
Get-ChildItem windows_krokiet_on_windows_*.exe | ForEach-Object { ./rcedit-x64.exe $_.Name --set-icon krokiet/icons/krokiet_logo_flag.ico }
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: krokiet-windows-on-windows-${{ github.sha }}
path: |
windows_krokiet_on_windows_skia_opengl.exe
windows_krokiet_on_windows_skia_vulkan.exe
windows_krokiet_on_windows_femtovg_wgpu.exe
windows_krokiet_on_windows_all_backends.exe
if-no-files-found: error
- name: Release
uses: softprops/action-gh-release@v2
if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
with:
tag_name: "Nightly"
files: |
windows_krokiet_on_windows_skia_opengl.exe
windows_krokiet_on_windows_skia_vulkan.exe
windows_krokiet_on_windows_femtovg_wgpu.exe
windows_krokiet_on_windows_all_backends.exe
token: ${{ secrets.PAT_REPOSITORY }}
container_4_12:
runs-on: ubuntu-latest
container:
image: ghcr.io/mglolenstine/gtk4-cross:gtk-4.12
steps:
- uses: actions/checkout@v4
- name: Install additional dependencies
# gio is for the build script
run: |
dnf install curl wget2 wget unzip mingw64-bzip2.noarch mingw64-poppler mingw64-poppler-glib mingw32-python3 rust-gio-devel adwaita-icon-theme wine -y && dnf clean all -y
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source "$HOME/.cargo/env"
rustup default 1.92.0
rustup target add x86_64-pc-windows-gnu
mkdir -p package
curl -L https://github.com/electron/rcedit/releases/download/v2.0.0/rcedit-x64.exe -o rcedit-x64.exe
- name: Cross compile for Windows - Release
if: ${{ github.ref == 'refs/heads/master' }}
run: |
source "$HOME/.cargo/env"
export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:/usr/share/pkgconfig:$MINGW_PREFIX/lib/pkgconfig/:/usr/x86_64-w64-mingw32/lib/pkgconfig/
cargo build --target=x86_64-pc-windows-gnu --release --locked
cp target/x86_64-pc-windows-gnu/release/czkawka_gui.exe package/
cp target/x86_64-pc-windows-gnu/release/czkawka_cli.exe package/
export WINEPREFIX=$(mktemp -d)
wine rcedit-x64.exe package/czkawka_gui.exe --set-icon czkawka_gui/icons/icon.ico
- name: Cross compile for Windows - Debug
if: ${{ github.ref != 'refs/heads/master' }}
run: |
source "$HOME/.cargo/env"
export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:/usr/share/pkgconfig:$MINGW_PREFIX/lib/pkgconfig/:/usr/x86_64-w64-mingw32/lib/pkgconfig/
cargo build --target=x86_64-pc-windows-gnu --locked --profile fastci
cp target/x86_64-pc-windows-gnu/fastci/czkawka_gui.exe package/
cp target/x86_64-pc-windows-gnu/fastci/czkawka_cli.exe package/
export WINEPREFIX=$(mktemp -d)
wine rcedit-x64.exe package/czkawka_gui.exe --set-icon czkawka_gui/icons/icon.ico
- name: Package
run: |
#!/bin/bash
set -euo pipefail
cp -t package $(pds -vv -f package/*.exe)
# Add gdbus which is recommended on Windows (why?)
cp $MINGW_PREFIX/bin/gdbus.exe package
# Handle the glib schema compilation as well
glib-compile-schemas $MINGW_PREFIX/share/glib-2.0/schemas/
mkdir -p package/share/glib-2.0/schemas/
cp -T $MINGW_PREFIX/share/glib-2.0/schemas/gschemas.compiled package/share/glib-2.0/schemas/gschemas.compiled
# Pixbuf stuff, in order to get SVGs (scalable icons) to load
mkdir -p package/lib/gdk-pixbuf-2.0
cp -rT $MINGW_PREFIX/lib/gdk-pixbuf-2.0 package/lib/gdk-pixbuf-2.0
cp -f -t package $(pds -vv -f $MINGW_PREFIX/lib/gdk-pixbuf-2.0/2.10.0/loaders/*)
find package -iname "*.dll" -or -iname "*.exe" -type f -exec mingw-strip {} +
cd package/share
wget2 https://github.com/qarmin/czkawka/files/10832192/gtk4_theme.zip
unzip gtk4_theme.zip
rm gtk4_theme.zip
cd ../..
wget2 https://github.com/qarmin/Automated-Fuzzer/releases/download/test/libGL.zip
unzip libGL.zip
mv libEGL.dll package/
mv libGLESv2.dll package/
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: czkawka-windows-${{ github.sha }}-4.12
path: |
./package
if-no-files-found: error
- name: Prepare files to release
run: |
cd package
zip -r ../windows_czkawka_gui_gtk_412.zip .
cd ..
- name: Release
uses: softprops/action-gh-release@v2
if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
with:
tag_name: "Nightly"
files: |
windows_czkawka_gui_gtk_412.zip
token: ${{ secrets.PAT_REPOSITORY }}
windows-tests:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Setup rust version
run: |
rustup default 1.92.0
# Both additional features and gtk gui are non-testable due really complicated setup of environment on Windows
- name: Test
run: |
cargo test -p czkawka_core -p krokiet
================================================
FILE: .gitignore
================================================
/target
.idea/
*.iml
*~
*#
results*.txt
TestSuite*
*.snap
flatpak/
*.zip
*.zst
*.profraw
*.profdata
/lcov_report*
/report
ci_tester/target
ci_tester/Cargo.lock
krokiet/Cargo.lock
krokiet/target
*.json
*.mm_profdata
perf.data
perf.data.old
krokiet/ui/test.slint
*.html
misc/*/*.lock
misc/*/target/
misc/*/.idea
benchmarks
TestFiles
*.txt
.venv
charts*
*__pycache__*/
result
.direnv
cedinia/android/keystore/*.keystore
cedinia/docs
================================================
FILE: .mailmap
================================================
TheEvilSkeleton Proprietary Chrome-chan
Rafał Mikrut <41945903+qarmin@users.noreply.github.com>
================================================
FILE: .rustfmt.toml
================================================
newline_style = "Unix"
max_width = 180
# Enable only with nightly channel via - cargo +nightly fmt
imports_granularity = "Module"
group_imports = "StdExternalCrate"
================================================
FILE: Cargo.toml
================================================
[workspace]
members = [
"czkawka_core",
"czkawka_cli",
"czkawka_gui",
"krokiet",
"cedinia"
]
exclude = [
"misc/test_read_perf",
"misc/test_image_perf",
"misc/test_compilation_speed_size",
"ci_tester",
]
resolver = "3"
# android-activity 0.6.0 panics when ANativeActivity_onCreate is called a second
# time (Activity recreation) because ndk_context::initialize_android_context
# asserts previous.is_none(). The fix (OnceLock, init once with Application ref)
# is merged to main but not yet released. Remove this patch once 0.6.1+ ships.
# Affects only android-activity ^0.6 (cedinia); Slint's ^0.5 dependency is unaffected.
[patch.crates-io]
android-activity = { git = "https://github.com/rust-mobile/android-activity", rev = "43de2770b91b1b8ff870f00551f89f04062216cc" }
[profile.release]
# panic = "unwind" in opposite to "abort", allows to catch panic!()
# Since Czkawka parse different types of files with few libraries, it is possible
# that some files will cause crash, so at this moment I don't recommend to use "abort"
# until you are ready to occasional crashes
panic = "unwind"
# Should find more panics, that now are hidden from user - in long term it should decrease bugs in app
# It may cause some crashes, that are not handled via panic::catch_unwind, so feel free to disable it, if you want
overflow-checks = true
# LTO setting is disabled by default, because release mode is usually needed to develop app and compilation with LTO would take a lot of time
# But it is used to optimize release builds(and probably also in CI, where time is not so important as in local development)
# Fat lto, generates a lot smaller executable than thin lto
# Also using codegen-units = 1, to generate smaller binaries
#lto = "fat"
#codegen-units = 1
# Optimize all dependencies except application/workspaces, even in debug builds to get reasonable performance e.g. when opening images
[profile.dev.package."*"] # OPT PACKAGES
opt-level = 3 # OPT PACKAGES
[profile.fast_release]
inherits = "release"
incremental = true
overflow-checks = true
debug = false
strip = true
[profile.test]
debug-assertions = true # Forces to crash when there is duplicated item in cli
overflow-checks = true
opt-level = 3
# Fast compilation and small binary size
[profile.fastci]
inherits = "dev"
strip = "symbols"
debug = false
lto = "off"
[profile.rdebug]
inherits = "release"
debug = "full"
strip = "none"
# Unsafe profile, just to check, how fast and small app could be
[profile.fastest]
inherits = "release"
panic = "abort"
lto = "fat"
strip = "symbols"
codegen-units = 1
opt-level = 3
debug = false
[workspace.lints]
clippy.unreachable = "allow" # This is a legitimate use case in most places
clippy.enum_variant_names = "allow" # Not always is possible to use different names
clippy.too_many_arguments = "allow" # Sometimes such functions are needed
clippy.type_complexity = "allow" # Sometimes such types are needed
clippy.collapsible_else_if = "allow" # Sometimes it is more readable
clippy.iter_on_single_items = "allow" # Allows to extend slice items, without needing to converting it when number of items change
clippy.needless_range_loop = "allow" # Sometimes it is more readable
clippy.doc_broken_link = "warn"
clippy.ip_constant = "warn"
clippy.unnecessary_semicolon = "warn"
clippy.trivially_copy_pass_by_ref = "warn"
clippy.indexing_slicing = "warn"
clippy.non_std_lazy_statics = "warn"
clippy.undocumented_unsafe_blocks = "warn"
clippy.manual_midpoint = "warn"
clippy.ignore_without_reason = "warn"
clippy.elidable_lifetime_names = "warn"
#clippy.duration_suboptimal_units = "warn"
#clippy.decimal_bitwise_operands = "warn"
clippy.allow_attributes = "warn"
clippy.assertions_on_result_states = "warn"
clippy.bool_to_int_with_if = "warn"
clippy.branches_sharing_code = "warn"
clippy.collection_is_never_read = "warn"
clippy.dbg_macro = "warn"
clippy.debug_assert_with_mut_call = "warn"
clippy.empty_enum_variants_with_brackets = "warn"
clippy.enum_glob_use = "warn"
clippy.equatable_if_let = "warn"
clippy.error_impl_error = "warn"
clippy.explicit_into_iter_loop = "warn"
clippy.explicit_iter_loop = "warn"
clippy.expl_impl_clone_on_copy = "warn"
clippy.fallible_impl_from = "warn"
clippy.filter_map_next = "warn"
clippy.flat_map_option = "warn"
clippy.float_cmp = "warn"
clippy.from_iter_instead_of_collect = "warn"
clippy.ignored_unit_patterns = "warn"
clippy.implicit_clone = "warn"
clippy.index_refutable_slice = "warn"
clippy.invalid_upcast_comparisons = "warn"
clippy.iter_filter_is_ok = "warn"
clippy.iter_filter_is_some = "warn"
clippy.iter_on_empty_collections = "warn"
clippy.iter_with_drain = "warn"
clippy.large_stack_arrays = "warn"
clippy.large_types_passed_by_value = "warn"
clippy.literal_string_with_formatting_args = "warn"
clippy.lossy_float_literal = "warn"
clippy.macro_use_imports = "warn"
clippy.manual_assert = "warn"
clippy.manual_instant_elapsed = "warn"
clippy.manual_is_variant_and = "warn"
clippy.manual_let_else = "warn"
clippy.manual_ok_or = "warn"
clippy.map_unwrap_or = "warn"
clippy.match_bool = "warn"
clippy.match_same_arms = "warn"
clippy.match_wildcard_for_single_variants = "warn"
clippy.mutex_atomic = "warn"
clippy.mutex_integer = "warn"
clippy.mut_mut = "warn"
clippy.needless_bitwise_bool = "warn"
clippy.needless_collect = "warn"
clippy.needless_continue = "warn"
clippy.needless_for_each = "warn"
clippy.needless_pass_by_ref_mut = "warn"
clippy.needless_pass_by_value = "warn"
clippy.needless_raw_strings = "warn"
clippy.nonstandard_macro_braces = "warn"
clippy.option_as_ref_cloned = "warn"
clippy.pathbuf_init_then_push = "warn"
clippy.path_buf_push_overwrite = "warn"
clippy.print_stderr = "warn"
clippy.print_stdout = "warn"
clippy.pub_underscore_fields = "warn"
clippy.question_mark = "warn"
clippy.range_minus_one = "warn"
clippy.range_plus_one = "warn"
clippy.redundant_clone = "warn"
clippy.redundant_else = "warn"
clippy.ref_binding_to_reference = "warn"
clippy.ref_option_ref = "warn"
clippy.same_functions_in_if_condition = "warn"
clippy.semicolon_if_nothing_returned = "warn"
clippy.set_contains_or_insert = "warn"
clippy.stable_sort_primitive = "warn"
clippy.string_add_assign = "warn"
clippy.string_slice = "warn"
clippy.suspicious_operation_groupings = "warn"
clippy.suspicious_xor_used_as_pow = "warn"
clippy.todo = "warn"
clippy.trait_duplication_in_bounds = "warn"
clippy.trivial_regex = "warn"
clippy.type_repetition_in_bounds = "warn"
clippy.unimplemented = "warn"
clippy.uninlined_format_args = "warn"
clippy.unnecessary_box_returns = "warn"
clippy.unnecessary_join = "warn"
clippy.unnecessary_wraps = "warn"
clippy.unnested_or_patterns = "warn"
clippy.unused_async = "warn"
clippy.unused_result_ok = "warn"
clippy.unused_rounding = "warn"
clippy.unused_self = "warn"
clippy.unwrap_used = "warn"
clippy.used_underscore_binding = "warn"
clippy.useless_let_if_seq = "warn"
clippy.use_self = "warn"
clippy.verbose_file_reads = "warn"
clippy.wildcard_imports = "warn"
================================================
FILE: Changelog.md
================================================
## Version 11.0.1 - 20.02.2026r
### Core
- Fixed issue with excluded folders not working on Windows - [#1808](https://github.com/qarmin/czkawka/pull/1808)
### GTK GUI
- Added missing Duration column to the similar videos tab, fixing a panic that occurred after video analysis - [#1793](https://github.com/qarmin/czkawka/pull/1793)
- Removed warning log message shown for non-existing excluded directories - [#1795](https://github.com/qarmin/czkawka/pull/1795)
- Fixed panic occurring when double-clicking a folder from the included or excluded directories list - [#1799](https://github.com/qarmin/czkawka/pull/1799)
- Updated to stable gtk4-rs 0.11 - [#1808](https://github.com/qarmin/czkawka/pull/1808)
### Krokiet
- Increased default maximum file size limit - [#1808](https://github.com/qarmin/czkawka/pull/1808)
## Prebuilt binaries
- Added new Krokiet wgpu binaries
- Added new all-in-one Krokiet binaries with all backends included
## CI
- Added Windows CI job running `cargo test`
## Version 11.0.0 - 14.02.2026r
### Breaking changes
#### Users
- The Czkawka GUI config file was migrated from a custom, broken format to JSON. All settings must be configured again. The old TXT file is not removed and can be used as a reference.
- In broken files mode, file type is no longer stored in cache. Existing cache files are incompatible with this version and will be automatically regenerated.
- The `Similarity Preset` enum in similar images mode was replaced with an integer argument `Max Difference` in range 0-40.
- HEIF images are now rotated only once instead of twice. Existing cache may contain incorrectly rotated images and should be regenerated by removing cache(but this requires manual intervention).
#### Devs
- Public API functions were slightly adjusted to avoid unnecessary cloning and referencing of copyable types.
- `Similarity` variables were renamed to `Difference`.
- Applications must call `register_image_decoding_hooks();` at startup to enable reading HEIF and JXL images.
### Core
- In similar images mode and previews, extension validation was removed in most cases - [#1623](https://github.com/qarmin/czkawka/pull/1623)
- Build-time and runtime versions of Musl and Glibc are now printed to logs - [#1604](https://github.com/qarmin/czkawka/pull/1604/files)
- Destination file removal during symlinking is now delayed to prevent data loss in case of failure - [#1672](https://github.com/qarmin/czkawka/pull/1672)
- Fixed invalid path canonicalization on Windows - [#1604](https://github.com/qarmin/czkawka/pull/1604/files)
- Comparison results are now deterministic - [#1654](https://github.com/qarmin/czkawka/pull/1654)
- Built-in JPEG previews are now read from RAW images when available - [#1655](https://github.com/qarmin/czkawka/pull/1655)
- Fixed silent panics when the logger could not write to the terminal - [#1658](https://github.com/qarmin/czkawka/pull/1658)
- Commit hash is now included in logs - [#1672](https://github.com/qarmin/czkawka/pull/1672)
- Improved and fixed logic for grouping similar images by similarity level - [#1685](https://github.com/qarmin/czkawka/pull/1685)
- Added scan time measurement - [#1674](https://github.com/qarmin/czkawka/pull/1674), [#1685](https://github.com/qarmin/czkawka/pull/1685)
- Added support for detecting broken video files in the broken files tool, via external ffmpeg and ffprobe - [#1745](https://github.com/qarmin/czkawka/pull/1745)
- Added new video optimizer mode to reencode videos with more efficient codecs and crop black/static bars, via external ffmpeg and ffprobe - [#1726](https://github.com/qarmin/czkawka/pull/1726), [#1745](https://github.com/qarmin/czkawka/pull/1745)
- Added new exif remover mode to remove selected EXIF tags from files - [#1745](https://github.com/qarmin/czkawka/pull/1745)
- Added new bad names mode to find and rename files with problematic names, e.g. non-ASCII characters or uppercase extensions - [#1754](https://github.com/qarmin/czkawka/pull/1754)
- Added ability to scan individual files, not only folders - [#1745](https://github.com/qarmin/czkawka/pull/1745)
- Limited supported image size to 2000 MP - [#1748](https://github.com/qarmin/czkawka/pull/1748)
- Automatic cleanup of outdated entries now runs at most once per week - [#1748](https://github.com/qarmin/czkawka/pull/1748)
- Added a function to manually remove outdated entries from cache files - [#1748](https://github.com/qarmin/czkawka/pull/1748)
- Added video property information, bitrate, codec, FPS, dimensions, duration for similar videos tool - [#1748](https://github.com/qarmin/czkawka/pull/1748)
- Fixed double rotation of HEIF images - [#1783](https://github.com/qarmin/czkawka/pull/1783)
- Fixed incorrect handling of some HEIF images by using built-in libheif-rs decoding methods - [#1783](https://github.com/qarmin/czkawka/pull/1783)
### CLI
- Enabled colored terminal output by default, can be disabled via feature flag - [#1672](https://github.com/qarmin/czkawka/pull/1672)
- Fixed a regression where results were not printed to the terminal - [#1672](https://github.com/qarmin/czkawka/pull/1672)
- Added `dry_run` and `move_to_trash` options to most of tools - [#1685](https://github.com/qarmin/czkawka/pull/1685)
- Fixed unbound `--excluded-extensions` option - [#1748](https://github.com/qarmin/czkawka/pull/1748)
- Added new modes: video optimizer, exif remover, and bad names - [#1760](https://github.com/qarmin/czkawka/pull/1760)
### GTK GUI
- Restored the sort button and fixed crashes related to sorting - [#1623](https://github.com/qarmin/czkawka/pull/1623)
- Configuration now uses JSON format instead of a custom one - [#1623](https://github.com/qarmin/czkawka/pull/1623)
- Added multithreaded creation of hard links, symbolic links, and file removal - [#1672](https://github.com/qarmin/czkawka/pull/1672)
- Fixed a GTK regression that caused image previews to appear extremely small - [#1658](https://github.com/qarmin/czkawka/pull/1658)
- Added a button to easily swap between compared images - [#1658](https://github.com/qarmin/czkawka/pull/1658)
- Performed refactoring to evaluate possible migration to GTK 5, currently not very feasible - [#1658](https://github.com/qarmin/czkawka/pull/1658)
- Fixed sorting by size in big files mode - [#1691](https://github.com/qarmin/czkawka/pull/1691)
- Fixed freezes caused by an invalid function declaration in gtk4-rs - [#1691](https://github.com/qarmin/czkawka/pull/1691)
- Added an About popup informing that Krokiet is the successor application - [#1718](https://github.com/qarmin/czkawka/pull/1718)
- Added `--cache` and `--config` CLI options to open cache and config paths - [#1745](https://github.com/qarmin/czkawka/pull/1745)
- Added shortest and longest path selection modes - [#1738](https://github.com/qarmin/czkawka/pull/1738)
### Krokiet
- Added a new logo - [#1726](https://github.com/qarmin/czkawka/pull/1726)
- Added video thumbnails, single and grid view - [#1714](https://github.com/qarmin/czkawka/pull/1714)
- Displayed cache, thumbnails, and logs size in settings - [#1714](https://github.com/qarmin/czkawka/pull/1714)
- Added sorting by clicking column headers - [#1718](https://github.com/qarmin/czkawka/pull/1718)
- Introduced a default limit of 500 message lines to prevent freezes caused by slow TextEdit performance - [#1718](https://github.com/qarmin/czkawka/pull/1718)
- Slightly increased font sizes to improve readability - [#1726](https://github.com/qarmin/czkawka/pull/1726)
- Added runtime application scaling, with some limitations - [#1726](https://github.com/qarmin/czkawka/pull/1726)
- Cleared messages in the bottom panel when a new scan starts - [#1726](https://github.com/qarmin/czkawka/pull/1726)
- Fixed a crash when clicking previous results while a new scan was in progress - [#1726](https://github.com/qarmin/czkawka/pull/1726)
- Changed default behavior to move files to trash instead of permanently deleting them - [#1726](https://github.com/qarmin/czkawka/pull/1726)
- Added a notification dialog when the application cannot be opened - [#1745](https://github.com/qarmin/czkawka/pull/1745)
- Added `--cache` and `--config` CLI options to open cache and config paths - [#1745](https://github.com/qarmin/czkawka/pull/1745)
- Added new modes: video optimizer, exif remover, and bad names - [#1726](https://github.com/qarmin/czkawka/pull/1726), [#1745](https://github.com/qarmin/czkawka/pull/1745), [#1754](https://github.com/qarmin/czkawka/pull/1754)
- Modification dates are now displayed in local time instead of UTC - [#1748](https://github.com/qarmin/czkawka/pull/1748)
- Added a new menu option to manually remove outdated cache entries - [#1748](https://github.com/qarmin/czkawka/pull/1748)
- Added an optional scan completion sound, hidden behind the `audio` feature flag - [#1754](https://github.com/qarmin/czkawka/pull/1754)
- Fixed an issue where sort options were not updating due to multiple invalid signal connections - [#1760](https://github.com/qarmin/czkawka/pull/1760)
- Added support for creating hard links and symbolic links - [#1760](https://github.com/qarmin/czkawka/pull/1760)
- Added shortest and longest path selection modes - [#1738](https://github.com/qarmin/czkawka/pull/1738)
- Fixed crashes caused by selection cache desynchronization - [#1783](https://github.com/qarmin/czkawka/pull/1783)
### External
- Wine 10.20 includes a bugfix that resolves crashes when opening file dialogs in Czkawka GUI - [Wine 49987 issue](https://bugs.winehq.org/show_bug.cgi?id=49987)
### Prebuilt binaries
- Krokiet Windows binaries with the Skia backend are now available, this only works with MSVC build and requires Visual C++ Redistributable
- Intel Mac binaries are now built with the latest available macOS version, currently 15
- Windows prebuilt binaries now bundle libEGL and libGLES, which fixes issues running GTK 4.12 builds on some systems, GTK 4.6 builds are no longer provided
- Krokiet macOS OpenGL binaries are deprecated due to outdated and broken Apple OpenGL drivers, Skia Vulkan binaries are now provided and recommended
- Some Linux binaries are now built on Ubuntu 24.04 to support a newer libheif-rs with improvements, including reading images with pixel formats other than rgb8
- Windows binaries now use an 8 MB stack size to match Linux, fixing stack overflows in debug builds
- Windows binaries now include built-in icons
## Version 10.0.0 - 18.08.2025r
### Breaking changes
#### Users
- Some languages now have unified names in Crowdin (e.g. `es` → `es-ES`). The GUI may not find them and will fall back to the default language.
- Cache files now use memory limits and are incompatible with previous versions.
- Cli image filter argument changed from `faussian` to `gaussian`
#### Devs
- `stop_flag` is now required argument in most of the core functions
- Visibility of some core functions has been reduced to `pub(crate)`
- The modules in czkawka_core have been split and reorganized a bit - imports need to be adjusted, although the actual behavior and item names should not be changed too much
### Core
- Replaced `println`/`eprintln` with logging functions - [#1478](https://github.com/qarmin/czkawka/pull/1478)
- Slightly improved cache loading and saving speed - [#1478](https://github.com/qarmin/czkawka/pull/1478)
- Messages and panics are now also logged to a file (can be disabled by setting the `DISABLE_FILE_LOGGING` environment variable) - [#1508](https://github.com/qarmin/czkawka/pull/1508)
- Added a 8GB memory limit when loading or saving cache to avoid out-of-memory crashes with broken cache files - [#1508](https://github.com/qarmin/czkawka/pull/1508)
- Czkawka binaries are now reproducible - [#1565](https://github.com/qarmin/czkawka/pull/1565)
- Added protection against deleting a folder that is no longer empty since the scan - [#1566](https://github.com/qarmin/czkawka/pull/1566)
- Replaced `pdf-rs` with the more popular `lopdf` library, which also has fewer dependencies - [#1566](https://github.com/qarmin/czkawka/pull/1566)
- Replaced `imagepipe` + `rawloader` with `rawler` which is still supported and faster to decode raw files - [#1572](https://github.com/qarmin/czkawka/pull/1572)
- Added more configuration options in video finder - [#1578](https://github.com/qarmin/czkawka/pull/1578)
- `fast_image_resize` feature is removed and `image_hasher/fast_resize_unstable` is enabled unconditionally - [#1586](https://github.com/qarmin/czkawka/pull/1586)
### CLI
- Improved logic for deleting files and added progress bar for this operation - [#1571](https://github.com/qarmin/czkawka/pull/1571)
### GTK GUI
- New icons - less visually appealing, but created by me and released under a truly free CC BY license - [#1478](https://github.com/qarmin/czkawka/pull/1478)
- Fixed crash when removing outdated cache - [#1508](https://github.com/qarmin/czkawka/pull/1508)
- Fixed missing file and folder names for similar videos in reference folders - [#1520](https://github.com/qarmin/czkawka/pull/1520)
- Fixed crashes when the SVG pixbuf loader is not available - [#1565](https://github.com/qarmin/czkawka/pull/1565)
- Fixed using custom select on referenced folders - [#1581](https://github.com/qarmin/czkawka/pull/1581)
### Krokiet
- Added the ability to select multiple items with mouse and keyboard - [#1478](https://github.com/qarmin/czkawka/pull/1478)
- Added sort button - [#1501](https://github.com/qarmin/czkawka/pull/1501)
- Window size is now remembered - [#1508](https://github.com/qarmin/czkawka/pull/1508)
- Added translations - [#1508](https://github.com/qarmin/czkawka/pull/1508), [#1513](https://github.com/qarmin/czkawka/pull/1513)
- Improved popup styling - [#1520](https://github.com/qarmin/czkawka/pull/1520)
- Dark and light themes can now be switched at runtime - [#1520](https://github.com/qarmin/czkawka/pull/1520)
- Changed icon color to white for dark theme to improve visibility - [#1520](https://github.com/qarmin/czkawka/pull/1520)
- Added the ability to hide text on buttons - [#1520](https://github.com/qarmin/czkawka/pull/1520)
- Multithreaded removing, moving, and renaming of files - [#1565](https://github.com/qarmin/czkawka/pull/1565)
- Files that fail to be removed, renamed, or moved are no longer deleted from the results list - [#1565](https://github.com/qarmin/czkawka/pull/1565)
- Progress information is shown when removing, renaming, or moving files, with the ability to stop the process - [#1565](https://github.com/qarmin/czkawka/pull/1565)
- Folders to scan can be now set via cli e.g. `krokiet /home/rafal` - for more info see `krokiet --help` - [#1566](https://github.com/qarmin/czkawka/pull/1566)
- Improved appearance of bottom directories panel - [#1569](https://github.com/qarmin/czkawka/pull/1569)
- Some buttons, are disabled, when there is no files selected - [#1586](https://github.com/qarmin/czkawka/pull/1586)
- Added info about the number of items selected to delete - [#1589](https://github.com/qarmin/czkawka/pull/1589)
- Limit image preview to max 1024 width/height, to speedup preview loading and fixing crash in software renderer - [#1590](https://github.com/qarmin/czkawka/pull/1590)
### External
- There is a new unofficial Tauri-based frontend for Czkawka - [Czkawka Tauri](https://github.com/shixinhuang99/czkawka-tauri)
- Czkawka 8.0.0 is now available in Debian Sid - [Cli](https://packages.debian.org/sid/czkawka-cli)/[Gui Gtk](https://packages.debian.org/sid/czkawka-gui)
### CI
- Compilation for 32-bit targets is now checked in CI
- Czkawka binaries are now checked for reproducibility in CI
### Prebuilt binaries
- AppImage binaries are no longer provided due to random bugs (not present in other packaging formats) and minimal added value compared to prebuilt Linux binaries or Flatpak
- HEIF Mac binaries are now provided
- CI now builds Linux binaries on Ubuntu 22.04 instead of 20.04(github removed 20.04 images)
- `musl` builds of `czkawka_cli` are now provided instead of `eyra` builds (slightly easier to maintain). GUI builds are not included due to limitations of `musl` and `eyra` :(
- Prebuilt Windows console binaries are no longer provided - logs are now saved to a file, which is easier to read than terminal output
- Skia opengl and vulkan backends are provided for Krokiet on Linux(no binaries on Windows, because don't know how to replace `sed`)
- Prebuilt binaries are now build with `lto fat` instead `lto thin` and `codegen-units=1` to greatly reduce binary size(~25% smaller binaries)
## Version 9.0.0 - 16.03.2025r
## Breaking changes
- Video, Duplicate (smaller prehash size), and Image cache (EXIF orientation + faster resize implementation) are incompatible with previous versions and need to be regenerated.
### Core
- Automatically rotating all images based on their EXIF orientation - [#1368](https://github.com/qarmin/czkawka/pull/1368)
- Fixed a crash caused by negative time values on some operating systems - [#1369](https://github.com/qarmin/czkawka/pull/1369)
- Updated `vid_dup_finder`; it can now detect similar videos shorter than 30 seconds - [#1425](https://github.com/qarmin/czkawka/pull/1425)
- Added support for more JXL image formats (using a built-in JXL → image-rs converter) - [#1425](https://github.com/qarmin/czkawka/pull/1425)
- Improved duplicate file detection by using a larger, reusable buffer for file reading - [#1425](https://github.com/qarmin/czkawka/pull/1425)
- Added an option for significantly faster image resizing to speed up image hashing - [#1458](https://github.com/qarmin/czkawka/pull/1458)
- Logs now include information about the operating system and compiled app features(only x86_64 versions) - [#1458](https://github.com/qarmin/czkawka/pull/1458)
- Added size progress tracking in certain modes - [#1458](https://github.com/qarmin/czkawka/pull/1458), [#1464](https://github.com/qarmin/czkawka/pull/1464)
- Ability to stop hash calculations for large files mid-process - [#1458](https://github.com/qarmin/czkawka/pull/1458)
- Implemented multithreading to speed up filtering of hard links - [#1458](https://github.com/qarmin/czkawka/pull/1458)
- Reduced prehash read file size to a maximum of 4 KB - [#1458](https://github.com/qarmin/czkawka/pull/1458)
- Fixed a slowdown at the end of scans when searching for duplicates on systems with a high number of CPU cores - [#1460](https://github.com/qarmin/czkawka/pull/1460)
- Improved scan cancellation speed when collecting files to check - [#1460](https://github.com/qarmin/czkawka/pull/1460)
- Added support for configuring config/cache paths using the `CZKAWKA_CONFIG_PATH` and `CZKAWKA_CACHE_PATH` environment variables - [#1464](https://github.com/qarmin/czkawka/pull/1464)
- Fixed a crash in debug mode when checking broken files named `.mp3` - [#1464](https://github.com/qarmin/czkawka/pull/1464)
- Catching panics from symphonia crashes in broken files mode - [#1466](https://github.com/qarmin/czkawka/pull/1466)
- Printing a warning, when using `panic=abort`(that may speed up app and cause occasional crashes) - [#1466](https://github.com/qarmin/czkawka/pull/1466)
### Krokiet
- Changed the default tab to "Duplicate Files" - [#1368](https://github.com/qarmin/czkawka/pull/1368)
### GTK GUI
- Added a window icon in Wayland - [#1400](https://github.com/qarmin/czkawka/pull/1400)
- Disabled the broken sort button - [#1400](https://github.com/qarmin/czkawka/pull/1400)
### CLI
- Added `-N` and `-M` flags to suppress printing results/warnings to the console - [#1464](https://github.com/qarmin/czkawka/pull/1464)
- Fixed an issue where messages were not cleared at the end of a scan - [#1464](https://github.com/qarmin/czkawka/pull/1464)
- Ability to disable cache via `-H` flag(useful for benchmarking) - [#1466](https://github.com/qarmin/czkawka/pull/1466)
### Prebuild-binaries
- This release is last version, that supports Ubuntu 20.04 - github actions drops this OS in its runners
- Linux and Mac binaries now are provided with two options x86_64 and arm64
- Arm linux builds needs at least Ubuntu 24.04
- Gtk 4.12 is used to build windows gtk gui instead gtk 4.10
- Dropping support for snap builds - too much time-consuming to maintain and testing(also it is broken currently)
- Removed native windows build krokiet version - now it is available only cross-compiled version from linux(should not be any difference)
## Version 8.0.0 - 11.10.2024r
### Breaking changes
- Due to the removal image_type from image struct, old cache files are incompatible with new version and should be regenerated from scratch(it uses new name)
- Some CLI arguments could change short name, due fixing ambiguous names
### Known regressions
- Slint 1.8 which Krokiet uses requires femtovg 0.9.2 which broke font rendering - https://github.com/slint-ui/slint/issues/6298
### CI
- Providing nightly builds - [#1360](https://github.com/qarmin/czkawka/pull/1360) - https://github.com/qarmin/czkawka/releases/tag/Nightly
- Added finding duplicated options in CLI - [#1364](https://github.com/qarmin/czkawka/pull/1364)
### Core
- Removed some unnecessary panics - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Simplified usage of structures when sending/receiving progress information - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Added Median hash algorithm - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Fixed compilation with Rust >=1.80 - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Extracted tool input parameters, that helped to find not used parameters - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Added new mod to find similar music only in groups with similar title tag - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Printing to file/console no longer uses two backslashes in windows paths - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Fixed panic when failed to decode raw picture - [#1355](https://github.com/qarmin/czkawka/pull/1355)
- Remove useless saving/loading cache when there is no files to check - [#1358](https://github.com/qarmin/czkawka/pull/1358)
- Filtering hard links on windows - [#1316](https://github.com/qarmin/czkawka/pull/1316)
- Added jxl support - [#1358](https://github.com/qarmin/czkawka/pull/1358)
- Added avif support(via external C library, not enabled by default) - [#1358](https://github.com/qarmin/czkawka/pull/1358)
- Integer overflow are enabled by default(prepare for reporting bugs, slower performance and general unstability) - [#1358](https://github.com/qarmin/czkawka/pull/1358)
- Fixed crash when loading invalid image cache - [#1230](https://github.com/qarmin/czkawka/pull/1230)
### Krokiet
- Fixed invalid default hash size in similar images - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Fixed and added more input parameters to the application - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Fixed problem with loading invalid preset - [#1226](https://github.com/qarmin/czkawka/pull/1226)
- Fixed crash when using 8 hash size with small similarity - [#1359](https://github.com/qarmin/czkawka/pull/1359)
- Disabling buttons when no files were found - [#1359](https://github.com/qarmin/czkawka/pull/1359)
- Changed way to close/open panel at bottom - [#1359](https://github.com/qarmin/czkawka/pull/1359)
- Modify logo a little - [#1359](https://github.com/qarmin/czkawka/pull/1359)
- Avoid errors when trying to load preview of not supported file - [#1359](https://github.com/qarmin/czkawka/pull/1359)
- Added ability to show preview of referenced folders - [#1359](https://github.com/qarmin/czkawka/pull/1359)
- Enable selecting with space and jumping over entries with arrows and opening with enter - [#1359](https://github.com/qarmin/czkawka/pull/1359)
- Added button to rename files with invalid extension - [#1364](https://github.com/qarmin/czkawka/pull/1364)
### GTK GUI
- Fixed and added more input parameters to the application - [#1355](https://github.com/qarmin/czkawka/pull/1355)
- Added option to use external libraries instead gtk pixbuf loader for previews - [#1358](https://github.com/qarmin/czkawka/pull/1358)
- Using static runtime with zstd compression in appimage - [#1350](https://github.com/qarmin/czkawka/pull/1355)
- Restoring flatpak builds - [#1275](https://github.com/qarmin/czkawka/pull/1275)
- [External] Mac homebrew version of app - https://formulae.brew.sh/formula/czkawka
### CLI
- Added options to find/remove images by size - [#1255](https://github.com/qarmin/czkawka/pull/1255)
- Fixed and added more input parameters to the application - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Fixed crash when stopping scan multiple times - [#1355](https://github.com/qarmin/czkawka/pull/1355)
- Print results also in debug build - [#1355](https://github.com/qarmin/czkawka/pull/1355)
- Added support for selecting reference directories - [#1364](https://github.com/qarmin/czkawka/pull/1364)
## Version 7.0.0 - 19.02.2024r
### BREAKING CHANGES
- Reducing size of cache files, made old cache files incompatible with new version
- `-C` in CLI now saves as compact json
### GTK GUI
- Added drag&drop support for included/excluded folders - [#1106](https://github.com/qarmin/czkawka/pull/1106)
- Added information where are saved scan results - [#1102](https://github.com/qarmin/czkawka/pull/1102)
### CLI
- Providing full static rust binary with [Eyra](https://github.com/sunfishcode/eyra) - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Fixed duplicated `-c` argument, now saving as compact json is handled via `-C` - [#1153](https://github.com/qarmin/czkawka/pull/1153)
- Added scan progress bar - [#1183](https://github.com/qarmin/czkawka/pull/1183)
- Clean and safe cancelling of scan - [#1183](https://github.com/qarmin/czkawka/pull/1183)
- Unification of CLI arguments - [#1183](https://github.com/qarmin/czkawka/pull/1183)
- Hardlink support for similar images/videos - [#1201](https://github.com/qarmin/czkawka/pull/1201)
### Krokiet GUI
- Initial release of new gui - [#1102](https://github.com/qarmin/czkawka/pull/1102)
### Core
- Using normal crossbeam channels instead of asyncio tokio channel - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Fixed tool type when using progress of empty directories - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Fixed missing json support when saving size and name duplicate results - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Fix cross-compiled debug windows build - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Added bigger stack size by default(fixes stack overflow in some musl apps) - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Added optional libraw dependency(better single-core performance and support more raw files) - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Speedup checking for wildcards and fix invalid recognizing long excluded items - [#1152](https://github.com/qarmin/czkawka/pull/1152)
- Big speedup when searching for empty folders(especially with multithreading + cached FS schema) - [#1152](https://github.com/qarmin/czkawka/pull/1152)
- Collecting files for scan can be a lot of faster due lazy file metadata gathering - [#1152](https://github.com/qarmin/czkawka/pull/1152)
- Fixed recognizing not accessible folders as non-empty - [#1152](https://github.com/qarmin/czkawka/pull/1152)
- Unifying code for collecting files to scan - [#1159](https://github.com/qarmin/czkawka/pull/1159)
- Decrease memory usage when collecting files by removing unused fields in custom file entries structs - [#1159](https://github.com/qarmin/czkawka/pull/1159)
- Decrease a little size of cache by few percents and improve loading/saving speed - [#1159](https://github.com/qarmin/czkawka/pull/1159)
- Added ability to remove from scan files with excluded extensions - [#1184](https://github.com/qarmin/czkawka/pull/1102)
- Fixed not showing in similar images results, files with same hashes when using reference folders - [#1184](https://github.com/qarmin/czkawka/pull/1102)
- Optimize release binaries with LTO(~25/50% smaller, ~5/10% faster) - [#1184](https://github.com/qarmin/czkawka/pull/1102)
## Version 6.1.0 - 15.10.2023r
- BREAKING CHANGE - Changed cache saving method, deduplicated, optimized and simplified procedure(all files needs to be hashed again) - [#1072](https://github.com/qarmin/czkawka/pull/1072), [#1086](https://github.com/qarmin/czkawka/pull/1086)
- Remove up to 340ms of delay when waiting for results - [#1070](https://github.com/qarmin/czkawka/pull/1070)
- Added logger with useful info when debugging app (level can be adjusted via e.g. `RUST_LOG=debug` env) - [#1072](https://github.com/qarmin/czkawka/pull/1072), [#1070](https://github.com/qarmin/czkawka/pull/1070)
- Core code cleanup - [#1072](https://github.com/qarmin/czkawka/pull/1072), [#1070](https://github.com/qarmin/czkawka/pull/1070), [#1082](https://github.com/qarmin/czkawka/pull/1082)
- Updated list of bad extensions and support for finding invalid jar files - [#1070](https://github.com/qarmin/czkawka/pull/1070)
- More default excluded items on Windows(like pagefile) - [#1074](https://github.com/qarmin/czkawka/pull/1074)
- Unified printing/saving method to files/terminal and fixed some differences/bugs - [#1082](https://github.com/qarmin/czkawka/pull/1082)
- Uses fun_time library to print how much functions take time - [#1082](https://github.com/qarmin/czkawka/pull/1082)
- Added exporting results into json file format - [#1083](https://github.com/qarmin/czkawka/pull/1083)
- Added new test/regression suite for CI - [#1083](https://github.com/qarmin/czkawka/pull/1083)
- Added ability to use relative paths - [#1083](https://github.com/qarmin/czkawka/pull/1083)
- Allowed removing similar images/videos/music from cli - [#1087](https://github.com/qarmin/czkawka/pull/1087)
- Added info about saving/loading items to cache in duplicate and music mode - [#1091](https://github.com/qarmin/czkawka/pull/1091)
- Fixed number of files to check in duplicate mode - [#1091](https://github.com/qarmin/czkawka/pull/1091)
- Added support for qoi image format(without preview yet) - [e92a](https://github.com/qarmin/czkawka/commit/e92a8a65de9bd1250be482dbce06959125554849)
- Fixed stability problem, that could remove invalid file in CLI - [#1083](https://github.com/qarmin/czkawka/pull/1083)
- Fix Windows gui crashes by using gtk 4.6 instead 4.8 or 4.10 - [#992](https://github.com/qarmin/czkawka/pull/992)
- Fixed printing info about duplicated music files - [#1016](https://github.com/qarmin/czkawka/pull/1016)
- Fixed printing info about duplicated video files - [#1017](https://github.com/qarmin/czkawka/pull/1017)
## Version 6.0.0 - 11.06.2023r
- Add finding similar audio files by content - [#970](https://github.com/qarmin/czkawka/pull/970)
- Allow to find duplicates by name/size at once - [#956](https://github.com/qarmin/czkawka/pull/956)
- Fix, simplify and speed up finding similar images - [#983](https://github.com/qarmin/czkawka/pull/956)
- Fixed bug when cache for music tags not worked - [#970](https://github.com/qarmin/czkawka/pull/970)
- Allow to set number of threads from CLI - [#972](https://github.com/qarmin/czkawka/pull/972)
- Fix problem with invalid item sorting in bad extensions mode - [#972](https://github.com/qarmin/czkawka/pull/972)
- Big refactor/cleaning of code - [#956](https://github.com/qarmin/czkawka/pull/956)/[#970](https://github.com/qarmin/czkawka/pull/970)/[#972](https://github.com/qarmin/czkawka/pull/972)
- Use builtin gtk webp loader for previews - [#923](https://github.com/qarmin/czkawka/pull/923)
- Fixed docker build - [#947](https://github.com/qarmin/czkawka/pull/947)
- Restore snap builds broken since GTk 4 port - [#965](https://github.com/qarmin/czkawka/pull/947)
- Instruction how to build native ARM64 binaries on Mac - [#945](https://github.com/qarmin/czkawka/pull/945)/[#971](https://github.com/qarmin/czkawka/pull/971)
## Version 5.1.0 - 19.02.2023r
- Added sort button - [#894](https://github.com/qarmin/czkawka/pull/894)
- Allow to set number of thread used to scan - [#839](https://github.com/qarmin/czkawka/pull/839)
- Faster similar images comparing with reference folders - [#826](https://github.com/qarmin/czkawka/pull/826)
- Update to clap 4 - [#878](https://github.com/qarmin/czkawka/pull/878)
- Use FileChooserNative instead FileChooserDialog - [#894](https://github.com/qarmin/czkawka/pull/894)
- Fix invalid music tags in music files when using reference folders - [#894](https://github.com/qarmin/czkawka/pull/894)
- Updated pdf dependency(a lot of less amount of broken pdf false positives) - [#894](https://github.com/qarmin/czkawka/pull/894)
- Changed strange PDF error message - "Try at" - [#894](https://github.com/qarmin/czkawka/pull/894)
- Treat extensions Mp4 and m4v as identical - [#834](https://github.com/qarmin/czkawka/pull/834)
- Improve thumbnail quality - [#895](https://github.com/qarmin/czkawka/pull/895)
- Verify if hardlinking works, and if not, disable button with proper message - [#881](https://github.com/qarmin/czkawka/pull/881)
- Apply some pydantic clippy lints on project - [#901](https://github.com/qarmin/czkawka/pull/901)
## Version 5.0.2 - 30.08.2022r
- Fixed problem with missing some similar images when using similarity > 0 - [#799](https://github.com/qarmin/czkawka/pull/799)
- Prebuilt Linux binaries are compiled without heif support - [24b](https://github.com/qarmin/czkawka/commit/24b64a32c65904c506b54270f0977ccbe5098cc8)
- Similar videos stops to proceed video after certain amount of time(fixes freezes) - [#815](https://github.com/qarmin/czkawka/pull/815)
- Add --version argument for czkawka_cli - [#806](https://github.com/qarmin/czkawka/pull/806)
- Rewrite a little nonsense message about minimal file size - [#807](https://github.com/qarmin/czkawka/pull/807)
## Version 5.0.1 - 03.08.2022r
- Fixed problem with removing ending slash with empty disk window path - [975](https://github.com/qarmin/czkawka/commit/97563a7b2a70fb5fcf6463f28069e6ea3b0ff5c2)
- Added to CLI bad extensions mode - [#795](https://github.com/qarmin/czkawka/pull/795)
- Restore default sorting method in CLI where finding biggest files - [5d7](https://github.com/qarmin/czkawka/commit/5d79dc7ccfee6d5426e37c4e6a860fa555c5927a)
- Added tests to CI - [#791](https://github.com/qarmin/czkawka/pull/791)
- Show error message when all directories are set as reference folders - [#795](https://github.com/qarmin/czkawka/pull/795)
- Added more info about new requirements on Linux - [#795](https://github.com/qarmin/czkawka/pull/795)
## Version 5.0.0 - 28.07.2022r
- GUI ported to use GTK 4 - [#466](https://github.com/qarmin/czkawka/pull/466)
- Use multithreading and improved algorithm to compare image hashes - [#762](https://github.com/qarmin/czkawka/pull/762)
- Resize preview with window - [#466](https://github.com/qarmin/czkawka/pull/466)
- Fix removing only one item from list view - [#466](https://github.com/qarmin/czkawka/pull/466)
- Fix showing help command in duplicate CLI mode - [#720](https://github.com/qarmin/czkawka/pull/720)
- Fix freeze when not choosing any tag in similar music mode - [#732](https://github.com/qarmin/czkawka/pull/732)
- Fix preview of files with non-lowercase extensions - [#694](https://github.com/qarmin/czkawka/pull/694)
- Read more tags from music files - [#705](https://github.com/qarmin/czkawka/pull/705)
- Improve checking for invalid extensions - [#705](https://github.com/qarmin/czkawka/pull/705), [#747](https://github.com/qarmin/czkawka/pull/747), [#749](https://github.com/qarmin/czkawka/pull/749)
- Support for finding invalid PDF files - [#705](https://github.com/qarmin/czkawka/pull/705)
- Re-enable checking for broken music files(`libasound.so.2` no longer needed) - [#705](https://github.com/qarmin/czkawka/pull/705)
- Fix disabled ui when using invalid settings in similar music - [#740](https://github.com/qarmin/czkawka/pull/740)
- Speedup searching for invalid extensions - [#740](https://github.com/qarmin/czkawka/pull/740)
- Support for finding the smallest files - [#741](https://github.com/qarmin/czkawka/pull/741)
- Improved Windows CI - [#749](https://github.com/qarmin/czkawka/pull/749)
- Ability to check for broken files by types - [#749](https://github.com/qarmin/czkawka/pull/749)
- Add heif and Webp files support - [#750](https://github.com/qarmin/czkawka/pull/750)
- Use in CLI Clap library instead StructOpt - [#759](https://github.com/qarmin/czkawka/pull/759)
- Multiple directories can be added via Manual Add button - [#782](https://github.com/qarmin/czkawka/pull/782)
- Option to exclude files from other filesystems in GUI(Linux) - [#776](https://github.com/qarmin/czkawka/pull/776)
## Version 4.1.0 - 24.04.2022r
- New mode - finding files whose content not match with their extension - [#678](https://github.com/qarmin/czkawka/pull/678)
- Builtin icons - no more invalid, theme/OS dependent icons - [#659](https://github.com/qarmin/czkawka/pull/659)
- Big(usually 2x) speedup of showing previews of images(both previews in scan and compare window) - [#660](https://github.com/qarmin/czkawka/pull/660)
- Fix selecting records by custom selection popup - [#632](https://github.com/qarmin/czkawka/pull/632)
- Support more tags when comparing music files - [#590](https://github.com/qarmin/czkawka/pull/590)
- Fix not proper selecting path - [#656](https://github.com/qarmin/czkawka/pull/656)
- No more popups during scan for similar videos on Windows - [#656](https://github.com/qarmin/czkawka/pull/656) - external change [4056](https://github.com/Farmadupe/ffmpeg_cmdline_utils/commit/405687514f9d9e8984cbe2547c53e85b71e08b27)
- Custom selecting is now case-insensitive by default - [#657](https://github.com/qarmin/czkawka/pull/657)
- Better approximate comparison of tags - [#641](https://github.com/qarmin/czkawka/pull/641)
- Fix search problem due accumulated stop events - [#623](https://github.com/qarmin/czkawka/pull/623)
- Option to ignore other filesystems in Unix OS(for now only in CLI) - [#673](https://github.com/qarmin/czkawka/pull/673)
- Fix file hardlinking on Windows - [#668](https://github.com/qarmin/czkawka/pull/668)
- Support for case-insensitive name grouping of files - [#669](https://github.com/qarmin/czkawka/pull/669)
- Directories for search GUI can be passed by CLI - [#677](https://github.com/qarmin/czkawka/pull/677)
- Prevent from getting non respond app notification from display servers - [#625](https://github.com/qarmin/czkawka/pull/625)
## Version 4.0.0 - 20.01.2022r
- Multithreading support for collecting files to check(2/3x speedup on 4 thread processor and SSD) - [#502](https://github.com/qarmin/czkawka/pull/502), [#504](https://github.com/qarmin/czkawka/pull/504)
- Add multiple translations - Polish, Italian, French, German, Russian ... - [#469](https://github.com/qarmin/czkawka/pull/469), [#508](https://github.com/qarmin/czkawka/pull/508), [5be](https://github.com/qarmin/czkawka/commit/5be801e76395855f07ab1da43cdbb8bd0b843834)
- Add support for finding similar videos - [#460](https://github.com/qarmin/czkawka/pull/460)
- GUI code refactoring and search code unification - [#462](https://github.com/qarmin/czkawka/pull/462), [#531](https://github.com/qarmin/czkawka/pull/531)
- Fixed crash when trying to hard/symlink 0 files - [#462](https://github.com/qarmin/czkawka/pull/462)
- GTK 4 compatibility improvements for future change of toolkit - [#467](https://github.com/qarmin/czkawka/pull/467), [#468](https://github.com/qarmin/czkawka/pull/468), [#473](https://github.com/qarmin/czkawka/pull/473), [#474](https://github.com/qarmin/czkawka/pull/474), [#503](https://github.com/qarmin/czkawka/pull/503), [#505](https://github.com/qarmin/czkawka/pull/505)
- Change minimal supported OS to Ubuntu 20.04(needed by GTK) - [#468](https://github.com/qarmin/czkawka/pull/468)
- Increased performance by avoiding creating unnecessary image previews - [#468](https://github.com/qarmin/czkawka/pull/468)
- Improved performance due caching hash of broken/not supported images/videos = [#471](https://github.com/qarmin/czkawka/pull/471)
- Option to not remove cache from non-existent files(e.g. from unplugged pendrive) - [#472](https://github.com/qarmin/czkawka/pull/472)
- Add multiple tooltips with helpful messages - [#472](https://github.com/qarmin/czkawka/pull/472)
- Allow caching prehash - [#477](https://github.com/qarmin/czkawka/pull/477)
- Improve custom selecting of records(allows to use Rust regex) - [#489](https://github.com/qarmin/czkawka/pull/478)
- Remove support for finding zeroed files - [#461](https://github.com/qarmin/czkawka/pull/461)
- Remove HashMB mode - [#476](https://github.com/qarmin/czkawka/pull/476)
- Approximate comparison of music - [#483](https://github.com/qarmin/czkawka/pull/483)
- Enable column sorting for simple treeview - [#487](https://github.com/qarmin/czkawka/pull/487)
- Allow hiding upper panel - [#491](https://github.com/qarmin/czkawka/pull/491)
- Make UI take less space - [#500](https://github.com/qarmin/czkawka/pull/500)
- Add support for raw images(NEF, CR2, KDC...) - [#532](https://github.com/qarmin/czkawka/pull/532)
- Image compare performance and usability improvements - [#529](https://github.com/qarmin/czkawka/pull/529), [#528](https://github.com/qarmin/czkawka/pull/528), [#530](https://github.com/qarmin/czkawka/pull/530), [#525](https://github.com/qarmin/czkawka/pull/525)
- Reorganize(unify) saving/loading data from file - [#524](https://github.com/qarmin/czkawka/pull/524)
- Add "reference folders" - [#516](https://github.com/qarmin/czkawka/pull/516)
- Add cache for similar music files - [#558](https://github.com/qarmin/czkawka/pull/558)
## Version 3.3.1 - 22.11.2021r
- Fix crash when moving buttons [#457](https://github.com/qarmin/czkawka/pull/457)
- Hide move button at start [c9ca230](https://github.com/qarmin/czkawka/commit/c9ca230dfd05e2166b2d68683b091cfd45037edd)
## Version 3.3.0 - 20.11.2021r
- Select files by pressing space key [#415](https://github.com/qarmin/czkawka/pull/415)
- Add additional info to printed errors [#446](https://github.com/qarmin/czkawka/pull/446)
- Add support for multiple image filters, hashes and sizes in similar images tool [#447](https://github.com/qarmin/czkawka/pull/447), [#448](https://github.com/qarmin/czkawka/pull/448)
- Button to move files/folders to provided location [#449](https://github.com/qarmin/czkawka/pull/449)
- Add non-clickable button to fix white theme [#450](https://github.com/qarmin/czkawka/pull/450)
- Fixed freeze when opening in same thread file/folder [#448](https://github.com/qarmin/czkawka/pull/448)
- Tool to check performance of different image filters and hash types and sizes [#447](https://github.com/qarmin/czkawka/pull/447)
- Add scheduled CI and pin it to support Rust 1.53.0 [7bb](https://github.com/qarmin/czkawka/commit/7bbdf742739a513b80d0cc06ba61dfafec976b23), [#431](https://github.com/qarmin/czkawka/pull/431)
- Update snap file to use builtin rust plugin and update gnome extension [8f2](https://github.com/qarmin/czkawka/commit/8f232285e5c34bee6d5da8e1453d7f40a0ffd08d)
- Disable from checking in similar images `webp`, `gif`, `bmp`, `ico` extension which caused crashes [#445](https://github.com/qarmin/czkawka/pull/446), [49e](https://github.com/qarmin/czkawka/commit/49effca169adb57b33f666757966d43b244319cc)
## Version 3.2.0 - 07.08.2021r
- Use checkbox instead selection to select files [#392](https://github.com/qarmin/czkawka/pull/392)
- Re-enable hardlink on windows - [#410](https://github.com/qarmin/czkawka/pull/410)
- Fix symlink and hardlink creating - [#409](https://github.com/qarmin/czkawka/pull/409)
- Add image preview to duplicate finder [#408](https://github.com/qarmin/czkawka/pull/408)
- Add setting maximum file size [#407](https://github.com/qarmin/czkawka/pull/407)
- Add new grouping algorithm to similar images [#405](https://github.com/qarmin/czkawka/pull/405)
- Update to Rust 1.54 [#400](https://github.com/qarmin/czkawka/pull/400)
- Add webp support to similar images [#396](https://github.com/qarmin/czkawka/pull/396)
- Use GtkScale instead radio buttons for similarity [#397](https://github.com/qarmin/czkawka/pull/397)
- Update all dependencies [#405](https://github.com/qarmin/czkawka/pull/405), [#395](https://github.com/qarmin/czkawka/pull/395)
- Split UI into multiple files [#391](https://github.com/qarmin/czkawka/pull/391)
- Update to gtk-rs 0.14 [#383](https://github.com/qarmin/czkawka/pull/383)
- Fix bug with moving windows [#361](https://github.com/qarmin/czkawka/pull/361)
- Generate Minimal Appimage [#339](https://github.com/qarmin/czkawka/pull/339)
## Version 3.1.0 - 09.05.2021r
- Clean README, by moving instructions to different files - [9aea6e9b](https://github.com/qarmin/czkawka/commit/9aea6e9b1ef5ac1e56ccd008e7456b80401179d0)
- Fix excluded items on Windows - [#324](https://github.com/qarmin/czkawka/pull/324)
- Center windows and add missing settings icon - [#323](https://github.com/qarmin/czkawka/pull/323)
- Sort cache - [#322](https://github.com/qarmin/czkawka/pull/322)
- Add desktop file to Snap - [018d5bebb](https://github.com/qarmin/czkawka/commit/018d5bebb0b297ba35529b03b8e2e68eb0a9b474), [ade2a756e2](https://github.com/qarmin/czkawka/commit/ade2a756e29c5ce5739d6268fcab7e76f59ed5f6)
- Customize minimum file size of cached records - [#321](https://github.com/qarmin/czkawka/pull/321)
- Update benchmarks - [2044b9185](https://github.com/qarmin/czkawka/commit/2044b91852fea89dfaf10dc1ab79c1d00e9e0c12)
- Rearrange Instruction - [8e7ac4a2d7f5b0](https://github.com/qarmin/czkawka/commit/8e7ac4a2d7f5b0beba2552581fb3a0d19c2efeb5)
- Add info that Czkawka and Bleachbit are not alternatives to each other - [30602a486](https://github.com/qarmin/czkawka/commit/30602a486f6ade6f9b7b91a73708225b4f4c2a7d)
- Fix crashes with too small message queue - [#316](https://github.com/qarmin/czkawka/pull/316)
- Fix a little unsorted results - [#304](https://github.com/qarmin/czkawka/pull/304)
- Fix Appimage(external bug) - [#299](https://github.com/qarmin/czkawka/issues/299)
- Fix error with saving results of name duplicates - [#307](https://github.com/qarmin/czkawka/pull/307)
- Update to Rust 1.5.1 - [#302](https://github.com/qarmin/czkawka/pull/302)
## Version 3.0.0 - 11.03.2021r
- Option to not ignore hardlinks - [#273](https://github.com/qarmin/czkawka/pull/273)
- Hardlink support for GUI - [#276](https://github.com/qarmin/czkawka/pull/276)
- New settings window - [#262](https://github.com/qarmin/czkawka/pull/262)
- Unify file removing - [#278](https://github.com/qarmin/czkawka/pull/278)
- Dryrun in duplicates CLI - [#277](https://github.com/qarmin/czkawka/pull/277)
- Option to turn off cache - [#263](https://github.com/qarmin/czkawka/pull/263)
- Update Image dependency and fix crashes - [#270](https://github.com/qarmin/czkawka/pull/270), [e3aca69](https://github.com/qarmin/czkawka/commit/e3aca69499966499413e4b7cd4d1037bec6a5d68)
- Add confirmation dialog when trying to remove all files in group - [#281](https://github.com/qarmin/czkawka/pull/281)
- Add confirmation dialog when removing files with delete key - [#282](https://github.com/qarmin/czkawka/pull/282)
- Open file when clicking at the Enter button - [#285](https://github.com/qarmin/czkawka/pull/285)
- Allow to put files to trash instead fully remove them - [#284](https://github.com/qarmin/czkawka/pull/284)
## Version 2.4.0 - 22.02.2021r
- Add about dialog - [#226](https://github.com/qarmin/czkawka/pull/226)
- Remove checking for ico in similar images - [#227](https://github.com/qarmin/czkawka/pull/227)
- Change progress dialog to progress window - [#229](https://github.com/qarmin/czkawka/pull/229)
- Restore snap confinement - [#218](https://github.com/qarmin/czkawka/pull/218), [8dcb718](https://github.com/qarmin/czkawka/commit/8dcb7188434e1c1728368642e17ccec29a4b372d)
- Add support for CRC32 and XXH3 hash - [#243](https://github.com/qarmin/czkawka/pull/243)
- Add delete method to replace duplicate files with hard links - [#236](https://github.com/qarmin/czkawka/pull/236)
- Add checking for broken music opt-in - [#249](https://github.com/qarmin/czkawka/pull/249)
- Allow to save to file similar images results - [10156ccfd3](https://github.com/qarmin/czkawka/commit/10156ccfd3ba880d26d4bbad1e025b0050d7753b)
- Keep original file if replacing duplicate with hardlink fails - [#256](https://github.com/qarmin/czkawka/pull/256)
- Fix Windows theme - [#265](https://github.com/qarmin/czkawka/pull/265)
- Windows taskbar progress support - [#264](https://github.com/qarmin/czkawka/pull/264)
- Ignore duplicates if those are hard links - [#234](https://github.com/qarmin/czkawka/pull/234)
- Support the hash type parameter in the CLI - [#267](https://github.com/qarmin/czkawka/pull/267)
- Use one implementation for all hash calculations - [#268](https://github.com/qarmin/czkawka/pull/268)
- Disable for now broken tga and gif files - [#270](https://github.com/qarmin/czkawka/pull/270)
## Version 2.3.2 - 21.01.2021r
- Add support for moving selection by keyboard to update similar image preview [#223](https://github.com/qarmin/czkawka/pull/223)
This version is only needed to test flatpak build
## Version 2.3.1 - 20.01.2021r
- Added flatpak support - [#203](https://github.com/qarmin/czkawka/pull/203)
- Spell fixes - [#222](https://github.com/qarmin/czkawka/pull/222), [#219](https://github.com/qarmin/czkawka/pull/219)
## Version 2.3.0 - 15.01.2021r
- Add cache for duplicate finder - [#205](https://github.com/qarmin/czkawka/pull/205)
- Add cache for broken files - [#204](https://github.com/qarmin/czkawka/pull/204)
- Decrease ram usage - [#212](https://github.com/qarmin/czkawka/pull/212)
- Add support for finding broken zip and audio files - [#210](https://github.com/qarmin/czkawka/pull/210)
- Sort Results by path where it is possible - [#211](https://github.com/qarmin/czkawka/pull/211)
- Add missing popover info for invalid symlinks - [#209](https://github.com/qarmin/czkawka/pull/209)
- Use the oldest available OS in Linux and Mac CI and the newest on Windows - [#206](https://github.com/qarmin/czkawka/pull/206)
- Add broken files support - [#202](https://github.com/qarmin/czkawka/pull/202)
- Remove save workaround and fix crashes when loading/saving cache - [#200](https://github.com/qarmin/czkawka/pull/200)
- Fix error when closing dialog progress by X - [#199](https://github.com/qarmin/czkawka/pull/199)
## Version 2.2.0 - 11.01.2021r
- Adds Mac GUI - [#160](https://github.com/qarmin/czkawka/pull/160)
- Use master gtk plugin again - [#179](https://github.com/qarmin/czkawka/pull/179)
- Only show preview when 1 image is selected - [#183](https://github.com/qarmin/czkawka/pull/183)
- Add buffered write/read - [#186](https://github.com/qarmin/czkawka/pull/186)
- Fix included/excluded files which contains commas - [#195](https://github.com/qarmin/czkawka/pull/195)
- Move image cache to cache from config dir - [#197](https://github.com/qarmin/czkawka/pull/197)
- Reorganize GUI Code(no visible changes) - [#184](https://github.com/qarmin/czkawka/pull/184), [#184](https://github.com/qarmin/czkawka/pull/184), [#189](https://github.com/qarmin/czkawka/pull/189), [#190](https://github.com/qarmin/czkawka/pull/190), [#194](https://github.com/qarmin/czkawka/pull/194)
## Version 2.1.0 - 31.12.2020r
- Hide preview when deleting images or symlinking it - [#167](https://github.com/qarmin/czkawka/pull/167)
- Add manual adding of directories - [#165](https://github.com/qarmin/czkawka/pull/165), [#168](https://github.com/qarmin/czkawka/pull/168)
- Add resizable top panel - [#164](https://github.com/qarmin/czkawka/pull/164)
- Add support for delete button - [#159](https://github.com/qarmin/czkawka/pull/159)
- Allow to select multiple entries in File Chooser - [#154](https://github.com/qarmin/czkawka/pull/154)
- Add cache support for similar images - [#139](https://github.com/qarmin/czkawka/pull/139)
- Add selecting images with its size - [#138](https://github.com/qarmin/czkawka/pull/138)
- Modernize popovers code and simplify later changes - [#137](https://github.com/qarmin/czkawka/pull/137)
## Version 2.0.0 - 23.12.2020r
- Add Snap support - [ee3d4](https://github.com/qarmin/czkawka/commit/ee3d450552cd0c37a114b05c557ff9381ef92466)
- Select longer names by default - [#113](https://github.com/qarmin/czkawka/pull/113)
- Add setting for deletion confirmation dialog - [#114](https://github.com/qarmin/czkawka/pull/114)
- Add button to hide/show text view errors - [#115](https://github.com/qarmin/czkawka/pull/115)
- Remove console window in Windows - [#116](https://github.com/qarmin/czkawka/pull/116)
- Add custom selection/unselection - [#117](https://github.com/qarmin/czkawka/pull/117)
- Add Image preview to similar images - [#118](https://github.com/qarmin/czkawka/pull/118)
- Remove orbtk frontend - [#119](https://github.com/qarmin/czkawka/pull/119)
- Update Icon - [#120](https://github.com/qarmin/czkawka/pull/120)
- Add setting button to disable/enable previews(enabled by default) - [#121](https://github.com/qarmin/czkawka/pull/121)
- Add button to enable/disable in settings text view errors - [#122](https://github.com/qarmin/czkawka/pull/122)
- Add support for symbolic links - [#123](https://github.com/qarmin/czkawka/pull/123)
- Add support for checking for invalid symlinks - [#124](https://github.com/qarmin/czkawka/pull/124)
- Add new windows dark theme - [#125](https://github.com/qarmin/czkawka/pull/125)
- Fix appimage crash by adding PNG version of icon - [#126](https://github.com/qarmin/czkawka/pull/126)
- Split symlink path to two path and file name - [#127](https://github.com/qarmin/czkawka/pull/127)
- Add option to open folders by double right click - [#128](https://github.com/qarmin/czkawka/pull/128)
- Add minimal similarity level - [#129](https://github.com/qarmin/czkawka/pull/129)
- Show errors in image previewer when failed to generate it - [#130](https://github.com/qarmin/czkawka/pull/130)
- Added instruction - [58e6221a](https://github.com/qarmin/czkawka/commit/58e6221a0e02d17d07c71152f56b948f616751a8), [598aec345e](https://github.com/qarmin/czkawka/commit/598aec345e9f5ac199fc3d642c0699d5228100a6), [afaa402b](https://github.com/qarmin/czkawka/commit/afaa402b31526aa8e6b47f3670bc62b26ad9f60f)
## Version 1.5.1 - 08.12.2020r
- Fix errors in progress bar caused by dividing by 0 - [#109](https://github.com/qarmin/czkawka/pull/109)
- Add option to save file, store settings and load them - [#108](https://github.com/qarmin/czkawka/pull/108)
- Center dialog to current window - [a04](https://github.com/qarmin/czkawka/commit/a047380dbe8aa4d04f9c482364469e21d231fab2)
## Version 1.5.0 - 02.12.2020r
- Added progress bar - [#106](https://github.com/qarmin/czkawka/pull/106)
- Removed unused buttons - [#107](https://github.com/qarmin/czkawka/pull/107)
## Version 1.4.0 - 09.11.2020r
- Multithreading Support to most modules - [#98](https://github.com/qarmin/czkawka/pull/98) [#99](https://github.com/qarmin/czkawka/pull/99) [#100](https://github.com/qarmin/czkawka/pull/100) [#101](https://github.com/qarmin/czkawka/pull/101)
- Simplify GUI code [#96](https://github.com/qarmin/czkawka/pull/96)
- Group similar images - [#97](https://github.com/qarmin/czkawka/pull/97)
- Add select buttons to each type of mode - [#102](https://github.com/qarmin/czkawka/pull/102)
- Fix GUI behavior in GUI when deleting similar image - [#103](https://github.com/qarmin/czkawka/pull/103)
- Add new similarity level - [#104](https://github.com/qarmin/czkawka/pull/104)
## Version 1.3.0 - 02.11.2020r
- Appimage support - [#77](https://github.com/qarmin/czkawka/pull/77)
- Removed warnings about non-existed excluded directories - [#79](https://github.com/qarmin/czkawka/pull/79)
- Updated README - [8ec](https://github.com/qarmin/czkawka/commit/8ecde0fc9adb3e6cedf432c4ba749e698b645a7a)
- Added pre hash support(speedup for searching big duplicates) - [#83](https://github.com/qarmin/czkawka/pull/83)
- Support for searching duplicates by file name - [#84](https://github.com/qarmin/czkawka/pull/84)
- Added support for checking for zeroed file - [#88](https://github.com/qarmin/czkawka/pull/88)
- Refactored GUI code to faster and safer changing/adding code - [#89](https://github.com/qarmin/czkawka/pull/89)
- Added some missing options to CLI in some modes - [#90](https://github.com/qarmin/czkawka/pull/90)
- Implemented finding duplicates by music tags - [#95](https://github.com/qarmin/czkawka/pull/95)
## Version 1.2.1 - 17.10.2020r
- Make image similarity search significantly faster. [#72](https://github.com/qarmin/czkawka/pull/72)
- Improve similar images GUI a little and add sorting to Similarity Enum [#73](https://github.com/qarmin/czkawka/pull/73)
- Improve deleting files in Similar files in GUI [#75](https://github.com/qarmin/czkawka/pull/75)
## Version 1.2.0 - 15.10.2020r
- Replace String with PathBuf for paths [#59](https://github.com/qarmin/czkawka/pull/59)
- Add test suite to PR [#65](https://github.com/qarmin/czkawka/pull/65)
- Support for finding similar images to CLI [#66](https://github.com/qarmin/czkawka/pull/66)
- Fix grammar-related errors and Ponglish expressions [#62](https://github.com/qarmin/czkawka/pull/62), [#63](https://github.com/qarmin/czkawka/pull/63)
- Don't delete by default files in duplicate finder in CLI - [23f203](https://github.com/qarmin/czkawka/commit/23f203a061e254275c95ca23ca4f1a78bd941f02)
- Support for finding similar images to GUI [#69](https://github.com/qarmin/czkawka/pull/69)
- Add support for opening files/folders from GUI with double-click [#70](https://github.com/qarmin/czkawka/pull/70)
## Version 1.1.0 - 10.10.2020r
- Windows support [#58](https://github.com/qarmin/czkawka/pull/58)
- Improve code quality/Simplify codebase [#52](https://github.com/qarmin/czkawka/pull/52)
- Fixed skipping some correct results in specific situations [#52](https://github.com/qarmin/czkawka/pull/52#discussion_r502613895)
- Added support for searching in other thread [#51](https://github.com/qarmin/czkawka/pull/51)
- Divide CI across files [#48](https://github.com/qarmin/czkawka/pull/48)
- Added ability to stop task from GUI [#55](https://github.com/qarmin/czkawka/pull/55)
- Fixed removing directories which contains only empty directories from GUI [#57](https://github.com/qarmin/czkawka/pull/57)
## Version 1.0.1 - 06.10.2020r
- Replaced default argument parser with StructOpt [#37](https://github.com/qarmin/czkawka/pull/37)
- Added all(except macOS GTK build) builds to CI where can be freely downloaded [#41](https://github.com/qarmin/czkawka/pull/41) [#39](https://github.com/qarmin/czkawka/pull/39)
- App can be downloaded also from Arch AUR and Cargo [#36](https://github.com/qarmin/czkawka/pull/36)
- Fixed crash with invalid file modification date [#33](https://github.com/qarmin/czkawka/issues/33)
- Upper tabs can hide and show when this is necessary [#38](https://github.com/qarmin/czkawka/pull/38)
- Fixed crash when file/folder name have non Unicode character [#44](https://github.com/qarmin/czkawka/issues/44)
- Added support for finding similar pictures in GUI [#69](https://github.com/qarmin/czkawka/issues/69)
## Version 1.0.0 - 02.10.2020r
- Added confirmation dialog to delete button
- Updated Readme
- Tested a lot app, so I think that it version 1.0.0 can be freely released
## Version 0.1.4 - 01.10.2020r
- Fixes -f default argument
- Added save button to GUI
- Cleaned a little code
- Deleting files and folders i GUI
- Support for all notebooks items in GUI
- Support for deleting and adding directories to search and to exclude in GUI
- Support for light themes in GUI
- Changed SystemTime to u64 from EPOCH_TIME
- Selective selecting of rows duplicate finder in GUI
- Changed minimum version of GTK to 3.22
- Added save system to GUI
- Added Big, Temporary and Empty folders finder to GUI
## Version 0.1.3 - 27.09.2020r
- Big code refactoring - now is a lot of easier create new modules and maintain old ones
- Added finding empty files
- Added new option to find duplicates by checking hash max 1MB of file
- Added support for finding temporary folder finder
- Improved README
- Simplify CLI help and improve it
## Version 0.1.2 - 26.09.2020r
- Add basic search empty folders in GTK GUI
- Remember place where button are placed
- Read and parse more values from GUI
- Print errors/warnings/messages to text field in GUI
- Add upper notebook with included, excluded directories, items and extensions
- Improve a little GUI
- Add version argument which print version e.g. `czkawka_gui --version`
- Simple Empty folder support in GUI
- The biggest files support in CLI
## Version 0.1.1 - 20.09.2020r
- Added images to readme
- Better GTK buttons and glade file
- Basic search in GTK
- Cleaned core from println
- Core functions doesn't use now process::exit(everything is done with help of messages/errors/warnings)
- Added support for non-recursive search
- Improved finding number and size of duplicated files
- Saving results to file
- Print how much data was read by duplicate finder(debug only)
- Added GitHub CI
- Only debug build prints debug information's
- Clean code
- Add basic idea config to misc folder
## Version 0.1.0 - 07.09.2020r
- Initial Version
- Duplicate file finder
- Empty folder finder
- Very WIP Orbtk GUI frontend
- Basic GTK Frontend(without any logic)
- CLI
## Initial commit - 26.08.2020r
================================================
FILE: LICENSE_CC_BY_4_ICONS
================================================
All icons, in this project are licensed under Creative Commons Attribution 4.0 International (CC BY 4.0).
Copyright (c) 2020 [jannuary](https://github.com/jannuary)
- data/icons/com.github.qarmin.czkawka.Devel.svg
- data/icons/com.github.qarmin.czkawka.svg
- data/icons/com.github.qarmin.czkawka-symbolic.svg
Copyright (c) 2020-2026 Rafał Mikrut
- data/icons/io.github.qarmin.krokiet.svg
License: CC-BY-4.0
Creative Commons Attribution 4.0 International Public License
.
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution 4.0 International Public License ("Public
License"). To the extent this Public License may be interpreted as a
contract, You are granted the Licensed Rights in consideration of Your
acceptance of these terms and conditions, and the Licensor grants You
such rights in consideration of benefits the Licensor receives from
making the Licensed Material available under these terms and
conditions.
.
Section 1 -- Definitions.
.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
.
b. Adapter's License means the license You apply to Your Copyright
and Similar Rights in Your contributions to Adapted Material in
accordance with the terms and conditions of this Public License.
.
c. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
.
d. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
.
e. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
.
f. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
.
g. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
.
h. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
.
i. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
.
j. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
.
k. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
.
Section 2 -- Scope.
.
a. License grant.
.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
.
a. reproduce and Share the Licensed Material, in whole or
in part; and
.
b. produce, reproduce, and Share Adapted Material.
.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
.
3. Term. The term of this Public License is specified in Section
6(a).
.
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
.
5. Downstream recipients.
.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
.
b. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
.
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
.
b. Other rights.
.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
.
2. Patent and trademark rights are not licensed under this
Public License.
.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties.
.
Section 3 -- License Conditions.
.
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
.
a. Attribution.
.
1. If You Share the Licensed Material (including in modified
form), You must:
.
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
.
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
.
ii. a copyright notice;
.
iii. a notice that refers to this Public License;
.
iv. a notice that refers to the disclaimer of
warranties;
.
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
.
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
.
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
.
4. If You Share Adapted Material You produce, the Adapter's
License You apply must not prevent recipients of the Adapted
Material from complying with this Public License.
.
Section 4 -- Sui Generis Database Rights.
.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
.
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database;
.
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material; and
.
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
.
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
.
Section 6 -- Term and Termination.
.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
.
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
.
2. upon express reinstatement by the Licensor.
.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
.
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
.
Section 7 -- Other Terms and Conditions.
.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
.
Section 8 -- Interpretation.
.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
.
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
================================================
FILE: LICENSE_MIT_EVERYTHING_OUTSIDE_ANY_CARGO_APP_LIBRARY
================================================
MIT License
Copyright (c) 2020-2026 Rafał Mikrut
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
**Krokiet** ((IPA: [ˈkrɔcɛt]), "croquette" in Polish) new generation GUI frontend, simple, multiplatform, fast and free app to remove unnecessary files from your computer.
**Czkawka** (_tch•kav•ka_ (IPA: [ˈʧ̑kafka]), "hiccup" in Polish) older gtk4 GUI frontend, superseded by Krokiet, but still receiving bugfix updates.
## Features
- **Written in memory-safe Rust** - almost 100% unsafe code free
- **Amazingly fast** - due multithreading and efficient algorithms
- **Free, Open Source without any ads**
- **Multiplatform** - runs on Linux, Windows, macOS, FreeBSD, x86, ARM, RISC-V and even Android
- **Cache support** - second and further scans should be much faster than the first one
- **Easy to run, easy to compile** - minimal runtime and build dependencies, portable version available
- **CLI frontend** - for easy automation
- **GUI frontend** - uses Slint or GTK 4 frameworks
- **Core library** - allows to reuse functionality in other apps
- **Android app** - experimental touch-friendly frontend for Android devices
- **No spying** - Czkawka does not have access to the Internet, nor does it collect any user information or statistics
- **Multilingual** - support multiple languages like Polish, English or Italian
- **Multiple tools to use**:
- **Duplicates** - Finds duplicates based on file name, size or hash
- **Empty Folders** - Finds empty folders with the help of an advanced algorithm
- **Big Files** - Finds the provided number of the biggest files in given location
- **Empty Files** - Looks for empty files across the drive
- **Temporary Files** - Finds temporary files
- **Similar Images** - Finds images which are not exactly the same (different resolution, watermarks)
- **Similar Videos** - Looks for visually similar videos
- **Same Music** - Searches for similar music by tags or by reading content and comparing it
- **Invalid Symbolic Links** - Shows symbolic links which point to non-existent files/directories
- **Broken Files** - Finds files that are invalid or corrupted
- **Bad Extensions** - Lists files whose content not match with their extension
- **Exif Remover** - Removes Exif metadata from various file types
- **Video Optimizer** - Crops from static parts and converts videos to more efficient formats
- **Bad Names** - Finds files with names that may be not wanted (e.g., containing special characters)


Changelog about each version can be found in [CHANGELOG.md](Changelog.md).
New releases can be found in [Github releases](https://github.com/qarmin/czkawka/releases) and nightly builds also in [Nightly releases](https://github.com/qarmin/czkawka/releases/tag/Nightly)
You can read more about the 11.0.0 release, its new features, and the issues that were fixed in the following articles:
- English article – https://medium.com/@qarmin/czkawka-krokiet-11-0-0f6cea385934
- Polish article – https://medium.com/@qarmin/czkawka-krokiet-11-0-c95ee35eccc2
## Usage, installation, compilation, requirements, license
Each tool uses different technologies, so you can find instructions for each of them in the appropriate file:
- [Krokiet GUI (Slint frontend)](krokiet/README.md)
- [Czkawka GUI (GTK frontend)](czkawka_gui/README.md)
- [Czkawka CLI](czkawka_cli/README.md)
- [Czkawka Core](czkawka_core/README.md)
- [Cedinia](cedinia/README.md)
## Comparison to other tools
In this comparison remember, that even if app have same features they may work different(e.g. one app may have more
options to choose than other).
| | Krokiet | Czkawka | FSlint | DupeGuru | Bleachbit |
|:-------------------------:|:-----------:|:----------------:|:------:|:-----------------:|:-----------:|
| Language | Rust | Rust | Python | Python/Obj-C | Python |
| Framework base language | Rust | C | C | C/C++/Obj-C/Swift | C |
| Framework | Slint | GTK 4 | PyGTK2 | Qt 5 (PyQt)/Cocoa | PyGTK3 |
| OS | Lin,Mac,Win | Lin,Mac,Win | Lin | Lin,Mac,Win | Lin,Mac,Win |
| Duplicate finder | ✔ | ✔ | ✔ | ✔ | |
| Empty files | ✔ | ✔ | ✔ | | |
| Empty folders | ✔ | ✔ | ✔ | | |
| Temporary files | ✔ | ✔ | ✔ | | ✔ |
| Big files | ✔ | ✔ | | | |
| Similar images | ✔ | ✔ | | ✔ | |
| Similar videos | ✔ | ✔ | | | |
| Music duplicates(tags) | ✔ | ✔ | | ✔ | |
| Music duplicates(content) | ✔ | ✔ | | | |
| Invalid symlinks | ✔ | ✔ | ✔ | | |
| Broken files | ✔ | ✔ | | | |
| Invalid names/extensions | ✔ | ✔ | ✔ | | |
| Exif cleaner | ✔ | | | | |
| Video optimizer | ✔ | | | | |
| Bad Names | ✔ | | | | |
| Names conflict | | | ✔ | | |
| Installed packages | | | ✔ | | |
| Bad ID | | | ✔ | | |
| Non stripped binaries | | | ✔ | | |
| Redundant whitespace | | | ✔ | | |
| Overwriting files | | | ✔ | | ✔ |
| Portable version | ✔ | ✔ | | | ✔ |
| Multiple languages | ✔ | ✔ | ✔ | ✔ | ✔ |
| Cache support | ✔ | ✔ | | ✔ | |
| In active development | Yes | Yes** | No | No* | Yes |
* Few small commits added recently and last version released in 2023
** Czkawka GTK is in maintenance mode receiving only bugfixes