{"id":13453876,"url":"https://github.com/woelper/oculante","last_synced_at":"2026-10-19T11:50:14.023Z","repository":{"id":42482641,"uuid":"202965675","full_name":"woelper/oculante","owner":"woelper","description":"A fast and simple image viewer / editor for many operating systems","archived":false,"fork":false,"pushed_at":"2026-10-15T19:21:12.000Z","size":141510,"stargazers_count":1702,"open_issues_count":186,"forks_count":83,"subscribers_count":15,"default_branch":"master","last_synced_at":"2026-10-16T17:27:30.209Z","etag":null,"topics":["dds","editor","exr","hdr","image","image-viewer","jpg","ktx","linux","mac","macos","png","psd","rust","tiff","viewer","windows10"],"latest_commit_sha":null,"homepage":"https://github.com/woelper/oculante","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/woelper.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null,"disclosure":null}},"created_at":"2019-08-18T05:56:52.000Z","updated_at":"2026-10-16T12:41:57.000Z","dependencies_parsed_at":"2022-09-01T02:02:17.020Z","dependency_job_id":"909502d9-0b2b-47d2-8afb-b8fa7162a2df","html_url":"https://github.com/woelper/oculante","commit_stats":{"total_commits":1409,"total_committers":15,"mean_commits":93.93333333333334,"dds":0.04116394606103624,"last_synced_commit":"468fd4bfcba257894bf6cf64a66adc6ad7ae0817"},"previous_names":[],"tags_count":356,"template":false,"template_full_name":null,"purl":"pkg:github/woelper/oculante","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/woelper%2Foculante","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/woelper%2Foculante/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/woelper%2Foculante/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/woelper%2Foculante/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/woelper","download_url":"https://codeload.github.com/woelper/oculante/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/woelper%2Foculante/sbom","scorecard":{"id":1236546,"data":{"date":"2025-08-11","repo":{"name":"github.com/woelper/oculante","commit":"c66806e8fc5ee0d7fec5f902aab11f6dd757eacc"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.9,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 22 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/rust-clippy.yml:26","Info: jobLevel 'actions' permission set to 'read': .github/workflows/rust-clippy.yml:28","Warn: no topLevel permission defined: .github/workflows/check_arm7.yml:1","Warn: no topLevel permission defined: .github/workflows/check_netbsd_default_features.yml:1","Warn: no topLevel permission defined: .github/workflows/check_netbsd_minimal.yml:1","Warn: no topLevel permission defined: .github/workflows/check_osx.yml:1","Warn: no topLevel permission defined: .github/workflows/check_run_tests.yml:1","Warn: no topLevel permission defined: .github/workflows/check_ubuntu_no_default_features.yml:1","Warn: no topLevel permission defined: .github/workflows/check_windows.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/rust-clippy.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":1,"reason":"branch protection is not maximal on development and all release branches","details":["Warn: 'allow deletion' enabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'master'","Warn: required approving review count is 1 on branch 'master'","Warn: codeowners review is not required on branch 'master'","Warn: no status checks found to merge onto branch 'master'","Info: PRs are required in order to make changes on branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 0.9.2 not signed: https://api.github.com/repos/woelper/oculante/releases/194324122","Warn: release artifact 0.9.1 not signed: https://api.github.com/repos/woelper/oculante/releases/176465467","Warn: release artifact 0.9.0 not signed: https://api.github.com/repos/woelper/oculante/releases/176228451","Warn: release artifact 0.8.23 not signed: https://api.github.com/repos/woelper/oculante/releases/167627939","Warn: release artifact 0.8.22 not signed: https://api.github.com/repos/woelper/oculante/releases/156414145","Warn: release artifact 0.9.2 does not have provenance: https://api.github.com/repos/woelper/oculante/releases/194324122","Warn: release artifact 0.9.1 does not have provenance: https://api.github.com/repos/woelper/oculante/releases/176465467","Warn: release artifact 0.9.0 does not have provenance: https://api.github.com/repos/woelper/oculante/releases/176228451","Warn: release artifact 0.8.23 does not have provenance: https://api.github.com/repos/woelper/oculante/releases/167627939","Warn: release artifact 0.8.22 does not have provenance: https://api.github.com/repos/woelper/oculante/releases/156414145"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/check_arm7.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_arm7.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/check_arm7.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_arm7.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/check_netbsd_default_features.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_netbsd_default_features.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/check_netbsd_default_features.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_netbsd_default_features.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/check_netbsd_minimal.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_netbsd_minimal.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/check_netbsd_minimal.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_netbsd_minimal.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/check_osx.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_osx.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/check_osx.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_osx.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/check_osx.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_osx.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/check_osx.yml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_osx.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/check_run_tests.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_run_tests.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/check_run_tests.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_run_tests.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/check_run_tests.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_run_tests.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/check_ubuntu_no_default_features.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_ubuntu_no_default_features.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/check_ubuntu_no_default_features.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_ubuntu_no_default_features.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/check_ubuntu_no_default_features.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_ubuntu_no_default_features.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/check_windows.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_windows.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/check_windows.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_windows.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/check_windows.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/check_windows.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:49: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:170: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:182: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:206: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:218: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:230: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:242: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:254: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:266: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:285: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust-clippy.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/rust-clippy.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust-clippy.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/woelper/oculante/rust-clippy.yml/master?enable=pin","Info:   0 out of  21 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of  14 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: all commits (30) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":3,"reason":"7 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: RUSTSEC-2021-0145 / GHSA-g98v-hv3f-hcfr","Warn: Project is vulnerable to: RUSTSEC-2024-0375","Warn: Project is vulnerable to: RUSTSEC-2021-0153","Warn: Project is vulnerable to: RUSTSEC-2024-0384","Warn: Project is vulnerable to: RUSTSEC-2022-0040 / GHSA-9qxh-258v-666c","Warn: Project is vulnerable to: RUSTSEC-2024-0436","Warn: Project is vulnerable to: RUSTSEC-2020-0071 / GHSA-wcg3-cvx6-7396"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-31T00:16:32.942Z","repository_id":42482641,"created_at":"2025-08-31T00:16:32.942Z","updated_at":"2025-08-31T00:16:32.942Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":344872684,"owners_count":38337890,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-10-03T21:59:58.778Z","status":"online","status_checked_at":"2026-10-18T02:00:06.448Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dds","editor","exr","hdr","image","image-viewer","jpg","ktx","linux","mac","macos","png","psd","rust","tiff","viewer","windows10"],"created_at":"2024-07-31T08:00:48.757Z","updated_at":"2026-10-19T11:50:14.016Z","avatar_url":"https://github.com/woelper.png","language":"Rust","funding_links":[],"categories":["Unsorted","Image Viewers","rust","Rust","Gaming","Graphics","File"],"sub_categories":["Other"],"readme":"### Oculante is currently in maintenance mode. We will only be accepting bug fixes and minor improvements to existing features until we complete our rewrite. More details can be seen [here](https://github.com/woelper/oculante/issues/#746). Progress can be seen on the oculante-next branch.\n\n\u003ch1 align=\"center\"\u003e\n    \u003cimg alt=\"banner\" src=\"res/banner.avif\"\u003e\n\u003c/h1\u003e\n\n _A no-nonsense hardware-accelerated image viewer_\n\n[\u003cimg src=\"res/download.svg\" height=\"50\"\u003e](https://github.com/woelper/oculante/releases/latest)\n\nOculante's vision is to be a fast, unobtrusive, portable image viewer with a wide range of supported image formats while also offering image analysis and basic editing tools.\n\nOculante is a free, open-source, bloat-free, and privacy-respecting image viewer that is fast to start up and open images. It is available on Windows, Mac, Linux, FreeBSD, and NetBSD, and supports a wide range of image formats. Oculante caches images for faster reloading and can correctly display unassociated channels. It also includes features for basic image analysis, and offers SIMD-accelerated, basic nondestructive editing tools such as cropping, resizing, painting, rotating, blurring, and more!\n\n[![](https://dcbadge.limes.pink/api/server/https://discord.gg/2Q6cF5ZWe7)](https://discord.gg/https://discord.gg/2Q6cF5ZWe7)\n---\n[![OSX](https://github.com/woelper/oculante/actions/workflows/check_osx.yml/badge.svg)](https://github.com/woelper/oculante/actions/workflows/check_osx.yml)\n[![NetBSD](https://github.com/woelper/oculante/actions/workflows/check_netbsd_minimal.yml/badge.svg)](https://github.com/woelper/oculante/actions/workflows/check_netbsd_minimal.yml)\n[![Ubuntu](https://github.com/woelper/oculante/actions/workflows/check_ubuntu_no_default_features.yml/badge.svg)](https://github.com/woelper/oculante/actions/workflows/check_ubuntu_no_default_features.yml)\n[![Windows](https://github.com/woelper/oculante/actions/workflows/check_windows.yml/badge.svg)](https://github.com/woelper/oculante/actions/workflows/check_windows.yml)\n[![ARM](https://github.com/woelper/oculante/actions/workflows/check_arm7.yml/badge.svg)](https://github.com/woelper/oculante/actions/workflows/check_arm7.yml)\n---\n![GitHub all releases](https://img.shields.io/github/downloads/woelper/oculante/total?label=release%20downloads)\n![Crates.io](https://img.shields.io/crates/d/oculante?label=crates.io%20downloads)\n![Screenshot](res/previews/front.png \"Screenshot\")\n\n## Flipbook\n\nWith configurable caching, Oculante can quickly step through image sequences:\n\n![Screenshot](res/previews/flipbook.avif \"Screenshot\")\n\n## Inspection\n\nGet information about pixel values and position, with precise picking:\n\n![Screenshot](res/picker.gif \"Screenshot\")\n\n## File Management\n\nOculante's built-in File Manager allows you to access files on your system without leaving the application. This makes it easy to compare images, especially with the dedicated compare option that lets you flip between images while preserving the zoom level and position.\n\n![Screenshot](res/previews/file_manager.png \"Screenshot\")\n\n## Correct color channel display:\n\nImages may contain color information that is masked by the alpha channel. Although it is present you will not see it since usually RGB values are multiplied with the A channel when displayed. Oculante allows you to inspect all channels individually and see color data without transparency applied.\n\n![Screenshot](res/premult.png \"Screenshot\")\n\n## Installation\n\nFind and download the correct executable for your operating system on the [releases](https://github.com/woelper/oculante/releases/latest) page. The download is small, around 25MB, as we link dependencies statically by default. We also have packages available for ARM Linux. Have a different OS? Please feel free to open an issue if you want your operating system of choice supported!\n\nIf you are on macOS, please ensure you have `libheif` installed.\n\nFor those looking to manage Oculante through a package manager, please see the options below.\n\n### Cargo\n\n```sh\ncargo install oculante\n```\n\n### Linux\n\n- Arch Linux \n\n```sh\npacman -S oculante\n```\n\n```sh\nparu -S oculante-git\n```\n\n- NixOS\n\n```sh\nenvironment.systemPackages = [\n    pkgs.oculante\n];\n```\n\n- openSUSE\n\n```sh\nzypper install oculante\n```\n\n- Flatpak\n\n```sh\nflatpak install flathub io.github.woelper.Oculante\n```\n\n### BSD\n\n- FreeBSD\n\n```sh\npkg install oculante\n```\n\n- NetBSD\n\n```sh\npkgin install oculante\n```\n\n###### NetBSD builds currently use glsl-to-spirv instead of shaderc ######\n\n### Windows\n\n- Scoop\n\n```sh\nscoop install extras/oculante\n```\n\n## Build Dependencies\n\nLinux (Debian):\n\n`sudo apt-get install libxcb-shape0-dev libxcb-xfixes0-dev libgtk-3-dev libasound2-dev nasm cmake`\n\nWindows:\nInstall Nasm from https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/win64/\n\nMac:\n`brew install nasm cmake`\n###### You may need this variable when building Oculante on macOS: `export SHADERC_LIB_DIR=/opt/homebrew/lib` ######\n\n## Updates\n\nOculante only gets updated when it improves something for you. You'll still see new releases about every month or two! To stay up to date you can use the update button in settings, or download the new release executable. Updates are also managed through your package manager if you installed through one.\n\n## Uninstalling\n\nTo uninstall Oculante, simply delete the executable file and the data folder. You can find the data folder in the relevant location for your operating system below.\n\n- Windows: `~/AppData/Local/.oculante`\n- Mac: `~/Library/Application Support/oculante`\n- Linux \u0026 BSD: `~/.local/share/oculante`\n\n## Roadmap\n\nYou can see what we're currently working on in our [Release Plan](https://github.com/users/woelper/projects/2/views/1), or our [Milestones](https://github.com/woelper/oculante/milestones)!\n\n\n## Features\n\n- Image info: pixel position, color info, color histogram.\n- Non-destructive editing, painting, and operator stack.\n- Lossless JPEG editing: Crop, rotate, mirror without recompressing data.\n- Built-in File Manager: Bookmark directories, favorite and manage files.\n- Image tools: Image comparison, Measuring tools, Color pallete generation.\n- User Interface: Dark/Light/System Themes, Zen Mode, Always on Top, Position/Scrub Bar, Fit image to view.\n- Metadata and Metafile support: Load EXIF data and save metafile edit stacks.\n- Focused on Performance: Threaded image loading, configurable image caching, Low cpu usage, pretty fast startup / loading time.\n- Color Channel support: Display individual RGBA channels, unassociated / unpremultiplied alpha.\n- Network listen mode: Start with `oculante -l port` and oculante will switch to receive mode, listening on that port.\n- Load files from stdin: pipe your data with `cat image | oculante -s`.\n\n### Image format support\n\n- bmp\n- gif (animation support and correct timing)\n- hdr, tonemapped\n- ico\n- icns (via `rust-icns`)\n- jpeg\n- jpeg2000 (via `jpeg2k`, feature \"j2k\", on by default)\n- png\n- pnm\n- tga\n- jxl (JPEG XL, via `jxl-oxide`)\n- avif\n- tiff (via `tiff` with additional float/half support)\n- webp (via `libwebp-sys` - `image` had _very_ limited format support)\n- farbfeld\n- DDS (DXT1-5, via `dds-rs`)\n- DICOM (via dicom-rs) - Some metadata supported, too.\n- psd (via `psd`)\n- svg (via `resvg`)\n- exr (via `exr-rs`), tonemapped\n- RAW (via `quickraw` - nef, cr2, dng, mos, erf, raf, arw, 3fr, ari, srf, sr2, braw, r3d, nrw, raw). Since raw is a complex field without true standards, not all camera models are supported.\n- ppm\n- HEIC/HEIF (via `libheif-rs`). Enabled on Windows builds, but optional dependency on MacOS and Linux - available behind `heif` flag.\n- qoi\n- kra (Krita files)\n- ora\n- otb\n- pcx\n- sgi\n- wbmp\n- xbm\n- xpm\n\n### Misc examples:\n\nViewing EXIF data\n\n![Screenshot](res/screenshot_exif.png \"Screenshot\")\n\nExtracting a signature\n\n![signature example](res/ex-signature.gif \"Extracting a signature\")\n\n## Credits\n\nPhotos used in tests and screenshots:\n\nhttps://unsplash.com/@mohsen_karimi\n\nhttps://unsplash.com/@frstvisuals\n\nhttps://unsplash.com/@eberhardgross\n\nUI Design:\n\n[Stoppedpuma](https://github.com/Stoppedpuma)\n\n## Privacy pledge\n\nOculante does in no way collect or send anonymous or non-anonynmous user data or statistics. Oculante is and will remain free and open-source. There will never be ads.\nThere are only two instances where oculante interacts with the network, and both never happen without being triggered by the user:\n- Updating the application (must be triggered manually from settings)\n- Listening for incoming images on a custom port (must be set on command line)\n\nIn addition, Oculante saves some settings locally, for example:\n- UI accent color\n- Keybindings\n- Vsync preferences\n- Whether the directory index bar is displayed\n- Recent files\n\n## License\n\nThis project is MIT licensed, but some parts such as the LUTs in res/LUT are under the GPL license. As a result, we're making our entire source code public. If you would like to use Oculante without publishing your source code, please remove any GPL-licensed components and their references.\n\n### Extras\n\u003cdetails\u003e\n\u003csummary\u003eCargo Features\u003c/summary\u003e\n\n- `turbo` (on by default), the turbojpeg library will not be used to open jpeg images. You won't need Nasm to be installed.\n\n- `file_open` will enable/disable a OS-native file open dialog. This pulls in additional dependencies and is enabled by default. Disabling it will enable a custom file dialog. This will probably the default in the future.\n\n- `notan_glsl-to-spirv` uses the spirv shader compiler\n\n- `notan/shaderc` (on by default) uses shaderc as a shader compiler. Longer build time.\n\n- `update` (on by default) enable app updating.\n\n- `heif` HEIF format support.\n\n- `avif_native` (on by default) Rust AVIF decoder.\n\n- `dav1d` Tried and tested AVIF decoder, takes priority over `avif_native` if both are enabled.\n\n- `jxlcms` (on by default) Required for complete JXL support.\n\n- `j2k` (on by default) Support for jpeg2000.\n\n\u003c/details\u003e \n\n\u003cdetails\u003e\n\u003csummary\u003eExtended Language Support\u003c/summary\u003e\n\nOculante can support some additional languages such as Arabic, Chinese, Japanese, Korean. This support depends on if your system has a supported font family installed. One supported font family is [Noto Sans](https://fonts.google.com/noto/specimen/Noto+Sans).\n\n### Simplified Chinese\n\n- Heiti SC\n- Songti SC\n- Noto Sans CJK SC\n- Noto Sans SC\n- WenQuanYi Zen Hei\n- SimSun\n- Noto Sans SC\n- PingFang SC\n- Source Han Sans CN\n\n### Traditional Chinese\n\n- Source Han Sans HK\n\n### Japanese\n\n- Noto Sans JP\n- Noto Sans CJK JP\n- Source Han Sans JP\n- MS Gothic\n\n### Korean\n\n- Source Han Sans KR\n\n### Taiwanese\n\n- Source Han Sans TW\n\n### Arabic\n\n- Noto Sans Arabic\n- Amiri\n- Lateef\n- Al Tarikh\n- Segoe UI\n\n\u003c/details\u003e \n\n\u003cdetails\u003e\n\u003csummary\u003eDefault Shortcuts\u003c/summary\u003e\n\n### Shortcuts:\n`mouse wheel` = zoom\n\n`left mouse`,`middle mouse` = pan\n\n`ctrl + mouse wheel` = prev/next image in folder\n\n`Right mouse` pick color from image (in paint mode)\n\n\u003ckbd\u003eT\u003c/kbd\u003e = AlwaysOnTop\n\n\u003ckbd\u003eF\u003c/kbd\u003e = Fullscreen\n\n\u003ckbd\u003eI\u003c/kbd\u003e = InfoMode\n\n\u003ckbd\u003eE\u003c/kbd\u003e = EditMode\n\n\u003ckbd\u003eRight\u003c/kbd\u003e = NextImage\n\n\u003ckbd\u003eHome\u003c/kbd\u003e = FirstImage\n\n\u003ckbd\u003eEnd\u003c/kbd\u003e = LastImage\n\n\u003ckbd\u003eLeft\u003c/kbd\u003e = PreviousImage\n\n\u003ckbd\u003eR\u003c/kbd\u003e = RedChannel\n\n\u003ckbd\u003eG\u003c/kbd\u003e = GreenChannel\n\n\u003ckbd\u003eB\u003c/kbd\u003e = BlueChannel\n\n\u003ckbd\u003eA\u003c/kbd\u003e = AlphaChannel\n\n\u003ckbd\u003eU\u003c/kbd\u003e = RGBChannel\n\n\u003ckbd\u003eC\u003c/kbd\u003e = RGBAChannel\n\n\u003ckbd\u003eV\u003c/kbd\u003e = ResetView\n\n\u003ckbd\u003eMinus\u003c/kbd\u003e = ZoomOut\n\n\u003ckbd\u003eEquals\u003c/kbd\u003e = ZoomIn\n\n\u003ckbd\u003eKey1\u003c/kbd\u003e = ZoomActualSize\n\n\u003ckbd\u003eKey2\u003c/kbd\u003e = ZoomDouble\n\n\u003ckbd\u003eKey3\u003c/kbd\u003e = ZoomThree\n\n\u003ckbd\u003eKey4\u003c/kbd\u003e = ZoomFour\n\n\u003ckbd\u003eKey5\u003c/kbd\u003e = ZoomFive\n\n\u003ckbd\u003eLShift\u003c/kbd\u003e + \u003ckbd\u003eC\u003c/kbd\u003e = CompareNext\n\n\u003ckbd\u003eLShift\u003c/kbd\u003e + \u003ckbd\u003eLeft\u003c/kbd\u003e = PanLeft\n\n\u003ckbd\u003eLShift\u003c/kbd\u003e + \u003ckbd\u003eRight\u003c/kbd\u003e = PanRight\n\n\u003ckbd\u003eLShift\u003c/kbd\u003e + \u003ckbd\u003eUp\u003c/kbd\u003e = PanUp\n\n\u003ckbd\u003eLShift\u003c/kbd\u003e + \u003ckbd\u003eDown\u003c/kbd\u003e = PanDown\n\n\u003ckbd\u003eDelete\u003c/kbd\u003e = DeleteFile\n\n\u003ckbd\u003eLShift\u003c/kbd\u003e + \u003ckbd\u003eDelete\u003c/kbd\u003e = ClearImage\n\n\u003ckbd\u003eRBracket\u003c/kbd\u003e = LosslessRotateRight\n\n\u003ckbd\u003eLBracket\u003c/kbd\u003e = LosslessRotateLeft\n\n\u003ckbd\u003eLControl\u003c/kbd\u003e + \u003ckbd\u003eC\u003c/kbd\u003e = Copy\n\n\u003ckbd\u003eLControl\u003c/kbd\u003e + \u003ckbd\u003eV\u003c/kbd\u003e = Paste\n\n\u003ckbd\u003eLControl\u003c/kbd\u003e + \u003ckbd\u003eO\u003c/kbd\u003e = Browse\n\n\u003ckbd\u003eQ\u003c/kbd\u003e = Quit\n\n\u003ckbd\u003eZ\u003c/kbd\u003e = ZenMode\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwoelper%2Foculante","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwoelper%2Foculante","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwoelper%2Foculante/lists"}