{
  "markdown": "# BlockTrust MVP\n\n> Plateforme de certification et vérification d'authenticité pour les entreprises  \n> Stack: **Next.js 16**, **Prisma**, **PostgreSQL**, **JWT (ES256)**, **QR Codes**\n\n**Déploiement & Neon (bold-frost / vercel-dev)** : voir [DEPLOYMENT.md](./DEPLOYMENT.md).\n\n---\n\n## 🎯 Vue d'ensemble\n\nBlockTrust est une plateforme permettant aux entreprises de :\n- Créer et gérer des certificats de confiance\n- Générer des signatures JWT pour authentifier leurs emails\n- Vérifier l'authenticité des communications via des badges et QR codes\n- Suivre les vérifications et détecter les tentatives de falsification\n\n## 🚀 Technologies\n\n- **Framework**: Next.js 16.1.1 (App Router)\n- **Base de données**: PostgreSQL avec Prisma ORM\n- **Authentification**: JWT avec ES256 (clés ECDSA)\n- **UI**: React 19, Tailwind CSS 4\n- **QR Codes**: Bibliothèque `qrcode`\n\n## 📁 Structure du projet\n\n```\nblocktrust-mvp/\n├── app/\n│   ├── api/\n│   │   ├── entities/\n│   │   │   └── route.ts          # CRUD des entités\n│   │   └── v2/\n│   │       ├── issue/\n│   │       │   └── route.ts      # Génération de signatures JWT\n│   │       └── verify/\n│   │           └── route.ts      # Vérification de signatures\n│   ├── badge/\n│   │   └── [id]/\n│   │       └── page.tsx          # Page badge avec QR code\n│   ├── components/\n│   │   └── QRCode.tsx            # Composant QR code\n│   ├── dashboard/\n│   │   ├── create/\n│   │   │   └── page.tsx          # Formulaire création entité\n│   │   └── page.tsx              # Dashboard principal\n│   ├── verify/\n│   │   ├── [id]/\n│   │   │   └── page.tsx          # Vérification par ID/SIRET\n│   │   └── page.tsx              # Vérification par token JWT\n│   ├── lib/\n│   │   └── db.ts                 # Client Prisma\n│   └── page.tsx                  # Page d'accueil\n├── lib/\n│   └── v2/\n│       ├── context.ts            # Canonicalisation et hash des contextes\n│       └── jwt.ts                # Signatures et vérification JWT\n├── prisma/\n│   ├── schema.prisma             # Schéma de base de données\n│   ├── migrations/               # Migrations Prisma\n│   └── seed.js                   # Script de seed\n└── README.md\n```\n\n## 🗄️ Modèle de données\n\n### User\n- Informations utilisateur (email, nom, plan)\n\n### Entity\n- Entité certifiée (nom légal, SIRET, email, site web)\n- Statuts: `kycStatus` (PENDING/APPROVED/REJECTED)\n- Niveaux: `validationLevel` (BRONZE/SILVER/GOLD)\n\n### Certificate\n- Certificat lié à une entité\n- Statuts: PENDING/APPROVED/REJECTED\n- Niveaux: BRONZE/SILVER/GOLD\n\n### Signature (V2)\n- Métadonnées de signature JWT\n- `jti`: Identifiant unique du token\n- `ctxHash`: Hash du contexte signé\n- `expiresAt`: Date d'expiration\n- `revoked`: Statut de révocation\n\n### VerificationEvent\n- Historique des vérifications\n- IP, User-Agent, verdict (VALID/TAMPERED/REVOKED/etc.)\n\n## 🔐 API V2 - Signatures JWT\n\n### POST `/api/v2/issue`\n\nGénère une signature JWT pour un contexte email.\n\n**Request:**\n```json\n{\n  \"entityId\": \"string\",\n  \"certificateId\": \"string\",\n  \"context\": {\n    \"from\": \"contact@example.com\",\n    \"to\": \"client@example.com\",\n    \"subject\": \"Sujet de l'email\",\n    \"date\": \"2024-01-15T10:00:00Z\",\n    \"body\": \"Corps de l'email (optionnel)\"\n  },\n  \"expiresInSeconds\": 3600\n}\n```\n\n**Response:**\n```json\n{\n  \"token\": \"eyJ...\",\n  \"verifyUrl\": \"http://localhost:3000/verify?token=...\",\n  \"signatureId\": \"uuid\"\n}\n```\n\n### POST `/api/v2/verify`\n\nVérifie une signature JWT.\n\n**Request:**\n```json\n{\n  \"token\": \"eyJ...\",\n  \"context\": {\n    \"from\": \"contact@example.com\",\n    \"to\": \"client@example.com\",\n    \"subject\": \"Sujet de l'email\",\n    \"date\": \"2024-01-15T10:00:00Z\",\n    \"body\": \"Corps de l'email (optionnel)\"\n  }\n}\n```\n\n**Response:**\n```json\n{\n  \"verdict\": \"VALID\" | \"VALID_WITH_WARNING\" | \"TAMPERED\" | \"REVOKED\" | \"EXPIRED\" | \"INVALID\",\n  \"reason\": \"string (optionnel)\",\n  \"entityId\": \"string\",\n  \"certificateId\": \"string\",\n  \"jti\": \"string\"\n}\n```\n\n## 🛠️ Installation et configuration\n\n### Prérequis\n\n- Node.js 20+\n- PostgreSQL\n- macOS (ou Linux/Windows)\n\n### 1. Installation des dépendances\n\n```bash\nnpm install\n```\n\n### 2. Configuration de la base de données\n\nCréer un fichier `.env` à la racine :\n\n```env\n# Base de données\nDATABASE_URL=\"postgresql://user:password@localhost:5432/blocktrust\"\nDIRECT_URL=\"postgresql://user:password@localhost:5432/blocktrust\"\n\n# JWT (clés ECDSA ES256)\nBLOCKTRUST_JWT_PRIVATE_KEY=\"-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----\"\nBLOCKTRUST_JWT_PUBLIC_KEY=\"-----BEGIN PUBLIC KEY-----\\n...\\n-----END PUBLIC KEY-----\"\n\n# Application\nNEXT_PUBLIC_APP_URL=\"http://localhost:3000\"\n```\n\n### 3. Génération des clés JWT (ES256)\n\n```bash\n# Générer une paire de clés ECDSA\nopenssl ecparam -genkey -name prime256v1 -noout -out private-key.pem\nopenssl ec -in private-key.pem -pubout -out public-key.pem\n\n# Convertir en format PKCS8 pour la clé privée\nopenssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in private-key.pem -out private-key-pkcs8.pem\n```\n\nCopier le contenu de `private-key-pkcs8.pem` dans `BLOCKTRUST_JWT_PRIVATE_KEY` et `public-key.pem` dans `BLOCKTRUST_JWT_PUBLIC_KEY` (avec `\\n` pour les retours à la ligne).\n\n### 4. Initialisation de la base de données\n\n```bash\n# Générer le client Prisma\nnpx prisma generate\n\n# Appliquer les migrations\nnpx prisma migrate deploy\n\n# (Optionnel) Seed la base de données\nnpm run seed\n```\n\n### 5. Lancement du serveur de développement\n\n```bash\nnpm run dev\n```\n\nL'application sera accessible sur [http://localhost:3000](http://localhost:3000)\n\n## 📝 Scripts disponibles\n\n- `npm run dev` - Lance le serveur de développement\n- `npm run build` - Build de production\n- `npm run start` - Lance le serveur de production\n- `npm run lint` - Vérifie le code avec ESLint\n- `npm run seed` - Seed la base de données avec des données de démo\n\n## 🎨 Fonctionnalités implémentées\n\n### ✅ Dashboard\n- Affichage des entités et certificats\n- Statistiques (certificats actifs, vérifications)\n- Navigation vers création, vérification, badges\n\n### ✅ Création d'entités\n- Formulaire de création avec validation\n- Création automatique d'un certificat associé\n- Gestion des erreurs (SIRET unique)\n\n### ✅ Badges et QR codes\n- Génération de badges visuels\n- QR codes pour vérification rapide\n- Affichage des informations de certification\n\n### ✅ Vérification\n- Vérification par ID/SIRET (page publique)\n- Vérification par token JWT (API V2)\n- Détection de falsification (hash mismatch)\n- Détection de replay (changement IP/UA)\n- Gestion de l'expiration et révocation\n\n### ✅ API V2 - Signatures JWT\n- Génération de tokens signés avec ES256\n- Canonicalisation des contextes email\n- Vérification cryptographique\n- Historique des vérifications\n\n## 🔒 Sécurité\n\n- **JWT ES256**: Signatures cryptographiques avec clés ECDSA\n- **Hash de contexte**: Protection contre la falsification\n- **Anti-replay**: Détection des vérifications suspectes\n- **Expiration**: Tokens avec durée de vie limitée\n- **Révocation**: Support de la révocation de signatures\n\n## 🚧 Prochaines étapes\n\n- [ ] Authentification utilisateur (Supabase Auth ou NextAuth)\n- [ ] Intégration email (plugin/extension)\n- [ ] Système de paiement (Stripe)\n- [ ] API REST complète\n- [ ] Tests unitaires et d'intégration\n- [ ] Documentation API (OpenAPI/Swagger)\n- [ ] Dashboard admin\n- [ ] Export de données\n- [ ] Notifications email\n\n## 📄 Licence\n\nPropriétaire - Tous droits réservés\n\n---\n\n**Développé avec ❤️ pour BlockTrust**\n# force rebuild\n",
  "bytes": 7409,
  "sha": "65291645c65065e4ac4710eae5749fa395c56f04a2aae5178350b23638b094e9",
  "repo_slug": "brnbtech770/blocktrust",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_brnbtech770_blocktrust_trustsc_655a3256/readme"
}