Changelog
All notable changes to the L8Server (Layr8 Cloud Node) project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Code Quality Improvements (October 29, 2025)
These improvements were added during code review of the v4.0.0 release:
- Added missing viewer role authorization test
- Fixed superadmin role typo in test data (
/global-group/→/global-groups/) - Updated documentation to include
:viewerin return values - Changed log level from
infotodebugfor successful authorization (reduces log noise) - Made
L8_NODE_ORG_SLUGrequired in production with runtime validation - Enhanced startup banner with key configuration details (environment, domain, org slug, ports, database, OpenTelemetry status)
[4.0.0] - 2025-10-18
Breaking Changes
- Organization-Based Authorization: GraphQL API now requires JWT tokens with
portal-org-rolesclaim - L8_NODE_ORG_SLUG: New required environment variable in production to identify licensed organization
- Legacy Roles Removed:
resource_accessroles from Keycloak JWT are no longer used for authorization - Access Control: Users without valid organization roles (
owner,admin,member,viewer, orsuperadmin) will be denied access
Features
-
Organization Authorization System
- Added
OrganizationAuthorizermodule for organization-based access control - Supports hierarchical roles:
superadmin(global),owner,admin,member,viewer(org-specific) - Runtime validation ensures production deployments are properly configured
- Added
-
Simplified Role Mapping
- Reduced from 6+ legacy roles to 2 GraphQL roles:
:admin(full access) and:viewer(read-only) - Clear separation between query (read) and mutation (write) operations
- Reduced from 6+ legacy roles to 2 GraphQL roles:
-
Enhanced Startup Banner
- Displays key configuration details: environment, domain, org slug, ports, database, OpenTelemetry status
- Security-conscious: excludes sensitive values (passwords, API keys, tokens)
Bug Fixes
- Fixed typo in superadmin role path:
/global-group/superadmin→/global-groups/superadmin
Improvements
- Changed log level from
infotodebugfor successful authorization (reduces production log noise) - Added comprehensive test coverage for organization authorization (18 tests)
- Updated documentation to include
:viewerrole in all relevant places
Compatibility
- Internal User system (database-backed roles) unchanged
- API key authentication unchanged
- Plugin authentication unchanged
- Development/test environments work without
L8_NODE_ORG_SLUG
[3.0.14] - 2025-10-18
This release consolidates work from July 21 - October 18, 2025, including security updates, OpenSSL compatibility fixes, and the foundation for organization-based authorization.
Security & Infrastructure (July 23, 2025)
-
Docker Base Image Migration:
- Switched to Debian slim images with security updates
- Later migrated to Alpine base images for OpenSSL compatibility
-
CVE Documentation and Assessment:
- CVE-2023-45853: Documented as false positive
- CVE-2025-4802: Documented as not applicable
- CVE-2023-2953 (libldap): Documented as minor issue
- CVE-2025-6020 (libpam): Documented as HIGH severity unfixed
- CVE-2023-31484 (perl-base): Documented as minor issue
Features (October 18, 2025)
- Organization Authorization Foundation: Added
OrganizationAuthorizermodule (preparation for v4.0.0) - MCP Design Documentation: Added design documentation for Model Context Protocol integration
- Connection Monitoring (from July 21): L8-53 - Track connection status via
gun_up/gun_downevents
Improvements (October 18, 2025)
- Enhanced debug logging and error handling for plugin channels
- Improved DIDComm key lookup troubleshooting with additional logging
- Better error handling in
present_proof_v3protocol
Refactoring (October 18, 2025)
- Refactored DID document service injection logic for improved maintainability
Documentation
- OpenSSL compatibility fix documentation
- MCP over DIDComm design documents
[3.0.6] - 2025-07-16
Features
- L8-53: Track connection status via
gun_up/gun_downevents for better connection monitoring (released July 21)
[3.0.5] - 2025-07-16
Features
- L8-68: Add optional API Key to DID restriction for finer-grained access control
- L8-89: Add domain information to structured log output
Bug Fixes
- L8-88: Fix trust-ping protocol to respond when
response_requested = true - L8-89: Fixed environment configuration issues
[3.0.4] - 2025-07-15
Features
- L8-84: DID Whitelist/Blacklist System
- Added simple whitelist/blacklist feature for DID-based access control
- Support for wildcard patterns in whitelist/blacklist
- In-memory cache for performance optimization
- Extended to include GraphQL API authorization
Bug Fixes
- L8-84: Fixed various GraphQL API bugs
Removed
- L8-46: Removed
getNodeConfigfrom GraphQL API for security
[3.0.3] - 2025-07-08
Features
- L8-71: Add
updateDidmutation to GraphQL API
[3.0.2] - 2025-07-08
Features
- L8-64: Toolbox improvements and refactoring
- L8-55: Updated
getDidto include service section in DID Document
Refactoring
- L8-15: Renamed
TwinResolvertoDidResolver(terminology consistency)
Bug Fixes
- L8-56: Fixed
getDidcall - L8-51: Made API keys global to the node (no longer relying on
user_id)
[3.0.0] - 2025-07-05
Breaking Changes
- L8-3: Rights system renamed to Roles system (terminology change)
- L8-33: Removed all geo-related functionality (queries, mutations, ping mutation)
- L8-15: Renamed Twin concept to DID concept in GraphQL API
- Treat compiler warnings as errors (improved code quality enforcement)
Features
- L8-3: Introduced
adminrole; renamedrequired_roles.extorole_mapping.ex - L8-1: Created
getNodeInfoGraphQL query withstartedAtfield - L8-4: Add validation logic for DID deletion (prevent deletion of Node’s own DID)
Improvements
- L8-45: GraphQL API returns
NOT_AUTHORIZEDinstead ofGENERIC_ERROR - L8-32: Updated error codes documentation and formatting
- L8-34: Improved rate-limiting documentation
- L8-48: Improved connection aliveness checking for gRPC transport with better test coverage
Removed
- L8-31: Removed unused peer node code
- L8-33: Removed geofencing/geo-related functionality
Bug Fixes
- L8-41: Fixed flaky tests, cleaned up compiler warnings
[2.2.10] - 2025-06-16
Improvements
- Dependencies update and testing improvements
[2.2.9] - 2025-06-20 to 2025-03-09
Security & Infrastructure
- Docker Base Image Migration: Switched from Debian to Alpine base images for OpenSSL compatibility
- Security Updates: Applied security updates and documented CVEs
- CVE-2023-45853: Documented as false positive
- CVE-2025-4802: Documented as not applicable
- CVE-2023-2953 (libldap): Documented as minor issue
- CVE-2025-6020 (libpam): Documented as HIGH severity unfixed
- CVE-2023-31484 (perl-base): Documented as minor issue
Features
-
Keycloak Integration
- Migrate
ex_authintol8_serverdirectly - Update GraphQL API to authenticate JWT using Keycloak
- Add environment variables for Keycloak configuration
- Fix Keycloak authentication and validation issues
- Migrate
-
Database
- Add
L8Server.Repo.WithAutoReconnectmodule for improved resilience - Fix database connection configuration
- Add backward compatibility with
ExAuth.Repomigrations
- Add
Improvements
- Structured Logging: Initial steps toward structured JSON logging
- OpenTelemetry: Optional OTEL exporter functionality (configurable)
- Web Server Migration: Upgrade from Cowboy to Bandit to resolve HTTP 431 response codes
- Bump max header length to 32KB (later to 50KB for request line, 100KB for headers)
- Fix database idle interval bug for Neon.tech databases
Bug Fixes
- Fixed plugin channel authentication issues
- Fixed graphql authentication and authorization
- Fixed arm64 Docker image builds
- Fixed GraphQL
getNodeConfigtypes
Removed
- Removed auth-related mutations from GraphQL API (security)
[2.2.5] - 2025-01-31
Architecture Refactoring
-
Three Endpoint Architecture: Split into Admin, Plugin, and Public endpoints
- Admin Endpoint (port 4001): Management interface with GraphQL
- Plugin Endpoint (port 4000): WebSocket connections for plugins
- Public Endpoint (port 9000): DID document resolution and public APIs
-
Removed dependency on
L8_NODE_BIND_ADDRESS -
Tightened security on plugin endpoint
-
Cleaned up environment variables and port configuration
Features
- Add
get_usersandget_portsto Toolbox
Bug Fixes
- Fixed plugin reply handling with improved logging
- Fixed gRPC ingress configuration
[2.2.2] - 2025-02-28 to 2025-02-21
Features
-
Observability
- Added OpenTelemetry integration with tracing instrumentation
- Added PromEx for Prometheus metrics
- Instrumented plugin lifecycle: connect, disconnect, send, receive
- Added tracing for DID document controller and resolution
-
Caching
- Added
DidDocCachemodule for DID document caching - Added
DidWebServerCachefor server-level caching - Improved performance for DID resolution
- Added
Improvements
- Enhanced telemetry for plugin sessions, connections, and message passing
- Improved debugging with SSL option logging for gRPC connections
- Added
ecto_dev_loggerfor database query logging in development
Removed
- Cleaned out ExPub references
[2.2.0] - Earlier History
Initial Features
-
Core DIDComm Implementation
- Message pipeline architecture
- Support for DIDComm encryption and signing
- Protocol handlers and message routing
-
Credential System
- Verifiable credentials support
- Credential chain of trust (Twin → Member → Network → Root)
- Present Proof protocol (v3)
-
GraphQL API
- Twin/DID management
- Message sending and receiving
- User and API key management
- Rate limiting
-
Plugin System
- WebSocket-based plugin connections
- API key authentication for plugins
- Protocol registration and message delivery
-
Database
- PostgreSQL with Ecto
- SSL support for production
- Connection pooling and retry logic
- Neon.tech compatibility
-
Transport Layers
- HTTP transport for DIDComm
- gRPC transport with SSL support
- WebSocket for plugins
-
Development Tools
- Toolbox module for interactive development
- Seed data and test helpers
- Script utilities
Infrastructure
- Docker support with multi-stage builds
- Docker image provenance for security
- Environment configuration with Mahaul
- Multiple deployment environments (dev, test, staging, prod)
Version History
4.x Series
- v4.0.0 (2025-10-18): Organization-based authorization system (breaking)
- Unreleased improvements (2025-10-29): Code review enhancements
3.x Series
- v3.0.14 (2025-10-18): Security updates, OpenSSL compatibility, MCP documentation, organization auth foundation
- Consolidates work from 2025-07-21 to 2025-10-18
- Note: No v3.0.7-3.0.13 versions were released
- v3.0.6 (2025-07-16): Connection status tracking via gun events
- v3.0.5 (2025-07-16): API key DID restrictions, structured logging
- v3.0.4 (2025-07-15): Whitelist/blacklist system with wildcards
- v3.0.3 (2025-07-08): updateDid mutation
- v3.0.2 (2025-07-08): Toolbox improvements, DidResolver rename
- v3.0.0 (2025-07-05): Rights→Roles rename, remove geo features (breaking)
2.x Series
- v2.2.10 (2025-06-16): Dependencies update and testing
- v2.2.9 (2025-03-09): Plugin auth fixes
- v2.2.8 (2025-03-09): Container image fix
- v2.2.7 (2025-03-09): Tracer fixes
- v2.2.6 (2025-02-28): Telemetry and metrics instrumentation
- v2.2.5 (2025-01-31): Three endpoint architecture (Admin, Plugin, Public)
- v2.2.4 (2025-01-31): Port and environment configuration cleanup
- v2.2.3 (2025-01-30): Logging improvements
- v2.2.2 (2025-01-29): gRPC ingress fix
- v2.2.1 (2025-01-29): gRPC ingress logic
- v2.2.0 (2025-01-29): Initial tracked release
Legend
- Major Release: Significant new features or milestones
- Breaking Changes: Changes that require action from users
- Features: New functionality
- Bug Fixes: Bug and issue fixes
- Improvements: Enhancements to existing functionality
- Refactoring: Code organization and cleanup
- Removed: Deprecated or removed features
- Security: Security fixes and improvements
- Dependencies: Dependency updates
- Documentation: Documentation improvements
Migration Guides
Migrating to v4.0.0
Required Actions:
-
Set L8_NODE_ORG_SLUG: Add the organization slug environment variable
export L8_NODE_ORG_SLUG=your-org-slug -
Update JWT Tokens: Ensure Keycloak JWT tokens include
portal-org-rolesclaim with one of:/organizations/{org-slug}/owner/organizations/{org-slug}/admin/organizations/{org-slug}/member/organizations/{org-slug}/viewer/global-groups/superadmin(for global access)
-
Remove Legacy Roles: Remove any dependencies on
resource_accessroles from Keycloak configuration -
Test Authorization: Verify that authorized users can access GraphQL API and unauthorized users are rejected
Non-Breaking:
- API key authentication continues to work unchanged
- Internal user system (database roles) unchanged
- Development/test environments can omit
L8_NODE_ORG_SLUG
Migrating to v3.0.0
Required Actions:
-
Terminology Changes:
- Update references from “rights” to “roles” in code and configuration
- Update references from “twin” to “DID” in GraphQL queries/mutations
-
Remove Geo Features:
- Remove any code using geo-related queries or mutations
- Database schema preserved (data not deleted)
-
Error Handling:
- Update error handling to expect
NOT_AUTHORIZEDinstead ofGENERIC_ERROR
- Update error handling to expect
Migrating to v2.2.5
Required Actions:
-
Update Environment Variables:
- Remove
L8_NODE_BIND_ADDRESS(no longer used) - Configure endpoint-specific ports if needed
- Remove
-
Update Client URLs:
- Admin/GraphQL: Port 4001
- Plugin WebSocket: Port 4000
- Public/DID Resolution: Port 9000
Contributing
When adding entries to this changelog:
- Place new entries under the
[Unreleased]section at the top - Use the appropriate emoji/category for the change type
- Reference issue numbers when applicable (e.g., L8-123)
- Keep descriptions concise but informative
- Highlight breaking changes clearly