{
  "version": "3.0.0",
  "generated_at": "2026-04-23T10:21:00Z",
  "description": "PQSL middleware packages — drop-in modules for popular web frameworks that add post-quantum security headers, per-IP rate limiting, and a /pqsl/kem/handshake endpoint backed by pqsl-core (Kyber1024 + Dilithium5).",
  "phase": "FASE 4 (10 pkgs) + FASE 4.1 (6 pkgs) = 16 middleware",
  "packages": [
    {
      "name": "pqsl-fastapi",
      "language": "Python",
      "framework": "FastAPI",
      "binding": "pqsl-python",
      "file": "pqsl-fastapi-v3.0.0.tar.gz",
      "size_bytes": 5352,
      "sha3_256": "483ad44951247ad439ee4d7b57f86bfe5fe42a0319c174f51fcd3e352f0f1363"
    },
    {
      "name": "pqsl-flask",
      "language": "Python",
      "framework": "Flask",
      "binding": "pqsl-python",
      "file": "pqsl-flask-v3.0.0.tar.gz",
      "size_bytes": 4122,
      "sha3_256": "5e6cee6b66dea8b8fc289f6020e9f1c99df2dc13d1f1aa8634270aa25130620a"
    },
    {
      "name": "pqsl-django",
      "language": "Python",
      "framework": "Django",
      "binding": "pqsl-python",
      "file": "pqsl-django-v3.0.0.tar.gz",
      "size_bytes": 4190,
      "sha3_256": "9be5e35333528b38c691d76ea1b8675a11285fae395afd3f8a25f3057633a64c"
    },
    {
      "name": "pqsl-express",
      "language": "TypeScript",
      "framework": "Express.js",
      "binding": "@posquantum/pqsl-node",
      "file": "pqsl-express-v3.0.0.tar.gz",
      "size_bytes": 4144,
      "sha3_256": "657d4500624eb52dadbd3c3dece7b2f2f2903966e9fb9b9589ded7b15a6f503d"
    },
    {
      "name": "pqsl-fastify",
      "language": "TypeScript",
      "framework": "Fastify",
      "binding": "@posquantum/pqsl-node",
      "file": "pqsl-fastify-v3.0.0.tar.gz",
      "size_bytes": 3628,
      "sha3_256": "7f197d390ce480b46527648dcdca9b3cc77843f30d7c4b2e072e39a2df497ee7"
    },
    {
      "name": "pqsl-nestjs",
      "language": "TypeScript",
      "framework": "NestJS",
      "binding": "@posquantum/pqsl-node",
      "file": "pqsl-nestjs-v3.0.0.tar.gz",
      "size_bytes": 3754,
      "sha3_256": "dfe394bfc0cf629a6cd4a943156e4cf095b8374f9e509b63d4563b57968d8aec"
    },
    {
      "name": "pqsl-spring",
      "language": "Java",
      "framework": "Spring Boot 3",
      "binding": "pqsl-java",
      "file": "pqsl-spring-v3.0.0.tar.gz",
      "size_bytes": 4617,
      "sha3_256": "79b199ae1141ec5b7c7abd1148725d7380ef237d36c80af80e8fe2c4efc4cae8"
    },
    {
      "name": "pqsl-aspnet",
      "language": "C#",
      "framework": "ASP.NET Core 6+",
      "binding": "PosQuantum.PQSL.Csharp",
      "file": "pqsl-aspnet-v3.0.0.tar.gz",
      "size_bytes": 4118,
      "sha3_256": "163854d490dcffa2f5f133aee91bf958142e1c98b985846f2b6b353d02811ae7"
    },
    {
      "name": "pqsl-rack",
      "language": "Ruby",
      "framework": "Rack (Rails, Sinatra, Hanami)",
      "binding": "Fiddle FFI → libpqsl_core.so",
      "file": "pqsl-rack-v3.0.0.tar.gz",
      "size_bytes": 4146,
      "sha3_256": "ee72f2159b321db0e46a8e0f89a2a40ae38fb606c6cababd921792a238b279cc"
    },
    {
      "name": "pqsl-laravel",
      "language": "PHP",
      "framework": "Laravel 10/11",
      "binding": "PHP FFI → libpqsl_core.so",
      "file": "pqsl-laravel-v3.0.0.tar.gz",
      "size_bytes": 4499,
      "sha3_256": "a7724a307537265f471e36d180bedc2d6c9743182c9d927f773b789fc534d0a3"
    },
    {
      "name": "pqsl-koa",
      "language": "TypeScript",
      "framework": "Koa 2",
      "binding": "@posquantum/pqsl-node",
      "file": "pqsl-koa-v3.0.0.tar.gz",
      "size_bytes": 3632,
      "sha3_256": "23af5a6f028f9822e79b7819b1bdf655d2c152879f49e85e873596e91757a34a",
      "phase": "4.1"
    },
    {
      "name": "pqsl-hapi",
      "language": "TypeScript",
      "framework": "Hapi 21",
      "binding": "@posquantum/pqsl-node",
      "file": "pqsl-hapi-v3.0.0.tar.gz",
      "size_bytes": 3717,
      "sha3_256": "09e928232ba64e651a713c7ced71a90747070099e83dda9445f429be3926d845",
      "phase": "4.1"
    },
    {
      "name": "pqsl-gin",
      "language": "Go",
      "framework": "Gin",
      "binding": "pqsl-go (runtime-registered encapsulator interface)",
      "file": "pqsl-gin-v3.0.0.tar.gz",
      "size_bytes": 3751,
      "sha3_256": "750246000869fb0fbeb4825031447eb91e249f6b23a1f02759ce62cf22fb2127",
      "phase": "4.1"
    },
    {
      "name": "pqsl-echo",
      "language": "Go",
      "framework": "Echo",
      "binding": "pqsl-go (runtime-registered encapsulator interface)",
      "file": "pqsl-echo-v3.0.0.tar.gz",
      "size_bytes": 3518,
      "sha3_256": "3160b0cc8716e70a9b84a2b0504f83372cb37e8cb9106e873a8a7e90b14aeca8",
      "phase": "4.1"
    },
    {
      "name": "pqsl-actix",
      "language": "Rust",
      "framework": "Actix-web 4",
      "binding": "pqsl-rust (runtime-registered encapsulator closure)",
      "file": "pqsl-actix-v3.0.0.tar.gz",
      "size_bytes": 4557,
      "sha3_256": "36cda60c003241dafefaafd2d5e59ee226d3ef200aa0285fea8520880afc9bf4",
      "phase": "4.1"
    },
    {
      "name": "pqsl-ktor",
      "language": "Kotlin",
      "framework": "Ktor 2.3+",
      "binding": "pqsl-kotlin (runtime-registered encapsulator lambda)",
      "file": "pqsl-ktor-v3.0.0.tar.gz",
      "size_bytes": 3820,
      "sha3_256": "b935d2b0b5c5179d2e80077f6abee1df94a96070c13962afd14baa0ea4b19e2f",
      "phase": "4.1"
    }
  ],
  "capabilities_common": [
    "Adds X-PQSL-Version: 3.0 on every response",
    "Per-IP token-bucket rate limit (bounded 50 000 entries, LRU eviction)",
    "GET /pqsl/health — returns { status, pqsl_version, binding_loaded }",
    "POST /pqsl/kem/handshake — Kyber1024 encapsulation (returns 503 if binding unavailable)"
  ],
  "honest_notes": [
    "These are middleware — NOT a transparent TLS replacement. Use PQSL-TLS for end-to-end.",
    "Rate-limit is per-process. Deploy a shared backend (Redis/Memcached/etc.) for multi-instance setups.",
    "Ruby/PHP use direct FFI to libpqsl_core.so (no dedicated pqsl-ruby/pqsl-php bindings shipped).",
    "Each package ships with LICENSE.txt (Proprietary v1.0) and NDA.md. Review before integration.",
    "FASE 4.1 (Koa/Hapi/Gin/Echo/Actix/Ktor) use runtime-registered encapsulators — call registerEncapsulator(cb) once at boot to bind pqsl-core."
  ]
}
