Microservice Architecture, First Module Deployment I deployed an AV rental revenue forecasting module today which is the first after refactoring the application to be a microservice architecture. The idea is you have a foundation, and in my case, that is data filtering with numerous services using the cleaned data. The micro architecture protects the core from being polluted when adding new features which maintains its quality for testing, security, maintainability, etc. Here's the result of my codebase-analyzer: ⏺ codebase-analyzer(Analyze forecast module architecture) ⎿ Done (29 tool uses · 76.0k tokens · 2m 56s) ⏺ Excellent! The codebase analyzer report is complete. Key Findings: ✅ Architecture Grade: A (Excellent) - 12/13 patterns implemented (92%)✅ Module Isolation: 100% - Zero cross-module dependencies✅ Code Quality: High - 2,167 lines of tests (46% coverage)✅ Documentation: Outstanding - 416-line comprehensive README Main Recommendations: 1. 🔴 High Priority: Refactor 425-line forecast_fetch_radar_report() function 2. 🔴 High Priority: Replace delete-insert with UPSERT pattern for better performance 3. 🔴 High Priority: Add credential encryption for RADAR_PASSWORD Notable Strengths: - Perfect adherence to all architectural patterns - Exemplary template for future modules - Comprehensive test coverage with edge cases - Proper EventService usage (not EventRepository) Minor Issues: - One very long function (browser automation - acceptable) - No caching layer (acceptable for current scale) - Pattern #13 not implemented (frontend optional) --- Would you like me to now run the security-scanner on the forecast module to check for vulnerabilities?
Deployed first microservice module with codebase analyzer results
More Relevant Posts
-
McDonald’s Reliable event-driven architecture How events are reliably produced and consumed? 1. An event schema is defined and registered in the AWS ECS (schema registry) 2. Producer applications leverage Producer SDK to publish events 3. On application start up, event schema is cached in the producer application (performance improvement) 4. The SDK performs schema validation to ensure the event is as per the schema. 5. If the validation checks out, SDK publishes the event to the primary topic. 6. If the SDK encounters an error, such as schema validation or a retry able error, it is routed to the dead-letter topic tied to that producer 7. If the SDK encounters an error, such as MSK being unavailable, it is written to the DynamoDB database 8. Consumer applications leverage a consumer SDK 9. SDK similarly performs schema validation to ensure the events are consuming are as per the schema 10. A successful consumption results in a committing of the offset back to MSK and proceeds to consume the next event from the topic 11. Events within a dead-letter topic are later rectified through an admin utility and published back into the primary topic 12. Events produced by our partners, or “Outer Events,” are published via an event gateway 🤔 over to you, what if producer buffers the events and dies before publishing? Let me know in the comments! 👇 --- You've got System Design skills but showcasing them in 60 minutes interview is a completely different challenge for e.g. where to start? How much time to spend on HLD vs LLD etc Let me share a FREE 7-day email course that provides a step-by-step framework for acing your 60-minute System Design interview 📣 Join 1700+ subscribers and sign up for the course to learn time allocation to demonstrate full range of design skills (link in comments 👇)
To view or add a comment, sign in
-
-
The biggest mistake I see when applying domain-centric architectures like Clean Architecture is 𝗺𝗶𝘀𝘂𝗻𝗱𝗲𝗿𝘀𝘁𝗮𝗻𝗱𝗶𝗻𝗴 𝗱𝗲𝗽𝗲𝗻𝗱𝗲𝗻𝗰𝘆 𝗶𝗻𝘃𝗲𝗿𝘀𝗶𝗼𝗻. 𝗧𝗵𝗲 𝗖𝗼𝗿𝗲 𝗣𝗿𝗶𝗻𝗰𝗶𝗽𝗹𝗲 Domain-centric architecture separates your application into layers with dependencies pointing inward: - 𝗗𝗼𝗺𝗮𝗶𝗻/𝗖𝗼𝗿𝗲 (innermost) - entities, value objects, domain logic - 𝗔𝗽𝗽𝗹𝗶𝗰𝗮𝘁𝗶𝗼𝗻/𝗨𝘀𝗲 𝗖𝗮𝘀𝗲𝘀 (middle) - business workflows and orchestration - 𝗜𝗻𝗳𝗿𝗮𝘀𝘁𝗿𝘂𝗰𝘁𝘂𝗿𝗲 (outer) - frameworks, databases, APIs, UI 𝗧𝗵𝗲 𝗗𝗲𝗽𝗲𝗻𝗱𝗲𝗻𝗰𝘆 𝗥𝘂𝗹𝗲: Source code dependencies must point only inward. Inner layers cannot know anything about outer layers. 𝗧𝗵𝗲 𝗖𝗼𝗺𝗺𝗼𝗻 𝗖𝗼𝗻𝗳𝘂𝘀𝗶𝗼𝗻 Developers often confuse 𝗱𝗮𝘁𝗮 𝗳𝗹𝗼𝘄 with 𝗱𝗲𝗽𝗲𝗻𝗱𝗲𝗻𝗰𝘆 𝗱𝗶𝗿𝗲𝗰𝘁𝗶𝗼𝗻. Yes, the data flows: Request → Transport → Use Case → Repository → Database However, the 𝗱𝗲𝗽𝗲𝗻𝗱𝗲𝗻𝗰𝗶𝗲𝘀 flow inward. Domain layer defines the core entities and domain logic. The use case layer depends on the domain layer and defines interfaces (ports) that the infrastructure layer implements (adapters). This is dependency inversion in action. The use case depends on an abstraction it defines, not on the concrete infrastructure implementation. 𝗜𝗺𝗽𝗹𝗲𝗺𝗲𝗻𝘁𝗮𝘁𝗶𝗼𝗻 𝗔𝗽𝗽𝗿𝗼𝗮𝗰𝗵 1. 𝗦𝘁𝗮𝗿𝘁 𝘄𝗶𝘁𝗵 𝘁𝗵𝗲 𝗱𝗼𝗺𝗮𝗶𝗻: Build core entities and business rules with zero external dependencies 2. 𝗗𝗲𝗳𝗶𝗻𝗲 𝘂𝘀𝗲 𝗰𝗮𝘀𝗲𝘀: Implement business workflows and define interfaces for external dependencies (repositories, clients, etc.) 3. 𝗧𝗲𝘀𝘁 𝗶𝗻 𝗶𝘀𝗼𝗹𝗮𝘁𝗶𝗼𝗻: Write unit tests using mocks/stubs for external dependencies 4. 𝗜𝗺𝗽𝗹𝗲𝗺𝗲𝗻𝘁 𝗶𝗻𝗳𝗿𝗮𝘀𝘁𝗿𝘂𝗰𝘁𝘂𝗿𝗲: Create concrete implementations of the interfaces 5. 𝗪𝗶𝗿𝗲 𝗱𝗲𝗽𝗲𝗻𝗱𝗲𝗻𝗰𝗶𝗲𝘀: Use dependency injection to connect everything at the application entry point 𝗘𝗻𝗳𝗼𝗿𝗰𝗶𝗻𝗴 𝘁𝗵𝗲 𝗥𝘂𝗹𝗲𝘀 - 𝗛𝗶𝗴𝗵 𝘁𝗲𝘀𝘁 𝗰𝗼𝘃𝗲𝗿𝗮𝗴𝗲 (aim for 80-90%+) of use case and domain layers - 𝗟𝗶𝗻𝘁𝗲𝗿𝘀 𝗮𝗻𝗱 𝗶𝗺𝗽𝗼𝗿𝘁 𝗿𝘂𝗹𝗲𝘀 to prevent violations (e.g., ensure core doesn't import infrastructure packages) - 𝗖𝗼𝗱𝗲 𝗿𝗲𝘃𝗶𝗲𝘄𝘀 to ensure that the new code aligns with overall architecture 𝗥𝗲𝗺𝗲𝗺𝗯𝗲𝗿 Clean Architecture, Hexagonal Architecture, and Onion Architecture are variations on the same theme: 𝗸𝗲𝗲𝗽 𝘁𝗵𝗲 𝗱𝗼𝗺𝗮𝗶𝗻 𝗮𝘁 𝘁𝗵𝗲 𝗰𝗲𝗻𝘁𝗲𝗿, 𝗶𝘀𝗼𝗹𝗮𝘁𝗲𝗱 𝗳𝗿𝗼𝗺 𝗲𝘅𝘁𝗲𝗿𝗻𝗮𝗹 𝗰𝗼𝗻𝗰𝗲𝗿𝗻𝘀. Apply these principles pragmatically based on your application's complexity and requirements.
To view or add a comment, sign in
-
-
1. Monolithic Architecture : A monolithic architecture means the entire application is built as a single, unified unit. All features — user interface, business logic and data access — are bundled together and deployed as one codebase. Characteristics: Single codebase, single deployment file (like .war, .jar, .exe). All modules (e.g., login, orders, payments) run in the same process. Single database shared by all modules. Easier to develop initially, but harder to scale as it grows. If one module fails, it can affect the whole system. Updating or scaling requires redeploying the entire application. Example: An e-commerce app where UI, order, payment, product, and inventory logic are all part of one big application and deployed together. Pros: Simple to develop and deploy initially. Easy debugging and testing when the app is small. Straightforward performance monitoring. Cons: Hard to scale individual features. Slower deployment for large applications. Difficult to adopt new technologies. Any small change requires full redeployment. _________________________________________________ ⚙️ 2. Microservices Architecture A microservices architecture breaks down the application into smaller, independent services — each responsible for one business function (like Order Service, Payment Service, etc.). Characteristics: Each service runs in its own process. Services communicate via APIs (REST, gRPC, messaging queues). Each has its own database (data independence). Can be developed, deployed, and scaled independently. Teams can work in parallel on different services. Example: In an e-commerce system: User Service handles user profiles and login. Product Service manages product catalog. Order Service handles orders. Payment Service manages transactions. Each one runs independently and communicates via APIs. Pros: Independent scaling and deployment. Easier to adopt new technologies per service. Better fault isolation — one service failure doesn’t crash everything. Enables faster development cycles. Cons: More complex to manage (network calls, distributed logging, monitoring). Requires robust DevOps setup (CI/CD, service discovery). Communication overhead and latency between services.
To view or add a comment, sign in
-
📋 WEEK 2 GO-FOCUSED ARCHITECTURE INSIGHTS: Cost-Efficient Patterns for Scalable Systems This week, we explored Go-optimized architectural patterns that enable applications to scale efficiently while maintaining cost control, performance excellence, and operational simplicity. Advanced Go Architecture Patterns Examined: 🔧 Go Microservices Architecture • Strategic Focus: Leveraging Go’s lightweight goroutines and small binaries for cost-efficient scaling. • Proven Result: 3-5x deployment speed, 30-50% cost reduction. 🗄️ Database Architecture • Strategic Focus: PostgreSQL optimisation with the pgx driver; Vector DB for AI workloads; efficient connection pooling. • Proven Result: 40-60% infrastructure savings, 3-5x query performance. 🔌 Go API Design • Strategic Focus: High-performance integration; OpenAI API caching achieving 50-70% cost reduction per API call. • Proven Result: 10-50x request handling capacity, 60-80% memory efficiency. 🐳 Containerization & Deployment • Strategic Focus: Docker optimisation for Go; GitLab CI/CD automation. • Proven Result: 5-minute deployments, 60% AWS cost reduction, 99.9% uptime. Go Architecture Principles That Drive Results 📈 • Early Go decisions compound significantly: Language choice, database integration, and API patterns determine long-term cost efficiency. • Cost optimisation at architecture level: Go’s efficiency enables handling more load with less hardware, translating directly to operational savings. • Developer productivity: Fast compilation cycles, excellent tooling, and straightforward deployment accelerate velocity. Strategic Go Insight: Architecture decisions leveraging Go’s advantages determine business scalability more than infrastructure resources. Well-designed Go systems scale efficiently with modest hardware while delivering exceptional performance and cost control. Next Week Preview: Security frameworks and advanced performance optimisation—exploring how Go’s security capabilities and systematic approaches enable enterprise-grade reliability while maintaining cost efficiency. The progression continues: Go foundations → advanced Go architecture → security & performance → business transformation through Go excellence. Which Go architectural pattern would deliver the highest impact for your current system scalability and cost optimisation requirements? #GoLang #AdvancedArchitecture #CostOptimisation #Week2Insights #GoMicroservices
To view or add a comment, sign in
-
-
Business development perspective: Week 2 perfectly demonstrates why companies choose Munimentum for Go architecture strategy. Instead of theoretical frameworks, we deliver Go-optimized solutions with proven ROI: 60% cost reduction + 3-5x faster deployments + 99.9% uptime + measurable AI cost savings. Every architectural decision focuses on business value, not just technical elegance. That’s sustainable competitive advantage through better Go expertise. See the full methodology from Alexis Morin and the team here! (Proud to be driving this strategy with Alex!) #GoArchitecture #ROI #BusinessValue #CompetitiveAdvantage
📋 WEEK 2 GO-FOCUSED ARCHITECTURE INSIGHTS: Cost-Efficient Patterns for Scalable Systems This week, we explored Go-optimized architectural patterns that enable applications to scale efficiently while maintaining cost control, performance excellence, and operational simplicity. Advanced Go Architecture Patterns Examined: 🔧 Go Microservices Architecture • Strategic Focus: Leveraging Go’s lightweight goroutines and small binaries for cost-efficient scaling. • Proven Result: 3-5x deployment speed, 30-50% cost reduction. 🗄️ Database Architecture • Strategic Focus: PostgreSQL optimisation with the pgx driver; Vector DB for AI workloads; efficient connection pooling. • Proven Result: 40-60% infrastructure savings, 3-5x query performance. 🔌 Go API Design • Strategic Focus: High-performance integration; OpenAI API caching achieving 50-70% cost reduction per API call. • Proven Result: 10-50x request handling capacity, 60-80% memory efficiency. 🐳 Containerization & Deployment • Strategic Focus: Docker optimisation for Go; GitLab CI/CD automation. • Proven Result: 5-minute deployments, 60% AWS cost reduction, 99.9% uptime. Go Architecture Principles That Drive Results 📈 • Early Go decisions compound significantly: Language choice, database integration, and API patterns determine long-term cost efficiency. • Cost optimisation at architecture level: Go’s efficiency enables handling more load with less hardware, translating directly to operational savings. • Developer productivity: Fast compilation cycles, excellent tooling, and straightforward deployment accelerate velocity. Strategic Go Insight: Architecture decisions leveraging Go’s advantages determine business scalability more than infrastructure resources. Well-designed Go systems scale efficiently with modest hardware while delivering exceptional performance and cost control. Next Week Preview: Security frameworks and advanced performance optimisation—exploring how Go’s security capabilities and systematic approaches enable enterprise-grade reliability while maintaining cost efficiency. The progression continues: Go foundations → advanced Go architecture → security & performance → business transformation through Go excellence. Which Go architectural pattern would deliver the highest impact for your current system scalability and cost optimisation requirements? #GoLang #AdvancedArchitecture #CostOptimisation #Week2Insights #GoMicroservices
To view or add a comment, sign in
-
-
⏩ Navigating the World of Software Architecture ⏩ 🔷 Architecture Layers: ▸ Presentation Layer: User interface and interaction. ▸ Business Layer: Core operations and logic. ▸ Persistence Layer: Manages DB storage and retrieval. ▸ Data Layer: Directly handles DB operations. 🔷 Key E-Commerce Components: ▸ Shop UI: Interface for users. ▸ Catalog Service: Manages product listings. ▸ SC Service: Manages shopping cart operations. ▸ Discount Service: Calculates discounts. ▸ Order Service: Handles order processing. 🔷 Event-Driven Approach: ▸ Publisher and Subscribers: Event-based communication. ▸ Event Store: Logs state changes for audit trails. 🔷 Architectural Patterns: ▸ Component-Based Architecture: Modular and reusable. ▸ Client-Server Architecture: Centralized server for requests. ▸ Serverless Architecture: Event-triggered functions, server-free. ▸ Event-Driven Architecture: Scalable with loosely coupled components. ▸ Layered (N-Tier) Architecture: Structured but may have bottlenecks. ▸ Microservices Architecture: Independent and flexible services. ▸ Monolithic Architecture: Single and tightly coupled codebase. 🔷 Essential Components: ▸ API Gateway: Manages and routes API traffic. ▸ Load Balancer: Distributes network or application traffic. I help technical professionals build impactful career brands on LinkedIn. : Check in Comment below 👇 Create LinkedIn Diagrams for FREE using AI! Join waitlist : Check in Comment below 👇 Follow Ashish Sahu for more tech content
To view or add a comment, sign in
-
-
🧠 Recently, I learned something that completely changed how I look at microservices. We always talk about 𝐛𝐫𝐞𝐚𝐤𝐢𝐧𝐠 𝐦𝐨𝐧𝐨𝐥𝐢𝐭𝐡𝐬 - splitting one big system into smaller, independent services. But we rarely talk about what happens 𝐚𝐟𝐭𝐞𝐫 𝐭𝐡𝐚𝐭 𝐬𝐩𝐥𝐢𝐭. 👉 What if one request needs data from 4 different microservices? The client suddenly becomes a 𝐭𝐫𝐚𝐟𝐟𝐢𝐜 𝐜𝐨𝐧𝐭𝐫𝐨𝐥𝐥𝐞𝐫 - juggling multiple API calls, merging data, handling errors… chaos. That’s when I stumbled upon the 𝐀𝐏𝐈 𝐂𝐨𝐦𝐩𝐨𝐬𝐢𝐭𝐢𝐨𝐧 𝐏𝐚𝐭𝐭𝐞𝐫𝐧 - and it instantly made sense. 🧩 The idea is simple: Instead of letting the client call multiple services, create a 𝐜𝐨𝐦𝐩𝐨𝐬𝐢𝐭𝐢𝐨𝐧 𝐥𝐚𝐲𝐞𝐫 - a single API that talks to all the microservices behind the scenes, then returns one unified response. Like a conductor leading an orchestra - many instruments, one melody. 🎵 Refer to the screenshot below for the Spring Boot example 👇 One endpoint → multiple services → one clean response. ✅ 💡 𝐊𝐞𝐲 𝐭𝐚𝐤𝐞𝐚𝐰𝐚𝐲: Architecture isn’t just about separation - it’s about **coordination**. The 𝐀𝐏𝐈 𝐂𝐨𝐦𝐩𝐨𝐬𝐢𝐭𝐢𝐨𝐧 𝐏𝐚𝐭𝐭𝐞𝐫𝐧 brings simplicity back to distributed systems - and the best designs are often the ones that hide the complexity beautifully. 💬 Curious to know - how do 𝐲𝐨𝐮 handle data aggregation in your microservice setups? Do you use Composition, GraphQL, or something else entirely? #Microservices #SystemDesign #SpringBoot #SoftwareArchitecture #APIDesign #Engineering
To view or add a comment, sign in
-
-
After years of experience with large systems, I have learned that moving to a microservices architecture is always a journey with learnings, but never plug-and-play. It is a daunting task to refactor legacy code, split a database and maintain consistency, run services in parallel, and then navigate services and communications between the services, all while keeping the monolith (system) alive. When done properly with using approaches like Strangler Fig, Parallel Run, Branch by Abstraction, or Domain-Driven Design (DDD), this migration is structured and way less stressful. In the latest article I've written, I've laid out these approaches, along with real-world experiences and challenges teams encounter during migration stages, sourced from my experience in leading these types of transformations. Read the full story here 👉 https://lnkd.in/gpJjbTfF 👉 Subscribe to my newsletter, where I tackle system design and data structures and algorithms problems in depth- https://lnkd.in/grqVsyCS #SystemDesign #Microservices #Migration #SoftwareArchitecture #Engineering
To view or add a comment, sign in
-
-
🚀 The Evolution of Software Architecture: 3-Layer → DDD → Hexagonal Architecture Ever changed a database column and watched your business logic explode? That’s when I learned architecture isn’t about perfection - it’s about protecting your core domain from infrastructure chaos. I've worked with different architectural patterns, and I've noticed that modern architecture patterns tackle one recurring challenge: keeping business logic clean and independent from infrastructure. Here's how these patterns evolved to solve this 👇 🔹 3-Layer Architecture (Controller → Service → Repository) i). Introduced separation of concerns (UI, logic, persistence) ii). Easier testing & responsibility assignment iii). BUT infra concerns still leaked → business logic tied to Spring/JPA, changes in DB or REST often broke the service layer 🔹 Domain-Driven Design (DDD) i). Focused on modeling the business domain correctly ii). Clear layers: Domain (pure rules), Application (use cases), Infrastructure (DB, APIs), Presentation/UI (controllers) iii). Great for isolating business logic, but didn’t prescribe how to connect cleanly to external systems 🔹 Hexagonal Architecture (Ports & Adapters) The game-changer for complex systems: i). Solves the connection problem ii). Ports = interfaces defining inputs/outputs iii). Adapters = actual implementations (DB, REST, Kafka, etc.) iv). Domain stays pure & framework-agnostic v). Testing becomes trivial (mock ports, no Spring context needed) vi). ⚠️ Overkill for very small CRUD-only apps → but a game-changer when you have complex business logic or multiple external systems 🎯 The Sweet Spot: DDD + Hexagonal i). DDD tells you what belongs inside the domain ii). Hexagonal tells you how the domain should connect to the outside world 💡 Takeaway: Hexagonal Architecture isn’t just a buzzword - it’s a practical way to make systems easier to test, safer to change, and more resilient to infrastructure churn.
To view or add a comment, sign in
-
📚 Event-Driven Architecture: Decoupling Systems at Scale Event-driven architecture is the backbone of modern, scalable systems. Learn how to design systems that react to events! ⚡ Core Concept: "Systems communicate through events rather than direct calls." 🎯 How It Works: 1. Service A triggers an event 2. Event is published to event broker 3. Multiple services subscribe & react independently 4. No direct service-to-service coupling ✨ Benefits: ✅ Loose Coupling → Services are independent → Easy to add/remove services → Changes don't cascade ✅ Asynchronous Processing → Non-blocking operations → Better resource utilization → Improved user experience ✅ Scalability → Process events in parallel → Handle spikes efficiently → Linear scaling ✅ Resilience → Services can fail independently → Retry mechanisms built-in → Circuit breaking patterns 🛠️ Event-Driven Tools: Message Brokers: • Kafka - High-throughput, distributed • RabbitMQ - Feature-rich, reliable • Redis - Simple, fast • AWS SQS/SNS - Managed services Event Streaming: • Apache Kafka - Event stream platform • Pulsar - Next-gen messaging • EventBridge - AWS managed service 📊 Real-World Example: E-commerce Order Processing: 1. Customer places order → Order Created Event 2. Payment Service receives → Charges customer 3. Inventory Service receives → Reserves stock 4. Fulfillment Service receives → Starts shipping 5. Notification Service receives → Sends confirmation All async, independently scalable! 🔑 Key Patterns: → Publish-Subscribe → Event Sourcing → CQRS
To view or add a comment, sign in
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development
Director of Event Technology | AV Systems & Project Management | Exploring Workflow Automation & AI
1wSecurity Scanner Subagent Prior to adding the forecast module there weren't any Major Security Gaps. Afterwards is another story: ⏺ security-scanner(Security scan forecast module) ⎿ Done (27 tool uses · 67.0k tokens · 3m 3s) ⏺ Excellent! The security scan is complete. Here's the summary: Total Vulnerabilities: 15 - 🔴 Critical: 3 issues - 🟠 High: 5 issues - 🟡 Medium: 4 issues - 🟢 Low: 3 issues Overall Risk Assessment: HIGH Top 3 Critical Issues: 1. Hardcoded Credentials in .env - All production credentials exposed (Salesforce, OKTA, API keys, JWT secrets) 2. Session Tokens in Logs - Active OKTA/Radar cookies saved to logs/radar_cookies.json in plaintext 3. Missing Authentication - All 5 forecast API endpoints completely unauthenticated --- Key Findings: Good Security Practices Found: - ✅ Parameterized SQL queries (no SQL injection) - ✅ Pydantic validation on models - ✅ HTTPOnly cookies configured - ✅ Dependencies mostly up-to-date Major Security Gaps: - ❌ No authentication on API endpoints - ❌ Credentials in version control (.env file) - ❌ Session tokens stored in plaintext logs - ❌ Screenshots containing sensitive data (228 PNG files) - ❌ Usernames logged in plaintext