{"id":17004822,"url":"https://github.com/clickermonkey/storkjs","last_synced_at":"2025-10-05T01:28:24.464Z","repository":{"id":57371386,"uuid":"44564683","full_name":"ClickerMonkey/storkjs","owner":"ClickerMonkey","description":"Simple key-value storage in your browser.","archived":false,"fork":false,"pushed_at":"2016-11-02T03:34:51.000Z","size":460,"stargazers_count":24,"open_issues_count":1,"forks_count":5,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-09-29T07:11:37.364Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://clickermonkey.github.io/storkjs","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ClickerMonkey.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-10-19T21:18:10.000Z","updated_at":"2024-11-11T09:04:58.000Z","dependencies_parsed_at":"2022-08-31T00:01:25.180Z","dependency_job_id":null,"html_url":"https://github.com/ClickerMonkey/storkjs","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/ClickerMonkey/storkjs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ClickerMonkey%2Fstorkjs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ClickerMonkey%2Fstorkjs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ClickerMonkey%2Fstorkjs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ClickerMonkey%2Fstorkjs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ClickerMonkey","download_url":"https://codeload.github.com/ClickerMonkey/storkjs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ClickerMonkey%2Fstorkjs/sbom","scorecard":{"id":30672,"data":{"date":"2025-08-11","repo":{"name":"github.com/ClickerMonkey/storkjs","commit":"78742156366b1ca27e49f596c815a38c1811147d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.3,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"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":"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":"Code-Review","score":0,"reason":"Found 0/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":"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":"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":"Dangerous-Workflow","score":-1,"reason":"no workflows found","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":"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":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"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":"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":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"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 1.0.1 not signed: https://api.github.com/repos/ClickerMonkey/storkjs/releases/4519531","Warn: release artifact 1.0.1 does not have provenance: https://api.github.com/repos/ClickerMonkey/storkjs/releases/4519531"],"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"}}]},"last_synced_at":"2025-08-14T19:01:46.874Z","repository_id":57371386,"created_at":"2025-08-14T19:01:46.874Z","updated_at":"2025-08-14T19:01:46.874Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278399623,"owners_count":25980330,"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-10-04T02:00:05.491Z","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":[],"created_at":"2024-10-14T04:44:32.842Z","updated_at":"2025-10-05T01:28:24.450Z","avatar_url":"https://github.com/ClickerMonkey.png","language":"JavaScript","readme":"# StorkJS\n### Simple key-value storage in your browser.\n\nEasiest way to install is via bower with `bower install storkjs`.\n\n[View Documentation](http://clickermonkey.github.io/storkjs) /\n[Download stork.js](https://raw.githubusercontent.com/ClickerMonkey/storkjs/master/build/stork.js) /\n[Download stork.min.js](https://raw.githubusercontent.com/ClickerMonkey/storkjs/master/build/stork.min.js)\n\n- `stork.js` is `110KB` (`17KB` gzipped)\n- `stork.min.js` is `26KB` (`7KB` gzipped)\n\nStorkJS allows you to store key-value pairs \u0026 records in the browser, so when your user returns that data is still there.\nInspired by [lawnchair](http://brian.io/lawnchair/), StorkJS is a more robust option with error handling, key customization, and much more!\n\nStorkJS uses the most preferred \u0026 supported storage available based on your browser.\n\n#### Features\n- Clean and simple API\n- Pure Javascript, no dependencies\n- Graceful degradation of storage backends, uses the best one available!\n- Keys \u0026 Values can be any data type\n- All stored key-value pairs/records can be loaded on initialization or lazy loaded upon request\n- Promises \u0026 [chaining](#chainingExample) allow for cleaner code, since saving and retrieving data\n   isn't always synchronous\n- Plugins can be added to alter behavior\n- Everything is cached to avoid unnessary retrievals\n\n#### API\n- [`then(callback)`](http://clickermonkey.github.io/storkjs/Stork#then): Start a chain of asynchronous calls\n- [`get(key, [success], [failure])`](http://clickermonkey.github.io/storkjs/Stork#get): Return a single value if it exists\n- [`getMany(keys, [success], [failure])`](http://clickermonkey.github.io/storkjs/Stork#getMany): Return several values at once\n- [`save(record, [success], [failure])`](http://clickermonkey.github.io/storkjs/Stork#save): Save a record, generating a key if one doesn't exist\n- [`batch(records, [success], [failure])`](http://clickermonkey.github.io/storkjs/Stork#batch): Save multuple records at once\n- [`put(key, value, [success], [failure])`](http://clickermonkey.github.io/storkjs/Stork#put): Save a key-value pair\n- [`remove(key, [success], [failure])`](http://clickermonkey.github.io/storkjs/Stork#remove): Removes a value/record based on their key\n- [`removeMany(keys, [success], [failure])`](http://clickermonkey.github.io/storkjs/Stork#removeMany): Removes several values/records at once\n- [`destroy([success], [failure])`](http://clickermonkey.github.io/storkjs/Stork#destroy): Remove all key-values/records\n- [`reload([success], [failure])`](http://clickermonkey.github.io/storkjs/Stork#reload): Load all records into cache\n- [`each(callback, [failure])`](http://clickermonkey.github.io/storkjs/Stork#each): Invokes the callback for all key-value pairs\n- [`all([success], [failure])`](http://clickermonkey.github.io/storkjs/Stork#all): Returns all keys and values to the callback\n- [`size([success], [failure])`](http://clickermonkey.github.io/storkjs/Stork#size): Returns the number of key-value pairs to the callback\n\n#### Functionality added through plugins\n- [`where(condition, [success], [failure])`](http://clickermonkey.github.io/storkjs/Stork#where): Returns a subset of all key-value pairs that match some condition\n- [`select(columns, [success], [failure])`](https://clickermonkey.github.io/storkjs/Stork#select): Returns an array of specified properties\n- [`sort(comparator, [success], [failure])`](https://clickermonkey.github.io/storkjs/Stork#sort): Sorts keys and values and returns the sorted value\n- [`aggregate(property, accumulate, getResult, [success], [failure])`](https://clickermonkey.github.io/storkjs/Stork#aggregate): Performs an aggregation on a property\n- [`count(property, [success], [failure])`](https://clickermonkey.github.io/storkjs/Stork#count): Returns the number of objects with a property\n- [`sum(property, [success], [failure])`](https://clickermonkey.github.io/storkjs/Stork#sum): Returns the sum of a property on object values\n- [`avg(property, [success], [failure])`](https://clickermonkey.github.io/storkjs/Stork#avg): Returns the average of a property on object values\n- [`min(property, [success], [failure])`](https://clickermonkey.github.io/storkjs/Stork#min): Returns the minimum value of a property on object values\n- [`max(property, [success], [failure])`](https://clickermonkey.github.io/storkjs/Stork#max): Returns the maximum value of a property on object values\n\n#### Examples\n*Using StorkJS as a record store*\n\n```javascript\nvar db = new Stork( {name: 'todos'} );\n// Save one record\ndb.save( {id: 1, title: 'Download Stork JS'} );\n// Save multiple at once\ndb.batch([\n  {id: 2, title: 'Use Stork JS'},\n  {id: 3, title: '???'},\n  {id: 4, title: 'Profit!'}\n]);\n// Save one without an ID, an ID is placed in the record automatically\ndb.save( {title: 'Hit the Gym'} );\n// Remove one\ndb.remove( 4 );\n// Retrieve a record\ndb.get( 3, function(todo)\n{\n  alert( todo.title );\n});\n// Retrieve all records\ndb.all(function(todos)\n{\n  // todos = array of all todo records\n});\n```\n\n*Using StorkJS as a key-value store*\n```javascript\nvar db = new Stork( {name: 'settings'} );\ndb.put( 'meow', 'string key' );\ndb.put( 23, 'number key' );\ndb.put( true, 'boolean key' );\ndb.put( {y:5}, 'object key' );\ndb.put( [1,3], 'array key' );\n// Remove one\ndb.remove( [1,3] );\n// Retrieve one key-value pair\ndb.get( {y:5}, function(value, key)\n{\n  // value == 'object key'\n});\n// Retrieve all key-value pairs\ndb.all(function(values, keys)\n{\n  // values = array of all values, keys = array of corresponding keys\n});\n```\n\n\u003cspan id=\"chainingExample\"\u003e\u003c/span\u003e\n*Listening for success or failure*\n```javascript\n// All saving, removal, \u0026 retrieval operations can be passed success \u0026 failure callbacks\ndb.get( 23543,\n  function(value, key) {\n\n  },\n  function(key, error) {\n\n  })\n;\n\n// All saving, removal, \u0026 retrieval operations return promises\ndb.get( 23543 )\n  .then(function(value, key) {\n\n  })\n  .error(function(error) {\n\n  })\n;\n\n// If a result of a callback is a promise, YOU CAN CHAIN THEM!\ndb.get( 23543 )\n  .then(function(value, key) {\n    // The value associated to the key\n    return this.size();\n  })\n  .then(function(size) {\n    // The current number of key-value pairs.\n    return this.all();\n  })\n  .then(function(values, keys) {\n    // All key-value pairs currently stored.\n    return this.destroy();\n  })\n  .then(function() {\n    // Everything is destroyed!\n  })\n  .error(function(error) {\n    // Oops!\n  })\n;\n```\n\n#### Building\n\n```\nnpm install\ngulp\n```\n\n#### Building Documentation\n```\ngulp docs\n```\n\n#### Testing\nOnce built, view `test/index.html` in the browser.\n\n## TODO\n- [ ] Test `chrome-storage-local` adapter\n- [ ] Test `ie-userdata` adapter\n- [ ] Add Blackberry Persistent storage\n- [ ] Add HTML5 Filesystem storage\n- [X] Add IE Userdata storage\n- [X] Add IndexedDB storage\n- [ ] Add CouchDB storage\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclickermonkey%2Fstorkjs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclickermonkey%2Fstorkjs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclickermonkey%2Fstorkjs/lists"}