{"id":23722663,"url":"https://github.com/remko/dsadmin","last_synced_at":"2025-09-03T23:31:47.272Z","repository":{"id":57216686,"uuid":"379013506","full_name":"remko/dsadmin","owner":"remko","description":"Google Cloud Datastore Emulator Administration UI","archived":false,"fork":false,"pushed_at":"2025-08-29T15:48:14.000Z","size":724,"stargazers_count":68,"open_issues_count":3,"forks_count":8,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-08-29T17:59:28.180Z","etag":null,"topics":["administration-interface","google-cloud-datastore","gui","ui"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/remko.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}},"created_at":"2021-06-21T17:35:12.000Z","updated_at":"2025-08-29T15:48:17.000Z","dependencies_parsed_at":"2024-01-04T09:34:06.244Z","dependency_job_id":null,"html_url":"https://github.com/remko/dsadmin","commit_stats":{"total_commits":142,"total_committers":2,"mean_commits":71.0,"dds":0.007042253521126751,"last_synced_commit":"0f265131f22b394ab7c2b5aad8d44d096dff8d5f"},"previous_names":[],"tags_count":27,"template":false,"template_full_name":null,"purl":"pkg:github/remko/dsadmin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remko%2Fdsadmin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remko%2Fdsadmin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remko%2Fdsadmin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remko%2Fdsadmin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/remko","download_url":"https://codeload.github.com/remko/dsadmin/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/remko%2Fdsadmin/sbom","scorecard":{"id":770319,"data":{"date":"2025-08-11","repo":{"name":"github.com/remko/dsadmin","commit":"ed686bd1b57b5117f1a00faa8fe33f4ea5b47d34"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/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":"Maintained","score":0,"reason":"0 commit(s) and 1 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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yml:1","Warn: no topLevel permission defined: .github/workflows/publish-release.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":"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/build.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-release.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/publish-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-release.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/publish-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-release.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/publish-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-release.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/publish-release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/publish-release.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/publish-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-release.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/publish-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-release.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/publish-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-release.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/publish-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-release.yml:78: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/publish-release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish-release.yml:79: update your workflow using https://app.stepsecurity.io/secureworkflow/remko/dsadmin/publish-release.yml/master?enable=pin","Info:   0 out of  14 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 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":"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":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":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.20.0 not signed: https://api.github.com/repos/remko/dsadmin/releases/135785134","Warn: release artifact v0.19.0 not signed: https://api.github.com/repos/remko/dsadmin/releases/120743518","Warn: release artifact v0.18.2 not signed: https://api.github.com/repos/remko/dsadmin/releases/115080482","Warn: release artifact v0.18.1 not signed: https://api.github.com/repos/remko/dsadmin/releases/74709978","Warn: release artifact v0.18.0 not signed: https://api.github.com/repos/remko/dsadmin/releases/69150285","Warn: release artifact v0.20.0 does not have provenance: https://api.github.com/repos/remko/dsadmin/releases/135785134","Warn: release artifact v0.19.0 does not have provenance: https://api.github.com/repos/remko/dsadmin/releases/120743518","Warn: release artifact v0.18.2 does not have provenance: https://api.github.com/repos/remko/dsadmin/releases/115080482","Warn: release artifact v0.18.1 does not have provenance: https://api.github.com/repos/remko/dsadmin/releases/74709978","Warn: release artifact v0.18.0 does not have provenance: https://api.github.com/repos/remko/dsadmin/releases/69150285"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 1 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":"28 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-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-cph5-m8f7-6c5x","Warn: Project is vulnerable to: GHSA-wf5p-g6vw-rhxx","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-67mh-4wv8-2f99","Warn: Project is vulnerable to: GHSA-74fj-2j2h-c42q","Warn: Project is vulnerable to: GHSA-pw2r-vq6v-hr8c","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-4q6p-r6v2-jvc5","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-qrpm-p2h7-hrv2","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-5g97-whc9-8g7j","Warn: Project is vulnerable to: GHSA-8r4g-cg4m-x23c","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-76p7-773f-r4q5","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7"],"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-23T02:03:43.590Z","repository_id":57216686,"created_at":"2025-08-23T02:03:43.590Z","updated_at":"2025-08-23T02:03:43.590Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273528176,"owners_count":25121750,"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-09-03T02:00:09.631Z","response_time":76,"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":["administration-interface","google-cloud-datastore","gui","ui"],"created_at":"2024-12-30T23:55:20.892Z","updated_at":"2025-09-03T23:31:46.960Z","avatar_url":"https://github.com/remko.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"./doc/logo.svg\" height=\"150\"\u003e\n\n# DSAdmin: Google Cloud Datastore Emulator Admin UI\n\n[![Build](https://github.com/remko/dsadmin/actions/workflows/build.yml/badge.svg)](https://github.com/remko/dsadmin/actions/workflows/build.yml)\n\nAdministration GUI for the Google Cloud Datastore Emulator.\n\n- Supports browsing, editing, creating, deleting, querying (using GQL),\n  import, export, ...\n- Supports formatted display of JSON properties \u0026 compressed properties\n- Supports large databases\n- Does not have problematic dependencies (such as gRPC, which are not\n  available on all platforms)\n- Portable: Implemented entirely in the frontend as an SPA. Uses the\n  [Datastore REST\n  API](https://cloud.google.com/datastore/docs/reference/data/rest)\n  directly from the frontend. The only thing a server is used for is for\n  proxying to the datastore emulator (to avoid CORS problems), and to\n  serve the HTML and JS files. The NPM package uses a small Node.js\n  server. A small [self-contained binary\n  server](https://github.com/remko/dsadmin/releases) is also provided,\n  avoiding the need for any system dependencies. If for some reason you\n  need this to be available in a specific environment (Java, Python,\n  ...), it should be easy to create a similar server to run this in.\n\n## 📷 Screenshots\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"https://raw.githubusercontent.com/remko/dsadmin/master/doc/screenshot-entity.png\" width=250 alt=\"Entity editor\"/\u003e\u003c/a\u003e\u0026nbsp;\u003cimg src=\"https://raw.githubusercontent.com/remko/dsadmin/master/doc/screenshot-kind.png\" alt=\"Kinds\" width=250/\u003e\u0026nbsp;\u003cimg src=\"https://raw.githubusercontent.com/remko/dsadmin/master/doc/screenshot-create.png\" alt=\"Entity creator\" width=250/\u003e\n\u003c/div\u003e\n\n## ❓ Why?\n\nSince Google stopped shipping an admin interface for their Datastore\nEmulator, there have been some external projects trying to fill the gap.\nHowever, all of the ones I tried were either partially or completely\nbroken, lacked in core features, had performance issues, were painful to\nset up, or had dependencies that prevented them from e.g. being\ninstalled in a non-x86 Docker image.\n\nThis project tries to fix all of the issues with the other Datastore\nadmin interfaces, and bring improvements on the original Google\ninterface.\n\n## 🚧 Not yet implemented\n\n- Editing nested entities\n- UI for filtering \u0026 projecting\n\n## 📖 Usage\n\n### Using NPM\n\nUsing the environment from the emulator:\n\n    eval $(gcloud beta emulators datastore env-init --data-dir=DATA-DIR)\n    npx dsadmin\n\nUsing command-line arguments:\n\n    npx dsadmin --project=my-datastore-project --datastore-emulator-host=localhost:8081\n\n### Using a pre-built binary\n\nDownload the correct binary for your OS from the [Releases\npage](https://github.com/remko/dsadmin/releases).\n\nStart using the environment from the emulator:\n\n    eval $(gcloud beta emulators datastore env-init --data-dir=DATA-DIR)\n    ./dsadmin\n\nStart using command-line arguments:\n\n    ./dsadmin --project=my-datastore-project --datastore-emulator-host=localhost:8081\n\n### Using Docker\n\n    docker run -p 8080:8080 ghcr.io/remko/dsadmin:latest \\\n      --project=my-project --datastore-emulator-host=host.docker.internal:8081\n\n### Using Docker Compose\n\nCreate a `docker-compose.yml` that starts the Datastore Emulator and the\nDatastore Admin container:\n\n``` yaml\nversion: \"3.9\"\nservices:\n  # DSAdmin container\n  dsadmin:\n    image: \"ghcr.io/remko/dsadmin:latest\"\n    depends_on:\n      - datastore\n    ports:\n      - \"8080:8080\"\n    environment:\n      DATASTORE_PROJECT_ID: my-datastore-project\n      DATASTORE_EMULATOR_HOST: \"datastore:8081\"\n\n  # Datastore Emulator container\n  datastore:\n    image: \"gcr.io/google.com/cloudsdktool/cloud-sdk:latest\"\n    volumes:\n      - datastore_data:/opt/datastore/data\n    ports:\n      - \"8081:8081\"\n    command: [\n      \"gcloud\", \"--quiet\", \"beta\", \"emulators\" ,\"datastore\", \"start\", \n      \"--host-port=0.0.0.0:8081\", \"--data-dir=/opt/datastore/data\"\n    ]\n    environment:\n      CLOUDSDK_CORE_PROJECT: my-datastore-project\n\nvolumes:\n  datastore_data:\n```\n\n## 💻 Development\n\nInstall all dependencies\n\n    yarn\n\nStart all development servers (datastore emulator, proxy, and frontend\nbuild):\n\n    yarn start\n\nIf you want to run against your own running instance of the Datastore\nemulator, start the backend server and the build server separately:\n\n    eval $(gcloud beta emulators datastore env-init --data-dir=DATA-DIR)\n    ./bin/dsadmin.js\n    yarn run start-build\n\nor using command-line arguments:\n\n    ./bin/dsadmin.js --project=my-datastore-project --datastore-emulator-host=localhost:8081\n    yarn run start-build\n\n## 🔋 Powered by ...\n\nThis project uses some great open source projects. Check them out if you\ndon't know them.\n\n\u003cdiv align=\"center\"\u003e\n\u003ca href=\"https://react-query.tanstack.com\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/TanStack/query/v3/docs/src/images/logo.svg\" height=70 alt=\"React Query\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"https://react-table.tanstack.com\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/TanStack/table/v7/docs/src/images/logo-light.svg\" height=75 alt=\"React Table\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"https://github.com/google/ko\"\u003e\u003cimg src=\"https://github.com/google/ko/raw/main/docs/images/ko.png\" height=75 alt=\"ko\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"https://esbuild.github.io\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/evanw/esbuild/master/images/logo.png\" height=75 alt=\"ESBuild\"/\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u003ca href=\"https://github.com/molefrog/wouter\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/molefrog/wouter/master/assets/logo.svg\" height=75 alt=\"Wouter\"/\u003e\u003c/a\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremko%2Fdsadmin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fremko%2Fdsadmin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fremko%2Fdsadmin/lists"}