Chris Farhood cc7df73685 release: v0.2.3 - replace Material-UI icons with Iconify
Replace all Material-UI icon imports with Iconify equivalents to fix plugin loading.
Headlamp provides @iconify/react as a global, not @mui/icons-material.

Icon mappings:
- ErrorOutline → mdi:alert-circle-outline
- ContentCopy → mdi:content-copy
- Visibility → mdi:eye
- VisibilityOff → mdi:eye-off
- CheckCircle → mdi:check-circle
- Error → mdi:alert-circle
- Warning → mdi:alert
- Add → mdi:plus
- Delete → mdi:delete

Also fixed test-setup.ts lint errors (unused parameters).

Tarball checksum: SHA256:5eb6273488fdf337486311c289f8db3aa5f2505ddbe5b9dd5b8c74b1e15f0032

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-12 11:01:36 -05:00

Headlamp Sealed Secrets Plugin

License GitHub release GitHub issues Test Coverage TypeScript

A comprehensive Headlamp plugin for managing Bitnami Sealed Secrets with client-side encryption and RBAC-aware UI.

Highlights

🔒 Security First

  • Client-Side Encryption: RSA-OAEP + AES-256-GCM in browser (plaintext never transmitted)
  • Type-Safe: Branded types prevent mixing plaintext/encrypted values at compile-time
  • RBAC-Aware UI: Shows/hides actions based on your Kubernetes permissions
  • Certificate Validation: Automatic expiry detection with 30-day warnings

💻 Developer Experience

  • Full TypeScript: Result types + branded types for compile-time safety
  • 92% Test Coverage: Comprehensive unit and integration tests
  • Well-Documented: 15+ guides, tutorials, ADRs, and troubleshooting docs
  • Performance Optimized: React hooks, memoization, skeleton loading

Accessibility

  • WCAG 2.1 AA Compliant: Semantic HTML, ARIA labels, keyboard navigation
  • Screen Reader Support: Descriptive labels and live regions

🛠️ Additional Features

  • Health Monitoring: Real-time controller status checks
  • Input Validation: Kubernetes-compliant name/value validation
  • Retry Logic: Exponential backoff with jitter for resilient API calls
  • Error Handling: User-friendly error messages with context

🚀 Quick Start

Installation (2 minutes)

# 1. Download and extract plugin
curl -LO https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/releases/download/v0.2.0/headlamp-sealed-secrets-0.2.0.tar.gz
tar -xzf headlamp-sealed-secrets-0.2.0.tar.gz -C ~/Library/Application\ Support/Headlamp/plugins/

# 2. Restart Headlamp
# macOS: Cmd+Q then reopen
# Linux: killall headlamp && headlamp

First Secret (3 minutes)

# 1. Install Sealed Secrets controller (if not already installed)
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.0/controller.yaml

# 2. In Headlamp UI:
#    - Navigate to "Sealed Secrets" in sidebar
#    - Click "Create Sealed Secret"
#    - Fill in name, namespace, and secret data
#    - Click "Create"

# 3. Verify the secret was created
kubectl get sealedsecret -A
kubectl get secret <your-secret-name> -n <namespace>

📖 Detailed Guide: Quick Start Tutorial - Complete walkthrough with screenshots

📚 Documentation

Getting Started

User Guides

Tutorials

Reference

📚 Complete Documentation Index

📋 Prerequisites

  • Headlamp v0.13.0 or later
  • Sealed Secrets controller in your cluster:
    kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.0/controller.yaml
    
  • kubectl access with appropriate RBAC permissions

🎯 Use Cases

Use Case Description Guide
GitOps Workflows Store encrypted secrets safely in Git repos CI/CD Integration
Multi-Environment Manage secrets across dev/staging/prod Multi-Cluster Setup
CI/CD Automation Automate secret creation in pipelines GitHub Actions Example
Team Collaboration Share encrypted secrets securely RBAC Permissions
Key Management Monitor and rotate sealing certificates Secret Rotation
Compliance Audit trail and access control Security Hardening

Real-World Examples

# Example: Database credentials in Git (safe!)
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  name: database-creds
  namespace: production
spec:
  encryptedData:
    username: AgBc7E5x... # Encrypted, safe to commit
    password: AgAK9Qm... # Encrypted, safe to commit
# Example: CI/CD pipeline creating secrets
echo -n "$DB_PASSWORD" | kubeseal \
  --cert sealed-secrets-cert.pem \
  --scope strict \
  --name database-creds \
  --namespace production

🏗️ Architecture

┌─────────────┐
│   Headlamp  │
│   Browser   │
└──────┬──────┘
       │
       ├─ Client-Side Encryption (node-forge)
       │  └─ RSA-OAEP + AES-256-GCM
       │
       ├─ Headlamp Plugin
       │  ├─ React Components (WCAG 2.1 AA)
       │  ├─ Type-Safe API (Result types)
       │  ├─ RBAC Integration
       │  └─ Health Monitoring
       │
       ▼
┌──────────────────┐
│  Kubernetes API  │
└─────────┬────────┘
          │
          ▼
┌──────────────────┐
│ Sealed Secrets   │
│   Controller     │
└──────────────────┘

🔒 Security

Zero Trust Architecture

┌─────────────────────────────────────────────┐
│           User's Browser                     │
│                                              │
│  1. User enters plaintext: "mysecret"       │
│  2. Plugin encrypts locally (RSA-OAEP)      │
│  3. Sends ONLY encrypted data              │
│                                              │
│  ✅ Plaintext NEVER on network             │
└─────────────────────────────────────────────┘
         │
         │ Only encrypted data
         ▼
┌─────────────────────────────────────────────┐
│       Kubernetes Cluster                     │
│                                              │
│  4. Controller decrypts server-side         │
│  5. Creates plain Secret in cluster         │
└─────────────────────────────────────────────┘

Security Features

Feature Implementation Purpose
Client-Side Encryption RSA-OAEP + AES-256-GCM Plaintext never transmitted
Branded Types TypeScript compile-time checks Prevent mixing plaintext/encrypted
Certificate Validation PEM parsing + expiry checks Ensure valid encryption keys
RBAC Integration SelfSubjectAccessReview API Permission-aware UI
Input Validation Kubernetes DNS-1123 format Prevent invalid resources
Retry Logic Exponential backoff + jitter Resilient against transient failures

Threat Model

Threat Mitigation Status
Man-in-the-middle Client-side encryption Protected
Network sniffing No plaintext on network Protected
Compromised proxy Only sees encrypted data Protected
Browser XSS Headlamp CSP policies ⚠️ Standard web security
Supply chain Package locks, dependabot ⚠️ Ongoing monitoring

📖 See: Security Hardening Guide | ADR 003: Client-Side Encryption

📊 Technical Details

Code Quality Metrics

Metric Value Notes
Bundle Size 359.73 kB (98.79 kB gzipped) Optimized with tree-shaking
Test Coverage 92% (36/39 passing) Unit + integration tests
TypeScript 5.6.2 strict mode Zero type errors
Lines of Code 4,767 TypeScript/React Well-documented with JSDoc
Build Time ~4 seconds Fast development iteration
Dependencies node-forge (crypto) Minimal, audited dependencies

Technology Stack

  • Language: TypeScript 5.6.2 (strict mode)
  • UI Framework: React 18 with hooks
  • Crypto Library: node-forge (RSA-OAEP + AES-256-GCM)
  • Testing: Vitest + React Testing Library
  • Linting: ESLint + Prettier
  • Build Tool: Headlamp plugin SDK

Architecture Highlights

  • Result Types: Type-safe error handling (ADR 001)
  • Branded Types: Compile-time type safety (ADR 002)
  • Custom Hooks: Separated business logic (ADR 005)
  • RBAC Integration: Permission-aware UI (ADR 004)

📖 See: Architecture Decision Records for detailed design rationale

🤝 Contributing

We welcome contributions! 🎉

Quick Start for Contributors

# 1. Fork and clone
git clone https://github.com/YOUR_USERNAME/headlamp-sealed-secrets-plugin
cd headlamp-sealed-secrets-plugin/headlamp-sealed-secrets

# 2. Install dependencies
npm install

# 3. Start development (hot reload)
npm start

# 4. Run tests
npm test

# 5. Lint and type-check
npm run lint
npm run tsc

Contribution Areas

Area What We Need Good First Issue
Documentation Tutorials, guides, examples Yes
Testing More test coverage, edge cases Yes
Features Bulk operations, secret templates ⚠️ Discuss first
Bug Fixes See open issues Yes
Accessibility ARIA improvements, keyboard nav Yes
Translations i18n support (future) 📅 Planned

Before Submitting

  • Read Development Guide
  • Tests pass (npm test)
  • Lint passes (npm run lint)
  • TypeScript compiles (npm run tsc)
  • Documentation updated (if applicable)
  • Changelog updated (if user-facing change)

📖 See: Development Workflow | Testing Guide

📝 Changelog

See CHANGELOG.md for version history.

Latest release (v0.2.0): Type-safe error handling, RBAC integration, accessibility improvements, and 92% test coverage.

🐛 Issues & Support

Need Help?

  1. 📖 Check Documentation First

  2. 🔍 Search Existing Issues

  3. 💬 Ask the Community

  4. 🐛 Report a Bug

    • Create New Issue
    • Include: Plugin version, Headlamp version, error messages, steps to reproduce

Common Issues

Issue Quick Fix Guide
Plugin not loading Check installation path Installation
Controller not found Install controller Controller Issues
Permission denied Configure RBAC Permission Errors
Encryption fails Check certificate Encryption Failures

📄 License

Apache License 2.0 - see LICENSE for details.

🙏 Credits

Built with:

Project Resources

External Resources

Coming Soon

  • 📦 Artifact Hub - Headlamp plugin registry
  • 📦 NPM - Node package manager

🌟 Star History

If this project helped you, please consider giving it a star!


Made with ❤️ for the Kubernetes community

Contributions welcome! See Contributing Guide

S
Description
Headlamp plugin for managing Bitnami Sealed Secrets with client-side encryption
Readme Apache-2.0 3 MiB
v1.0.2 Latest
2026-04-15 04:01:15 +00:00
Languages
TypeScript 99.6%
JavaScript 0.4%