{"id":34605212,"url":"https://github.com/mkalus/goggler","last_synced_at":"2025-12-24T13:39:27.255Z","repository":{"id":57565985,"uuid":"337326249","full_name":"mkalus/goggler","owner":"mkalus","description":"Website screenshot microservice that caches screenshots on disk or S3 storage","archived":false,"fork":false,"pushed_at":"2025-08-12T13:13:45.000Z","size":77,"stargazers_count":5,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-12T15:15:02.904Z","etag":null,"topics":["chromedp","docker","golang","microservice","screenshot"],"latest_commit_sha":null,"homepage":"","language":"Go","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/mkalus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null}},"created_at":"2021-02-09T07:32:07.000Z","updated_at":"2025-08-12T13:13:48.000Z","dependencies_parsed_at":"2024-06-20T11:08:46.570Z","dependency_job_id":"6f7be1dc-866f-4b7a-b71a-bbcc94842a37","html_url":"https://github.com/mkalus/goggler","commit_stats":null,"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/mkalus/goggler","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkalus%2Fgoggler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkalus%2Fgoggler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkalus%2Fgoggler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkalus%2Fgoggler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mkalus","download_url":"https://codeload.github.com/mkalus/goggler/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkalus%2Fgoggler/sbom","scorecard":{"id":652186,"data":{"date":"2025-08-11","repo":{"name":"github.com/mkalus/goggler","commit":"52af36328f63544d9347f28816fd0a487efc9acc"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"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":"Maintained","score":5,"reason":"6 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 5","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":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/release_build.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":"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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"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":"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":"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/release_build.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/mkalus/goggler/release_build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release_build.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/mkalus/goggler/release_build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release_build.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/mkalus/goggler/release_build.yml/main?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:2","Warn: containerImage not pinned by hash: Dockerfile:8: pin your Docker image by updating docker.io/chromedp/headless-shell:latest to docker.io/chromedp/headless-shell:latest@sha256:343daf8b02efdbaa385ef35bbd3415623bb5676c117c364d7c03479ba80c1450","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   2 containerImage 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":"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":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release_build.yml:9"],"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":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"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 v0.5.0 not signed: https://api.github.com/repos/mkalus/goggler/releases/239359704","Warn: release artifact v0.4.4 not signed: https://api.github.com/repos/mkalus/goggler/releases/234152490","Warn: release artifact v0.4.3 not signed: https://api.github.com/repos/mkalus/goggler/releases/217079293","Warn: release artifact v0.4.2 not signed: https://api.github.com/repos/mkalus/goggler/releases/202758596","Warn: release artifact v0.4.1 not signed: https://api.github.com/repos/mkalus/goggler/releases/166838494","Warn: release artifact v0.5.0 does not have provenance: https://api.github.com/repos/mkalus/goggler/releases/239359704","Warn: release artifact v0.4.4 does not have provenance: https://api.github.com/repos/mkalus/goggler/releases/234152490","Warn: release artifact v0.4.3 does not have provenance: https://api.github.com/repos/mkalus/goggler/releases/217079293","Warn: release artifact v0.4.2 does not have provenance: https://api.github.com/repos/mkalus/goggler/releases/202758596","Warn: release artifact v0.4.1 does not have provenance: https://api.github.com/repos/mkalus/goggler/releases/166838494"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2022-0603 / GHSA-hp87-p4gw-j4gq"],"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-21T13:46:42.156Z","repository_id":57565985,"created_at":"2025-08-21T13:46:42.156Z","updated_at":"2025-08-21T13:46:42.156Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28003381,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-24T02:00:07.193Z","response_time":83,"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":["chromedp","docker","golang","microservice","screenshot"],"created_at":"2025-12-24T13:39:26.422Z","updated_at":"2025-12-24T13:39:27.247Z","avatar_url":"https://github.com/mkalus.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# goggler\n\nWebsite screenshot microservice written in Golang that caches screenshots on disk or S3 storage\n\n## Compiling and Running\n\nCompile and run with:\n\n```bash\ngo build github.com/mkalus/goggler/cmd/goggler \u0026\u0026 GOGGLER_DEBUG=1 ./goggler\n```\n\nPoint your Browser to the URL: `http://localhost:8080/?url=https%3A%2F%2Fduckduckgo.com%2F\u0026wait=2000`\n\n**Note:** Goggler uses ChromeDP and needs Chrome or Chromium to work. This means it has to be able to\naccess and start Chrome or Chromium somehow (Chrome in path variable or the like).\n\n## Parameters\n\nValid URI parameters:\n\n* `url` URL to take screenshot from (required)\n* `width` Width of image and viewport (might be scaled up or down, see below, default: 1920)\n* `height` Height of image and viewport (might be scaled up or down, see below, default: 1024)\n* `scale` Scale of image and viewport (final width and height are multiplied by this, default: 0.2)\n* `quality` PNG image quality (default: 90)\n* `wait` Time in ms to wait until screenshot is taken (to wait for rendering to finish, default: 2000 =  2 secs)\n* `timeout` Timeout in ms after which request is cancelled (default: 60000 = 60 secs)\n* `maxage` Maximum age of cache file in seconds (!) before it gets reloaded (set to 0 to never renew files, default: 2592000 = 30 days)\n* `force` Force update (set to `1` or any other non-empty value)\n\nDefaults may be changed by setting environmental variables when running goggle.\n\n## Environmental variables\n\nChanges defaults and sets some other elements:\n\n* `GOGGLER_WIDTH` Set default image width\n* `GOGGLER_HEIGHT` Set default image height\n* `GOGGLER_SCALE` Set default image scale\n* `GOGGLER_QUALITY` Set default image quality\n* `GOGGLER_WAIT_FOR_IDLE` Wait for network idle in browser (default: `false`, set to any value to enable)\n* `GOGGLER_WAIT` Set default wait time (ms) before rendering (default: `2000` aka 2 seconds)\n* `GOGGLER_TIMEOUT` Set default timeout (ms) time (default: `60000` aka 60 seconds)\n* `GOGGLER_MAXAGE` Set default max age (s) time (default: `2592000` aka 30 days)\n* `GOGGLER_LISTEN` Set default listen address (default: `:8080`)\n* `GOGGLER_DEBUG` Enable debugging log (default: `false`, set to any value to enable)\n* `GOGGLER_CACHE` Type of cache (`local` or `s3`, default `local`)\n* `GOGGLER_CACHE_CLEANUP_INTERVAL` Interval in seconds at which cleanup service is run to clean stale data (maxage has to be greater than 0, also: set to 0 to never clean up old files, s3 needs full days to work properly, default: 2592000 = 30 days)\n* `GOGGLER_CACHE_LOCAL_PATH` Path to local cache (default: OS specific temp dir like `/tmp/goggler`)\n* `GOGGLER_CACHE_S3_URL` Endpoint for S3 storage (e.g. `s3.amazonaws.com`)\n* `GOGGLER_CACHE_S3_BUCKETNAME` Bucket name\n* `GOGGLER_CACHE_S3_ACCESSKEY` Access Key ID for S3 storage\n* `GOGGLER_CACHE_S3_SECRETKEY` Secret Access Key ID for S3 storage\n* `GOGGLER_CACHE_S3_REGION` S3 region (might be skipped in Amazon, e.g. `us-east-1`)\n* `GOGGLER_CACHE_S3_SKIPSSL` Set to any value to skip secure SSL/TLS connection\n* `GOGGLER_CACHE_S3_CREATEBUCKET` Set to any value to create bucket if it does not exist\n\nExamples:\n\n```bash\n# Basic test\nGOGGLER_DEBUG=1 GOGGLER_LISTEN=127.0.0.1:9090 ./goggler\n# Local storage\nGOGGLER_CACHE_LOCAL_PATH=~/mydata ./goggler\n# Waiting for network idle instead of fixed amount of time\nGOGGLER_CACHE_LOCAL_PATH=~/mydata GOGGLER_WAIT_FOR_IDLE=1 ./goggler\n# S3 storage\nGOGGLER_DEBUG=1 GOGGLER_CACHE=s3 GOGGLER_CACHE_S3_BUCKETNAME=mytestbucket \\\n  GOGGLER_CACHE_S3_ACCESSKEY=_KEY_ GOGGLER_CACHE_S3_SECRETKEY=_KEY_ ./goggler\n# Minio storage\nGOGGLER_DEBUG=1 GOGGLER_CACHE=s3 GOGGLER_CACHE_S3_URL=127.0.0.1:9000 \\\n  GOGGLER_CACHE_S3_BUCKETNAME=test GOGGLER_CACHE_S3_ACCESSKEY=minioadmin \\\n  GOGGLER_CACHE_S3_SECRETKEY=minioadmin GOGGLER_CACHE_S3_SKIPSSL=1 \\\n  GOGGLER_CACHE_S3_CREATEBUCKET=1 ./goggler\n```\n\n## Docker\n\nThere is a Docker container of goggler including a headless version of Chromium. Try it using:\n\n```bash\ndocker run --rm -p8080:8080 --init ronix/goggler\n```\n\n**Important:** The `--init` option is needed to get rid of zombie processes that will spawn if you run the container.\nThis is due Chrome creating new processes within the container. I have not found a way to tackle this, but since it is\nmore a feature than a bug, I assume we can live with this.\n\nFull example with persistent volume:\n\n```bash\ndocker run -d -p8080:8080 -v /tmp/goggler:/tmp/goggler \\\n  --name goggler --init ronix/goggler\n```\n\nFull example with S3 storage:\n\n```bash\ndocker run -d -p8080:8080 --name goggler -e \"GOGGLER_CACHE=s3\" \\\n  -e \"GOGGLER_CACHE_S3_BUCKETNAME=mytestbucket\" \\\n  -e \"GOGGLER_CACHE_S3_ACCESSKEY=_KEY_\" \\\n  -e \"GOGGLER_CACHE_S3_SECRETKEY=_KEY_\" \\\n  --init ronix/goggler\n```\n\nBuilding Docker image from this source:\n\n```bash\ndocker build -t goggler .\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmkalus%2Fgoggler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmkalus%2Fgoggler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmkalus%2Fgoggler/lists"}