Odel
legacy shield

legacy shield

Local
@stephenballot-aiMDXUpdated 1w ago

Zero-knowledge encrypted vault for AI agents. EU-hosted persistent storage.

Legacy Shield

Secure digital vault for critical documents with emergency access. 100% European hosting.

Legacy Shield is a privacy-first document vault designed for storing your most critical filesβ€”passports, wills, insurance policies, property deedsβ€”with built-in emergency access for loved ones. Unlike general cloud storage, Legacy Shield uses client-side encryption and European-exclusive infrastructure to ensure maximum privacy and security.

🌟 Key Features

  • πŸ” Zero-Knowledge Encryption: Files encrypted in your browser before upload
  • 🚨 Emergency Access: Loved ones can access your vault with unlock phrase (read-only)
  • πŸ‡ͺπŸ‡Ί European Data Sovereignty: 100% EU infrastructure (hosted on Hetzner, Germany)
  • πŸ“± Document Viewer: View PDFs, images, and documents in-browser
  • 🏷️ Smart Organization: Categories, tags, favorites, expiration tracking
  • βœ… GDPR Native: Privacy-first design, compliant by default
  • πŸ›‘οΈ Powered by BitAtlas: Uses the BitAtlas zero-knowledge encryption layer for all file storage and key management.

πŸ—οΈ Architecture

Monorepo Structure:

legacy-shield/
β”œβ”€β”€ packages/
β”‚   β”œβ”€β”€ web/          # Next.js frontend (React + TypeScript)
β”‚   β”œβ”€β”€ api/          # Express backend (Node.js + TypeScript)
β”‚   └── shared/       # Shared types and utilities
β”œβ”€β”€ infrastructure/   # Deployment configs
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ product-spec.md   # Product specification
└── architecture-spec.md  # Technical architecture

Tech Stack:

  • Frontend: Next.js 14, TypeScript, TailwindCSS, Web Crypto API
  • Backend: Node.js, Express, Prisma ORM, PostgreSQL
  • Storage: Hetzner Object Storage (S3-compatible)
  • Hosting: Hetzner Cloud (Germany)
  • Payments: Stripe

πŸš€ Quick Start

Prerequisites

  • Node.js 20+ and npm 10+
  • Docker and Docker Compose
  • Git

1. Clone and Install

cd /Users/stephenballot/Documents/LegacyShield
npm install

2. Start Infrastructure

# Start PostgreSQL, Redis, and MinIO (local S3)
docker compose up -d

# Verify services are running
docker ps

Note: You can also use npm run docker:dev as a shortcut.

3. Configure Environment

# Copy example environment file
cp .env.example .env

# Edit .env with your values (defaults work for local development)

4. Initialize Database

cd packages/api

# Generate Prisma Client
npm run db:generate

# Run database migrations
DATABASE_URL="postgresql://legacyshield:devpassword@localhost:5432/legacyshield_dev" npm run db:migrate

# Optional: seed with test data
npm run db:seed

cd ../..

Note: The DATABASE_URL must be provided because Prisma doesn't automatically read the root .env file. See GETTING_STARTED.md for details.

5. Start Development Servers

# Start both frontend and backend
npm run dev

# Or start individually:
npm run dev:web    # Frontend at http://localhost:3000
npm run dev:api    # Backend at http://localhost:4000

6. Access the Application

πŸ“š Development

Available Scripts

# Development
npm run dev              # Start all services
npm run dev:web          # Start frontend only
npm run dev:api          # Start backend only

# Building
npm run build            # Build all packages
npm run build:web        # Build frontend
npm run build:api        # Build backend

# Testing
npm run test             # Run all tests
npm run lint             # Lint all packages
npm run type-check       # TypeScript type checking

# Database
cd packages/api
npm run db:migrate       # Run migrations
npm run db:seed          # Seed database
npm run db:studio        # Open Prisma Studio
npm run db:reset         # Reset database

# Docker
docker compose up -d     # Start Docker services
docker compose down      # Stop Docker services
docker compose logs -f   # View Docker logs

Tip: For detailed setup instructions, see GETTING_STARTED.md

Project Structure

packages/
β”œβ”€β”€ web/                          # Frontend (Next.js)
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ app/                  # Next.js App Router
β”‚   β”‚   β”‚   β”œβ”€β”€ (auth)/           # Auth pages (login, register)
β”‚   β”‚   β”‚   β”œβ”€β”€ (dashboard)/      # Protected dashboard pages
β”‚   β”‚   β”‚   └── emergency-access/ # Public emergency portal
β”‚   β”‚   β”œβ”€β”€ components/           # React components
β”‚   β”‚   β”œβ”€β”€ lib/
β”‚   β”‚   β”‚   β”œβ”€β”€ crypto/           # Client-side encryption
β”‚   β”‚   β”‚   β”œβ”€β”€ api/              # API client
β”‚   β”‚   β”‚   └── utils/            # Utilities
β”‚   β”‚   β”œβ”€β”€ hooks/                # Custom React hooks
β”‚   β”‚   β”œβ”€β”€ store/                # Zustand stores
β”‚   β”‚   └── types/                # TypeScript types
β”‚   └── package.json
β”‚
β”œβ”€β”€ api/                          # Backend (Express)
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ routes/               # API routes
β”‚   β”‚   β”œβ”€β”€ middleware/           # Express middleware
β”‚   β”‚   β”œβ”€β”€ services/             # Business logic
β”‚   β”‚   β”œβ”€β”€ models/               # Data models
β”‚   β”‚   β”œβ”€β”€ jobs/                 # Background jobs
β”‚   β”‚   β”œβ”€β”€ utils/                # Utilities
β”‚   β”‚   └── server.ts             # Main server file
β”‚   β”œβ”€β”€ prisma/
β”‚   β”‚   β”œβ”€β”€ schema.prisma         # Database schema
β”‚   β”‚   └── migrations/           # Database migrations
β”‚   └── package.json
β”‚
└── shared/                       # Shared code
    β”œβ”€β”€ src/
    β”‚   β”œβ”€β”€ types/                # Shared TypeScript types
    β”‚   β”œβ”€β”€ constants/            # Shared constants
    β”‚   └── utils/                # Shared utilities
    └── package.json

πŸ”’ Security

Legacy Shield implements a zero-knowledge architecture:

  1. Client-side encryption: All files encrypted in browser before upload
  2. Key derivation: Master key derived from password using PBKDF2 (100k iterations)
  3. Per-file keys: Each file encrypted with unique AES-256-GCM key
  4. Dual-key system: Files encrypted with both owner key and emergency key
  5. No plaintext storage: Server never sees unencrypted files or keys
  6. 2FA mandatory: Two-factor authentication required for all users

Encryption Flow

Password β†’ PBKDF2 β†’ Master Key β†’ Encrypts file keys β†’ AES-256-GCM β†’ Encrypted file
                                                                           ↓
                                                              Hetzner Object Storage (Germany)

πŸ‡ͺπŸ‡Ί European Data Sovereignty

All infrastructure is hosted exclusively in the European Union:

  • Compute: Hetzner Cloud (Falkenstein, Germany)
  • Database: Hetzner Managed PostgreSQL (Germany)
  • Storage: Hetzner Object Storage (Germany)
  • Backups: Automated backups to Nuremberg, Germany

Your data never leaves European soil and is protected by:

  • GDPR (General Data Protection Regulation)
  • German BDSG (Federal Data Protection Act)
  • No US CLOUD Act jurisdiction

πŸ“– Documentation

πŸ§ͺ Testing

# Run all tests
npm run test

# Run tests for specific package
npm run test --workspace=web
npm run test --workspace=api

# Run tests in watch mode
npm run test:watch --workspace=web

# Run e2e tests
npm run test:e2e

πŸš€ Deployment

Production Deployment (Hetzner Cloud)

  1. Infrastructure Setup: See infrastructure/README.md
  2. Environment Variables: Configure production .env with real credentials
  3. Database Migration: Run migrations on production database
  4. Deploy: Use GitHub Actions or manual deployment
# Build for production
npm run build

# Deploy to Hetzner (manual)
# See infrastructure/deploy.sh

CI/CD

GitHub Actions workflow automatically:

  • Runs tests on every PR
  • Builds and deploys to staging on develop branch
  • Builds and deploys to production on main branch

🀝 Contributing

This is a private project. For the development team:

  1. Create feature branch: git checkout -b feature/your-feature
  2. Make changes and commit: git commit -m "Add your feature"
  3. Push branch: git push origin feature/your-feature
  4. Create Pull Request on GitHub

Code Standards

  • TypeScript: Strict mode enabled
  • Linting: ESLint with Airbnb config
  • Formatting: Prettier (automatic on commit)
  • Commits: Conventional commits format

πŸ“Š Pricing

  • Free Tier: 15 documents, 1 emergency contact
  • Pro Tier: $10/month or $500 lifetime
    • 100 documents
    • 5 emergency contacts
    • Advanced features (expiration tracking, sharing, audit logs)

πŸ“„ License

Copyright Β© 2026 Legacy Shield. All rights reserved.

This is proprietary software. Unauthorized copying or distribution is prohibited.

πŸ†˜ Support


Built with ❀️ in Europe. Your data, your privacy, your legacy.