diff --git a/README.md b/README.md
index ac03e2988..3300999b8 100755
--- a/README.md
+++ b/README.md
@@ -48,47 +48,50 @@
- [Star History](#star-history)
- [Contributors](#contributors)
-## Intro
+## Intro
-This boilerplate is made for creating chrome extensions using React and Typescript.
-> The focus was on improving the build speed and development experience with Vite(Rollup) & Turborepo.
+This boilerplate helps you create Chrome/Firefox extensions using React and Typescript. It improves
+the build speed and development experience by using Vite and Turborepo.
-## Features
+## Features
- [React18](https://reactjs.org/)
- [TypeScript](https://www.typescriptlang.org/)
- [Tailwindcss](https://tailwindcss.com/)
-- [Vite](https://vitejs.dev/)
+- [Vite](https://vitejs.dev/) (and [Rollup](https://rollupjs.org/))
- [Turborepo](https://turbo.build/repo)
- [Prettier](https://prettier.io/)
- [ESLint](https://eslint.org/)
-- [Chrome Extension Manifest Version 3](https://developer.chrome.com/docs/extensions/mv3/intro/)
-- [Custom I18n Package](/packages/i18n/)
-- [Custom HMR(Hot Module Rebuild) Plugin](/packages/hmr/)
-- [End to End Testing with WebdriverIO](https://webdriver.io/)
+- [Chrome Extensions Manifest Version 3](https://developer.chrome.com/docs/extensions/mv3/intro/)
+- [Custom i18n package](/packages/i18n/)
+- [Custom HMR (Hot Module Rebuild) plugin](/packages/hmr/)
+- [End-to-end testing with WebdriverIO](https://webdriver.io/)
-## Getting started:
+## Getting started
1. When you're using Windows run this:
- `git config --global core.eol lf`
- `git config --global core.autocrlf input`
- #### This will change eol(End of line) to the same as on Linux/Mac, without this, you will have conflicts with your teammates with those systems and our bash script won't work
+
+ **This will set the EOL (End of line) character to be the same as on Linux/macOS. Without this, our bash script won't work, and you will have conflicts with developers on Linux/macOS.**
2. Clone this repository.
-3. Change `extensionDescription` and `extensionName` in `messages.json` file in `packages/i18n/locales` folder.
-4. Install pnpm globally: `npm install -g pnpm` (check your node version >= 18.19.1))
-5. Run `pnpm install`
+3. Edit `/packages/i18n/locales/`{your locale(s)}/`messages.json`
+4. In the objects `extensionDescription` and `extensionName`, change the `message` fields (leave `description` alone)
+5. In `/.package.json`, change the `version` to the desired version of your extension.
+6. Install pnpm globally: `npm install -g pnpm` (check your node version >= 18.19.1))
+7. Run `pnpm install`
-### And then, depending on needs:
+Then, depending on the target browser:
### For Chrome:
1. Run:
- - Dev: `pnpm dev` (On windows, you should run as administrator. [(Issue#456)](https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/issues/456)
+ - Dev: `pnpm dev` (on Windows, you should run as administrator; see [issue#456](https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/issues/456))
- Prod: `pnpm build`
2. Open in browser - `chrome://extensions`
-3. Check - `Developer mode`
-4. Find and Click - `Load unpacked extension`
-5. Select - `dist` folder at root
+3. Check - Developer mode
+4. Click - Load unpacked in the upper left corner
+5. Select the `dist` directory from the boilerplate project
### For Firefox:
@@ -96,14 +99,11 @@ This boilerplate is made for creating chrome extensions using React and Typescri
- Dev: `pnpm dev:firefox`
- Prod: `pnpm build:firefox`
2. Open in browser - `about:debugging#/runtime/this-firefox`
-3. Find and Click - `Load Temporary Add-on...`
-4. Select - `manifest.json` from `dist` folder at root
-
-
-Remember in firefox you add plugin in temporary mode, that's mean it'll disappear after each browser close.
+3. Click - Load Temporary Add-on... in the upper right corner
+4. Select the `./dist/manifest.json` file from the boilerplate project
-You have to do it on every browser launch.
-
+> [!NOTE]
+> In Firefox, you load add-ons in temporary mode. That means they'll disappear after each browser close. You have to load the add-on on every browser launch.
## Install dependency for turborepo:
@@ -118,12 +118,16 @@ You have to do it on every browser launch.
`package` - Name of the package you want to install e.g. `nodemon` \
`module-name` - You can find it inside each `package.json` under the key `name`, e.g. `@extension/content-script`, you can use only `content-script` without `@extension/` prefix
-## Env Variables
+## Environment variables
-1. Copy `.example.env` and paste it as `.env` in the same path
-2. Add a new record inside `.env`
-3. Add this key with type for value to `vite-env.d.ts` (root) to `ImportMetaEnv`
-4. Then you can use it with `import.meta.env.{YOUR_KEY}` like with standard [Vite Env](https://vitejs.dev/guide/env-and-mode)
+To add an environment variable:
+
+1. Copy `.example.env` to `.env` (in the same directory)
+2. Add a new record inside `.env`, prefixed with `VITE_`, e.g. `VITE_MY_API_KEY=...`
+3. Edit `./vite-env.d.ts` and in the `ImportMetaEnv` interface, add your variable with the appropriate type, e.g.
+
+ `readonly VITE_MY_API_KEY: string;`
+4. Then you can read the variable via `import.meta.env.MY_API_KEY` (learn more at [Env Variables and Modes](https://vite.dev/guide/env-and-mode))
#### If you want to set it for each package independently:
@@ -133,66 +137,73 @@ You have to do it on every browser launch.
#### Remember you can't use global and local at the same time for the same package(It will be overwritten)
-## Structure
+## Boilerplate structure
+
+### Chrome extension
-### ChromeExtension
+The extension lives in the `chrome-extension` directory and includes the following files:
-Main app with background script, manifest
+- [`manifest.js`](chrome-extension/manifest.js) - script that outputs the `manifest.json`
+- [`src/background`](chrome-extension/src/background) - [background script](https://developer.chrome.com/docs/extensions/mv3/background_pages/)
+ (`background.service_worker` in manifest.json)
+- [`public`](chrome-extension/public/) - icons referenced in the manifest; content CSS for user's page injection
-- `manifest.js` - manifest for chrome extension
-- `src/background` - [background script](https://developer.chrome.com/docs/extensions/mv3/background_pages/) for chrome
- extension (`background.service_worker` in
- manifest.json)
-- `public/content.css` - content css for user's page injection
+> [!IMPORTANT]
+> To facilitate development, the boilerplate is configured to "Read and change all your data on all websites".
+> In production, it's best practice to limit the premissions to only the strictly necessary websites. See
+> [Declaring permissions](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions)
+> and edit `manifest.js` accordingly.
### Packages
-Some shared packages
+Some shared packages:
-- `dev-utils` - utils for chrome extension development (manifest-parser, logger)
-- `i18n` - custom i18n package for chrome extension. provide i18n function with type safety and other validation.
-- `hmr` - custom HMR plugin for vite, injection script for reload/refresh, hmr dev-server
-- `shared` - shared code for entire project. (types, constants, custom hooks, components, etc.)
-- `storage` - helpers for [storage](https://developer.chrome.com/docs/extensions/reference/api/storage) easier integration with, e.g local, session storages
-- `tailwind-config` - shared tailwind config for entire project
-- `tsconfig` - shared tsconfig for entire project
-- `ui` - here's a function to merge your tailwind config with global one, and you can save components here
-- `vite-config` - shared vite config for entire project
-- `zipper` - By ```pnpm zip``` you can pack ```dist``` folder into ```extension.zip``` inside newly created ```dist-zip```
-- `e2e` - By ```pnpm e2e``` you can run end to end tests of your zipped extension on different browsers
+- `dev-utils` - utilities for Chrome extension development (manifest-parser, logger)
+- `i18n` - custom internationalization package; provides i18n function with type safety and other validation
+- `hmr` - custom HMR plugin for Vite, injection script for reload/refresh, HMR dev-server
+- `shared` - shared code for the entire project (types, constants, custom hooks, components etc.)
+- `storage` - helpers for easier integration with [storage](https://developer.chrome.com/docs/extensions/reference/api/storage), e.g. local/session storages
+- `tailwind-config` - shared Tailwind config for entire project
+- `tsconfig` - shared tsconfig for the entire project
+- `ui` - function to merge your Tailwind config with the global one; you can save components here
+- `vite-config` - shared Vite config for the entire project
+- `zipper` - run `pnpm zip` to pack the `dist` folder into `extension.zip` inside the newly created `dist-zip`
+- `e2e` - run `pnpm e2e` for end-to-end tests of your zipped extension on different browsers
### Pages
-- `content` - [content script](https://developer.chrome.com/docs/extensions/mv3/content_scripts/) for chrome
- extension (`content_scripts` in manifest.json)
-- `content-ui` - [content script](https://developer.chrome.com/docs/extensions/mv3/content_scripts/) for render UI in
- user's page (`content_scripts` in manifest.json)
-- `content-runtime` - [content runtime script](https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts#functionality)
- this can be inject from `popup` like standard `content`
-- `devtools` - [devtools](https://developer.chrome.com/docs/extensions/mv3/devtools/#creating) for chrome
- extension (`devtools_page` in manifest.json)
-- `devtools-panel` - devtools panel for [devtools](pages/devtools/src/index.ts)
-- `new-tab` - [new tab](https://developer.chrome.com/docs/extensions/mv3/override/) for chrome
- extension (`chrome_url_overrides.newtab` in manifest.json)
-- `options` - [options](https://developer.chrome.com/docs/extensions/mv3/options/) for chrome extension (`options_page`
- in manifest.json)
-- `popup` - [popup](https://developer.chrome.com/docs/extensions/reference/browserAction/) for chrome
- extension (`action.default_popup` in
- manifest.json)
-- `side-panel` - [sidepanel(Chrome 114+)](https://developer.chrome.com/docs/extensions/reference/sidePanel/) for chrome
- extension (`side_panel.default_path` in manifest.json)
-
-## Community
+Code that is transpiled to be part of the extension lives in the [pages](pages/) directory.
+
+- [`content`](pages/content/) - [content scripts](https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts)
+ (`content_scripts` in manifest.json)
+- [`content-ui`](pages/content-ui) - React UI rendered in the current page (you can see it at the very bottom when you get started)
+ (`content_scripts` in manifest.json)
+- [`content-runtime`](pages/content-runtime/src/) - [injected content scripts](https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts#functionality);
+ this can be injected from `popup` like standard `content`
+- [`devtools`](pages/devtools/) - [extend the browser DevTools](https://developer.chrome.com/docs/extensions/how-to/devtools/extend-devtools#creating)
+ (`devtools_page` in manifest.json)
+- [`devtools-panel`](pages/devtools-panel/) - [DevTools panel](https://developer.chrome.com/docs/extensions/reference/api/devtools/panels)
+ for [devtools](pages/devtools/src/index.ts)
+- [`new-tab`](pages/new-tab/) - [override the default New Tab page](https://developer.chrome.com/docs/extensions/develop/ui/override-chrome-pages)
+ (`chrome_url_overrides.newtab` in manifest.json)
+- [`options`](pages/options/) - [options page](https://developer.chrome.com/docs/extensions/develop/ui/options-page)
+ (`options_page` in manifest.json)
+- [`popup`](pages/popup/) - [popup](https://developer.chrome.com/docs/extensions/reference/api/action#popup) shown when clicking the extension in the toolbar
+ (`action.default_popup` in manifest.json)
+- [`side-panel`](pages/side-panel/) - [sidepanel (Chrome 114+)](https://developer.chrome.com/docs/extensions/reference/api/sidePanel)
+ (`side_panel.default_path` in manifest.json)
+
+## Community
To chat with other community members, you can join the [Discord](https://discord.gg/4ERQ6jgV9a) server.
You can ask questions on that server, and you can also help others.
Also, suggest new features or share any challenges you've faced while developing Chrome extensions!
-## Reference
+## Reference
+- [Chrome Extensions](https://developer.chrome.com/docs/extensions)
- [Vite Plugin](https://vitejs.dev/guide/api-plugin.html)
-- [ChromeExtension](https://developer.chrome.com/docs/extensions/mv3/)
- [Rollup](https://rollupjs.org/guide/en/)
- [Turborepo](https://turbo.build/repo/docs)
- [Rollup-plugin-chrome-extension](https://www.extend-chrome.dev/rollup-plugin)