A secure password generator and manager Chrome extension built with React and TypeScript. Generate strong passwords, save them securely, and access them easily.
- 🔐 Generate secure passwords
- 📏 Customizable password length
- 🔢 Optional numbers and symbols
- 💾 Save passwords locally
- 📋 Quick copy to clipboard
- 🎨 Clean, modern UI with dark theme
- 🛡️ Secure storage using Chrome's built-in storage API
- React 18
- TypeScript
- Tailwind CSS
- Vite
- Lucide React Icons
- Chrome Extension API
Before you begin, ensure you have installed:
- Node.js (v14 or higher)
- npm (v6 or higher)
- Google Chrome browser
- Clone the repository
git clone https://github.com/yourusername/rem-password-chrome
cd rem-password-chrome
- Install dependencies
npm install
- Create required icon files
# Install Sharp for icon generation
npm install sharp --save-dev
# Create generate-icons.cjs file with this content:
const sharp = require('sharp');
const sizes = [16, 48, 128];
async function generateIcons() {
for (const size of sizes) {
await sharp('public/icon.svg')
.resize(size, size)
.png()
.toFile(`public/icon${size}.png`);
}
}
generateIcons().catch(console.error);
# Run icon generation
node generate-icons.cjs
- Build the extension
npm run build
- Open Google Chrome
- Navigate to
chrome://extensions/
- Enable "Developer mode" in the top right corner
- Click "Load unpacked" in the top left
- Select the
dist
folder from your project directory
- Start development server:
npm run dev
- Build for production:
npm run build
rem-password-chrome/
├── public/
│ ├── icon.svg
│ ├── icon16.png
│ ├── icon48.png
│ └── icon128.png
├── src/
│ ├── App.tsx
│ ├── main.tsx
│ └── index.css
├── manifest.json
├── generate-icons.cjs
├── package.json
└── vite.config.ts
{
"manifest_version": 3,
"name": "rem-password-chrome",
"description": "A password manager extension",
"version": "1.0",
"action": {
"default_popup": "index.html",
"default_title": "Open rem-password-chrome"
},
"permissions": [
"storage"
],
"icons": {
"16": "icon16.png",
"48": "icon48.png",
"128": "icon128.png"
}
}
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [react()],
build: {
outDir: 'dist',
rollupOptions: {
output: {
inlineDynamicImports: false,
manualChunks: undefined
}
}
},
base: './'
})