{"id":16677543,"url":"https://github.com/foresterre/miniview","last_synced_at":"2026-02-16T07:32:03.660Z","repository":{"id":37820847,"uuid":"187069665","full_name":"foresterre/miniview","owner":"foresterre","description":"🏮 a mini image viewer library and cli for testing programs which work with images","archived":false,"fork":false,"pushed_at":"2025-03-06T10:12:50.000Z","size":2220,"stargazers_count":9,"open_issues_count":16,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-02T07:45:01.639Z","etag":null,"topics":["cli","hacktoberfest","image","image-viewer","library","testing","viewer","visual-debugging"],"latest_commit_sha":null,"homepage":"https://docs.rs/miniview","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/foresterre.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"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}},"created_at":"2019-05-16T17:06:51.000Z","updated_at":"2025-01-18T18:54:55.000Z","dependencies_parsed_at":"2023-12-25T11:24:44.780Z","dependency_job_id":"8c1375bf-ea55-491e-9c6d-a23290ef1717","html_url":"https://github.com/foresterre/miniview","commit_stats":{"total_commits":680,"total_committers":4,"mean_commits":170.0,"dds":"0.14411764705882357","last_synced_commit":"ddf32f753d2fa9926ded371b634bad5f70c93a11"},"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/foresterre/miniview","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foresterre%2Fminiview","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foresterre%2Fminiview/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foresterre%2Fminiview/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foresterre%2Fminiview/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/foresterre","download_url":"https://codeload.github.com/foresterre/miniview/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/foresterre%2Fminiview/sbom","scorecard":{"id":406850,"data":{"date":"2025-08-11","repo":{"name":"github.com/foresterre/miniview","commit":"a6d2c42f4098ee4a7846c5419573c665beb44be6"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.3,"checks":[{"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":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","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":-1,"reason":"Found no human activity in the last 16 changesets","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":"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":"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":"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/fmt.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/foresterre/miniview/fmt.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/fmt.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/foresterre/miniview/fmt.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/licenses_and_advisories.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/foresterre/miniview/licenses_and_advisories.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/licenses_and_advisories.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/foresterre/miniview/licenses_and_advisories.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/linter.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/foresterre/miniview/linter.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/linter.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/foresterre/miniview/linter.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/msrv.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/foresterre/miniview/msrv.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/msrv.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/foresterre/miniview/msrv.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/foresterre/miniview/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/foresterre/miniview/test.yml/main?enable=pin","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/fmt.yml:1","Warn: no topLevel permission defined: .github/workflows/licenses_and_advisories.yml:1","Warn: no topLevel permission defined: .github/workflows/linter.yml:1","Warn: no topLevel permission defined: .github/workflows/msrv.yml:1","Warn: no topLevel permission defined: .github/workflows/test.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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.3.0 not signed: https://api.github.com/repos/foresterre/miniview/releases/27281885","Warn: release artifact v0.3.0 does not have provenance: https://api.github.com/repos/foresterre/miniview/releases/27281885"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"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":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 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":5,"reason":"5 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: RUSTSEC-2021-0139","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-2024-0384","Warn: Project is vulnerable to: RUSTSEC-2021-0140"],"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-18T21:30:37.175Z","repository_id":37820847,"created_at":"2025-08-18T21:30:37.175Z","updated_at":"2025-08-18T21:30:37.175Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29502934,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-16T05:57:17.024Z","status":"ssl_error","status_checked_at":"2026-02-16T05:56:49.929Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["cli","hacktoberfest","image","image-viewer","library","testing","viewer","visual-debugging"],"created_at":"2024-10-12T13:26:45.400Z","updated_at":"2026-02-16T07:32:03.635Z","avatar_url":"https://github.com/foresterre.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"[\u003cimg alt=\"github\" src=\"https://img.shields.io/badge/github-foresterre/miniview-blue?labelColor=555555\u0026logo=github\" height=\"20\"\u003e](https://github.com/foresterre/miniview)\n[\u003cimg alt=\"crates.io\" src=\"https://img.shields.io/crates/v/miniview.svg?color=fc8d62\u0026logo=rust\" height=\"20\"\u003e](https://crates.io/crates/miniview)\n[\u003cimg alt=\"ci\" src=\"https://img.shields.io/github/actions/workflow/status/foresterre/miniview/msrv.yml?branch=main\" height=\"20\"\u003e](https://github.com/foresterre/miniview/actions?query=workflow%3Aci-msrv+branch%3Amain)\n[\u003cimg alt=\"docs-rs\" src=\"https://docs.rs/miniview/badge.svg\" height=\"20\"\u003e](https://docs.rs/miniview)\n\n# miniview\n\nMiniView is a bare-bones image viewer intended to be used during development and testing.\nMiniView can be called as binary from the CLI, and used as a Rust library.\n\nTo see what it can do, and whether it would fit your purpose, please see:\n* Use from the [cli](https://github.com/foresterre/miniview#instructions-for-cli-use)\n* Use as [library](https://github.com/foresterre/miniview#instructions-for-library-use)\n    * Documentation: [docs.rs](https://docs.rs/miniview/)\n\nMiniView is not intended to be used as your primary image viewer. For that purpose, I would recommend [Emulsion](https://github.com/ArturKovacs/emulsion).\n\n# Install\n\n### Binary installation\n\nWith [cargo](https://crates.io/crates/miniview) install: `cargo install miniview`\n\nPre-build binary: see [releases](https://github.com/foresterre/miniview/releases)\n\n### Add library dependency\n\nRun `cargo add miniview` with [cargo-edit](https://crates.io/crates/cargo-edit), or add `miniview` as a dependency to your `Cargo.toml`:\n\n```toml\nminiview = \"*\" # replace `*` with the latest version\n```\n\n\n# Usage\n\n### Instructions for CLI use\n\n| Usage | Linux example | Windows example (cmd.exe) |\n|----------------------------------------|------------------------------------------------|------------------------------------------------|\n| `miniview \u003cPATH_TO_IMAGE\u003e` | `miniview image.png` | `miniview image.png` |\n| `miniview --from-path \u003cPATH_TO_IMAGE\u003e` | `miniview --from-path image.png` | `miniview --from-path  image.png` |\n| `miniview --from-stdin-path` | `echo image.png \\| miniview --from-stdin-path`  | `echo image.png \\| miniview --from-stdin-path` |\n| `miniview --from-stdin-bytes` | `cat image.png \\| miniview --from-stdin-bytes` | `type image.png \\| miniview --from-stdin-bytes` |\n\n\u003cbr\u003e\n\n**Flags \u0026amp; Options**\n\n| Flag/Option | Description | \n| ---    | ---         |\n| `--fullscreen` | Set the window to fullscreen |\n| `--allow-window-resizing` | Allow the window to resize (doesn't resize the image!) |\n| `--close-after \u003cn\u003e` | Close the window after `n` milliseconds |\n\n\u003cbr\u003e\n\n**Keyboard shortcuts**\n\nPress `ESC` to exit the image window.\n\n### Instructions for library use\n\n```rust\nuse miniview::config::ConfigBuilder;\nuse std::time::Duration;\n\nfn main() {\n    let config =\n        ConfigBuilder::from_path(concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/resources/plant.jpg\"))\n            .set_fullscreen(true)\n            .set_lazy_window(false)\n            .build();\n\n    let controls = MiniView::show(config).expect(\"unable to create miniview\");\n\n    // do some important other work!\n    std::thread::sleep(Duration::from_millis(1000));\n\n    let closed = controls.close();\n    assert!(closed.is_ok());\n}\n```\n\n# Backends\n\nMiniView supports two backends: piston-window and pixels. You can switch between backends on compile time. This requires\nsetting Cargo [features](https://doc.rust-lang.org/cargo/reference/features.html). The piston-window backend can be\nenabled using the `backend_piston_window` feature, and the pixels backend can be enabled using the `backend_pixels` feature.\n\nThe default backend is **pixels**. This backend will be used if no-default-features is not specified. Note that the default backend\nis not available on MacOS.\n\nThe next sections provide examples, on how to enable each backend. Only one backend should be enabled at a time.\n\n## backend: piston-window\n\n### Platform support\n\n| Platform | Supported | Tested | Notes |\n|----|----|----|-----|\n| Linux | ✅ | ✅ ||\n| MacOS |   |    | MacOS does not allow the creation of graphical windows off the main thread.  |\n| Windows | ✅ | ✅  ||\n| ... other [piston-window](https://github.com/PistonDevelopers/piston_window) + [glutin](https://github.com/rust-windowing/glutin) platforms | ✅ | | Assuming graphical windows can be created off the main thread.\n\n### Configuration examples\n\nWhen building MiniView, the piston-window backend can be used by compiling with:\n```bash\ncargo run --no-default-features --features backend_piston_window \n```\n\nWhen using MiniView as a library, you can use:\n```toml\n[dependencies.miniview]\nversion = \"*\" # replace `*` with the latest version\ndefault-features = false \nfeatures = [\"backend_piston_window\"]\n```\n\nor \n\n```toml\n[dependencies]\nminiview = { version = \"*\", default-features = false, features = [\"backend_piston_window\"] }\n```\n\nNB: replace `*` in `version = \"*\"` with [any supported version](https://crates.io/crates/miniview/versions).\n\n## backend: pixels\n\n### Platform support\n\n\n| Platform | Supported | Tested | Notes |\n|----|----|----|-----|\n| Linux | ✅ | ✅ ||\n| Windows | ✅ | ✅  ||\n| MacOS |   |    | MacOS does not allow the creation of graphical windows off the main thread.  |\n| FreeBSD | ✅ |||\n| DragonflyBSD | ✅ |||\n| NetBSD | ✅ |||\n| OpenBSD | ✅ |||\n| ... other [pixels](https://github.com/parasyte/pixels) + [winit](https://github.com/rust-windowing/winit) platforms | | | Assuming graphical windows can be created off the main thread, support can be added. Please open an [issue](https://github.com/foresterre/miniview/issues).\n\n\n### Configuration examples\n\nWhen building MiniView, the pixels backend can be used by compiling with:\n```bash\ncargo run --no-default-features --features backend_pixels\n```\n\nWhen using MiniView as a library, you can use:\n```toml\n[dependencies.miniview]\nversion = \"*\" # replace `*` with the latest version\ndefault-features = false \nfeatures = [\"backend_pixels\"]\n```\n\nor\n\n```toml\n[dependencies]\nminiview = { version = \"*\", default-features = false, features = [\"backend_pixels\"] }\n```\n\nNB: replace `*` in `version = \"*\"` with [any supported version](https://crates.io/crates/miniview/versions).\n\n# Suggestions, Questions, Bugs\n\nFeel free to open an issue :mailbox_with_mail: if you have a suggestion, a question or found a bug =).\n\n🎸 🎺 🎻 🎷\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fforesterre%2Fminiview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fforesterre%2Fminiview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fforesterre%2Fminiview/lists"}