{"id":13580220,"url":"https://github.com/juicycleff/ultimate-backend","last_synced_at":"2025-05-14T02:04:53.246Z","repository":{"id":37759446,"uuid":"209656500","full_name":"juicycleff/ultimate-backend","owner":"juicycleff","description":"Multi tenant SaaS starter kit with cqrs graphql microservice architecture, apollo federation, event source and authentication","archived":false,"fork":false,"pushed_at":"2025-04-14T08:25:06.000Z","size":7793,"stargazers_count":2795,"open_issues_count":89,"forks_count":420,"subscribers_count":65,"default_branch":"master","last_synced_at":"2025-05-05T05:33:28.522Z","etag":null,"topics":["apollo-federation","backend","boilerplate","consul","cqrs","cqrs-architectural-pattern","ddd","ddd-architecture","event-sourcing","eventstore","eventstream","gateways","graphql","graphql-server","microservices","multi-tenancy","nats","nats-streaming","nestjs","stripe"],"latest_commit_sha":null,"homepage":"https://juicycleff.github.io/ultimate-backend-docs","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/juicycleff.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":"2019-09-19T22:06:43.000Z","updated_at":"2025-05-05T02:16:43.000Z","dependencies_parsed_at":"2023-12-20T15:32:46.726Z","dependency_job_id":"5821d86b-4603-4869-91e3-64d42c0f8bdb","html_url":"https://github.com/juicycleff/ultimate-backend","commit_stats":{"total_commits":228,"total_committers":8,"mean_commits":28.5,"dds":0.2894736842105263,"last_synced_commit":"0ae62a4b894c0e46baf75228ec88fae98f6abe06"},"previous_names":[],"tags_count":82,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juicycleff%2Fultimate-backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juicycleff%2Fultimate-backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juicycleff%2Fultimate-backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juicycleff%2Fultimate-backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/juicycleff","download_url":"https://codeload.github.com/juicycleff/ultimate-backend/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254050954,"owners_count":22006387,"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","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":["apollo-federation","backend","boilerplate","consul","cqrs","cqrs-architectural-pattern","ddd","ddd-architecture","event-sourcing","eventstore","eventstream","gateways","graphql","graphql-server","microservices","multi-tenancy","nats","nats-streaming","nestjs","stripe"],"created_at":"2024-08-01T15:01:48.841Z","updated_at":"2025-05-14T02:04:53.225Z","avatar_url":"https://github.com/juicycleff.png","language":"TypeScript","funding_links":["https://opencollective.com/ultimate-backend/contribute","https://opencollective.com/ultimate-backend"],"categories":["Resources","TypeScript","Node.js","boilerplate","⚙️ Backend \u0026 APIs","Javascript"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e  \nULTIMATE BACKEND  \n\u003c/h1\u003e  \n    \n\u003cp align=\"center\"\u003e  \n  \u003cbold\u003e(WIP)\u003c/bold\u003e: This is an enterprise scale advanced microservice pattern with GraphQL API and GRPC Microservices, based on Domain (DDD) using the command query responsibility segregation (CQRS) design pattern.\n  Want to ask \u003ca target=\"_blank\" href=\"https://join.slack.com/t/ultimate-backend/shared_invite/zt-gd6kuuh2-B665Di4cRLqzVqXvhbmrHg\"\u003eRex Isaac Raphael\u003c/a\u003e questions, join the slack channel :)\n\u003c/p\u003e  \n    \u003cp align=\"center\"\u003e  \n\u003c/p\u003e  \n  \n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://opencollective.com/ultimate-backend/tiers/sponsor/badge.svg?label=sponsor\u0026color=brightgreen\" /\u003e\n\u003ca href=\"https://img.shields.io/github/license/juicycleff/ultimate-backend?style=flat-square\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/github/license/juicycleff/ultimate-backend?style=flat-square\" alt=\"License\"/\u003e\u003c/a\u003e  \n\u003ca href=\"https://img.shields.io/snyk/vulnerabilities/github/juicycleff/ultimate-backend?style=flat-square\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/snyk/vulnerabilities/github/juicycleff/ultimate-backend?style=flat-square\" alt=\"Snyk\"/\u003e\u003c/a\u003e  \n\u003ca href=\"https://img.shields.io/github/languages/code-size/juicycleff/ultimate-backend?style=flat-square\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/github/languages/code-size/juicycleff/ultimate-backend?style=flat-square\" alt=\"Code Size\"/\u003e\u003c/a\u003e  \n\u003ca href=\"https://img.shields.io/github/package-json/v/juicycleff/ultimate-backend?style=flat-square\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/github/package-json/v/juicycleff/ultimate-backend?style=flat-square\" alt=\"Version\"/\u003e\u003c/a\u003e  \n\u003ca href=\"https://img.shields.io/github/languages/top/juicycleff/ultimate-backend?style=flat-square\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/github/languages/top/juicycleff/ultimate-backend?style=flat-square\" alt=\"Top Language\"/\u003e\u003c/a\u003e  \n\u003ca href=\"https://img.shields.io/codacy/grade/dc460840375d4ac995f5647a5ed10179?style=flat-square\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/codacy/grade/dc460840375d4ac995f5647a5ed10179?style=flat-square\" alt=\"Top Language\"/\u003e\u003c/a\u003e  \n\u003c/p\u003e  \n  \n## Description  \nNote: The current boilerplate repo is here [WIP Ultimate Backend Boilerplate](https://github.com/juicycleff/ultimate-backend-boilerplate). This repo is currently houses the microservice packages [Next Branch](https://github.com/juicycleff/ultimate-backend/tree/next/packages).\n\nThis should be the go to backend base for your next scalable project. This is a proof of concept project designed to be extremely slim and scalable, with distributed data request and process handling, built from the ground up for production use. It comes with Multi-Tenancy SaaS support, following different multi-tenancy database strategy as well as different resolver patterns  \nto identify your tenants. The goal is to give your next big project that extra leap to awesomeness. To get started read the instructions below. With support for both [Event Store](https://eventstore.org) and [NATS Streaming](https://nats.io) for event streaming and Kafka comming soon.\n  \n\u003e **Note:** Seeing alot of clone of the project which is good, but please if you can 🌟 the project as it also motivates me in improving the project. Also the docker azure CI setups is broken and will be fixed soon.\n\u003e \n  \n\u003e **Note:** Also ultimate backend is coming to `rust` as a complete microservice framework, if you want to be part of it and you program in `rust`, please write to me. Here is the repo [ultimate](https://github.com/juicycleff/ultimate)\n\u003e \n## Features  \n  \nSoftware features  \n  \n* ✅ CQRS  \n* ✅ Software as a Service  \n* ✅ Authentication by stateful session (Password) GraphQL  \n* ✅ OAuth2 Authentication (Google, Github, Facebook) REST  \n* ✅ User  \n* ✅ Event Sourcing  \n* ✅ GraphQL API  \n* ✅ GRPC Microservice  \n* ✅ Emailing Queue  \n* ✅ Role Based Access Control  \n* ✅ Multi Tenancy  \n* ✅ Payment ([Stripe](https://stripe.com/))  \n* ✅ SaaS Plans ([Stripe](https://stripe.com/))  \n* ✅ Security\n* ✅ Service Discovery (Default on Consul), supports ectd, Kubernetes  \n* ✅ [React SSR Starter Kit](https://github.com/juicycleff/ultimate-backend-dashboard)\n* ❌ (WiP) Documentation  \n* ✅ (WiP) Webhooks  \n* ❌ (WiP) Support for language translation  \n* ❌ (WiP) GraphQL dataloaders\n  \n## Software stack\n  \n  |                |Required                          |Optional                         |\n|----------------|-------------------------------|-----------------------------|\n|`Store and cache`|[Event Store (Event Source Store)](https://eventstore.org), [Redis (Queue \u0026 cache)](https://redis.io/) and [MongoDB (Database)](https://www.mongodb.com/)            |[ArangoDB (Database)](https://www.arangodb.com/), [NATS Streaming (Event Source Store)](https://nats.io)            |\n|`Stack and frameworks` |[NestJS (Server Framework)](https://nestjs.com), [NodeJS (System runtime)](https://nodejs.org), [Typescript](https://www.typescriptlang.org), [Express JS](https://expressjs.com), [Fastify](https://www.fastify.io), [GRPC](https://grpc.io/), [NestCloud](https://nestcloud.org/) and [Apollo GraphQL](https://www.apollographql.com)                |none            |\n|`Deployment and containerization`          |[Docker](https://www.docker.com/) |[Kubernetes](https://kubernetes.io/), [Azure Pipeline](https://azure.microsoft.com/en-us/services/devops/pipelines/), GitLab CI ||\n|`Service Registry`          |[Consul](https://consul.io/)|[Kubernetes](https://kubernetes.io/) and [etcd](https://etcd.io/)|\n  \n\n## Folder Structure  \nSenior candidate in the folder structure is the `/app` folder. This folder contains all executable programs or in this case microservices\n\n - `/app/service-access` The access microservice handles access token management for each tenant in the system. It also validates current tenant credentials against a tenant specific resources. It is the gate keeper for your tenant api.\n - `/app/service-account` The account microservice handles user account commands and queries such as creating and validating new and current users in the system.\n - `/app/service-tenant` The tenant microservice handles creating new tenants as well as managing tenant specific commands and queries.\n - `/app/service-role` Similar to service-access, this service validates users based on roles against the entire system and tenants they belong to. This service handles only user authorization, where service-access is for tenant access keys for external api.\n - `/app/service-notification` The microservice performs notification tasks in the entire systems. Right now it supports emailing, but can be extended to support push notification as well as activity feeds.\n - `/app/service-billing` The billing microservice manages billing and payment commands. It is tightly integrated with Stripe, but can be easily replaced.\n - `/app/service-project` This microservice is merely an example of supporting multi-tenant database strategy. It holds no other significance.\n\nThe next important folder is the  `/lib` folder. This folder contains all internal libraries that is depended upon by the microservices, and they are,\n - `/lib/common` House shared/common modules in the project.\n - `/lib/core` This is the core module of ultimate backend and houses most of the codebase that wires everything together.\n - `/lib/repo-orm` This library will be extracted in the future as it matures. It is aimed at being a simple, less cluttered NoSQL multi-tenant object relational mapper (ORM), It supports caching, MongoDB and ArangoDB, with support for FaunaDB in the works.\n - `/lib/contracts` Shared contracts for both typescript typings and graphql code first types, are stored here.\n - `/lib/repository` It holds all repositories used in the microservices, and this repository and created from the repo-rom library.\n - `/lib/proto-schema` All GRPC protobuf files required by each service, is stored in here and shared amongst services that depends on them.\n  \n  Other folders such as `iac` which simply means Infrastructure as Code is teraform setup for creating a kubernetes cluster with just a simple command for running the microservices. `scripts` contains helper bash scripts for CI/CD.\n  \n## Installation  \n  \n```bash  \n$ yarn install\n```  \n  \n## Configuration  \n  \nBefore starting the services, please create the appropriate consul (Default service registry Consul) kv store config for all the services. You can find the example config  \nin the folders of each service called `config.example`. The consul config key of say the `account service` should be  \n`ultimatebackend/config/io.ultimatebackend.srv.account` and just paste the config.yaml content in the consul store for that key in yaml and save.  \nYou will need to set your sendgrid api key, so the backend can send emails on signup etc. If using stripe for payments you'll also need to put your public and private keys there too.  \nYou can opt in for `etcd` or `kubernetes` as `service registry`.  \n  \n## Usage  \n\n### With Docker locally\n```bash\n$ docker-compose --project-directory=. -f docker-compose.dev.yml up --build\n```\n\n\u003e **Note:** I've seen some issues with consul docker image and so would recommend setting up consul manually before running this command\n\u003e \n  \n### Without Docker locally \n  \nConsul, Mongodb, redis, memcached, and eventstore all need to be started first as our microservices need to connect to them.  \n  \nStart consul locally  \n```bash  \nconsul agent --dev  \n```\nFor help installing consul on your local machine, visit [Consul Website](https://consul.io/)\n  \nStart mongodb locally  \n```bash  \nmongod  \n```  \n  \nIf you have docker installed  \n```bash  \ndocker run -d -p 27017:27017 mongo  \ndocker run -d -p 1113:1113 -p 2113:2113 eventstore/eventstore --insecure # insecure flag specifies no certificate required - suitable for devmode \ndocker run -d -p 6379:6379 redis  \n```  \n  \nOtherwise, you can install and run redis and eventstore locally if you choose.  \n  \n### Running the microservices  \nYou should start the microservices in any other. Example  \n  \n```bash\n  \n# Generate protobuf typescript definitions and please fix the path for timestamps import (You should do this only when you update the protobuf files)\n# and also build the proto-scheme lib (You should do this only when you update the protobuf files)\n# in `lib/proto-schem`\n# Also adds configuration(config.example files) to consul K/V registry (consul need to be running)\n# You need jq and yq programs to use it   \n$ yarn setup:local\n  \n# Start the account service  \n$ npx nest start service-account  \n  \n# Start the access service  \n$ npx nest start service-access  \n  \n# Start the role service  \n$ npx nest start service-role  \n  \n# Start the graphql api  \n$ npx nest start api-admin  \n  \n```  \n\u003e **Note:** You don't need all services running plus you can start them in any order.\n  \n### Alternative method of running services  \n  \nIf you find the nest cli using too much memory running each service, you can build them first and then run them:  \n  \nBuild each service:  \n```bash  \nnpx nest build service-account  \nnpx nest build service-notification  \nnpx nest build service-billing  \nnpx nest build service-project  \nnpx nest build service-tenant  \nnpx nest build service-access  \nnpx nest build service-role  \n```  \n  \nEach service is built and written into dist/apps directory from where you can directly run each service with nodejs. Running each service with ```npx nest start``` uses three orders of magnitude more memory than this method so you will use a lot less memory!  \n  \nRun each service in a separate terminal:  \n```bash  \nnode dist/apps/service-account/main.js  \nnode dist/apps/service-notification/main.js  \nnode dist/apps/service-billing/main.js  \nnode dist/apps/service-project/main.js  \nnode dist/apps/service-tenant/main.js  \nnode dist/apps/service-access/main.js  \n```  \n  \nWith the databases and the services running you can now start the gateways as mentioned above.  \n  \n```bash  \nyarn start:dev api-admin  \n```  \n  \n## Get started by registering a user on the admin gateway  \n  \nIn the graphql playground running at http://localhost:4000//graph you can register a user:  \n  \n```graphql  \nmutation register {  \n  account {  \n    register(input:{  \n        firstname: \"Alice\"  \n        lastname: \"Bob\"  \n        email: \"AliceBobsEmail@protonmail.com\"  \n        password: \"supersecretpassword\"  \n    }) {  \n      token  \n    }  \n  }  \n}  \n```  \n  \nAll going well you should have received the following reply as well as an email with a verification code as well as a jwt token that contains both email and verification code for your frontend  \n  \n```  \n{  \n    \"data\": {  \n        \"account\": {  \n            \"register\": {  \n                \"token\": \"gtdjghdrtd65edjhc-chxgfxjtgzrkzxyzxtrs45wi6kydch\"  \n            }  \n        }  \n    }  \n}  \n```  \n  \n## Quick Tips  \n  \n#### Generating dynamic mongo filter GraphQL type.  \nYou can generate dynamic graphql filter by decorating the fields you want to be  \navaiable in your generated filter type with the `@Filterable()` decorator like below  \n  \n  \n```typescript  \nimport { Filterable } from '@ultimatebackend/core';  \n  \n@ObjectType()  \nexport class Tenant extends Node {  \n  \n  @Filterable()  \n  @Field({ nullable: true })  \n  name: string;  \n  \n  @Filterable()  \n  @Field({ nullable: true })  \n  normalizedName: string;  \n}  \n```  \n  \nAfter adding decorator to the fields you can now add generate your graphql input type.\n\u003e **Note:** Enums and sub-types not supported at the moment.\n  \n```typescript  \nimport { FilterMongo } from '@ultimatebackend/contracts';  \n  \n@InputType()  \nexport class TenantFilterInput extends FilterMongo(Tenant, { simple: true }) {}  \n```  \n  \n#### Multi-tenant Database for services.  \nYou can enable multi-tenant database support in your micro-service by adding this\n```typescript\nMongoModule.registerAsync({  \n useClass: MongoMultiTenantConfigService,  \n})\n```\ncode block to the service app module. For example;\n\n```typescript  \nimport { Module } from '@nestjs/common';  \nimport { MongoModule } from '@juicycleff/repo-orm/database';  \nimport { MongoMultiTenantConfigService } from '@ultimatebackend/core/mutiltenancy';  \n  \n@Module({  \n  imports: [\n    // ...\n    MongoModule.registerAsync({  \n      useClass: MongoMultiTenantConfigService,  \n    }),\n    // ...\n  ],  \n})  \nexport class AppModule {}  \n```  \nA good example is the `service-project` microservice.\n\nNext you must enable multi-tenancy in the  `main.ts` file of the `api-admin` service or any other api type microservice you create in your project.  \n  \n```typescript  \nimport { NestFactory } from '@nestjs/core';  \nimport { NestCloud } from '@nestcloud/core';  \nimport { AppModule } from './app.module';  \nimport { enableMultiTenancy, TenantDatabaseStrategy } from '@ultimatebackend/core/mutiltenancy';  \n  \nasync function bootstrap() {  \n  const app = NestCloud.create(await NestFactory.create(AppModule));  \n  \n  app.use(enableMultiTenancy({  \n    enabled: true,  \n    tenantResolver: {  \n      resolverType: 'Header',  \n      headerKeys: {  \n        tenant: 'x-tenant-id',  \n        apiKey: 'x-tenant-key',  \n      },  \n      requiresToken: true,  \n    },  \n    databaseStrategy: TenantDatabaseStrategy.DataIsolation,  \n  }));  \n  \n  // ..... code continues  \n}  \n  \n```  \n  \n#### Access token with scopes  \nAccess tokens scopes just a combination of action and resource identifier. For example, take this mutation;\n```typescript\n  @UseGuards(GqlAuthGuard)\n  @Resource({ name: 'billing', identify: 'billing:card', roles: ['customer'], action: 'update' })\n  @ResolveField(() =\u003e Card)\n  async create(@Args('input') input: CreateCardInput, @Context() ctx: GqlContext): Promise\u003cCard\u003e {\n    // @ts-ignore\n    const result = await this.service.billing.createCard({...input}, setRpcContext(ctx)).toPromise();\n    return result.card;\n  }\n```\nYour access token scope will be `update_billing:card` and so your mutation to create an access token should look like this\n\n```graphql\nmutation {\n  accessToken {\n    create(input: {\n      name: \"my-superb-token\",\n      scopes: [\"update_billing:card\"]\n    }) {\n      token\n      id\n      name\n      active\n    }\n  }\n}\n``` \nThat's all you need to know when creating access token which should be used together with your tenant normalized name to access the API\nwithout a logged in user.\n\n#### More docs updates coming.  \n  \n## Test  \n  \n```bash  \n# unit tests  \n$ yarn run test  \n  \n# e2e tests  \n$ yarn run test:e2e  \n  \n# test coverage  \n$ yarn run test:cov  \n```  \n\n### Financial Contributors\nBecome a financial contributor. Your funds go to; people in need [[Contribute](https://opencollective.com/ultimate-backend/contribute)]\n\n#### Backers\n\n\u003ca href=\"https://opencollective.com/ultimate-backend\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/backer.svg?width=890\"\u003e\u003c/a\u003e\n\n#### Sponsors\n\nSupport this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/ultimate-backend/contribute)]\n\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/0/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/1/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/2/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/3/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/4/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/5/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/6/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/7/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/8/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/9/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/9/avatar.svg\"\u003e\u003c/a\u003e\n\n## My Other Projects  \n  \n  Here are some of my projects, show some love and start them if you find them helpful :)\n  \n - [nestjs-event-store](https://github.com/juicycleff/nestjs-event-store)\n - [casbin-mongodb-adapter](https://github.com/juicycleff/casbin-mongodb-adapter)\n - [nestjs-casbin](https://github.com/juicycleff/nestjs-casbin)\n - [flutter-unity-view-widget](https://github.com/snowballdigital/flutter-unity-view-widget)\n  \n## Special Thanks  \n  \n  This project wouldn't be possible without these two awesome projects,\n  [NestJS (Server Framework)](https://nestjs.com) and [NestCloud](https://nestcloud.org/), please make sure to Star them.\n  \n## License  \n  \n  This project is [MIT licensed](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuicycleff%2Fultimate-backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjuicycleff%2Fultimate-backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuicycleff%2Fultimate-backend/lists"}