Composing mixins for event sourcing

Testing Composed Mixins: A TypeScript Event Sourcing Journey

Disclaimer: This blog post is automatically generated from project documentation and technical proposals using AI assistance. The content represents our development journey and architectural decisions. Code examples are simplified illustrations and may not reflect the exact production implementation. Table of Contents The Mixin Composition Challenge Why Mixins for Event Sourcing Building WithShots: Shot Tracking Building WithTiming: Match Events The Event Ordering Problem Testing Strategy with node:test Testing Individual Mixins Testing Composition Data-Driven Testing with Scenarios Key Learnings The Mixin Composition Challenge When Caroline, Claude, and I refactored our Match aggregate to use the Repository pattern, we wanted to separate concerns using TypeScript mixins. The aggregate needed to: ...

December 4, 2025 · 9 min · Claude, Caroline & Stef Hock
AI and human collaboration in code development

Welcome to Claude, Caroline and Me

Disclaimer: This blog post is automatically generated from project documentation and technical proposals using AI assistance. The content represents our development journey and architectural decisions. Code examples are simplified illustrations and may not reflect the exact production implementation. Table of Contents About This Blog The Team The Project What We’re Building Recent Development Iterations What’s Next About This Blog Welcome to “Claude, Caroline and Me” - a development blog documenting the journey of building a modern real-time scoring system for padel matches. This blog captures the iterations, challenges, and solutions as we work together to create something functional and scalable. ...

December 3, 2025 · 4 min · Claude, Caroline & Stef Hock
Breakthrough success in data analytics

Migrating Analytics from PostgreSQL to ClickHouse

Disclaimer: This blog post is automatically generated from project documentation and technical proposals using AI assistance. The content represents our development journey and architectural decisions. Code examples are simplified illustrations and may not reflect the exact production implementation. The Materialized View Problem I was reviewing PostgreSQL slow query logs when Caroline pointed out something concerning: “Our materialized view refreshes are taking longer every week.” She pulled up the stats: SELECT schemaname, matviewname, last_refresh, query_start, current_timestamp - query_start as refresh_duration FROM pg_stat_progress_refresh_mat_view JOIN pg_stat_activity USING (pid); The match_statistics view was taking 18 seconds to refresh. The player_momentum view was at 12 seconds. “That’s only going to get worse as we accumulate more matches,” Caroline said. “And these views lock tables during refresh.” Claude suggested a solution: “ClickHouse is designed for exactly this—analytical queries over large datasets. Keep PostgreSQL for transactions, use ClickHouse for analytics.” We decided to migrate. ...

December 3, 2025 · 11 min · Claude, Caroline & Stef Hock
Data visualization and analytics landscape

Building Real-Time Biometric Tracking for Padel

Disclaimer: This blog post is automatically generated from project documentation and technical proposals using AI assistance. The content represents our development journey and architectural decisions. Code examples are simplified illustrations and may not reflect the exact production implementation. The Biometric Challenge Caroline had a question that changed everything: “What if we could track heart rate during pressure points?” I looked up from my keyboard. “You mean correlate biometric data with match events?” “Exactly,” she said. “We already track every shot, every score change. If we add heart rate and movement data, we could see exactly when players get stressed.” Claude liked the idea: “Biometric data would let you detect fatigue patterns, recovery rates, momentum shifts—all based on actual physiology, not just scores.” We needed a system that could handle high-frequency data (up to 50Hz for gyroscopes), stream it in real-time from wearables, and correlate it with our existing event sourcing system. ...

December 3, 2025 · 11 min · Claude, Caroline & Stef Hock
Digital network architecture and connections

Securing Our Docker Swarm with Overlay Networks

Disclaimer: This blog post is automatically generated from project documentation and technical proposals using AI assistance. The content represents our development journey and architectural decisions. Code examples are simplified illustrations and may not reflect the exact production implementation. The Port Explosion Problem I was reviewing our Docker Compose file when Caroline pointed out a problem: “We’re exposing way too many ports to the host.” She was right. Our current configuration looked like this: traefik: ports: - '8080:80' - '8443:443' postgres: ports: - '5432:5432' clickhouse: ports: - '8123:8123' - '9000:9000' nats: ports: - '4222:4222' - '8222:8222' “That’s six public ports just for infrastructure,” Caroline said. “And we’re not even using standard HTTP/HTTPS ports.” Claude agreed: “In a multi-node Swarm deployment, this is a security nightmare. Anyone who knows your IP can probe those ports.” We needed a better networking architecture—one with proper isolation, encryption, and a single entry point. ...

December 3, 2025 · 11 min · Claude, Caroline & Stef Hock