{"id":29763943,"url":"https://github.com/karmasakshi/jet","last_synced_at":"2026-01-30T23:21:19.704Z","repository":{"id":305759839,"uuid":"799878839","full_name":"karmasakshi/jet","owner":"karmasakshi","description":"Angular starter-kit for building quality web apps fast. Now with Supabase.","archived":false,"fork":false,"pushed_at":"2026-01-29T18:59:33.000Z","size":7217,"stargazers_count":69,"open_issues_count":11,"forks_count":8,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-30T04:55:42.126Z","etag":null,"topics":["angular","boilerplate","javascript","material","progressive-web-app","pwa","single-page-app","spa","starter","starter-kit","starter-template","supabase","template","typescript"],"latest_commit_sha":null,"homepage":"https://jet-tau.vercel.app","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/karmasakshi.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"karmasakshi","buy_me_a_coffee":"karmasakshi"}},"created_at":"2024-05-13T09:24:29.000Z","updated_at":"2026-01-29T18:59:37.000Z","dependencies_parsed_at":"2025-07-21T22:26:46.606Z","dependency_job_id":"a868c734-e5ec-4cdb-a074-1c5403d9286b","html_url":"https://github.com/karmasakshi/jet","commit_stats":null,"previous_names":["karmasakshi/jet"],"tags_count":105,"template":true,"template_full_name":null,"purl":"pkg:github/karmasakshi/jet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karmasakshi%2Fjet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karmasakshi%2Fjet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karmasakshi%2Fjet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karmasakshi%2Fjet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/karmasakshi","download_url":"https://codeload.github.com/karmasakshi/jet/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karmasakshi%2Fjet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28922787,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-30T22:32:35.345Z","status":"ssl_error","status_checked_at":"2026-01-30T22:32:31.927Z","response_time":66,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["angular","boilerplate","javascript","material","progressive-web-app","pwa","single-page-app","spa","starter","starter-kit","starter-template","supabase","template","typescript"],"created_at":"2025-07-26T23:00:45.329Z","updated_at":"2026-01-30T23:21:19.699Z","avatar_url":"https://github.com/karmasakshi.png","language":"TypeScript","funding_links":["https://github.com/sponsors/karmasakshi","https://buymeacoffee.com/karmasakshi"],"categories":["Recently Updated","Site Templates"],"sub_categories":["[Jul 26, 2025](/content/2025/07/26/README.md)","Free Templates"],"readme":"# Jet\n\nAngular starter-kit for building quality web apps fast. Now with Supabase.\n\n\u003cbr /\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg\n    alt=\"Logo\"\n    src=\"./public/images/logo.svg\"\n    width=\"64\"\n  /\u003e\n\u003c/p\u003e\n\n\u003cbr /\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://opensource.org/license/mit\"\u003e\u003cimg alt=\"GitHub License\" src=\"https://img.shields.io/github/license/karmasakshi/jet?color=brightgreen\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://developer.mozilla.org/en-US/observatory/analyze?host=jet-tau.vercel.app\"\u003e\u003cimg alt=\"Mozilla HTTP Observatory Grade\" src=\"https://img.shields.io/mozilla-observatory/grade/jet-tau.vercel.app?color=brightgreen\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/karmasakshi/jet/commits/main\"\u003e\u003cimg alt=\"GitHub commit activity\" src=\"https://img.shields.io/github/commit-activity/t/karmasakshi/jet?color=brightgreen\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/karmasakshi/jet/commits/main\"\u003e\u003cimg alt=\"GitHub last commit\" src=\"https://img.shields.io/github/last-commit/karmasakshi/jet?color=brightgreen\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/karmasakshi/jet/pulls\"\u003e\u003cimg alt=\"Static Badge\" src=\"https://img.shields.io/badge/prs-welcome-brightgreen\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/karmasakshi/jet/releases\"\u003e\u003cimg alt=\"GitHub Release\" src=\"https://img.shields.io/github/v/release/karmasakshi/jet?color=blue\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/angular/angular/releases\"\u003e\u003cimg alt=\"GitHub package.json prod dependency version\" src=\"https://img.shields.io/github/package-json/dependency-version/karmasakshi/jet/%40angular%2Fcore?color=blue\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/angular/components/releases\"\u003e\u003cimg alt=\"GitHub package.json prod dependency version\" src=\"https://img.shields.io/github/package-json/dependency-version/karmasakshi/jet/%40angular%2Fmaterial?color=blue\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/supabase/supabase-js/releases\"\u003e\u003cimg alt=\"GitHub package.json prod dependency version\" src=\"https://img.shields.io/github/package-json/dependency-version/karmasakshi/jet/%40supabase%2Fsupabase-js?color=blue\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fgithub.com%2Fkarmasakshi%2Fjet\u0026countColor=white\u0026style=plastic\"\u003e\n  \u003ca href=\"https://x.com/jetprojectdev\"\u003e\u003cimg alt=\"X (formerly Twitter) Follow\" src=\"https://img.shields.io/twitter/follow/jetprojectdev?style=plastic\u0026logo=X\u0026label=%40jetprojectdev\u0026color=white\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.dev/karmasakshi/jet\"\u003e\u003cimg alt=\"Static Badge\" src=\"https://img.shields.io/badge/click%20to-code-6e4b3a?style=plastic\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\n## Highlights\n\n- 🆕 **Modern Angular**: Uses Signals, new template syntax, Zoneless, Standalone, lazy-loaded routes, and more.\n- 📲 **PWA-ready**: Has safe-area styles for native-like edge-to-edge content in both portrait and landscape. Has background updating and offline support via [@angular/service-worker](https://angular.dev/ecosystem/service-workers).\n- 🎨 **Customizable**: Support for light/dark/automatic color schemes. Theme generation via [Angular Material](https://material.angular.dev/guide/theming#custom-color-palettes). Support for multiple languages and language tools via [Transloco](https://jsverse.gitbook.io/transloco). Custom fonts per language, RTL support, and more.\n- 🌿 **Pre-built features**: Production-ready, responsive components for authentication and profile management. Authentication, profile management and RBAC flows integrated with [Supabase](https://supabase.com/docs/guides/auth). Easily set up your own back-end using migrations and swap out Supabase.\n- 🚂 **Services**: Production-ready services for managing alerts, analytics, PWA updates, progress bar, browser storage, and more.\n- 🚀 **Performant**: Modular and tree-shakeable. 80+ on [PageSpeed Insights](https://pagespeed.web.dev/).\n- 🔒 **Secure**: Locked-down CSP and other security headers. 80+ on [Mozilla Observatory](https://developer.mozilla.org/en-US/observatory).\n- 📏 **Strict linting and formatting**: Strict configurations for ESLint, Prettier and TypeScript.\n- 🎁 **Release management**: Commit linting via [@commitlint/\\*](https://github.com/conventional-changelog/commitlint). Automatic versioning and changelog generation via [Release Please](https://github.com/marketplace/actions/release-please-action).\n- 🌻 **Environment support**: Easily configure environments via [@ngx-env/builder](https://github.com/chihab/dotenv-run/tree/main/packages/angular) and injection tokens.\n- 🗻 **Always updated**: Actively maintained and regularly built from the ground-up. [See 1000+ commits](https://github.com/karmasakshi/jet/commits/main/).\n\n\u003cbr /\u003e\n\n[![Star History Chart](https://api.star-history.com/svg?repos=karmasakshi/jet\u0026type=Date)](https://www.star-history.com/#karmasakshi/jet\u0026Date)\n\n\u003cbr /\u003e\n\n## Demo\n\n\u003ca href=\"https://jet-tau.vercel.app\"\u003e\u003cimg alt=\"Static Badge\" src=\"https://img.shields.io/badge/click%20to-open-6e4b3a?style=plastic\"\u003e\u003c/a\u003e\n\n## Get started in 30 seconds\n\n\u003ca href=\"https://github.com/new?template_name=jet\u0026template_owner=karmasakshi\"\u003e\u003cimg alt=\"Static Badge\" src=\"https://img.shields.io/badge/click%20to-use-6e4b3a?style=plastic\"\u003e\u003c/a\u003e\n\n- Click the button above, create your repository, then clone it\n- Create a copy of `.env.example` and name it `.env`\n- Delete `./.github/FUNDING.yml`\n- Delete `./CHANGELOG.md`; a fresh one will be created on first release\n- Delete `./LICENSE` and the `license` property in `./package.json` and `./package-lock.json`\n- Reset the `version` property in both `./package.json` and `./package-lock.json` to `0.0.0`\n- Run `npm install`; this will also enable [Husky](https://typicode.github.io/husky/)\n- Find and replace `https://jet-tau.vercel.app` with the base URL of your app\n- Run `ng serve` and start building!\n\nNice to do:\n\n- Set namespace name in [StorageService](./src/app/services/storage/storage.service.ts) and `project_id` in `./supabase/config.toml` to something unique to your app\n- Update `./README.md` (this file)\n\n## Contents\n\n- [Features](#features)\n  - [Components](#components)\n  - [Constants](#constants)\n  - [Directives](#directives)\n  - [Enums](#enums)\n  - [Guards](#guards)\n  - [Injection Tokens](#injection-tokens)\n  - [Interceptors](#interceptors)\n  - [Services](#services)\n  - [GitHub Actions](#github-actions)\n  - [GitHub Issue Templates](#github-issue-templates)\n- [Guides](#guides)\n  - [Add elements](#add-elements)\n    - [Add a component](#add-a-component)\n    - [Add a page component](#add-a-page-component)\n    - [Add a service](#add-a-service)\n  - [Manage code](#manage-code)\n    - [Format code](#format-code)\n    - [Lint code](#lint-code)\n    - [Test code](#test-code)\n    - [Commit code](#commit-code)\n    - [Update commit scopes](#update-commit-scopes)\n    - [Update precommit tasks](#update-precommit-tasks)\n  - [Manage icons](#manage-icons)\n  - [Manage styles](#manage-styles)\n    - [Add styles](#add-styles)\n    - [Generate a Material theme](#generate-a-material-theme)\n    - [Override Material styles](#override-material-styles)\n  - [Manage i18n](#manage-i18n)\n    - [Add a language](#add-a-language)\n    - [Change the default language](#change-the-default-language)\n    - [Remove a language](#remove-a-language)\n  - [Manage environments](#manage-environments)\n    - [Add an environment](#add-an-environment)\n    - [Add an environment variable](#add-an-environment-variable)\n  - [Manage releases](#manage-releases)\n    - [Set up Release Please](#set-up-release-please)\n    - [Cut a release](#cut-a-release)\n    - [Cut a major release](#cut-a-major-release)\n  - [Deploy](#deploy)\n    - [Vercel](#vercel)\n  - [Supabase](#supabase)\n    - [Cheat sheet](#cheat-sheet)\n    - [Set up Supabase](#set-up-supabase)\n    - [Link a Supabase project](#link-a-supabase-project)\n    - [Run Supabase locally](#run-supabase-locally)\n    - [Remove RBAC](#remove-rbac)\n    - [Remove Supabase](#remove-supabase)\n  - [Squeeze out more performance](#squeeze-out-more-performance)\n- [License](#license)\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n## Features\n\n### Components\n\n- [AppComponent](./src/app/components/app/app.component.ts)\n- [FooterComponent](./src/app/components/footer/footer.component.ts)\n- [HomePageComponent](./src/app/components/home-page/home-page.component.ts)\n- [MessagePageComponent](./src/app/components/message-page/message-page.component.ts)\n- [PageComponent](./src/app/components/page/page.component.ts)\n- [ProfilePageComponent](./src/app/components/profile-page/profile-page.component.ts)\n- [ResetPasswordPageComponent](./src/app/components/reset-password-page/reset-password-page.component.ts)\n- [SettingsPageComponent](./src/app/components/settings-page/settings-page.component.ts)\n- [SidenavComponent](./src/app/components/sidenav/sidenav.component.ts)\n- [SignInPageComponent](./src/app/components/sign-in-page/sign-in-page.component.ts)\n- [SignOutPageComponent](./src/app/components/sign-out-page/sign-out-page.component.ts)\n- [SignUpPageComponent](./src/app/components/sign-up-page/sign-up-page.component.ts)\n- [ToolbarComponent](./src/app/components/toolbar/toolbar.component.ts)\n- [UpdatePasswordPageComponent](./src/app/components/update-password-page/update-password-page.component.ts)\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Constants\n\n- [AVATAR_FILE_MAX_SIZE_MB](./src/app/constants/avatar-file-max-size-mb.constant.ts)\n- [COLOR_SCHEME_OPTIONS](./src/app/constants/color-scheme-options.constant.ts)\n- [DEFAULT_COLOR_SCHEME_OPTION](./src/app/constants/default-color-scheme-option.constant.ts)\n- [DEFAULT_LANGUAGE_OPTION](./src/app/constants/default-language-option.constant.ts)\n- [DEFAULT_SETTINGS](./src/app/constants/default-settings.constant.ts)\n- [LANGUAGE_OPTIONS](./src/app/constants/language-options.constant.ts)\n- [NAVIGATION_MENU_ITEMS](./src/app/constants/navigation-menu-items.constant.ts)\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Directives\n\n- [AnalyticsDirective](./src/app/directives/analytics/analytics.directive.ts)\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Enums\n\n- [AppRole](./src/app/enums/app-role.enum.ts)\n- [LocalStorageKey](./src/app/enums/local-storage-key.enum.ts)\n- [QueryParam](./src/app/enums/query-param.enum.ts)\n- [SessionStorageKey](./src/app/enums/session-storage-key.enum.ts)\n- [SupabaseBucket](./src/app/enums/supabase-bucket.enum.ts)\n- [SupabaseEdgeFunction](./src/app/enums/supabase-edge-function.enum.ts)\n- [SupabaseRpcFunction](./src/app/enums/supabase-rpc-function.enum.ts)\n- [SupabaseTable](./src/app/enums/supabase-table.enum.ts)\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Guards\n\n- [signedInGuard](./src/app/guards/signed-in/signed-in.guard.ts)\n- [signedOutGuard](./src/app/guards/signed-out/signed-out.guard.ts)\n- [unsavedChangesGuard](./src/app/guards/unsaved-changes/unsaved-changes.guard.ts)\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Injection Tokens\n\n- [GOOGLE_ANALYTICS_MEASUREMENT_ID](./src/app/injection-tokens/google-analytics-measurement-id.injection-token.ts)\n- [IS_ANALYTICS_ENABLED](./src/app/injection-tokens/is-analytics-enabled.injection-token.ts)\n- [IS_LOGGING_ENABLED](./src/app/injection-tokens/is-logging-enabled.injection-token.ts)\n- [SUPABASE_CLIENT](./src/app/injection-tokens/supabase-client.injection-token.ts)\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Interceptors\n\n- [progressBarInterceptor](./src/app/interceptors/progress-bar/progress-bar.interceptor.ts)\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Services\n\n- [AlertService](./src/app/services/alert/alert.service.ts)\n- [AnalyticsService](./src/app/services/analytics/analytics.service.ts)\n- [LoggerService](./src/app/services/logger/logger.service.ts)\n- [ProfileService](./src/app/services/profile/profile.service.ts)\n- [ProgressBarService](./src/app/services/progress-bar/progress-bar.service.ts)\n- [ServiceWorkerService](./src/app/services/service-worker/service-worker.service.ts)\n- [SettingsService](./src/app/services/settings/settings.service.ts)\n- [StorageService](./src/app/services/storage/storage.service.ts)\n- [ToolbarTitleService](./src/app/services/toolbar-title/toolbar-title.service.ts)\n- [UserService](./src/app/services/user/user.service.ts)\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### GitHub Actions\n\n- [deploy-supabase-functions](./.github/workflows/deploy-supabase-functions.yml)\n- [release-please](./.github/workflows/release-please.yml)\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### GitHub Issue Templates\n\n- [Bug](./.github/ISSUE_TEMPLATE/bug.md)\n- [Documentation](./.github/ISSUE_TEMPLATE/documentation.md)\n- [Enhancement](./.github/ISSUE_TEMPLATE/enhancement.md)\n\n## Guides\n\nIf you need help with something not listed here, [create a new issue](https://github.com/karmasakshi/jet/issues).\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Add elements\n\nUse [ng g](https://angular.dev/cli/generate) as you would in any other Angular project.\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Add a component\n\n- Run `ng g c components/\u003ccomponent-name\u003e`\n- In the `@Component()` decorator:\n  - Set `changeDetection: ChangeDetectionStrategy.OnPush`\n  - Set `imports: [TranslocoModule]`\n- In the class:\n  - Set `readonly #loggerService = inject(LoggerService);`\n  - As a convention, at the end of the constructor, set `this.#loggerService.logComponentInitialization('\u003cClassName\u003e');`\n- As a convention, add the component selector as a key in [en.json](./public/i18n/en.json) and other translation files\n- Update spec\n\nIn the template, wrap the contents in:\n\n```html\n\u003cng-container *transloco=\"let t\"\u003e ... \u003c/ng-container\u003e\n```\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Add a page component\n\n- Run `ng g c components/\u003ccomponent-name\u003e`\n- In the `@Component()` decorator:\n  - Set `changeDetection: ChangeDetectionStrategy.OnPush`\n  - Set `imports: [TranslocoModule, PageComponent]`\n- In the class:\n  - Set `readonly #loggerService = inject(LoggerService);`\n  - As a convention, at the end of the constructor, set `this.#loggerService.logComponentInitialization('\u003cClassName\u003e');`\n- As a convention, add the component selector as a key in [en.json](./public/i18n/en.json) and other translation files\n- Update spec\n- Add a route to it in [app.routes.ts](./src/app/app.routes.ts)\n- Update [sitemap-main.xml](./public/sitemaps/sitemap-main.xml)\n- If required, add an icon and navigation link to it in [NAVIGATION_MENU_ITEMS](./src/app/constants/navigation-menu-items.constant.ts)\n\nIn the template, wrap the contents in:\n\n```html\n\u003cng-container *transloco=\"let t\"\u003e\n  \u003cjet-page\n    [seoDescription]=\"t('\u003ccomponent-selector\u003e.seo.description')\"\n    [seoKeywords]=\"t('\u003ccomponent-selector\u003e.seo.keywords')\"\n    [seoTitle]=\"t('\u003ccomponent-selector\u003e.seo.title')\"\n    [toolbarTitle]=\"t('\u003ccomponent-selector\u003e.toolbar-title')\"\n  \u003e\n    ...\n  \u003c/jet-page\u003e\n\u003c/ng-container\u003e\n```\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Add a service\n\n- Run `ng g s services/\u003cservice-name\u003e/\u003cservice-name\u003e`\n- In the class:\n  - Set `readonly #loggerService = inject(LoggerService);`\n  - As a convention, at the end of the constructor, set `this.#loggerService.logServiceInitialization('\u003cClassName\u003e');`\n- Add mock\n- Update spec\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Manage code\n\nWhen enabled, [Husky](https://typicode.github.io/husky/) prevents pushing code that fails linting or building.\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Format code\n\nRun `npm run format-staged` to format staged files. This runs automatically before every commit via [Husky](https://typicode.github.io/husky/) and [Lint Staged](https://github.com/lint-staged/lint-staged).\n\nRun `npm run format` to format all files.\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Lint code\n\nRun `ng lint`. This runs automatically before every commit via [Husky](https://typicode.github.io/husky/) and ESLint.\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Test code\n\nRun `ng test`.\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Commit code\n\nRun `npm run commit`, or commit directly with a valid commit message.\n\nCommit messages that don't follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) will be blocked by [Husky](https://typicode.github.io/husky/) and [Commitlint](https://commitlint.js.org/).\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Update commit scopes\n\nIn [.commitlintrc.json](./.commitlintrc.json), update `\"scope-enum\": [2, \"always\", [\"general\", \"main\", \"\u003cyour-scope-1\u003e\", ..., \"\u003cyour-scope-n\u003e\"]]`.\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Update precommit tasks\n\nUpdate [pre-commit](./.husky/pre-commit). As a good practice, ensure every task is defined [package.json](./package.json) and can be run independently.\n\nMore tasks mean longer commit times.\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Update dependencies\n\nRun `npm run reinstall-dependencies`. It runs the following subscripts to remove all dependencies, then install their latest versions: `x:uninstall-devDependencies`, `x:uninstall-dependencies`, `x:install-dependencies`, `x:install-devDependencies`. You shouldn't have to run these subscripts yourself.\n\nFor this to work, ensure the subscripts are updated every time a dependency is added or removed.\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Manage icons\n\nJet uses [Material Symbols](https://fonts.google.com/icons?icon.style=Rounded) for icons. Instead of downloading the entire font, each icon is explicitly specified in [index.html](./src/index.html). To add or remove icons, update the icon names **alphabetically** in the `\u003clink\u003e` element (read more about this requirement [here](https://developers.google.com/fonts/docs/material_symbols#optimize_the_icon_font)).\n\nCustom SVG icons can be loaded in `_setIcons()` in [AppComponent](./src/app/components/app/app.component.ts).\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Manage styles\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Add styles\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Generate a Material theme\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Override Material styles\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Manage i18n\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Add a language\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Change the default language\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Remove a language\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Manage environments\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Add an environment\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Add an environment variable\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Manage releases\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Set up Release Please\n\n- Generate a [Personal Access Token](https://github.com/settings/personal-access-tokens) token with no expiry\n- Save it to Actions \u003e Secrets as `RELEASE_PLEASE_TOKEN`\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Cut a release\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Cut a major release\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Deploy\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Vercel\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Supabase\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Cheat sheet\n\n- `npx supabase status`\n- `npx supabase start`\n- `npx supabase stop`\n- `npx supabase functions new \u003cfunction-name\u003e`\n- `npx supabase functions serve`\n- `npx supabase migrations new`\n- `npx supabase db reset`\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Set up Supabase\n\n- Set `project_id` in [config.toml](./supabase/config.toml) to something unique to the project\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Link a Supabase project\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Run Supabase locally\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Remove RBAC\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n#### Remove Supabase\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n### Squeeze out more performance\n\n\u003cbr /\u003e\n\n[↑ Back to Contents](#contents)\n\n## License\n\nThis project is licensed under the MIT License. See [LICENSE](./LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarmasakshi%2Fjet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkarmasakshi%2Fjet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarmasakshi%2Fjet/lists"}