- Redesign identities list to show avatar and display name from Nostr profile - Replace star icon selection with clickable row for identity switching - Add gear icon for direct access to identity settings - Highlight selected identity with primary color border - Remove credits box from information tab - Add rebuild instruction to CLAUDE.md - Clean up unused imports in info components - Replace HTML autofocus with programmatic focus for accessibility Files modified: - CLAUDE.md - package.json - projects/chrome/src/app/components/home/identities/* - projects/chrome/src/app/components/home/info/* - projects/chrome/src/app/components/vault-login/* - projects/firefox/src/app/components/home/identities/* - projects/firefox/src/app/components/home/info/* - projects/firefox/src/app/components/vault-login/* 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
3.4 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
Plebeian Signer is a browser extension for managing multiple Nostr identities and signing events without exposing private keys to web applications. It implements NIP-07 (window.nostr interface) with support for NIP-04 and NIP-44 encryption.
Build Commands
npm ci # Install dependencies
npm run build:chrome # Build Chrome extension (outputs to dist/chrome)
npm run build:firefox # Build Firefox extension (outputs to dist/firefox)
npm run watch:chrome # Development build with watch mode for Chrome
npm run watch:firefox # Development build with watch mode for Firefox
npm test # Run unit tests with Karma
npm run lint # Run ESLint
Important: After making any code changes, rebuild both extensions before testing:
npm run build:chrome && npm run build:firefox
Architecture
Monorepo Structure
This is an Angular CLI monorepo with three projects:
- projects/chrome: Chrome extension (MV3)
- projects/firefox: Firefox extension
- projects/common: Shared Angular library used by both extensions
Extension Architecture
The extension follows a three-layer communication model:
-
Content Script (
plebian-signer-content-script.ts): Injected into web pages, bridges messages between page scripts and the background service worker -
Injected Script (
plebian-signer-extension.ts): Injected into page context, exposeswindow.nostrAPI to web applications -
Background Service Worker (
background.ts): Handles NIP-07 requests, manages permissions, performs cryptographic operations
Message flow: Web App → window.nostr → Content Script → Background → Content Script → Web App
Storage Layers
- BrowserSyncHandler: Encrypted vault data synced across browser instances (or local-only based on user preference)
- BrowserSessionHandler: Session-scoped decrypted data (unlocked vault state)
- SignerMetaHandler: Extension metadata (sync flow preference)
Each browser (Chrome/Firefox) has its own handler implementations in projects/{browser}/src/app/common/data/.
Custom Webpack Build
Both extensions use @angular-builders/custom-webpack to bundle additional entry points beyond the main Angular app:
background.ts- Service workerplebian-signer-extension.ts- Page-injected scriptplebian-signer-content-script.ts- Content scriptprompt.ts- Permission prompt popupoptions.ts- Extension options page
Common Library
The @common import alias resolves to projects/common/src/public-api.ts. Key exports:
StorageService: Central data management with encryption/decryptionCryptoHelper,NostrHelper: Cryptographic utilities- Shared Angular components and pipes
Testing Extensions Locally
Chrome:
- Navigate to
chrome://extensions - Enable "Developer mode"
- Click "Load unpacked"
- Select
dist/chrome
Firefox:
- Navigate to
about:debugging - Click "This Firefox"
- Click "Load Temporary Add-on..."
- Select a file in
dist/firefox
NIP-07 Methods Implemented
getPublicKey()- Return public keysignEvent(event)- Sign Nostr eventgetRelays()- Get configured relaysnip04.encrypt/decrypt- NIP-04 encryptionnip44.encrypt/decrypt- NIP-44 encryption