{"id":49614831,"url":"https://github.com/mminkoff/ember-filestack","last_synced_at":"2026-05-04T21:02:34.430Z","repository":{"id":21136445,"uuid":"91806511","full_name":"mminkoff/ember-filestack","owner":"mminkoff","description":"Support for Filestack service within EmberJS","archived":false,"fork":false,"pushed_at":"2026-01-29T17:21:12.000Z","size":3236,"stargazers_count":6,"open_issues_count":7,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-01-30T04:58:53.625Z","etag":null,"topics":["ember","ember-filestack","emberjs","emberjs-addon","filepicker","filestack"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/mminkoff.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","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":"2017-05-19T13:04:09.000Z","updated_at":"2026-01-29T17:21:59.000Z","dependencies_parsed_at":"2024-11-16T17:32:41.931Z","dependency_job_id":"43e0f2a8-c31a-4ab0-bfb0-236da8f529f5","html_url":"https://github.com/mminkoff/ember-filestack","commit_stats":{"total_commits":87,"total_committers":10,"mean_commits":8.7,"dds":0.6551724137931034,"last_synced_commit":"95888880c6bb2b3e4c6bc5ad1430bd39ec264565"},"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/mminkoff/ember-filestack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mminkoff%2Fember-filestack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mminkoff%2Fember-filestack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mminkoff%2Fember-filestack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mminkoff%2Fember-filestack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mminkoff","download_url":"https://codeload.github.com/mminkoff/ember-filestack/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mminkoff%2Fember-filestack/sbom","scorecard":{"id":654439,"data":{"date":"2025-08-11","repo":{"name":"github.com/mminkoff/ember-filestack","commit":"c11fc8f8527efdb4d1555ad2fbeddb227881f251"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/20 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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.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":"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":"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/ci.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/mminkoff/ember-filestack/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/mminkoff/ember-filestack/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/mminkoff/ember-filestack/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/mminkoff/ember-filestack/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/mminkoff/ember-filestack/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/mminkoff/ember-filestack/ci.yml/master?enable=pin","Info:   0 out of   6 GitHub-owned 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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: MIT License: LICENSE.md: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":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for 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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 11 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":0,"reason":"46 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-whgm-jr23-g3j9","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-wxhq-pm8v-cw75","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-r7qp-cfhv-p84w","Warn: Project is vulnerable to: GHSA-q9mw-68c2-j6m5","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-rc47-6667-2j5j","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq","Warn: Project is vulnerable to: GHSA-3rfm-jhwj-7488","Warn: Project is vulnerable to: GHSA-hhq3-ff78-jv3g","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-76p7-773f-r4q5","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-25hc-qcg6-38wj","Warn: Project is vulnerable to: GHSA-qm95-pgcg-qqfq","Warn: Project is vulnerable to: GHSA-cqmj-92xf-r6r9","Warn: Project is vulnerable to: GHSA-4wf5-vphf-c2xc","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-4vvj-4cpr-p986","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"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-21T14:17:27.777Z","repository_id":21136445,"created_at":"2025-08-21T14:17:27.777Z","updated_at":"2025-08-21T14:17:27.777Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32624693,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-04T10:08:07.713Z","status":"ssl_error","status_checked_at":"2026-05-04T10:08:02.005Z","response_time":58,"last_error":"SSL_read: 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":["ember","ember-filestack","emberjs","emberjs-addon","filepicker","filestack"],"created_at":"2026-05-04T21:00:49.336Z","updated_at":"2026-05-04T21:02:34.403Z","avatar_url":"https://github.com/mminkoff.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ember-filestack\n\n[![npm version](https://badge.fury.io/js/ember-filestack.svg)](http://badge.fury.io/js/ember-filestack)\n[![CI](https://github.com/mminkoff/ember-filestack/actions/workflows/ci.yml/badge.svg)](https://github.com/mminkoff/ember-filestack/actions/workflows/ci.yml)\n[![Ember Observer Score](http://emberobserver.com/badges/ember-filestack.svg)](http://emberobserver.com/addons/ember-filestack)\n\nProvides file picking, storing, and converting funtionality from [Filestack](https://www.filestack.com) using [filestack-js](https://github.com/filestack/filestack-js).\n\n# Installation\n\n`ember install ember-filestack`\n\n# Compatibility\n\n- Ember.js v3.24 or above\n- Ember CLI v3.24 or above\n- Node.js v12 or above\n\nember-filestack supports all ember LTS versions (that means 3.24+ at the moment). With that being said,\nit may support versions even older than that.\n\nYour consuming app must depend on ember-auto-import \u003e= 2 in order to use this addon.\n\n# Migration from 1.0.0\n\nThere are important changes since v1.0.0. Most will be supported with deprecation notices until v3.0.0. However, there have also been important changes in the underlyng filestack.js module. Please refer to the [Filestack API changelog](https://github.com/filestack/filestack-js/blob/cc3196dc2a9c65ec503eb264d362998114ba142e/CHANGELOG.md) for changes to available options.\n\nPlease read our [migration guide](https://github.com/mminkoff/ember-filestack/blob/master/MIGRATION.md) for changes to `environment.js` and the Ember components.\n\n# Configuration\n\n## API Key\n\n- Create your filestack.com key at https://www.filestack.com/.\n- Add your filestack.com key in your `config/environment.js` file\n\n```js\n// config/environment.js\nmodule.exports = function (environment) {\n  let ENV = {\n    //...\n    'ember-filestack': {\n      apiKey: 'AOkSBYOLvTqK3GzWzQMOuz',\n    },\n  };\n  //...\n};\n```\n\n## Custom CDN\n\nTo minimize your quota usage (both bandwidth and process quotas), you can put filestack behind your own CDNs (e.g. AWS CloudFront).\nTo do that you will want to proxy all urls with the host `https://cdn.filestackcontent.com`.\n\nThen you can configure your custom CDN url like:\n\n```js\n// config/environment.js\nmodule.exports = function (environment) {\n  let ENV = {\n    //...\n    'ember-filestack': {\n      apiKey: '\u003cyour filestack api key\u003e',\n      customCDN: '\u003cyour-cdn.cloudfront.net\u003e',\n    },\n  };\n  //...\n};\n```\n\nWhen `customCDN` is defined, `ember-filestack` will ensure that Filestack’s CDN is never accessed directly.\n\n## Global config for picker and preview\n\nYou can add global options for the picker and preview components (read more about them in the next sections).\nFor that, you can use the `pickerOptions` and `previewOptions` keys in the ember-filestack config.\nAdditionally, any necessary filestack [client options](https://filestack.github.io/filestack-js/interfaces/clientoptions.html) must be defined here.\n\nExample:\n\n```js\n// config/environment.js\nmodule.exports = function(environment) {\n  let ENV = {\n    //...\n    'ember-filestack': {\n      // ...\n      clientOptions: {\n        // add any client options here\n      },\n      pickerOptions: {\n        // add any global picker options here\n      },\n      previewOptions: {\n        // add any global preview options here\n      }\n    }\n  };\n  //...\n```\n\n# Usage\n\n## File Picker\n\nThe file picker is rendered using the `\u003cFilestackPicker/\u003e` component. This component accepts all the available picker options\nthat the filestack picker accepts. Complete documentation of all the available options can be found\n[here](https://filestack.github.io/filestack-js/interfaces/pickeroptions.html).\n\nExample:\n\n```hbs\n\u003cbutton type='button' {{on 'click' (fn (mut this.showFilePicker) true)}}\u003eChoose\n  file\u003c/button\u003e\n\n{{#if this.showFilePicker}}\n  \u003cFilestackPicker\n    @accept='image/*'\n    @onUploadDone={{this.fileSelected}}\n    @onClose={{fn (mut this.showFilePicker) false}}\n  /\u003e\n{{/if}}\n```\n\n```js\nexport default class FileUploader extends Component {\n  fileSelected(result) {\n    // `result` is an array of files you've just uploaded\n    console.log(result.filesUploaded);\n  }\n}\n```\n\n## Generate file urls\n\nWhen you need to generate a filestack url, you should use the `{{filestack-url}}` helper.\n\nThis helper accepts a filestack handle or any image url as the first (and only) positional parameter.\n\nAdditionally, you can pass in additional multiple named parameters that correspond to [transforms](https://www.filestack.com/docs/concepts/transform/).\nThe helper accepts all the available transforms that filestack provides. You can check the available transform options\n[here](https://filestack.github.io/filestack-js/interfaces/transformoptions.html).\n\nExamples:\n\n```hbs\n{{filestack-url this.handleOrUrl}}\n\n{{filestack-url this.handleOrUrl resize=(hash width=50 height=50 fit='scale')}}\n\n{{filestack-url this.handleOrUrl output=(hash format='jpg')}}\n\n{{filestack-url\n  this.handleOrUrl\n  output=(hash format='png')\n  resize=(hash width=500 height=500 fit='max')\n}}\n```\n\nYou can also use the included `filestack` service to generate image urls:\n\n```js\nimport Component from '@glimmer/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nexport default class MyComponent extends Component {\n  @service filestack;\n\n  get scaledImage() {\n    let url = this.args.imageUrl;\n    let transformations = {\n      output: {\n        format: 'png',\n      },\n      resize: {\n        width: 500,\n        height: 500,\n        fit: 'max',\n      },\n    };\n\n    return this.filestack.getUrl(url, transformations);\n  }\n}\n```\n\nAll of these will respect the `customCDN` configuration, if present.\n\nNotice that _it is_ possible to write invalid transforms. For example, you can't specify a transform of\n`resize=(hash fit=\"some-invalid-value\")`. Under the hook, `filestack-js` will validate the passed transform options,\nso expect errors if you do something wrong.\n\n## Filestack previewer\n\nFilestack has a feature to preview documents in a nice file previewer. This renders\nan iframe with filestack's previewer and it supports multiple formats. Read more about\nthis feature [here](https://www.filestack.com/docs/concepts/transform/#document-viewer).\n\nember-filestack provides a `\u003cFilestackPreview/\u003e` component that you can use to quickly insert this\niframe anywhere in your DOM.\n\nExample:\n\n```hbs\n\u003cFilestackPreview @handle={{this.fileHandle}} /\u003e\n```\n\nThis component supports all the preview options that filestack supports.\nComplete documentation of all the available options can be found\n[here](https://filestack.github.io/filestack-js/interfaces/previewoptions.html).\n\n## Direct filestack client Access\n\nSometimes you might need to use the filestack client manually.\nTo do that, you can use the `filestack` service `initClient` method as follows:\n\n```js\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\n\nexport default class MyComponent extends Component {\n  // inject the filestack service\n  @service filestack;\n\n  async someFunction() {\n    // Use the promise in case you are not sure that your component will be initialized after filestack has been loaded\n\n    let filestack = await this.filestack.initClient();\n\n    // do something with filestack\n  }\n}\n```\n\nNotice that `initClient` is asynchronous (returns a Promise). This happens because we lazily initialize and import\nfilestack client. Please read the next section for more information.\n\n## Lazy filestack initialization\n\nAll the filestack javascript and the respective filestack initialization is done **only when needed**.\nThis means that, if a user never renders a filepicker or generates a filestack url, your app won't spend any\nresources or bandwidth with filestack related work.\n\nWith that being said, `ember-filestack` makes sure that it only initializes filestack **once**. This means that, for example,\nif you call `this.filestack.initClient()` twice, all the heavy work will be done once. In this example the second call\nwould return the filestack client immediately.\n\n## Fastboot considerations\n\n`ember-filestack` will no-op on fastboot environments since `filestack-js` requires access to `document` (which isn't available on node).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmminkoff%2Fember-filestack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmminkoff%2Fember-filestack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmminkoff%2Fember-filestack/lists"}