Files
plebeian-signer/CLAUDE.md
mleku fe886d2101 Rebrand to Plebeian Signer with updated colors and UI improvements
- Fix project name from "Plebian" to "Plebeian" throughout codebase
- Replace gooti logo with Plebeian Market logo across all screens
- Update color scheme to match Plebeian Market (pink accent #ff3eb5)
- Add IBM Plex Mono fonts and Reglisse heading font
- Center vault create/import screen content vertically
- Reduce spacing on sync preference screen to prevent scrolling
- Add Enter key support on vault login password field
- Update options page with new logo and color scheme
- Bump version to 0.0.5

Files modified:
- package.json (version bump, name fix)
- projects/*/public/{logo.svg,options.html,manifest.json}
- projects/*/src/app/components/vault-*/*.{html,scss}
- projects/*/src/app/components/welcome/*.html
- projects/common/src/lib/styles/*.scss
- Various component files for branding updates

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-17 11:47:38 +01:00

3.2 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

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:

  1. Content Script (plebian-signer-content-script.ts): Injected into web pages, bridges messages between page scripts and the background service worker

  2. Injected Script (plebian-signer-extension.ts): Injected into page context, exposes window.nostr API to web applications

  3. 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 worker
  • plebian-signer-extension.ts - Page-injected script
  • plebian-signer-content-script.ts - Content script
  • prompt.ts - Permission prompt popup
  • options.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/decryption
  • CryptoHelper, NostrHelper: Cryptographic utilities
  • Shared Angular components and pipes

Testing Extensions Locally

Chrome:

  1. Navigate to chrome://extensions
  2. Enable "Developer mode"
  3. Click "Load unpacked"
  4. Select dist/chrome

Firefox:

  1. Navigate to about:debugging
  2. Click "This Firefox"
  3. Click "Load Temporary Add-on..."
  4. Select a file in dist/firefox

NIP-07 Methods Implemented

  • getPublicKey() - Return public key
  • signEvent(event) - Sign Nostr event
  • getRelays() - Get configured relays
  • nip04.encrypt/decrypt - NIP-04 encryption
  • nip44.encrypt/decrypt - NIP-44 encryption