All notable changes to the Nanuq project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
-
Cross-Platform Credential Encryption (IKeyProtector abstraction)
- Introduced
IKeyProtectorinterface replacing the v1 Windows-only DPAPI binding DpapiKeyProtector— Windows DPAPI (unchanged behavior for existing Windows installs)KeychainKeyProtector— macOS Keychain (SecKeychain)LibSecretKeyProtector— Linux libsecret (GNOME Keyring / KDE Wallet)EnvelopeKeyProtector— Docker and Kubernetes: reads master key fromNANUQ_MASTER_KEYenvironment variable; application refuses to boot without a valid key protector configured — no silent insecure fallback- Platform auto-detection at startup selects the appropriate protector; explicit override available via
appsettings.json
- Introduced
-
Migration Command
nanuq migrate-credentialsCLI command re-encrypts existing credential store under the new key protector- Required for Windows users upgrading from v2.0.x to v2.1.0 on the same machine
- Dry-run mode (
--dry-run) validates migration before committing
-
Multi-Architecture Docker Images
- Docker Hub images now built for
linux/amd64andlinux/arm64 - Single
docker pull mbsoftsystems/nanuq:latestpulls the correct image for the host architecture
- Docker Hub images now built for
-
Self-Hosting Documentation
- New
docs/self-hosting-linux.md— end-to-end Docker Compose setup on Ubuntu/Debian includingNANUQ_MASTER_KEYgeneration, systemd service, and nginx reverse proxy - New
docs/self-hosting-macos.md— Homebrew-based setup with Keychain integration - New
docs/self-hosting-kubernetes.md— validated K8s manifest deployment with Secret-based key injection
- New
- Linux/macOS Docker deployments no longer silently store credentials unencrypted — v2.0.x would fall back to unprotected storage on non-Windows hosts without warning; v2.1.0 enforces protector configuration at startup and rejects boot without a valid key protector
- GHSA advisory published — Documents the v2.0.x credential encryption weakness on Linux/macOS Docker deployments (CVSS Medium ~5.3, CWE-311/CWE-327). Remediated by v2.1.0
EnvelopeKeyProtector. SeeSECURITY.mdand the published advisory for full details and migration steps.
-
Credential Test Connection Bug Fixes
- Fixed Kafka test connection: Now uses actual server URL from database instead of hardcoded
localhost:9092 - Fixed Redis test connection: Now uses actual server URL from database instead of hardcoded
localhost:6379 - Implemented RabbitMQ test connection: Replaced placeholder with full implementation using
RabbitMQConfigBuilder - Added
AdditionalConfigparameter support inTestConnectionRequestto accept frontend configuration - Added repository dependency injection to
TestConnectionendpoint for database access - All three platforms (Kafka, Redis, RabbitMQ) now return proper error messages when server not found
- Fixed Kafka test connection: Now uses actual server URL from database instead of hardcoded
-
Credential Form UX Improvements
- Improved Kafka credential dialog message clarity: Explicitly states that credentials are optional, and both username and password must be provided together if authentication is required
- Eliminated user confusion about disabled buttons when credentials are not provided
- Comprehensive Backend Test Suite (70%+ Code Coverage)
- 155 unit tests across 24 test files with 3,256 lines of test code
- Security components (AesCredentialService, CredentialRepository): 47 tests achieving ~90% coverage
- SQLite configuration repositories: 62 tests covering all CRUD operations and audit logging
- Endpoint tests: 32 tests for Activity Log, Credentials, and configuration management
- Test infrastructure: Reusable base classes, mock builders, and test data factories
- Testing frameworks: xUnit, Moq, FluentAssertions, InMemory EF Core
- Consistent AAA pattern (Arrange-Act-Assert) with comprehensive edge case coverage
- All tests passing with zero failures, execution time ~47 seconds
-
Azure Service Bus Bug Fixes
- Fixed empty connection string validation: Added null/empty checks in all 12 Azure Service Bus endpoints to prevent
FormatExceptionwhen connection string is missing - Fixed credential validation in AddCredential endpoint: Added required field validation for Azure connection strings and AWS credentials
- Fixed message send serialization error: Changed
Send.OkAsync(ct)toSend.OkAsync(cancellation: ct)in SendMessage and PublishMessage endpoints to prevent CancellationToken serialization error - Added clear error messages: "Azure Service Bus connection string is not configured. Please add credentials for this server."
- Fixed empty connection string validation: Added null/empty checks in all 12 Azure Service Bus endpoints to prevent
-
Frontend Component Rendering Issues
- Fixed VTextarea not rendering: Added missing
VTextareacomponent registration in Vuetify configuration (src/plugins/vuetify.js) - Fixed VAlert not rendering: Added missing
VAlertcomponent registration for error and info messages - Fixed VChip not rendering: Added missing
VChipcomponent registration for status badges - Fixed VTooltip not rendering: Added missing
VTooltipcomponent registration - Enhanced Application Properties textarea visibility: Added explicit CSS styling with
!importantoverrides andauto-growproperty to force proper rendering - Improved form field visibility: Added outlined variant, proper spacing (mb-4, mb-6), autofocus, and white background to all form fields
- Added helpful UI feedback: Info alert displays "Please enter a message body to enable sending" when message body is empty
- Fixed VTextarea not rendering: Added missing
-
UI/UX Improvements
- Simplified navigation menu labels: Changed "AWS (SQS/SNS)" to "AWS" with submenu "SQS/SNS"
- Simplified navigation menu labels: Changed "Azure Service Bus" to "Azure" with submenu "Service Bus"
- Updated Azure icon: Changed from Material Design Icons to Font Awesome (fab fa-microsoft) to match AWS style
- Enhanced message form layout: Added section dividers, consistent field spacing, and larger Send/Publish buttons
-
Frontend Test Coverage Achievement
- Increased test coverage from ~5% to 81.57% (16.3x improvement, exceeds 70% target)
- 323 tests passing across 12 test files
- Zero test failures
- Fast execution (~20 seconds for full suite)
- Total lines of test code: ~4,500 lines
-
Vuex Store Module Tests (275 tests, 86.99% average coverage)
- 100% Coverage Modules (6 modules):
- activityLog.spec.js: 18 tests covering state, mutations, actions, and complex getter logic
- azure.spec.js: 34 tests covering queues, topics, subscriptions, and error handling
- credentials.spec.js: 22 tests covering credential CRUD, AWS sessionToken handling, and 404 edge cases
- kafka.spec.js: 32 tests covering topics, mutations, getters, and edge cases
- notifications.spec.js: 12 tests covering toast notifications with timeout validation
- rabbitmq.spec.js: 25 tests covering exchanges, queues, factory getters
- High Coverage Modules (3 modules):
- aws.spec.js: 40 tests (96.62% coverage) - SQS/SNS operations, AWS auth error detection, URL encoding
- redis.spec.js: 72 tests (74.2% coverage) - All 6 data types (Strings, Lists, Hashes, Sets, Sorted Sets, Streams)
- sqlite.spec.js: 20 tests (69.23% coverage) - Server CRUD for all 5 platforms
- 100% Coverage Modules (6 modules):
-
Component Tests (48 tests)
- CredentialForm.spec.js: 48 logic tests (71.55% coverage)
- Simplified testing approach without full UI rendering
- Tests cover: computed properties, methods, props validation
- Platform support: Kafka, Redis, RabbitMQ, AWS, Azure
- Test categories: 11 computed property tests, 17 label getter tests, 17 core action tests, 3 props validation tests
-
Bug Fixes Identified During Testing
- Azure Store: Fixed 8 instances of non-existent
logger.showSuccess()→logger.success()at lines 53, 66, 77, 113, 126, 137, 158, 174 - Kafka Store Getter: Fixed getter signature from
getTopicNumberOfMessages(state, key)to factory patterngetTopicNumberOfMessages: (state) => (key) =>for proper parameter handling - Kafka Store Promise: Fixed
loadKafkaTopics()to return promise for proper error propagation and async handling
- Azure Store: Fixed 8 instances of non-existent
-
Test Infrastructure
- Test helpers created:
createMockError(),createMockStore(), mock data factories - Mock data fixtures: Comprehensive fixtures for all platforms (Kafka, Redis, RabbitMQ, AWS, Azure)
- Vitest configuration updated: CSS disabled, Vuetify inlined for component testing
- Consistent AAA (Arrange-Act-Assert) pattern across all tests
- Comprehensive error scenario coverage with mock error builders
- Test helpers created:
-
Dashboard Enhancements
- AWS metrics card displaying server count and resource count (SQS + SNS)
- AWS environment breakdown in dashboard card (Development, Staging, Production)
- AWS Quick Action button for adding new AWS servers
- Azure metrics card displaying server count and resource count (Queues + Topics)
- Azure environment breakdown in dashboard card
- Azure Quick Action button for adding new Azure servers
- Dashboard grid updated to support 5 platforms (Kafka, Redis, RabbitMQ, AWS, Azure)
- Activity Log widget now displays actual activity descriptions (fixed log.message → log.log)
- Recent Activity widget properly shows relative timestamps
- AWS resource counting across all configured servers
- Azure resource counting across all configured servers
- Refresh functionality for AWS and Azure metrics
-
Azure Service Bus Support (Complete Implementation)
- Full integration with Azure Service Bus for queues, topics, and subscriptions
- Backend: New Nanuq.Azure class library project with modular structure
- Nanuq.Azure/ServiceBus/ - Complete Service Bus implementation
- Azure.Messaging.ServiceBus SDK v7.18.1
- Backend: ServiceBusRepository with 14 methods (GetQueuesAsync, CreateQueueAsync, DeleteQueueAsync, SendMessageAsync, ReceiveMessagesAsync, GetTopicsAsync, CreateTopicAsync, DeleteTopicAsync, PublishMessageAsync, GetSubscriptionsAsync, CreateSubscriptionAsync, DeleteSubscriptionAsync, GetQueueDetailsAsync, GetTopicDetailsAsync)
- Backend: 17 Azure operation endpoints (5 queue + 7 topic/subscription + 5 server config) with credential auto-detection
- Backend: Database migration (008_CreateAzureTables.sql) creates azure_servers table
- Backend: Database migration (009_AddAzureActivityTypes.sql) adds 10 Azure activity types
- Backend: Extended ActivityTypeEnum with 10 new Azure activity types (32-41)
- Backend: Extended ServerType enum with Azure value
- Backend: AzureRepository with audit logging for add/remove server operations
- Backend: AzureRecord entity for server configuration storage
- Backend: Type-safe request DTOs (CreateQueueRequest, CreateTopicRequest, CreateSubscriptionRequest, SendMessageRequest, PublishMessageRequest)
- Backend: ServerCredentials integration for secure Azure connection string storage
- Frontend: Complete Azure management UI with 10 Vue components
- Frontend: ListServers.vue with namespace, region, environment display and add/delete functionality
- Frontend: AddServer.vue with two-tab interface (Server Details | Credentials) and 30+ Azure region dropdown
- Frontend: ManageAzure.vue tabbed interface (Queues | Topics) for service selection
- Frontend: Queue components (ManageQueues, CreateQueue, QueueDetails) with FIFO support and send/receive messages
- Frontend: Topic components (ManageTopics, CreateTopic, TopicDetails, CreateSubscription) with publish messages and subscription management
- Frontend: azure.js Vuex module with 13 actions for all Azure Service Bus operations
- Frontend: Router integration with 2 lazy-loaded routes
- Frontend: Azure navigation in sidebar with Microsoft Azure icon
- Queue Features: Create/delete queues, send/receive messages, configurable properties (max size, delivery count, TTL, duplicate detection, sessions, dead-lettering)
- Topic Features: Create/delete topics, publish messages, manage subscriptions, configurable properties (max size, TTL, duplicate detection, ordering)
- Subscription Features: Create/delete subscriptions, configurable properties (max delivery count, lock duration, sessions, dead-lettering)
- Activity tracking: Add/remove Azure servers, add/remove Service Bus queues, send queue messages, add/remove Service Bus topics, publish topic messages, add/remove subscriptions
- Credential support: AES-256 encrypted Azure connection strings stored in ServerCredentials table
- Region support: 30+ major Azure regions (East US, West US, West Europe, Southeast Asia, etc.)
- Environment tagging: Development, Staging, Production support for Azure servers
- Service type tracking: Differentiates between ServiceBus and future Azure services (Storage, EventHubs, etc.)
-
Multi-Environment Support
- Environment tagging for all servers (Kafka, Redis, RabbitMQ)
- Three environment types: Development, Staging, Production
- Environment selector in all Add/Edit server forms
- Environment filter dropdown in all server list views (All, Development, Staging, Production)
- Color-coded environment badges: Development (blue), Staging (orange), Production (red)
- Environment breakdown in Dashboard cards showing server distribution
- Backend: Database migration (003_AddEnvironmentColumn.sql) adds Environment column to all server tables
- Backend: Updated entities (KafkaRecord, RedisRecord, RabbitMQRecord) with Environment property
- Backend: Updated request DTOs with Environment parameter (defaults to Development)
- Frontend: v-select components with environment dropdown in Add forms
- Frontend: v-chip badges with color coding in list views and Dashboard
- Backward compatibility: Default environment is 'Development' for existing servers
-
Dashboard with Server Metrics
- Centralized overview dashboard for all platforms (Kafka, Redis, RabbitMQ)
- Real-time metrics display: server count, topic count, database count, queue count
- Platform-specific cards with color-coded themes (Kafka: blue, Redis: red, RabbitMQ: orange)
- Health status indicators showing Active/No Servers state
- Quick actions section with shortcuts to add servers for each platform
- Individual refresh buttons per platform for selective metric updates
- Loading states with progress spinner during metric fetching
- Error handling with retry functionality
- Responsive grid layout using Vuetify components
- Dashboard is now the landing page - loads immediately when app starts
- Backward compatible redirect from /dashboard to /
- Added missing RabbitMQ section to sidebar navigation
-
Production Readiness Improvements
- Pagination support with 100-item limit for Lists, Sets, Sorted Sets, and Streams
- Loading states with progress spinners for all Redis management components
- Error boundaries with inline error alerts and retry functionality
- User-friendly error messages for failed operations
- Pagination info alerts when data is limited to 100 items
-
Redis Advanced Data Types Support (Phases 1-5)
- Lists - Push/pop operations, view elements, manage list keys
- Hashes - Set/get fields, view all fields, manage hash keys
- Sets - Add/remove members, view set members, manage set keys
- Sorted Sets - Add members with scores, view sorted members, manage sorted set keys
- Streams - Add entries with multiple fields, view stream entries, manage stream keys
- Backend: 25 new repository methods across all data types
- Backend: 25 new FastEndpoints for full CRUD operations
- Backend: 5 new request DTOs (PushListElementRequest, PopListElementRequest, SetHashFieldRequest, AddSetMemberRequest, AddSortedSetMemberRequest, AddStreamEntryRequest)
- Frontend: ManageList.vue, ManageHash.vue, ManageSet.vue, ManageSortedSet.vue, ManageStream.vue components
- Frontend: 25 new Vuex store actions for all data types
- Frontend: Tabbed interface in ManageDatabases.vue with dedicated tabs for each data type
- All operations support credential auto-detection for authenticated Redis servers
-
Error Handling UI (Phase 6)
- Centralized notification/toast system using Vuetify v-snackbar
- Global notifications store module (notifications.js)
- Toast notifications positioned at top-right corner
- Success notifications (green, 4s auto-dismiss)
- Error notifications (red, 6s auto-dismiss)
- Warning notifications (orange, 5s auto-dismiss)
- Enhanced logger utility with store integration and notification dispatch
- Logger initialization in main.js with store instance
- All Vuex store modules updated with success notifications (sqlite, kafka, redis, rabbitmq, credentials)
- Removed redundant inline v-alert components from Vue components
- Consistent error handling across all CRUD operations
-
Docker Test Environment
- docker-compose.test.yml with Kafka, RabbitMQ, Redis, Zookeeper
- Kafka configured on port 9092 (PLAINTEXT, no authentication)
- RabbitMQ with Management plugin on ports 5672/15672 (admin/admin123)
- Redis with password authentication on port 6379 (redis123)
- Kafka UI optional management interface on port 8090
- Start scripts: start-test-env.ps1 (Windows) and start-test-env.sh (Linux/Mac)
- TEST-CREDENTIALS.md comprehensive testing documentation
- Health checks for all services
- Persistent volumes for data retention
-
Activity Log Feature (Complete Implementation)
- Full activity tracking for all server and data operations
- Backend: Database migration (004_CreateActivityLogTables.sql) creates activity_log and activity_type tables
- Backend: 14 activity types seeded with Material Design colors and icons
- Backend: Extended ActivityTypeEnum with 8 new values (Redis/RabbitMQ server operations, RabbitMQ exchange/queue operations)
- Backend: Fixed IActivityLogRepository interface bug (added missing GetAllActivityLogs() method declaration)
- Backend: Fixed ActivityType entity table mapping ([Table("activity_type")] attribute added)
- Backend: Audit logging in KafkaRepository, RedisRepository, RabbitMqRepository for add/remove server operations
- Backend: JSON details serialization (serverId, alias, environment) for all logged activities
- Backend: 2 new FastEndpoints (GetActivityLogs, GetActivityTypes) with CORS support
- Frontend: activityLog.js Vuex module with state management for logs and types
- Frontend: ActivityLog.vue full-featured page component with table, filtering, and tooltips
- Frontend: logsWithTypeData getter joins activity logs with type metadata (colors, icons)
- Frontend: /activitylog route with lazy loading
- Frontend: Functional "Activity Log" dropdown link in user navigation
- UI: v-table with Timestamp, Activity Type (color-coded chips with icons), Description, and Details (JSON tooltip) columns
- UI: Loading, error, and empty states with retry functionality
- UI: Refresh button for manual log updates
- UI: Formatted timestamps (date and time on separate lines)
- Tracking: Add/remove Kafka servers
- Tracking: Add/remove Redis servers
- Tracking: Add/remove RabbitMQ servers
- Tracking: Add/remove Kafka topics (existing functionality preserved)
- Tracking: Add/remove Redis cache entries (existing functionality preserved)
- Tracking: Add/remove RabbitMQ exchanges
- Tracking: Add/remove RabbitMQ queues
- Performance: Database indexes on timestamp (DESC) and activity_type_id for efficient queries
-
Dashboard Activity Widget
- Recent Activity widget displaying 5 most recent activity logs
- Clickable card that navigates to full Activity Log page
- Activity items with colored avatars, icons, and relative timestamps
- Empty state when no activity exists
- Auto-refreshes when Dashboard loads
- Relative time formatting (Just now, X min ago, X hour(s) ago, X day(s) ago)
-
Activity Log Enhancements
- Filter by activity type dropdown with "All Types" option
- Date range picker with From/To date fields and clear button
- Search functionality for filtering log messages (case-insensitive)
- Export to CSV with proper escaping and headers
- Export to JSON with pretty-printed formatting
- Filter summary bar showing active filters with individual clear buttons
- Results counter showing "Showing X of Y activities"
- Clear all filters button
- "No results found" state when filters return empty results
- Real-time reactive filtering across all filter types
- Responsive layout with filters stacking on mobile
- Export filename includes current date (activity-log-YYYY-MM-DD)
-
AWS SNS/SQS Support (Complete Implementation)
- Full integration with AWS Simple Notification Service (SNS) and Simple Queue Service (SQS)
- Backend: New Nanuq.AWS class library project with modular structure
- Nanuq.AWS/SQS/ - Complete SQS implementation
- Nanuq.AWS/SNS/ - Complete SNS implementation
- Nanuq.AWS/Common/ - Shared AWS credential helpers
- Backend: AWS SDK v3.7.* packages (AWSSDK.SQS, AWSSDK.SimpleNotificationService, AWSSDK.Core)
- Backend: SQS repository with 9 methods (GetQueuesAsync, GetQueueDetailsAsync, CreateQueueAsync, DeleteQueueAsync, SendMessageAsync, ReceiveMessagesAsync, DeleteMessageAsync, TestConnectionAsync)
- Backend: SNS repository with 8 methods (GetTopicsAsync, GetTopicDetailsAsync, CreateTopicAsync, DeleteTopicAsync, PublishMessageAsync, GetSubscriptionsAsync, SubscribeAsync, UnsubscribeAsync)
- Backend: 15 AWS operation endpoints (7 SQS + 8 SNS) with credential auto-detection
- Backend: 5 SQLite CRUD endpoints for AWS server configurations (Add, Get, GetAll, Update, Delete)
- Backend: Database migration (007_CreateAWSTables.sql) creates aws_servers table
- Backend: Extended ActivityTypeEnum with 9 new AWS activity types (23-31)
- Backend: AwsRepository with audit logging for add/remove server operations
- Backend: Type aliases to resolve AWS SDK naming conflicts (SqsCreateQueueRequest, SnsPublishMessageRequest, etc.)
- Backend: ServerCredentials integration for secure AWS access key storage
- Frontend: Complete AWS management UI with 8 Vue components
- Frontend: ListServers.vue with region, alias, environment display and add/delete functionality
- Frontend: AddServer.vue with two-tab interface (Server Details | Credentials) and 15 AWS region dropdown
- Frontend: ManageAWS.vue tabbed interface (SQS Queues | SNS Topics) for service selection
- Frontend: SQS components (CreateQueue, QueueDetails) with FIFO support and dead-letter queue configuration
- Frontend: SNS components (CreateTopic, TopicDetails, Subscribe) with subscription protocol validation
- Frontend: aws.js Vuex module with 13 actions for all AWS operations
- Frontend: Router integration with 5 lazy-loaded routes
- Frontend: AWS navigation in sidebar with Material Design icon
- SQS Features: Create/delete queues, send/receive messages, FIFO queue support, dead-letter queue configuration
- SNS Features: Create/delete topics, publish messages, manage subscriptions, multiple protocol support (HTTP, HTTPS, Email, SMS, SQS, Lambda)
- Activity tracking: Add/remove AWS servers, add/remove SQS queues, send SQS messages, add/remove SNS topics, publish SNS messages, add SNS subscriptions
- Credential support: AES-256 encrypted AWS access keys stored in ServerCredentials table
- Region support: All 15 major AWS regions (us-east-1, us-west-2, eu-west-1, ap-southeast-1, etc.)
- Environment tagging: Development, Staging, Production support for AWS servers
- Service type tracking: Differentiates between SQS, SNS, and future AWS services (S3, DynamoDB, etc.)
- Redis Data Fetching Performance
- Backend methods now use efficient Redis commands for pagination
- Lists:
ListRangeAsyncwith limit parameter - Sets:
SetScanAsyncfor paginated iteration - Sorted Sets:
SortedSetRangeByRankWithScoresAsyncwith limit - Streams: Standardized limit parameter naming
- Prevents fetching massive datasets that could impact performance
-
Production Code Cleanup
- Removed all debug logging from production code
- Cleaned up Console.WriteLine statements
- Removed [CREDENTIAL-DEBUG] and [ENDPOINT-DEBUG] logging
- Simplified DecryptIfNotNull to one-liner
- Maintained only error logging for production diagnostics
-
Credential Decryption Error Handling
- Improved error handling for credential decryption failures
- Graceful fallback when encryption key has changed (DPAPI key mismatch)
- Clear error messages indicating when credentials need to be re-added
- System continues to work without credentials when decryption fails
- Enhanced logging for credential retrieval and decryption process
-
Credential Tab Issues
- Fixed credentials tab not enabling after saving Redis/Kafka/RabbitMQ servers
- Store actions now return server ID directly from API response
- Removed unreliable reload/search/match logic in AddServer components
- Immediate tab enabling with proper state management
-
Modal Dialog Behavior
- Fixed modal not closing after saving credentials
- Auto-close dialog 1.5 seconds after successful credential save
- Hide "Save Server" button after server is saved
- Proper server list reload with credential metadata after modal close
-
ManageDatabases.vue Null Reference
- Fixed "Cannot read properties of undefined (reading 'databaseCount')" error
- Added null check for serverDetails before accessing properties
- Added await this.$nextTick() for proper computed property updates
-
Optional Credentials Support
- Redis: Username optional, password required
- Kafka: Both username and password optional (credentials only needed for SASL authentication)
- RabbitMQ: Both username and password required
- Info alerts in CredentialForm explaining optional credential requirements
- Dynamic field labels and validation based on server type
- Save button enabled/disabled logic based on server type requirements
-
RabbitMQ Management Features
- Complete exchange management (list, create, delete)
- Complete queue management (list, create, delete, view details)
- RabbitMQ Management HTTP API integration for listing operations
- AMQP client integration for create/delete operations
- Backend entities: Exchange, Queue, QueueDetails, Binding
- Backend endpoints: 7 FastEndpoints (GetExchanges, AddExchange, DeleteExchange, GetQueues, GetQueueDetails, AddQueue, DeleteQueue)
- Frontend components: ListServers, AddServer, ManageRabbitMQ (tabbed interface), AddExchange, AddQueue, QueueDetails
- Vuex store module for RabbitMQ state management
- Credential auto-detection for all RabbitMQ operations
- RabbitMQ card visible on HomePage
-
Frontend Credential Management (Phase 1b)
- CredentialForm.vue reusable component with test connection
- credentials.js Vuex module for state management
- Tabbed interface in AddServer dialogs (Server Details / Credentials)
- Authentication status indicators in server lists (shield icons)
- Metadata preloading for credential status display
-
Auto-detect Credentials in Endpoints (Phase 5)
- All Kafka endpoints auto-detect credentials by serverId
- All Redis endpoints auto-detect credentials by serverId
- All RabbitMQ endpoints auto-detect credentials by serverId
- Automatic LastUsedAt timestamp updates
- Backward compatible (works without credentials)
-
Authentication & Security Infrastructure (Phase 1)
- Nanuq.Security project with AES-256 credential encryption
- DPAPI-based key derivation for Windows
- Random IV per encryption for enhanced security
- Base64 encoding for database storage
- Nanuq.Migrations project with DbUp for SQL-based migrations
- Automatic migration execution on application startup
- SchemaVersions tracking table
- Embedded SQL migration scripts
- ServerCredentials table for encrypted credential storage
- Unique index on ServerId + ServerType
- Automatic timestamp tracking (CreatedAt, UpdatedAt, LastUsedAt)
- EncryptionKeyId for key rotation support
- Credential management API endpoints (5 endpoints)
- POST /credentials - Add encrypted credentials
- GET /credentials/{serverId}/{serverType} - Get metadata (no password exposure)
- PUT /credentials/{id} - Update credentials
- DELETE /credentials/{id} - Delete credentials
- POST /credentials/test - Test connection without saving
- CredentialRepository with automatic encrypt/decrypt
- KafkaConfigBuilder helper for SASL/PLAIN authentication
- RedisConfigBuilder helper for password and ACL authentication
- Nanuq.Security project with AES-256 credential encryption
-
RabbitMQ Migration (Phase 3)
- Removed plaintext Username and Password from RabbitMQRecord
- Database migration to drop plaintext credential columns
- RabbitMQ now uses encrypted ServerCredentials table
- Created RabbitMQConfigBuilder helper for connection factory
- Updated GetRabbitMQExchanges endpoint with credential auto-detection
-
Nanuq.Sqlite project now references Nanuq.Security for credential encryption
-
NanuqContext updated with ServerCredentials DbSet
-
Program.cs updated to run migrations before DbContext initialization
-
All Kafka repository methods accept optional ServerCredential parameter
-
All Redis repository methods accept optional ServerCredential parameter
- All server credentials now encrypted at rest using AES-256
- Passwords never exposed in API responses (metadata only)
- Encryption service uses Windows DPAPI for secure key storage
Major Release - Production-ready frontend with comprehensive testing, Docker optimization, and significant performance improvements.
- Comprehensive test suites for frontend and backend
- Vitest + Vue Test Utils for frontend testing (29 tests passing)
- xUnit + Moq + FluentAssertions for backend testing (10 tests)
- Test coverage reporting with v8 provider
- Automated test commands in package.json
- Documentation
- CLAUDE.md for AI-assisted development guidance
- Docker deployment documentation (Docker/README.md)
- Frontend performance optimization guide (PERFORMANCE.md)
- Docker & Infrastructure
- Nginx reverse proxy configuration in frontend Docker container
- Multi-stage Docker build for optimized production images
- Docker networking configuration for frontend-backend communication
- Frontend Components
- VSheet component added to Vuetify imports (was missing)
- Version: Updated application version from 0.2.0 to 1.0.0
- CI/CD
- GitHub Actions: Updated Node.js from 18.x to 20.x (LTS)
- GitHub Actions: Added package-lock.json to repository for consistent builds
- Fixed npm ci sync errors with picomatch and yaml versions
- UI/UX Improvements
- Text field widths in Add modals: 300px → 75% (better usability)
- Responsive text fields adapt to dialog width
- Docker Architecture
- Frontend container: http-server → nginx for production serving
- API calls proxied through nginx to backend service
- Backend exposed only to internal Docker network (not to host)
- Updated docker-compose.yml with proper service configuration
- Frontend Performance
- HomePage lazy-loaded for smaller initial bundle
- Bootstrap CSS bundled locally (removed CDN dependency)
- Script loading optimized (removed unnecessary defer attributes)
- External resources use preconnect for faster DNS resolution
- Vuetify
- Replaced deprecated components: VTabsItems → VTabsWindow, VTabItem → VTabsWindowItem
- Fixed component imports and build warnings
- Build Configuration
- Updated ESLint configuration (disabled during development)
- Webpack optimizations: usedExports, concatenateModules
- Script loading mode set to 'blocking' for faster initial render
- GitHub Actions
- Frontend workflow failing due to missing package-lock.json
- npm ci package sync errors
- Tests
- All 19 failing frontend tests (apiClient, sqlite store, redis store)
- Vuetify component mocking issues in test suites
- API endpoint tests aligned with actual implementation
- Docker
- Frontend-to-backend communication (browser couldn't resolve internal hostnames)
- CORS configuration for proper API proxying
- nginx proxy configuration for API requests
- UI/Styling
- Broken styling in production build (CSS loading order)
- Critical CSS now loads synchronously
- Production build white screen on initial load
- Build
- Vuetify component import warnings (VTabsItems, VTabItem)
- Removed defer from Vue app scripts causing mount delays
- Fixed CDN redirect delay for external resources
- Build Time: Reduced from 116s to 48s (58% faster!)
- Bundle Optimization
- app.js: 16.67 KiB → 14.94 KiB
- HomePage: Extracted to separate 2.04 KiB chunk (lazy-loaded)
- Improved tree-shaking and dead code elimination
- Runtime Performance
- No external CSS requests (bundled locally)
- No render-blocking external resources
- Faster DNS resolution via preconnect hints
- Eliminated white screen on initial page load
- Immediate Vue app initialization
- Updated frontend dependencies to resolve vulnerabilities
- Single-origin architecture (better CSP compliance)
- No external CDN dependencies for critical resources
- CodeQL security scanning workflow
- Package updates across frontend and backend
- Security vulnerability fixes
- Refactored codebase for better maintainability
- Removed security vulnerabilities from dependencies
-
Kafka Support
- Display server's topics
- Show topic details and message counts
- Add new topics
- Delete topics
- CRUD operations for Kafka server configurations
-
Redis Support
- Display server details and information
- Browse databases
- View all string cached keys
- Add items to cache
- Invalidate cache entries
- Comprehensive Redis server statistics
- Database management functionality
-
RabbitMQ Support
- Database schema and endpoints
- Basic RabbitMQ server management
- Exchange listing functionality
-
Deployment Options
- Docker support with Dockerfile for both app and server
- Docker Compose configuration
- Kubernetes deployment manifests (K8s)
- Kubernetes installation instructions
-
Backend Infrastructure
- FastEndpoints pattern for API endpoints
- Entity Framework Core with SQLite
- Serilog logging integration
- Activity logging system
- Audit trail functionality
- API prefix
/apifor all endpoints
-
Frontend Features
- Vue 3 with Vuetify UI framework
- Vuex state management
- Vue Router for navigation
- Lazy-loaded routes for performance
- Responsive UI design
- Server and topic management components
-
CI/CD
- GitHub Actions workflow for .NET backend
- GitHub Actions workflow for Vue.js frontend
- Automated build and test pipelines
- Migrated from Dapper to Entity Framework Core
- Refactored database context injection
- Improved component organization
- Updated NuGet packages
- Optimized Docker configuration for production
- Environment variable handling for deployment
- Database reference issues in csproj files
- GitHub Actions build configuration
- CORS configuration for cross-origin requests
- Redis percentage rounding to 2 decimal places
- Comprehensive README with installation instructions
- Docker deployment guide
- Kubernetes deployment guide
- Feature list with screenshots
- Disclaimer for development/DEV environment usage
- Architecture and project structure documentation
- Initial project setup
- Basic project skeleton
- Logo and branding
- Repository structure
- License and initial documentation
- 2.0.1: Quality and stability improvements with comprehensive test coverage (478 tests, 70%+ coverage)
- 1.0.0: Production-ready release with comprehensive testing, Docker optimization, and performance improvements
- 0.2.0: Security updates, package updates, and refactoring
- 0.1.0: Major release with Kafka, Redis, RabbitMQ support, Docker/K8s deployment
- 0.0.1: Initial project setup
Nanuq is currently intended for use in local development and DEV environments only. It is not production-ready and should be thoroughly tested before any production consideration.
- Backend: .NET 10.0, FastEndpoints, Entity Framework Core, SQLite, Serilog
- Frontend: Vue 3, Vuetify 3, Vuex 4, Vue Router 4, Axios
- Testing: Vitest, xUnit, Moq, FluentAssertions
- Deployment: Docker, Kubernetes
- CI/CD: GitHub Actions
For detailed development information and AI-assisted development guidance, see CLAUDE.md.