{"id":18258211,"url":"https://github.com/cheqd/studio","last_synced_at":"2026-05-19T11:01:54.123Z","repository":{"id":60286304,"uuid":"481242041","full_name":"cheqd/studio","owner":"cheqd","description":"API server for interacting with decentralised identity functionality on the cheqd Network","archived":false,"fork":false,"pushed_at":"2026-01-16T09:25:27.000Z","size":25131,"stargazers_count":11,"open_issues_count":13,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-01-16T23:46:24.756Z","etag":null,"topics":["cheqd","decentralized-identifiers","decentralized-identity","hacktoberfest","verifiable-credentials"],"latest_commit_sha":null,"homepage":"https://studio-api.cheqd.net","language":"TypeScript","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/cheqd.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-04-13T14:07:59.000Z","updated_at":"2025-12-01T14:20:36.000Z","dependencies_parsed_at":"2024-01-17T19:43:55.039Z","dependency_job_id":"e62d15c1-2053-467f-b113-b46a74bae2ed","html_url":"https://github.com/cheqd/studio","commit_stats":{"total_commits":331,"total_committers":11,"mean_commits":30.09090909090909,"dds":0.5135951661631419,"last_synced_commit":"8b6c91341b451eb2a85bdcd4f6b328aebfa69941"},"previous_names":["cheqd/studio","cheqd/credential-service"],"tags_count":293,"template":false,"template_full_name":null,"purl":"pkg:github/cheqd/studio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cheqd%2Fstudio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cheqd%2Fstudio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cheqd%2Fstudio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cheqd%2Fstudio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cheqd","download_url":"https://codeload.github.com/cheqd/studio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cheqd%2Fstudio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29046503,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-03T10:09:22.136Z","status":"ssl_error","status_checked_at":"2026-02-03T10:09:16.814Z","response_time":96,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":["cheqd","decentralized-identifiers","decentralized-identity","hacktoberfest","verifiable-credentials"],"created_at":"2024-11-05T10:29:37.521Z","updated_at":"2026-02-03T13:12:50.660Z","avatar_url":"https://github.com/cheqd.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# cheqd Studio\n\n[![GitHub release (latest by date)](https://img.shields.io/github/v/release/cheqd/studio?color=green\u0026label=stable%20release\u0026style=flat-square)](https://github.com/cheqd/studio/releases/latest)\n![GitHub Release Date](https://img.shields.io/github/release-date/cheqd/studio?color=green\u0026style=flat-square)\n[![GitHub license](https://img.shields.io/github/license/cheqd/studio?color=blue\u0026style=flat-square)](https://github.com/cheqd/studio/blob/main/LICENSE)\n\n[![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/cheqd/studio?include_prereleases\u0026label=dev%20release\u0026style=flat-square)](https://github.com/cheqd/studio/releases/)\n![GitHub commits since latest release (by date)](https://img.shields.io/github/commits-since/cheqd/studio/latest?style=flat-square)\n[![GitHub contributors](https://img.shields.io/github/contributors/cheqd/studio?label=contributors%20%E2%9D%A4%EF%B8%8F\u0026style=flat-square)](https://github.com/cheqd/studio/graphs/contributors)\n\n[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/cheqd/studio/dispatch.yml?label=workflows\u0026style=flat-square)](https://github.com/cheqd/studio/actions/workflows/dispatch.yml)\n[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/cheqd/studio/codeql.yml?label=CodeQL\u0026style=flat-square)](https://github.com/cheqd/studio/actions/workflows/codeql.yml)\n![GitHub repo size](https://img.shields.io/github/repo-size/cheqd/studio?style=flat-square)\n\n## ℹ️ Overview\n\ncheqd Studio (formerly known as Credential Service) enables users to consume cheqd's identity functionality, such as DIDs, Trust Registries, Status Lists, Credential Payments and DID-Linked Resources over REST API. This enables users to integrate cheqd's functionality into existing applications or create a full end-to-end trusted ecosystem from the ground up.\n\nGet started by setting up your cheqd Studio account below:\n\n- [Setup cheqd Studio account](https://cheqd.io/solutions/cheqd-studio/)\n- [cheqd Studio docs and tutorials](https://docs.cheqd.io/product/getting-started/studio)\n\n## 📖 Usage\n\nWe run hosted endpoints for this package (in case you don't want to run it yourself) which have Swagger / OpenAPI\ndefinition endpoints that list all of the APIs and how they work.\n\nThe Swagger API definition pages are:\n\n- [Production / Stable Release APIs](https://studio-api.cheqd.net/swagger/)\n- [Staging / Development Release APIs](https://studio-api-staging.cheqd.net/swagger/)\n\n## 🔧 Configuration\n\nThe application allows configuring the following parameters using environment variables.\n\n### Core configuration\n\n#### Events tracking\n\n1. `LOG_LEVEL`: specifies log level, like 'trace', 'debug', 'info', 'warn' or 'error';\n\n#### Network API endpoints\n\n1. `MAINNET_RPC_URL`: RPC endpoint for cheqd mainnet (Default: `https://rpc.cheqd.net:443`).\n2. `TESTNET_RPC_URL`: RPC endpoint for cheqd testnet (Default: `https://rpc.cheqd.network:443`).\n3. `RESOLVER_URL`: API endpoint for a [DID Resolver](https://github.com/cheqd/did-resolver) endpoint that supports\n   `did:cheqd` (Default: `https://resolver.cheqd.net/1.0/identifiers/`).\n4. `APPLICATION_BASE_URL`: URL of the application (external domain name).\n5. `CORS_ALLOWED_ORIGINS`: CORS allowed origins used in the app (optional). (Default: `APPLICATION_BASE_URL`).\n\n#### Veramo KMS Database\n\nThe application supports two modes in which keys are managed: either just storing them in-memory while a container is\nrunning, or persisting them in a PostgresSQL database with Veramo SDK. Using an external Postgres database allows for\n\"custodian\" mode where identity and cheqd/Cosmos keys can be offloaded by client applications to be stored in the\ndatabase.\n\nBy default, `ENABLE_EXTERNAL_DB` is set to off/`false`. To enable external Veramo KMS database, set `ENABLE_EXTERNAL_DB`\nto `true`, then define below environment variables in `.env` file:\n\n1. `EXTERNAL_DB_CONNECTION_URL`: PostgreSQL database connection URL, e.g.\n   `postgres://\u003cuser\u003e:\u003cpassword\u003e@\u003chost\u003e:\u003cport\u003e/\u003cdatabase\u003e`.\n2. `EXTERNAL_DB_ENCRYPTION_KEY`: Secret key used to encrypt the Veramo key-specific database tables. This adds a layer\n   of protection by not storing the database in plaintext.\n3. `EXTERNAL_DB_CERTIFICATE`: Custom CA certificate required to connect to the database (optional).\n\n#### API Authentication using LogTo\n\nBy default, the application has API authentication disabled (which can be changed in configuration). If, however, you'd\nlike to run the app with API authentication features, the following variables need to be configured.\n\nWe use a self-hosted version of [LogTo](https://logto.io/), which supports OpenID Connect. Theoretically, these values\ncould also be replaced with [LogTo Cloud](http://cloud.logto.io/) or any other OpenID Connect identity provider.\n\nBy default, `ENABLE_AUTHENTICATION` is set to off/`false`. To enable external Veramo KMS database, set\n`ENABLE_AUTHENTICATION` to `true`, then define below environment variables in `.env` file:\n\n1. **Endpoints**\n    1. `LOGTO_ENDPOINT`: API endpoint for LogTo server\n    2. `LOGTO_DEFAULT_RESOURCE_URL`: Root of API resources in this application to be guarded. (Default:\n       `http://localhost:3000/` on localhost.)\n    3. `LOGTO_MANAGEMENT_API`: URL of management API for LogTo. This is typically static within self-hosted LogTo applications and is not meant to be a resolvable URL. (Default: `https://default.logto.app/api`)\n2. **User-facing APIs**\n    1. `LOGTO_APP_ID`: Application ID for the cheqd Studio application in LogTo. This can be set up as type\n       \"Traditional Web\"\n    2. `LOGTO_APP_SECRET`: Application secret associated with App ID above.\n3. **Machine-to-machine backend APIs**\n    1. `LOGTO_M2M_APP_ID`: Application ID for machine-to-machine application in LogTo. This is used for elevated\n       management APIs within LogTo.\n    2. `LOGTO_M2M_APP_SECRET`: Application secret\n4. **Default role update using [LogTo webhooks](https://docs.logto.io/docs/recipes/webhooks/)**: LogTo supports\n   webhooks to fire of requests to an API when it detects certain actions/changes. If you want to automatically assign a\n   role to users, a webhook is recommended to be setup for firing off whenever there's a new account created, or a new\n   sign-in.\n    1. `LOGTO_DEFAULT_ROLE_ID`: LogTo Role ID for the default role to put new users into.\n    2. `LOGTO_WEBHOOK_SECRET`: Webhook secret to authenticate incoming webhook requests from LogTo.\n5. **Miscellaneous**\n    1. `COOKIE_SECRET`: Secret for cookie encryption.\n    2. `API_KEY_EXPIRATION` (optional): Expiration time for API keys in days. (Default 30 days)\n\n#### Faucet settings\n\nThis section describes bootstrapping things for newcomers accounts. If it's enabled cheqd Studio auto-populates\nsome tokens on the testnet for making the process simpler.\n\n1. `ENABLE_ACCOUNT_TOPUP`: Enable/disable such functionality (`false` by default)\n2. `FAUCET_URI`: Faucet service API endpoint (Default: `https://faucet-api.cheqd.network/credit`)\n3. `TESTNET_MINIMUM_BALANCE`: Minimum balance on account before it is automatically topped up from the faucet. This value should be expressed as an integer in `CHEQ` tokens, which will then be converted in the background to `ncheq` denomination. Account balance check is carried out on every account creation/login. (Default: 10,000 CHEQ testnet tokens)\n\n#### Stripe integration\n\nThe application supports Stripe integration for payment processing.\n\n1. `STRIPE_ENABLED` - Enable/disable Stripe integration (`false` by default)\n2. `STRIPE_SECRET_KEY` - Secret key for Stripe API. Please, keep it secret on deploying\n3. `STRIPE_PUBLISHABLE_KEY` - Publishable key for Stripe API.\n4. `STRIPE_WEBHOOK_SECRET` - Secret for Stripe Webhook.\n5. `STRIPE_BUILD_PLAN_ID` - Subscription planId of Build plan\n6. `STRIPE_TEST_PLAN_ID` -  Subscription planId of Test plan\n\n### 3rd Party Connectors\n\nThe app supports 3rd party connectors for credential storage and delivery.\n\n#### Verida\n\nThe app's [Verida Network](https://www.verida.network/) connector can be enabled to deliver generated credentials to\nVerida Wallet.\n\nBy default, `ENABLE_VERIDA_CONNECTOR` is set to off/`false`. To enable external Veramo KMS database, set\n`ENABLE_VERIDA_CONNECTOR` to `true`, then define below environment variables in `.env` file:\n\n1. `VERIDA_PRIVATE_KEY`: Secret key for Verida Network API.\n2. `POLYGON_PRIVATE_KEY`: Secret key for Polygon Network.\n\n## 🧑‍💻🛠 Developer Guide\n\n### Run as standalone application using Docker Compose\n\nIf you want to run the application without any external databases or dependent services, we provide\n[a Docker Compose file](docker/no-external-db/docker-compose-no-db.yml) to spin up a standalone service.\n\n```bash\ndocker compose -f docker/no-external-db/docker-compose-no-db.yml up --detach\n```\n\nThis standalone service uses an in-memory database with no persistence, and therefore is recommended only if you're\nmanaging key/secret storage separately.\n\nThe [`no-db.env` file](docker/no-external-db/no-db.env) in the same folder contains all the environment variables\nnecessary to configure the service. (See section _Configuration_ above.)\n\n### Run with external Key Management System (KMS) and/or authentication service using Docker Compose\n\nConstruct the postgres URL and configure the env variables mentioned above.\n\nSpinning up a Docker container from the\n[pre-built studio Docker image on Github](https://github.com/cheqd/studio/pkgs/container/studio)\nis as simple as the command below:\n\n#### Configure PostgreSQL database\n\nConfigure the environment variables in the [`postgres.env` file](docker/with-external-db/postgres.env):\n\n1. `POSTGRES_USER`: Username for Postgres database\n2. `POSTGRES_PASSWORD`: Password for Postgres database\n3. `POSTGRES_MULTIPLE_DATABASES`: Database names for multiple databases in the same cluster, e.g.: `\"app,logto\"`. This\n   sets up multiple databases in the same cluster, which can be used independently for External Veramo KMS or LogTo\n   service.\n\nThen, make the Postgres initialisation scripts executable:\n\n```bash\nchmod +x docker/with-external-db/pg-init-scripts/create-multiple-postgresql-databases.sh\n```\n\n#### Start LogTo service\n\nConfigure the environment variables in the [`logto.env` file](docker/with-external-db/logto.env) with the settings\ndescribed in section above.\n\nThen, run the LogTo service to configure the LogTo application API resources, applications, sign-in experiences, roles\netc using Docker Compose:\n\n```bash\ndocker compose -f docker/with-external-db/docker-compose-with-db.yml --profile logto up --detach\n```\n\nConfiguring LogTo is outside the scope of this guide, and we recommend reading\n[LogTo documentation](https://docs.logto.io/) to familiarise yourself.\n\n#### Start studio app\n\nConfigure the environment variables in the [`with-db.env` file](docker/with-external-db/with-db.env) with the settings\ndescribed in section above. Depending on whether you are using external Veramo KMS only, LogTo only, or both you will\nneed to have previously provisioned these services as there are environment variables in this file that originate from\nPostgres/LogTo.\n\nThen, start the service using Docker Compose:\n\n```bash\ndocker compose -f docker/with-external-db/docker-compose-with-db.yml up --detach\n```\n\n#### Running app or LogTo migrations\n\nWhen upgrading either the external Veramo KMS or LogTo, you might need to run migrations for the underlying databases.\n\nYou can run _just_ the migration scripts using [Docker Compose profiles](https://docs.docker.com/compose/profiles/)\ndefined in the Compose file.\n\nFor example, to run cheqd Studio app migrations on an existing Postgres database (for external Veramo KMS):\n\n```bash\ndocker compose -f docker/with-external-db/docker-compose-with-db.yml --profile app-setup up --detach\n```\n\nOr to run LogTo migrations on an existing Postgres database:\n\n```bash\ndocker compose -f docker/with-external-db/docker-compose-with-db.yml --profile logto-setup up --detach\n```\n\n### Build using Docker\n\nTo build your own image using Docker, use the [Dockerfile](docker/Dockerfile) provided.\n\n```bash\ndocker build --file docker/Dockerfile --target runner . --tag studio:local\n```\n\n## 🐞 Bug reports \u0026 🤔 feature requests\n\nIf you notice anything not behaving how you expected, or would like to make a suggestion / request for a new feature,\nplease create a [**new issue**](https://github.com/cheqd/studio/issues/new/choose) and let us know.\n\n## 💬 Community\n\nOur [**Discord server**](http://cheqd.link/discord-github) is our primary chat channel for the open-source\ncommunity, software developers, and node operators.\n\nPlease reach out to us there for discussions, help, and feedback on the project.\n\n## 🙋 Find us elsewhere\n\n[![Telegram](https://img.shields.io/badge/Telegram-2CA5E0?style=for-the-badge\u0026logo=telegram\u0026logoColor=white)](https://t.me/cheqd)\n[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge\u0026logo=discord\u0026logoColor=white)](http://cheqd.link/discord-github)\n[![Twitter](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge\u0026logo=twitter\u0026logoColor=white)](https://twitter.com/intent/follow?screen_name=cheqd_io)\n[![LinkedIn](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white)](http://cheqd.link/linkedin)\n[![Medium](https://img.shields.io/badge/Medium-12100E?style=for-the-badge\u0026logo=medium\u0026logoColor=white)](https://blog.cheqd.io)\n[![YouTube](https://img.shields.io/badge/YouTube-FF0000?style=for-the-badge\u0026logo=youtube\u0026logoColor=white)](https://www.youtube.com/channel/UCBUGvvH6t3BAYo5u41hJPzw/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcheqd%2Fstudio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcheqd%2Fstudio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcheqd%2Fstudio/lists"}