{"id":13406815,"url":"https://github.com/graphile/starter","last_synced_at":"2025-05-14T06:13:50.998Z","repository":{"id":36653729,"uuid":"181560785","full_name":"graphile/starter","owner":"graphile","description":"Opinionated SaaS quick-start with pre-built user account and organization system for full-stack application development in React, Node.js, GraphQL and PostgreSQL. Powered by PostGraphile, TypeScript, Apollo Client, Graphile Worker, Graphile Migrate, GraphQL Code Generator, Ant Design and Next.js","archived":false,"fork":false,"pushed_at":"2025-04-24T13:36:00.000Z","size":7887,"stargazers_count":1785,"open_issues_count":28,"forks_count":223,"subscribers_count":37,"default_branch":"main","last_synced_at":"2025-04-24T14:43:27.972Z","etag":null,"topics":["apollo-client","eslint","graphile","graphql","job-queue","node","nodejs","postgraphile","postgresql","saas","saas-boilerplate","starter","typescript"],"latest_commit_sha":null,"homepage":"https://graphile-starter.herokuapp.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/graphile.png","metadata":{"files":{"readme":"README.md","changelog":null,"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,"zenodo":null},"funding":{"github":"Benjie"}},"created_at":"2019-04-15T20:28:31.000Z","updated_at":"2025-04-24T13:36:04.000Z","dependencies_parsed_at":"2024-01-06T07:54:11.604Z","dependency_job_id":"207d8645-8636-438c-a3c5-bd6460938868","html_url":"https://github.com/graphile/starter","commit_stats":{"total_commits":1086,"total_committers":46,"mean_commits":"23.608695652173914","dds":0.1813996316758748,"last_synced_commit":"2b7f47ced5780b5ace0a269c15a7ddbfac0496bb"},"previous_names":[],"tags_count":13,"template":true,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphile%2Fstarter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphile%2Fstarter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphile%2Fstarter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graphile%2Fstarter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/graphile","download_url":"https://codeload.github.com/graphile/starter/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254083733,"owners_count":22011902,"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-client","eslint","graphile","graphql","job-queue","node","nodejs","postgraphile","postgresql","saas","saas-boilerplate","starter","typescript"],"created_at":"2024-07-30T19:02:40.004Z","updated_at":"2025-05-14T06:13:50.965Z","avatar_url":"https://github.com/graphile.png","language":"TypeScript","funding_links":["https://github.com/sponsors/Benjie"],"categories":["TypeScript","typescript","Web Development","Node.js"],"sub_categories":["Node.js"],"readme":"# Graphile Starter\n\n## Take it for a spin!\n\nWe're running the starter at:\n\nhttps://graphile-starter.herokuapp.com\n\nFeel free to register an account and have a poke around as you see fit.\n\n**NOTE**: emails are sent from Graphile Starter, so please only enter email\naddresses you control.\n\n**NOTE**: every time we merge to master, we ship a new version of Graphile\nStarter to Heroku and entirely wipe the database, so your data may not persist.\nIf you wish to delete your data before this time you can do so via the delete\naccount feature baked into the starter.\n\n## NOT FOR BEGINNERS\n\nWe do not advise that you build your own projects on top of this project until\nyou're comfortable with the various tools it uses\n([Node.js](https://nodejs.org/en/docs/),\n[Express](https://expressjs.com/en/api.html),\n[PostgreSQL](https://www.postgresql.org/docs/current/index.html),\n[GraphQL](https://graphql.org/learn/),\n[PostGraphile](https://www.graphile.org/postgraphile/introduction/),\n[Graphile Worker](https://github.com/graphile/worker),\n[Graphile Migrate](https://github.com/graphile/migrate),\n[TypeScript](https://www.typescriptlang.org/docs/),\n[React](https://reactjs.org/docs/getting-started.html),\n[Apollo Client for React](https://www.apollographql.com/docs/react/),\n[GraphQL Code Generator](https://github.com/dotansimha/graphql-code-generator),\n[ESLint](https://eslint.org/),\n[Prettier](https://prettier.io/docs/en/index.html), [Jest](https://jestjs.io/),\n[Cypress](https://www.cypress.io/), etc).\n\nThis is an **advanced** project with deeply integrated tooling across the full\nstack. The project is called \"Starter\" because it helps you to start new\nprojects with all these technologies, tools and techniques already in place. If\nyou're not already familiar with these things then you'll probably find the\nproject overwhelming, it is not intended to be your first experience of any of\nthese tools.\n\nIf you're just getting started with PostGraphile, before you dive into this\nproject make sure you check out the\n[PostGraphile required knowledge](https://www.graphile.org/postgraphile/required-knowledge/)\nand especially the\n[schema design tutorial](https://www.graphile.org/postgraphile/postgresql-schema-design/).\nThis repository takes a slightly different approach to schema design than the\naforementioned tutorial, but it's still an incredibly valuable resource.\n\n## Purpose\n\nGraphile Starter is an opinionated quick-start project for full-stack\napplication development in React, Node.js, GraphQL and PostgreSQL. It includes\nthe foundations of a modern web application, with a full user registration\nsystem, organizations (e.g. teams/companies/etc), session management, optimized\njob queue, a significant amount of pre-configured tooling, tests (both\nend-to-end and more granular) and much more.\n\nIt is suitable for building projects both large and small, with a focus on\nproductivity. You might use it:\n\n- to go from conception to launch of a web app during a hack day\n- as the foundation for client projects at your web agency\n- to build your side-hustle without spending lots of time on boilerplate\n- to build a SaaS project to help fund your open source work 😉\n\nHowever you use it, the project can be deployed to many platforms, and can be\nscaled to larger audiences both horizontally and vertically with very few\nchanges.\n\nPlease note that this software is not \"complete,\" free of software defects, or\nfree of security issues — it is not a \"finished\" solution, but rather the seed\nof a solution which you should review, customize, fix, and develop further.\n\nIt is intended that you use a \"point in time\" version of this software ─ it is\nnot intended that you can merge updates to this software into your own\nderivative in an automated fashion.\n\n\u003c!-- SPONSORS_BEGIN --\u003e\n\n## Crowd-funded open-source software\n\n**PLEASE DONATE.**\n\nTake this software and use it as the starting point to build your project. Go\nmake some money, and [give something back](https://graphile.org/sponsor/) to\nsupport us building more tools and kits for the Node, GraphQL and PostgreSQL\necosystems. We have made this project available under the simple and liberal MIT\nlicense to give you to a huge amount of freedom in how you use it, but this\nisn't possible without the help of our wonderful sponsors.\n\nWe need more people to join our sponsors so we can continue to bring about\nawesome projects like this. We'd love to spend more time on open source,\nbuilding tools that will save you and others even more time and money ─ please\nsponsor our open source efforts:\n\n### [Click here to find out more about sponsors and sponsorship.](https://www.graphile.org/sponsor/)\n\nAnd please give some love to our featured sponsors 🤩:\n\n\u003ctable\u003e\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003ca href=\"https://www.the-guild.dev/\"\u003e\u003cimg src=\"https://graphile.org/images/sponsors/theguild.png\" width=\"90\" height=\"90\" alt=\"The Guild\" /\u003e\u003cbr /\u003eThe Guild\u003c/a\u003e *\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003ca href=\"https://gosteelhead.com/\"\u003e\u003cimg src=\"https://graphile.org/images/sponsors/steelhead.svg\" width=\"90\" height=\"90\" alt=\"Steelhead\" /\u003e\u003cbr /\u003eSteelhead\u003c/a\u003e *\u003c/td\u003e\n\u003c/tr\u003e\u003c/table\u003e\n\n\u003cem\u003e\\* Sponsors the entire Graphile suite\u003c/em\u003e\n\n\u003c!-- SPONSORS_END --\u003e\n\n## Table of contents\n\n- [Graphile Starter](#graphile-starter)\n  - [Take it for a spin!](#take-it-for-a-spin)\n  - [NOT FOR BEGINNERS](#not-for-beginners)\n  - [Purpose](#purpose)\n  - [Crowd-funded open-source software](#crowd-funded-open-source-software)\n    - [Click here to find out more about sponsors and sponsorship.](#click-here-to-find-out-more-about-sponsors-and-sponsorship)\n  - [Table of contents](#table-of-contents)\n  - [Features](#features)\n  - [Variants](#variants)\n  - [Prerequisites](#prerequisites)\n    - [Local development](#local-development)\n    - [Docker development](#docker-development)\n  - [Getting started](#getting-started)\n  - [Running](#running)\n  - [Making it yours](#making-it-yours)\n  - [Docker development](#docker-development-1)\n  - [Building the production docker image](#building-the-production-docker-image)\n  - [Production build for local mode](#production-build-for-local-mode)\n  - [Deploying to Heroku](#deploying-to-heroku)\n  - [Cleanup](#cleanup)\n  - [Custom packages](#custom-packages)\n  - [MIT License](#mit-license)\n\n## Features\n\nGraphile Starter is a full-stack [GraphQL](https://graphql.org/learn/) and\n[React](https://reactjs.org/) project, with server-side rendering (SSR) and\nrouting thanks to [Next.js](https://nextjs.org/). The backend is a beautiful\npairing of Node.js and PostgreSQL running on Express.js, enabled by\n[PostGraphile](https://www.graphile.org/postgraphile/) in library mode. The\nfrontend uses the [AntD](https://ant.design/) design framework to accelerate\ndevelopment. The entire stack is written in TypeScript, with auto-generated\nGraphQL types and operations thanks to\n[graphql-code-generator](https://github.com/dotansimha/graphql-code-generator).\n\nThere are four tenets to Graphile Starter:\n\n- Speedy development\n- Batteries included\n- Type safety\n- Best practices\n\nGraphile Starter is easy to start and everything is pre-configured as much as\npossible.\n\n**Speedy development**: hot reloading, easy debugging, Graphile's\n[idempotent migration system](https://github.com/graphile/migrate),\n[job queue](/TECHNICAL_DECISIONS.md#job-queue) and server middleware ready to\nuse; not to mention deep integration with VSCode should you use that editor:\nplugin recommendations, pre-configured settings, ESLint and Prettier integration\nand debugging profiles\n\n**Batteries included**: full user system and OAuth, AntD design framework, Jest\nand [Cypress end-to-end](/TECHNICAL_DECISIONS.md#cypress-e2e-tests) testing,\nsecurity, email templating and transport, pre-configured linting and code\nformatting, deployment instructions, and more\n\n**Type safety**: pre-configured type checking, strongly typed throughout with\nTypeScript\n\n**Best practices**: React, GraphQL, PostGraphile, Node, Jest and Cypress best\npractices\n\nSee [TECHNICAL_DECISIONS.md](TECHNICAL_DECISIONS.md) for a more detailed list of\nfeatures included and the technical decisions behind them.\n\n## Variants\n\nSince this is a highly opinionated starter; community members may have slightly\ndifferent opinions and may choose to maintain forks of this project that apply\ntheir own opinions. A few of these are listed below; if you maintain a fork of\nthis project please make a note at the top of your own README, and add it to\nthis list:\n\n- [Vue 3 + Vite SSR variant](https://github.com/xvaara/graphile-starter-vite-ssr-vue3-apollo) -\n  replaces Next.js with Vue and Vite SSR\n- [Nuxt.js variant](https://github.com/JoeSchr/graphile-starter) - replaces\n  Next.js for Vue users\n- [Create React App variant](https://github.com/alexk111/graphile-starter-cra) -\n  replaces Next.js for apps without Server Side Rendering\n- [Remix variant](https://github.com/fnimick/graphile-starter-remix-or-sveltekit) -\n  replaces Next.js with Remix\n- [Sveltekit variant](https://github.com/fnimick/graphile-starter-remix-or-sveltekit/tree/sveltekit) -\n  replaces Next.js with Sveltekit\n\n**VARIANTS ARE NOT OFFICIALLY SUPPORTED** and may become out of date or\nunmaintained over time. If you have issues with variants, please submit issues\nor PRs to the projects in question, not to this project.\n\n## Prerequisites\n\nYou can either work with this project locally (directly on your machine) or use\na pre-configured Docker environment. We'll differentiate this in the README with\na table like this one:\n\n| Local mode                      | OR  | Docker mode                              |\n| ------------------------------- | :-: | ---------------------------------------- |\n| _command for local development_ | or  | _command for docker-compose development_ |\n\n**Be careful not to mix and match Docker-mode vs local-mode for development.**\nYou should make a choice and stick to it. (Developing locally but deploying with\n`production.Docker` is absolutely fine.)\n\n**IMPORTANT**: If you choose the Docker mode, be sure to read\n[docker/README.md](docker/README.md).\n\nFor users of Visual Studio Code (VSCode), a `.vscode` folder is included with\neditor settings and debugger settings provided, plus a list of recommended\nextensions. Should you need it, there is also a `.devcontainer` folder which\nenables you to use\n[VSCode's remote containers](https://code.visualstudio.com/docs/remote/containers)\ngiving you a local-like development experience whilst still using docker\ncontainers.\n\n### Local development\n\nRequires:\n\n- Node.js v16+ must be installed\n- PostgreSQL v10+ server must be available\n- `pg_dump` command must be available (or you can remove this functionality)\n- VSCode is recommended, but any editor will do\n\nThis software has been developed under Mac and Linux, and should work in a\n`bash` environment.\n\n**Windows users**: making a project like Graphile Starter run smoothly on\nWindows can be a challenge; `@JoeSchr` and `@hips` on the\n[Graphile Discord](http://discord.gg/graphile) have been working in improving\nthis and they're pretty pleased with the result, but you may still get some\nteething problems. PRs to fix Windows compatibility issues are welcome (please\nkeep them small!) Failing that, try the Docker mode :)\n\n### Docker development\n\nRequires:\n\n- [`docker`](https://docs.docker.com/install/)\n- [`docker-compose`](https://docs.docker.com/compose/install/)\n- Ensure you've allocated Docker **at least** 4GB of RAM; significantly more\n  recommended\n  - (Development only, production is much more efficient)\n\nHas been tested on Windows and Linux (Ubuntu 18.04LTS).\n\n## Getting started\n\nThis project is designed to work with `yarn`. If you don't have `yarn`\ninstalled, you can install it with `npm install -g yarn`. The Docker setup\nalready has `yarn` \u0026 `npm` installed and configured.\n\nTo get started, please run `yarn`, followed by:\n\n| Local mode   | OR  | Docker mode                     |\n| ------------ | :-: | ------------------------------- |\n| `yarn setup` | or  | `export UID; yarn docker setup` |\n\nThis command will lead you through the necessary steps, and create a `.env` file\nfor you containing your secrets.\n\n**NOTE:** `export UID` is really important on Linux Docker hosts, otherwise the\nfiles and folders created by Docker will end up owned by root, which is\nnon-optimal. We recommend adding `export UID` to your `~/.profile` or\n`~/.bashrc` or similar so you don't have to remember it.\n\n**Do not commit `.env` to version control!**\n\n## Running\n\nYou can bring up the stack with:\n\n| Local mode   | OR  | Docker mode                     |\n| ------------ | :-: | ------------------------------- |\n| `yarn start` | or  | `export UID; yarn docker start` |\n\nAfter a short period you should be able to load the application at\nhttp://localhost:5678\n\nThis main command runs a number of tasks:\n\n- uses [`graphile-migrate`](https://github.com/graphile/migrate) to watch\n  the`migrations/current.sql` file for changes, and automatically runs it\n  against your database when it changes\n- watches the TypeScript source code of the server, and compiles it from\n  `@app/*/src` to `@app/*/dist` so node/`graphile-worker`/etc. can run the\n  compiled code directly\n- runs the node server (includes PostGraphile and Next.js middleware)\n- runs `graphile-worker` to execute your tasks (e.g. sending emails)\n- watches your GraphQL files and your PostGraphile schema for changes and\n  generates your TypeScript React hooks for you automatically, leading to\n  strongly typed code with minimal effort\n- runs the `jest` tests in watch mode, automatically re-running as the database\n  or test files change\n\n**NOTE**: `docker-compose up server` also runs the PostgreSQL server that the\nsystem connects to.\n\nYou may also choose to develop locally, but use the PostgreSQL server via\n`docker-compose up -d db`.\n\nThen for development you may need a console; you can open one with:\n\n| Local mode | OR  | Docker mode                    |\n| ---------- | :-: | ------------------------------ |\n| `bash`     | or  | `export UID; yarn docker bash` |\n\nTo shut everything down:\n\n| Local mode | OR  | Docker mode                    |\n| ---------- | :-: | ------------------------------ |\n| Ctrl-c     | or  | `export UID; yarn docker down` |\n\n## Making it yours\n\n1. Download and extract a zip of\n   [the latest release from GitHub](https://github.com/graphile/starter/releases)\n1. In that folder run:\n   - `git init`\n   - `git add .`\n   - `git commit -m \"Graphile Starter base\"`\n1. Change the project name in `package.json`\n1. Change the project settings in `@app/config/src/index.ts`\n1. Replace the `README.md` file\n1. Add your own copyright notices to the `LICENSE.md` file\n1. Commit as you usually would\n1. [Show your appreciation with sponsorship](https://www.graphile.org/sponsor/)\n\n## Docker development\n\nBe sure to read [docker/README.md](docker/README.md).\n\n## Building the production docker image\n\nTo build the production image, use `docker build` as shown below. You should\nsupply the `ROOT_URL` build variable (which will be baked into the client code,\nso cannot be changed as envvars); if you don't then the defaults will apply\n(which likely will not be suitable).\n\nTo build the worker, pass `TARGET=\"worker\"` instead of the default\n`TARGET=\"server\"`.\n\n```sh\ndocker build \\\n  --file production.Dockerfile \\\n  --build-arg ROOT_URL=\"http://localhost:5678\" \\\n  --build-arg TARGET=\"server\" \\\n  .\n```\n\nWhen you run the image you must pass it the relevant environmental variables,\nfor example:\n\n```sh\ndocker run --rm -it --init -p 5678:5678 \\\n  -e GRAPHILE_LICENSE=\"$GRAPHILE_LICENSE\" \\\n  -e SECRET=\"$SECRET\" \\\n  -e JWT_SECRET=\"$JWT_SECRET\" \\\n  -e DATABASE_VISITOR=\"$DATABASE_VISITOR\" \\\n  -e DATABASE_URL=\"$DATABASE_URL\" \\\n  -e AUTH_DATABASE_URL=\"$AUTH_DATABASE_URL\" \\\n  -e GITHUB_KEY=\"$GITHUB_KEY\" \\\n  -e GITHUB_SECRET=\"$GITHUB_SECRET\" \\\n  docker-image-id-here\n```\n\nCurrently if you miss required envvars weird things will happen; we don't\ncurrently have environment validation (PRs welcome!).\n\nNote: If you are using the `production.Dockerfile` to run graphile/starter in a\nDocker container on eg. Kubernetes, AWS ECS, DigitalOcean App Platform (or\nsimilar) and you are trying to connect to Amazon RDS or DigitalOcean databases\n(or probably other managed databases), make sure to replace\n`/data/amazon-rds-ca-cert.pem` with the CA certificate of your own database.\nThis file is copied into your Docker image during build time and can therefore\nbe referenced in your env variables `DATABASE_URL` and `AUTH_DATABASE_URL`:  \n`DATABASE_URL=\"postgres://name:password@host:port/dbname?ssl=true\u0026sslrootcert=/app/data/amazon-rds-ca-cert.pem\"`\n\n## Production build for local mode\n\nUse `yarn run build` to generate a production build of the project\n\n## Deploying to Heroku\n\nPrerequisites:\n\n- Install the Heroku CLI: https://devcenter.heroku.com/articles/heroku-cli\n\nIf you are using `graphile-migrate` make sure that you have executed\n`graphile-migrate commit` to commit all your database changes, since we only run\ncommitted migrations in production.\n\nMake sure you have customized `@app/config/src/index.ts`.\n\nMake sure everything is committed and pushed in git.\n\nSet up a database server; we recommend using Amazon RDS.\n\nOnce your database server is running, you can use our `heroku-setup` script to\nautomate the setup process. This script does the following:\n\n- Creates the Heroku app\n- Adds the redis extension to this Heroku app\n- Creates the database in the database server\n- Creates the relevant roles, generating random passwords for them\n- Installs some common database extensions\n- Sets the Heroku config variables\n- Adds the Heroku app as a git remote named 'Heroku'\n- Pushes the 'master' branch to Heroku to perform your initial build\n\nCreate a copy of `heroku-setup.template` and rename the copy to `heroku-setup`,\nthen edit it and customize the settings at the top. We also recommend reading\nthrough the script and customizing it as you see fit - particularly if you are\nusing additional extensions that need installing.\n\nNow run the script:\n\n```\nbash heroku-setup\n```\n\nHopefully all has gone well. If not, step through the remaining tasks in the\nHeroku-setup script and fix each task as you go. We've designed the script so\nthat if your superuser credentials are wrong, or the Heroku app already exists,\nyou can just edit the settings and try again. All other errors will probably\nneed manual intervention. Verbosity is high so you can track exactly what\nhappened.\n\nThe server should be up and running now (be sure to access it over HTTPS\notherwise you will not be able to run GraphQL queries), but it is not yet\ncapable of sending emails. To achieve this, you must configure an email\ntransport. We have pre-configured support for Amazon SES. Once SES is set up,\nyour domain is verified, and you've verified any emails you wish to send email\nto (or have had your sending limits removed), make sure that the `fromEmail` in\n`@app/config/src/index.ts` is correct, and then create an IAM role for your\nPostGraphile server. Here's an IAM template for sending emails - this is the\nonly permission required for our IAM role currently, but you may wish to add\nothers later.\n\n```\n{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Effect\": \"Allow\",\n            \"Action\": \"ses:SendRawEmail\",\n            \"Resource\": \"*\"\n        }\n    ]\n}\n```\n\nGenerate an Access Key for this IAM role, and then tell Heroku the access key id\nand secret:\n\n```\nheroku config:set AWS_ACCESS_KEY_ID=\"...\" AWS_SECRET_ACCESS_KEY=\"...\" -a $APP_NAME\n```\n\nNow you can tell Heroku to run the worker process as well as the currently\nrunning 'web' process:\n\n```\nheroku ps:scale worker=1 -a $APP_NAME\n```\n\nWhen you register an account on the server you should receive a verification\nemail containing a clickable link. When you click the link your email will be\nverified and thanks to GraphQL subscriptions the previous tab should be updated\nto reflect that your account is now verified.\n\nYou can also configure your application for social login. This works the same as\nin development except the callback URL will be different, something like\n`https://MY_HEROKU_APP_NAME.herokuapp.com/auth/github/callback`. Set the GitHub\nOAuth secrets on your Heroku app to trigger a restart and enable social login:\n\n```\nheroku config:set GITHUB_KEY=\"...\" GITHUB_SECRET=\"...\" -a $APP_NAME\n```\n\n## Cleanup\n\nTo delete the Heroku app:\n\n```\nheroku apps:destroy -a $APP_NAME\n```\n\nTo delete the database/roles (replace `dbname` with your database name):\n\n```\ndrop database dbname;\ndrop role dbname_visitor;\ndrop role dbname_authenticator;\ndrop role dbname;\n```\n\n## Custom packages\n\nWhen running `yarn setup`, this command will also invoke\n`yarn workspaces foreach run setup`. This allows you to add custom setup hooks\nnecessary for your individual packages.\n\nAdd a line like the following to your `scripts` section in your `package.json`:\n\n`\"setup\": \"npm i -g some-package\"`\n\n## MIT License\n\nThis is open source software; you may use, modify and distribute it under the\nterms of the MIT License, see\n[GRAPHILE_STARTER_LICENSE.md](./GRAPHILE_STARTER_LICENSE.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraphile%2Fstarter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgraphile%2Fstarter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraphile%2Fstarter/lists"}