[{"title":"End-to-End Industrial AI, From Camera to Dashboard","summary":"Building an end-to-end industrial ai pipeline: Jetson Orin inference, EMQX 5.8 transport, a Go 1.24 consumer, and a Grafana 11 dashboard.","tags":["industrial-ai","grafana","golang"],"tracks":["programming"],"url":"/blog/end-to-end-industrial-ai-camera-dashboard/","date":"2026-04-28","img":"/images/blog/end-to-end-industrial-ai-camera-dashboard.svg"},{"title":"Connecting Edge Vision Inference to an MQTT Telemetry Backbone","summary":"How to do edge vision mqtt integration: publish Jetson Orin inference results to an EMQX 5.8 backbone with a resilient Go 1.24 bridge.","tags":["mqtt","jetson","golang"],"tracks":["programming"],"url":"/blog/edge-vision-mqtt-integration/","date":"2026-04-24","img":"/images/blog/edge-vision-mqtt-integration.svg"},{"title":"Tuning MQTT QoS and Persistence for Reliable Sensor Delivery","summary":"How to do mqtt qos persistence tuning with EMQX 5.8 and RocksDB: QoS selection, durable sessions, retained messages, and write-path tuning.","tags":["mqtt","emqx","rocksdb"],"tracks":["programming"],"url":"/blog/mqtt-qos-persistence-tuning/","date":"2026-04-21","img":"/images/blog/mqtt-qos-persistence-tuning.svg"},{"title":"Optimizing MQTT Clusters for Critical Environmental Monitoring","summary":"Practical mqtt cluster optimization with EMQX 5.8 for environmental monitoring: routing tables, backpressure, session persistence, and failover tuning.","tags":["mqtt","emqx","monitoring"],"tracks":["programming"],"url":"/blog/mqtt-cluster-optimization-environmental-monitoring/","date":"2026-04-17","img":"/images/blog/mqtt-cluster-optimization-environmental-monitoring.svg"},{"title":"Processing Millions of Sensor Events per Second with Go","summary":"Golang sensor event processing at millions of events per second with NATS, batching, and partitioned consumers.","tags":["golang","nats","streaming"],"tracks":["programming"],"url":"/blog/golang-sensor-event-processing/","date":"2026-04-14","img":"/images/blog/golang-sensor-event-processing.svg"},{"title":"Building a High-Throughput Telemetry Pipeline in Go","summary":"Build a high-throughput telemetry pipeline in Go with channels, ring buffers, and backpressure.","tags":["golang","concurrency","telemetry"],"tracks":["programming"],"url":"/blog/high-throughput-telemetry-pipeline-go/","date":"2026-04-10","img":"/images/blog/high-throughput-telemetry-pipeline-go.svg"},{"title":"Deploying YOLO Models on NVIDIA Jetson with TensorRT","summary":"A complete YOLO Jetson TensorRT deployment guide covering ONNX export, INT8 engines, and DeepStream 7.","tags":["jetson","tensorrt","deployment"],"tracks":["programming"],"url":"/blog/yolo-jetson-tensorrt-deployment/","date":"2026-04-07","img":"/images/blog/yolo-jetson-tensorrt-deployment.svg"},{"title":"Training a Defect Detection Model for the Factory Floor","summary":"A practical guide to defect detection model training with YOLOv11, PyTorch 2.6, and Roboflow.","tags":["machine-learning","yolo","training"],"tracks":["programming"],"url":"/blog/defect-detection-model-factory-floor/","date":"2026-04-03","img":"/images/blog/defect-detection-model-factory-floor.svg"},{"title":"Architecting Computer Vision Quality Control at the Industrial Edge","summary":"A production blueprint for computer vision quality control at the industrial edge with Jetson Orin, YOLOv11, and TensorRT 10.","tags":["computer-vision","edge-ai","jetson"],"tracks":["programming"],"url":"/blog/computer-vision-quality-control-industrial-edge/","date":"2026-04-01","img":"/images/blog/computer-vision-quality-control-industrial-edge.svg"},{"title":"SLOs and Error Budgets for Distributed AI Pipelines","summary":"Define SLO error budgets for AI pipelines with Prometheus, Sloth, and Grafana 11, including multi-window burn-rate alerts that page on real risk.","tags":["slo","sloth","prometheus"],"tracks":["programming"],"url":"/blog/slo-error-budgets-ai-pipelines/","date":"2026-03-27","img":"/images/blog/slo-error-budgets-ai-pipelines.svg"},{"title":"Managing Grafana Dashboards as Code with Terraform","summary":"Manage Grafana dashboards as code with Terraform 1.10 and Grafonnet: version control, PR review, and an end to manual dashboard drift.","tags":["grafana","terraform","grafonnet"],"tracks":["programming"],"url":"/blog/grafana-dashboards-as-code-terraform/","date":"2026-03-24","img":"/images/blog/grafana-dashboards-as-code-terraform.svg"},{"title":"Building Real-Time Alerting Dashboards with Prometheus and Grafana","summary":"Build Prometheus Grafana alerting dashboards that page on real signal: recording rules, Alertmanager routing, and panels engineers trust.","tags":["prometheus","grafana","alertmanager"],"tracks":["programming"],"url":"/blog/prometheus-grafana-alerting-dashboards/","date":"2026-03-20","img":"/images/blog/prometheus-grafana-alerting-dashboards.svg"},{"title":"Load Testing a Vector Search Pipeline Before It Breaks","summary":"Vector search load testing with Qdrant, k6, and Prometheus. Find your pipeline's breaking point before production traffic does.","tags":["qdrant","k6","load-testing"],"tracks":["programming"],"url":"/blog/vector-search-load-testing/","date":"2026-03-17","img":"/images/blog/vector-search-load-testing.svg"},{"title":"Monitoring Vector Database Performance Under Heavy Load","summary":"Vector database performance monitoring for Qdrant 1.13 with Prometheus 3.x, HNSW internals, and tail-latency signals.","tags":["qdrant","observability","vector-search"],"tracks":["programming"],"url":"/blog/vector-database-performance-monitoring/","date":"2026-03-13","img":"/images/blog/vector-database-performance-monitoring.svg"},{"title":"Tracking Token Usage and Cost per Request with OpenTelemetry","summary":"Build token usage cost telemetry with OpenTelemetry metrics and Prometheus 3.x, and attribute spend per request.","tags":["opentelemetry","observability","finops"],"tracks":["programming"],"url":"/blog/token-usage-cost-telemetry-opentelemetry/","date":"2026-03-10","img":"/images/blog/token-usage-cost-telemetry-opentelemetry.svg"},{"title":"Adopting OpenTelemetry GenAI Semantic Conventions","summary":"Adopt the OpenTelemetry GenAI semantic conventions, migrate ad-hoc attributes, and keep dashboards portable across teams.","tags":["opentelemetry","observability","standards"],"tracks":["programming"],"url":"/blog/opentelemetry-genai-semantic-conventions/","date":"2026-03-06","img":"/images/blog/opentelemetry-genai-semantic-conventions.svg"},{"title":"Instrumenting LLM Calls with OpenTelemetry Traces","summary":"Production guide to OpenTelemetry LLM tracing with Python 3.12, OTLP, span attributes, streaming, and context propagation.","tags":["opentelemetry","observability","python"],"tracks":["programming"],"url":"/blog/opentelemetry-llm-tracing/","date":"2026-03-03","img":"/images/blog/opentelemetry-llm-tracing.svg"},{"title":"Guardrails and Cost Controls for Agentic DevOps in Production","summary":"Production agentic devops guardrails using OpenTelemetry, token budgets, and policy gates to keep autonomous agents safe and cheap.","tags":["opentelemetry","guardrails","agentic-devops"],"tracks":["programming"],"url":"/blog/agentic-devops-guardrails-cost-controls/","date":"2026-02-27","img":"/images/blog/agentic-devops-guardrails-cost-controls.svg"},{"title":"Generating and Maintaining Test Suites with Agent Loops","summary":"Build ai generated test suites that maintain themselves with an agent loop driven by pytest 8 and coverage.py.","tags":["pytest","coverage","agent-loop"],"tracks":["programming"],"url":"/blog/ai-generated-test-suites-agent-loops/","date":"2026-02-24","img":"/images/blog/ai-generated-test-suites-agent-loops.svg"},{"title":"AI-Driven Test-Driven Development, A Practical Workflow","summary":"A practical ai-driven test-driven development workflow with pytest 8 and the Anthropic API, tests first, implementation second.","tags":["pytest","tdd","anthropic-api"],"tracks":["programming"],"url":"/blog/ai-driven-test-driven-development/","date":"2026-02-20","img":"/images/blog/ai-driven-test-driven-development.svg"},{"title":"Catching Regressions with an AI Reviewer Agent on Pull Requests","summary":"Build an ai reviewer agent for pull requests with GitHub Actions and LangGraph 0.3 that reads diffs and posts inline regression comments.","tags":["langgraph","github-actions","code-review"],"tracks":["programming"],"url":"/blog/ai-reviewer-agent-pull-requests/","date":"2026-02-17","img":"/images/blog/ai-reviewer-agent-pull-requests.svg"},{"title":"Wiring an Automated AI Code Review Pipeline into CI","summary":"Wire an automated AI code review pipeline into GitHub Actions that analyzes PR diffs and posts structured, inline review comments.","tags":["ci","github-actions","code-review"],"tracks":["programming"],"url":"/blog/ai-code-review-pipeline-ci/","date":"2026-02-13","img":"/images/blog/ai-code-review-pipeline-ci.svg"},{"title":"Stateful Agent Graphs, Checkpointing and Human in the Loop","summary":"Add durable checkpointing and human-in-the-loop approval gates to LangGraph agents using SQLite and Postgres savers and the interrupt primitive.","tags":["langgraph","checkpointing","python"],"tracks":["programming"],"url":"/blog/langgraph-checkpointing-human-in-the-loop/","date":"2026-02-10","img":"/images/blog/langgraph-checkpointing-human-in-the-loop.svg"},{"title":"Orchestrating Multi-Agent Workflows with CrewAI","summary":"Build advanced multi-agent workflows in CrewAI from the ground up with custom tools, Pydantic-validated output, sequential and hierarchical processes, memory, and the small habits that keep the system trustworthy.","tags":["crewai","agents","python"],"tracks":["programming"],"url":"/blog/multi-agent-workflows-crewai/","date":"2026-02-06","img":"/images/blog/multi-agent-workflows-crewai.svg"},{"title":"Building an Autonomous Engineering Squad with LangGraph","summary":"Build an autonomous engineering squad in LangGraph with specialized planner, coder, and reviewer agents wired through a routed state graph.","tags":["langgraph","agents","python"],"tracks":["programming"],"url":"/blog/autonomous-engineering-squad-langgraph/","date":"2026-02-03","img":"/images/blog/autonomous-engineering-squad-langgraph.svg"},{"title":"Benchmarking SLM Latency and Memory on Constrained Hardware","summary":"Run a rigorous SLM latency benchmark on edge hardware with llama-bench, ONNX Runtime 1.20, and perf.","tags":["benchmarking","onnxruntime","llama-cpp"],"tracks":["programming"],"url":"/blog/benchmarking-slm-latency-memory-edge/","date":"2026-01-30","img":"/images/blog/benchmarking-slm-latency-memory-edge.svg"},{"title":"Cutting Edge Model Footprint with Pruning and Distillation","summary":"Reduce edge model footprint with structured pruning and knowledge distillation in PyTorch 2.6.","tags":["pytorch","distillation","pruning"],"tracks":["programming"],"url":"/blog/edge-model-footprint-pruning-distillation/","date":"2026-01-27","img":"/images/blog/edge-model-footprint-pruning-distillation.svg"},{"title":"Designing an Autonomous Agent Network on WebAssembly","summary":"Design an autonomous agent network on WebAssembly with the Component Model and WASI 0.2.","tags":["rust","webassembly","component-model"],"tracks":["programming"],"url":"/blog/autonomous-agent-network-webassembly/","date":"2026-01-23","img":"/images/blog/autonomous-agent-network-webassembly.svg"},{"title":"Building a Wasm Inference Runtime for Edge Agents with Rust","summary":"Build a WebAssembly inference runtime in Rust with Wasmtime 28 and WASI-NN for sandboxed edge agents.","tags":["rust","webassembly","wasi-nn"],"tracks":["programming"],"url":"/blog/wasm-inference-runtime-edge-agents-rust/","date":"2026-01-20","img":"/images/blog/wasm-inference-runtime-edge-agents-rust.svg"},{"title":"Fine-Tuning a Small Language Model with LoRA for One Domain","summary":"A hands-on guide to LoRA fine-tuning a small language model with Unsloth and QLoRA — data prep, training, merging, export.","tags":["fine-tuning","lora","unsloth"],"tracks":["programming"],"url":"/blog/lora-fine-tuning-small-language-model/","date":"2026-01-16","img":"/images/blog/lora-fine-tuning-small-language-model.svg"},{"title":"Running Phi-4-mini on a Raspberry Pi 5 with llama.cpp","summary":"Step-by-step guide to running Phi-4-mini on a Raspberry Pi 5 with llama.cpp — build, tune, manage thermals, and ship it.","tags":["raspberry-pi","phi-4-mini","llama-cpp"],"tracks":["programming"],"url":"/blog/phi-4-mini-raspberry-pi-llama-cpp/","date":"2026-01-13","img":"/images/blog/phi-4-mini-raspberry-pi-llama-cpp.svg"},{"title":"Quantizing SLMs to 4-Bit with GGUF Without Wrecking Accuracy","summary":"A practical guide to GGUF 4-bit quantization with llama.cpp — convert, quantize, measure, and keep accuracy intact.","tags":["quantization","gguf","llama-cpp"],"tracks":["programming"],"url":"/blog/quantizing-slms-4-bit-gguf/","date":"2026-01-09","img":"/images/blog/quantizing-slms-4-bit-gguf.svg"},{"title":"Why Small Language Models Belong at the Edge in 2026","summary":"The case for running small language models at the edge in 2026 — latency, cost, privacy, and a concrete llama.cpp deployment.","tags":["edge-ai","slm","llama-cpp"],"tracks":["programming"],"url":"/blog/small-language-models-edge-2026/","date":"2026-01-06","img":"/images/blog/small-language-models-edge-2026.svg"},{"title":"Predictions for 2026, The Post Agent Era for Backend Engineers","summary":"What 2026 likely brings for backend engineers, agents as boring infrastructure, OS-level AI, agent-native data systems, and the calibration adjustments to make.","tags":["leadership","predictions","ai-agents","backend"],"tracks":["programming"],"url":"/blog/predictions-for-2026-the-post-agent-era-for-backend-engineers/","date":"2025-12-19","img":"/images/blog/predictions-for-2026-the-post-agent-era-for-backend-engineers.svg"},{"title":"Talking to Executives About Technical Risk, A Practical Framework","summary":"A practical framework for senior engineers to communicate technical risk to executives, with concrete framing, a risk taxonomy, and templates for the conversation.","tags":["leadership","risk-management","executive-communication"],"tracks":["programming"],"url":"/blog/talking-to-executives-about-technical-risk-a-practical-framework/","date":"2025-12-17","img":"/images/blog/talking-to-executives-about-technical-risk-a-practical-framework.svg"},{"title":"Lessons From Running Platform Engineering Teams in 2025","summary":"What actually works when running a platform engineering team, framed around internal product thinking, golden paths, RACI for shared services, and the failures I learned from.","tags":["leadership","platform-engineering","devex"],"tracks":["programming"],"url":"/blog/lessons-from-running-platform-engineering-teams-in-2025/","date":"2025-12-15","img":"/images/blog/lessons-from-running-platform-engineering-teams-in-2025.svg"},{"title":"The 2025 Technical Retrospective, Agents, Wasm, Edge AI, and MCP","summary":"What actually mattered in 2025, agents went multi-step, Wasm grew up on the server, edge AI got real, and MCP became the wire format. Plus what I got wrong.","tags":["leadership","retrospective","ai-agents","webassembly","mcp"],"tracks":["programming"],"url":"/blog/the-2025-technical-retrospective-agents-wasm-edge-ai-and-mcp/","date":"2025-12-12","img":"/images/blog/the-2025-technical-retrospective-agents-wasm-edge-ai-and-mcp.svg"},{"title":"Architecture Reviews That Don't Waste Senior Time","summary":"A practical playbook for architecture reviews that actually inform decisions, with templates for prep docs, review rubrics, and the rules that keep meetings short.","tags":["leadership","architecture","reviews"],"tracks":["programming"],"url":"/blog/architecture-reviews-that-dont-waste-senior-time/","date":"2025-12-10","img":"/images/blog/architecture-reviews-that-dont-waste-senior-time.svg"},{"title":"Building Influence Without Authority, A Tech Lead's Guide","summary":"How to move organizations when you don't have the org chart power to do it, with concrete frameworks for credibility, allyship, and the long game of influence.","tags":["leadership","influence","staff-engineering"],"tracks":["programming"],"url":"/blog/building-influence-without-authority-a-tech-leads-guide/","date":"2025-12-08","img":"/images/blog/building-influence-without-authority-a-tech-leads-guide.svg"},{"title":"Writing ADRs That Actually Inform Decisions","summary":"An opinionated guide to ADRs that work in real engineering orgs, with a battle-tested template, scoring rubric, and the structural choices that make ADRs readable.","tags":["leadership","architecture","adr"],"tracks":["programming"],"url":"/blog/writing-adrs-that-actually-inform-decisions/","date":"2025-12-05","img":"/images/blog/writing-adrs-that-actually-inform-decisions.svg"},{"title":"Consultative Discovery for Complex Software Architectures","summary":"A senior engineer's discovery playbook for ambiguous architecture work, with question sets, interview structure, and a discovery brief template that drives real decisions.","tags":["leadership","architecture","discovery"],"tracks":["programming"],"url":"/blog/consultative-discovery-for-complex-software-architectures/","date":"2025-12-03","img":"/images/blog/consultative-discovery-for-complex-software-architectures.svg"},{"title":"Transitioning to Technical Leadership, A Senior Engineer's Playbook","summary":"What actually changes when you move from senior IC to technical leader, plus concrete frameworks for ramp, delegation, and the identity shift nobody warns you about.","tags":["leadership","career","engineering-management"],"tracks":["programming"],"url":"/blog/transitioning-to-technical-leadership-a-senior-engineers-playbook/","date":"2025-12-01","img":"/images/blog/transitioning-to-technical-leadership-a-senior-engineers-playbook.svg"},{"title":"Closing the Loop, Support Feedback to Product Engineering","summary":"A working model for routing support insights into product engineering decisions, with data structures, reporting cadence, and the political work of making engineering listen.","tags":["customer-success","voice-of-customer","product-engineering"],"tracks":["programming"],"url":"/blog/closing-the-loop-support-feedback-to-product-engineering/","date":"2025-11-21","img":"/images/blog/closing-the-loop-support-feedback-to-product-engineering.svg"},{"title":"Escalation Paths and Runbooks for Enterprise Support","summary":"How to design escalation paths and write runbooks that hold up when an enterprise customer is in pain, with explicit decision criteria and operational templates.","tags":["customer-success","escalation","runbooks"],"tracks":["programming"],"url":"/blog/escalation-paths-and-runbooks-for-enterprise-support/","date":"2025-11-19","img":"/images/blog/escalation-paths-and-runbooks-for-enterprise-support.svg"},{"title":"Measuring Support Engineering Effectiveness, Metrics That Matter","summary":"Which support engineering metrics actually predict customer outcomes, which ones get gamed, and how to build a measurement stack that drives the right behavior.","tags":["customer-success","metrics","support-operations"],"tracks":["programming"],"url":"/blog/measuring-support-engineering-effectiveness-metrics-that-matter/","date":"2025-11-17","img":"/images/blog/measuring-support-engineering-effectiveness-metrics-that-matter.svg"},{"title":"Triage Automation with LLMs and Zendesk, A Hands On Tutorial","summary":"A working LLM triage system for Zendesk in Python, covering classification, routing, agent-assist suggestions, evaluation, and the rollout pattern that doesn't break production.","tags":["customer-success","llm-automation","zendesk"],"tracks":["programming"],"url":"/blog/triage-automation-with-llms-and-zendesk-a-hands-on-tutorial/","date":"2025-11-14","img":"/images/blog/triage-automation-with-llms-and-zendesk-a-hands-on-tutorial.svg"},{"title":"SLA Driven Operations for Tech Support Managers","summary":"A practical operating model for SLA-driven support orgs, covering queue topology, staffing math, on-call rotations, and the dashboards that actually drive behavior.","tags":["customer-success","sla","support-operations"],"tracks":["programming"],"url":"/blog/sla-driven-operations-for-tech-support-managers/","date":"2025-11-12","img":"/images/blog/sla-driven-operations-for-tech-support-managers.svg"},{"title":"Bridging L3 Engineers and Enterprise Clients, A Tech Support Playbook","summary":"A playbook for the technical translation work that holds enterprise support together, with templates, escalation patterns, and the human gotchas that nobody trains for.","tags":["customer-success","enterprise-support","communication"],"tracks":["programming"],"url":"/blog/bridging-l3-engineers-and-enterprise-clients-a-tech-support-playbook/","date":"2025-11-10","img":"/images/blog/bridging-l3-engineers-and-enterprise-clients-a-tech-support-playbook.svg"},{"title":"Embedding Strategies for Support Documentation in 2025","summary":"A senior engineer's decision guide for picking, mixing, and fine-tuning embeddings for technical support corpora, with runnable benchmarks and real recall numbers.","tags":["customer-success","embeddings","vector-search"],"tracks":["programming"],"url":"/blog/embedding-strategies-for-support-documentation-in-2025/","date":"2025-11-07","img":"/images/blog/embedding-strategies-for-support-documentation-in-2025.svg"},{"title":"Building a Support Knowledge Base from Zendesk and Jira","summary":"How to extract, dedupe, anonymize, and rank tickets from Zendesk and Jira into a knowledge base that's actually safe to feed into a RAG pipeline.","tags":["customer-success","knowledge-base","zendesk"],"tracks":["programming"],"url":"/blog/building-a-support-knowledge-base-from-zendesk-and-jira/","date":"2025-11-05","img":"/images/blog/building-a-support-knowledge-base-from-zendesk-and-jira.svg"},{"title":"RAG Systems for Technical Support Teams in 2025","summary":"A field-tested walkthrough of building retrieval-augmented generation for L1 through L3 support, with runnable Python, pgvector and Qdrant pipelines, and the failure modes nobody talks about.","tags":["customer-success","rag","support-engineering"],"tracks":["programming"],"url":"/blog/rag-systems-for-technical-support-teams-in-2025/","date":"2025-11-03","img":"/images/blog/rag-systems-for-technical-support-teams-in-2025.svg"},{"title":"Measuring Developer Experience with DORA and SPACE in Backstage","summary":"A working tutorial on turning Backstage into a real DX measurement platform.","tags":["backstage","dora","developer-experience"],"tracks":["programming"],"url":"/blog/measuring-developer-experience-dora-space-backstage/","date":"2025-10-29","img":"/images/blog/measuring-developer-experience-dora-space-backstage.svg"},{"title":"Service Catalog Design That Scales, Lessons From Production","summary":"Catalog modeling decisions that pay back at scale, learned the hard way.","tags":["backstage","service-catalog","platform-engineering"],"tracks":["programming"],"url":"/blog/service-catalog-design-that-scales/","date":"2025-10-27","img":"/images/blog/service-catalog-design-that-scales.svg"},{"title":"Developer Onboarding with Backstage and ArgoCD, An End to End Tutorial","summary":"How to build an onboarding loop that a new hire can finish in their first morning.","tags":["backstage","argocd","developer-experience"],"tracks":["programming"],"url":"/blog/developer-onboarding-backstage-argocd-end-to-end/","date":"2025-10-22","img":"/images/blog/developer-onboarding-backstage-argocd-end-to-end.svg"},{"title":"Score Spec for Workload Portability in 2025","summary":"Where Score Spec actually fits in a 2025 platform stack, with working examples.","tags":["score-spec","platform-engineering","humanitec"],"tracks":["programming"],"url":"/blog/score-spec-workload-portability-2025/","date":"2025-10-20","img":"/images/blog/score-spec-workload-portability-2025.svg"},{"title":"TechDocs at Scale with Backstage, A Production Setup","summary":"How to make TechDocs fast and reliable past the first ten repositories.","tags":["backstage","techdocs","documentation"],"tracks":["programming"],"url":"/blog/techdocs-at-scale-backstage-production-setup/","date":"2025-10-15","img":"/images/blog/techdocs-at-scale-backstage-production-setup.svg"},{"title":"Writing Custom Backstage Plugins in TypeScript, A Hands On Tutorial","summary":"A working engineer's tutorial on building Backstage plugins that survive contact with production.","tags":["backstage","plugins","typescript"],"tracks":["programming"],"url":"/blog/writing-custom-backstage-plugins-typescript/","date":"2025-10-13","img":"/images/blog/writing-custom-backstage-plugins-typescript.svg"},{"title":"Golden Paths and Software Templates in Backstage, A Step by Step Guide","summary":"How to turn a portal into a paved road with real Backstage 1.34 software templates.","tags":["backstage","golden-paths","scaffolder"],"tracks":["programming"],"url":"/blog/golden-paths-software-templates-backstage/","date":"2025-10-08","img":"/images/blog/golden-paths-software-templates-backstage.svg"},{"title":"Building an Internal Developer Portal with Backstage 1.34","summary":"A working engineer's walkthrough of building an IDP from scratch with Backstage 1.34 on Node.js 22.","tags":["backstage","idp","platform-engineering"],"tracks":["programming"],"url":"/blog/building-internal-developer-portal-backstage-1-34/","date":"2025-10-06","img":"/images/blog/building-internal-developer-portal-backstage-1-34.svg"},{"title":"Supply Chain Security for AI Models, Signing and SBOM","summary":"How to sign models, produce SBOMs that mean something for ML, and verify everything at runtime without slowing your team down.","tags":["security","supply-chain","ai-models"],"tracks":["programming"],"url":"/blog/supply-chain-security-ai-models-signing-and-sbom/","date":"2025-09-24","img":"/images/blog/supply-chain-security-ai-models-signing-and-sbom.svg"},{"title":"Content Moderation for LLMs with Llama Guard 3.2","summary":"How to deploy Llama Guard 3.2 for input and output moderation without crippling latency, with custom rules and real benchmarks.","tags":["security","llama-guard","content-moderation"],"tracks":["programming"],"url":"/blog/content-moderation-for-llms-llama-guard-3-2/","date":"2025-09-22","img":"/images/blog/content-moderation-for-llms-llama-guard-3-2.svg"},{"title":"Policy as Code with OPA 1.0, A Production Walkthrough","summary":"How to run OPA 1.0 in production without footguns, with real policies, bundle infrastructure, and the operational habits that keep it healthy.","tags":["security","opa","policy-as-code"],"tracks":["programming"],"url":"/blog/policy-as-code-opa-1-0-production-walkthrough/","date":"2025-09-17","img":"/images/blog/policy-as-code-opa-1-0-production-walkthrough.svg"},{"title":"SPIFFE and SPIRE for Service Identity, A Hands On Tutorial","summary":"Install SPIRE 1.10, register workloads, and use SVIDs from real applications without faking your way through the docs.","tags":["security","spiffe","spire"],"tracks":["programming"],"url":"/blog/spiffe-spire-service-identity-hands-on-tutorial/","date":"2025-09-15","img":"/images/blog/spiffe-spire-service-identity-hands-on-tutorial.svg"},{"title":"Securing RAG Systems Against Data Exfiltration in 2025","summary":"Practical controls that stop the most common RAG exfiltration vectors without breaking retrieval quality.","tags":["security","rag","llm"],"tracks":["programming"],"url":"/blog/securing-rag-against-data-exfiltration-2025/","date":"2025-09-10","img":"/images/blog/securing-rag-against-data-exfiltration-2025.svg"},{"title":"DevSecOps in AI ML Pipelines, A Comprehensive Tutorial","summary":"How to wire real security gates into ML pipelines without grinding training to a halt, with code and policies that actually work.","tags":["security","devsecops","mlops"],"tracks":["programming"],"url":"/blog/devsecops-ai-ml-pipelines-comprehensive-tutorial/","date":"2025-09-08","img":"/images/blog/devsecops-ai-ml-pipelines-comprehensive-tutorial.svg"},{"title":"Zero Trust Architectures for AI Services, A Step by Step Setup","summary":"How to build a real Zero Trust setup around your model-serving stack without drowning in vendor jargon.","tags":["security","zero-trust","ai-infra"],"tracks":["programming"],"url":"/blog/zero-trust-architectures-ai-services-step-by-step-setup/","date":"2025-09-03","img":"/images/blog/zero-trust-architectures-ai-services-step-by-step-setup.svg"},{"title":"Advanced Prompt Injection Defenses in 2025, A Practical Guide","summary":"Layered prompt injection defenses that actually hold up in production, with code, diagrams, and the failure modes nobody talks about.","tags":["security","prompt-injection","llm"],"tracks":["programming"],"url":"/blog/advanced-prompt-injection-defenses-2025-practical-guide/","date":"2025-09-01","img":"/images/blog/advanced-prompt-injection-defenses-2025-practical-guide.svg"},{"title":"Observability for n8n in 2025, Metrics, Logs, and Traces","summary":"Build production observability for n8n with Prometheus metrics, structured logs, OpenTelemetry traces, and the dashboards that catch incidents early.","tags":["n8n","observability","opentelemetry"],"tracks":["programming"],"url":"/blog/observability-for-n8n-2025-metrics-logs-traces/","date":"2025-08-22","img":"/images/blog/observability-for-n8n-2025-metrics-logs-traces.svg"},{"title":"Self Hosted n8n on Kubernetes, A Production Setup","summary":"Deploy n8n 1.78 on Kubernetes properly, with separate main, webhook, and worker deployments, HPA, ingress, and persistence.","tags":["n8n","kubernetes","helm"],"tracks":["programming"],"url":"/blog/self-hosted-n8n-on-kubernetes-production-setup/","date":"2025-08-20","img":"/images/blog/self-hosted-n8n-on-kubernetes-production-setup.svg"},{"title":"Error Handling and Retries for Production n8n Workflows","summary":"Build n8n workflows that survive flaky APIs, with retry policies, error trigger workflows, circuit breakers, and dead letter routing patterns.","tags":["n8n","error-handling","reliability"],"tracks":["programming"],"url":"/blog/error-handling-and-retries-for-production-n8n-workflows/","date":"2025-08-18","img":"/images/blog/error-handling-and-retries-for-production-n8n-workflows.svg"},{"title":"Managing Secrets and Credentials in n8n for Enterprise","summary":"Move n8n credentials out of the database and into Vault or Infisical, wire up Keycloak or Auth0 SSO, and build a rotation story that doesn't break workflows.","tags":["n8n","secrets","security"],"tracks":["programming"],"url":"/blog/managing-secrets-and-credentials-in-n8n-for-enterprise/","date":"2025-08-15","img":"/images/blog/managing-secrets-and-credentials-in-n8n-for-enterprise.svg"},{"title":"n8n Queue Mode with Redis at Scale, A Production Walkthrough","summary":"From a single-node Redis to Sentinel and clustered queues, the practical guide to running n8n queue mode at production scale.","tags":["n8n","redis","queue-mode"],"tracks":["programming"],"url":"/blog/n8n-queue-mode-redis-at-scale-production-walkthrough/","date":"2025-08-13","img":"/images/blog/n8n-queue-mode-redis-at-scale-production-walkthrough.svg"},{"title":"Connecting Jira Cloud to Internal Platforms with n8n","summary":"A real Jira to internal platform integration in n8n, webhook ingest, JQL pulls, Forge events, and the auth patterns that don't break in six months.","tags":["n8n","jira","atlassian"],"tracks":["programming"],"url":"/blog/connecting-jira-cloud-to-internal-platforms-with-n8n/","date":"2025-08-11","img":"/images/blog/connecting-jira-cloud-to-internal-platforms-with-n8n.svg"},{"title":"Orchestrating Complex Enterprise Data Syncs with n8n","summary":"How to build n8n data syncs that survive production, with idempotency keys, watermark-based pulls, fan-out fan-in, and a real dead letter queue.","tags":["n8n","data-sync","etl"],"tracks":["programming"],"url":"/blog/orchestrating-complex-enterprise-data-syncs-with-n8n/","date":"2025-08-08","img":"/images/blog/orchestrating-complex-enterprise-data-syncs-with-n8n.svg"},{"title":"Writing Custom n8n Nodes in TypeScript, A Step by Step Tutorial","summary":"From scaffold to npm publish, a complete TypeScript walkthrough for writing custom n8n nodes that don't embarrass you in a code review.","tags":["n8n","typescript","custom-nodes"],"tracks":["programming"],"url":"/blog/writing-custom-n8n-nodes-typescript-step-by-step-tutorial/","date":"2025-08-06","img":"/images/blog/writing-custom-n8n-nodes-typescript-step-by-step-tutorial.svg"},{"title":"Advanced n8n Architecture in 2025, Queue Mode and Worker Scaling","summary":"How n8n 1.78 actually runs at scale, the main and worker split, Bull queues, concurrency knobs, and where queue mode earns its keep.","tags":["n8n","architecture","queue-mode"],"tracks":["programming"],"url":"/blog/advanced-n8n-architecture-2025-queue-mode-worker-scaling/","date":"2025-08-04","img":"/images/blog/advanced-n8n-architecture-2025-queue-mode-worker-scaling.svg"},{"title":"Rate Limiting and Resilience Patterns for Modern APIs","summary":"A working playbook for keeping API services up under load and degrading gracefully when they can't.","tags":["api","reliability","rate-limiting"],"tracks":["programming"],"url":"/blog/rate-limiting-resilience-patterns-modern-apis/","date":"2025-07-30","img":"/images/blog/rate-limiting-resilience-patterns-modern-apis.svg"},{"title":"OpenTelemetry for gRPC Services in Go, A Production Walkthrough","summary":"OpenTelemetry has stabilized enough that you can wire it up once and forget. Here's the configuration that ships.","tags":["api","opentelemetry","grpc"],"tracks":["programming"],"url":"/blog/opentelemetry-grpc-go-production-walkthrough/","date":"2025-07-28","img":"/images/blog/opentelemetry-grpc-go-production-walkthrough.svg"},{"title":"Schema First API Development with buf, A Step by Step Tutorial","summary":"buf turns protobuf from a code generator into a real schema platform. Here's the workflow that actually scales across teams.","tags":["api","buf","protobuf"],"tracks":["programming"],"url":"/blog/schema-first-api-development-with-buf/","date":"2025-07-23","img":"/images/blog/schema-first-api-development-with-buf.svg"},{"title":"API Gateway Architectures in 2025, Envoy Gateway and Kong Compared","summary":"Both gateways are mature in 2025. The right choice depends less on features than on how your platform team wants to operate.","tags":["api","gateway","envoy"],"tracks":["programming"],"url":"/blog/api-gateway-architectures-2025-envoy-gateway-kong/","date":"2025-07-21","img":"/images/blog/api-gateway-architectures-2025-envoy-gateway-kong.svg"},{"title":"Streaming gRPC for Real Time Data, A Hands On Guide","summary":"Streaming gRPC is more than calling Send in a loop. Here's how to build streams that don't fall over in production.","tags":["api","grpc","streaming"],"tracks":["programming"],"url":"/blog/streaming-grpc-realtime-data-guide/","date":"2025-07-16","img":"/images/blog/streaming-grpc-realtime-data-guide.svg"},{"title":"Securing Internal Microservices with JWT and SPIFFE in 2025","summary":"SPIFFE gives you trustworthy workload identity. JWT gives you portable claims. Together, they replace static service tokens.","tags":["api","security","spiffe"],"tracks":["programming"],"url":"/blog/securing-internal-microservices-jwt-spiffe-2025/","date":"2025-07-14","img":"/images/blog/securing-internal-microservices-jwt-spiffe-2025.svg"},{"title":"Connect Go for Browser Friendly gRPC, A Production Tutorial","summary":"Connect-Go gives you gRPC ergonomics with a wire format browsers can actually speak. Here's how to use it well.","tags":["api","connect-go","grpc"],"tracks":["programming"],"url":"/blog/connect-go-browser-friendly-grpc-tutorial/","date":"2025-07-09","img":"/images/blog/connect-go-browser-friendly-grpc-tutorial.svg"},{"title":"gRPC Deep Dive in 2025, Patterns for High Throughput Services","summary":"What still trips people up about gRPC in 2025, and the production patterns that actually move the needle.","tags":["api","grpc","go"],"tracks":["programming"],"url":"/blog/grpc-deep-dive-2025-high-throughput-patterns/","date":"2025-07-07","img":"/images/blog/grpc-deep-dive-2025-high-throughput-patterns.svg"},{"title":"YugabyteDB for Global Apps, A Hands On Tutorial","summary":"How to design and run YugabyteDB 2.23 for globally distributed apps, covering placement, multi-region geo-partitioning, and Postgres compatibility tradeoffs.","tags":["yugabytedb","distributed-sql","postgres"],"tracks":["programming"],"url":"/blog/yugabytedb-for-global-apps/","date":"2025-06-25","img":"/images/blog/yugabytedb-for-global-apps.svg"},{"title":"Reading pg_stat_io and Modern Postgres Internals","summary":"A deep dive on pg_stat_io in PostgreSQL 17, explaining buffer cache mechanics, IO contexts, and how to diagnose storage and memory pressure from the view.","tags":["postgres","performance","observability"],"tracks":["programming"],"url":"/blog/reading-pg-stat-io-and-modern-postgres-internals/","date":"2025-06-23","img":"/images/blog/reading-pg-stat-io-and-modern-postgres-internals.svg"},{"title":"Time Series at Scale with TimescaleDB Hypertables","summary":"How to design, operate, and scale TimescaleDB 2.18 hypertables for production time-series workloads, with chunk sizing, compression, and aggregation patterns.","tags":["timescaledb","postgres","time-series"],"tracks":["programming"],"url":"/blog/time-series-at-scale-with-timescaledb-hypertables/","date":"2025-06-18","img":"/images/blog/time-series-at-scale-with-timescaledb-hypertables.svg"},{"title":"High Availability Postgres with Patroni 4.0, A Step by Step Setup","summary":"How to build a production-grade highly available Postgres 17 cluster using Patroni 4.0, etcd for consensus, and HAProxy for routing.","tags":["postgres","patroni","high-availability"],"tracks":["programming"],"url":"/blog/high-availability-postgres-with-patroni-4-0/","date":"2025-06-16","img":"/images/blog/high-availability-postgres-with-patroni-4-0.svg"},{"title":"Citus for Sharded Multi Tenant Postgres, A Production Walkthrough","summary":"A senior engineer's walkthrough of Citus 12.1 for sharded multi-tenant Postgres, focused on schema patterns, query routing, and operational realities.","tags":["citus","postgres","sharding"],"tracks":["programming"],"url":"/blog/citus-for-sharded-multi-tenant-postgres/","date":"2025-06-11","img":"/images/blog/citus-for-sharded-multi-tenant-postgres.svg"},{"title":"Distributed SQL with CockroachDB 24.3, A Comprehensive Tutorial","summary":"How to think about and operate CockroachDB 24.3 as a distributed SQL engine, with concrete schema, query, and locality patterns.","tags":["cockroachdb","distributed-sql","postgres"],"tracks":["programming"],"url":"/blog/distributed-sql-with-cockroachdb-24-3/","date":"2025-06-09","img":"/images/blog/distributed-sql-with-cockroachdb-24-3.svg"},{"title":"Scaling pgvector to Billion Vector Workloads, A Hands On Guide","summary":"A practical engineer's playbook for scaling pgvector 0.8 to billion-vector workloads on Postgres 17, covering HNSW, quantization, and partitioning.","tags":["postgres","pgvector","ai"],"tracks":["programming"],"url":"/blog/scaling-pgvector-to-billion-vector-workloads/","date":"2025-06-04","img":"/images/blog/scaling-pgvector-to-billion-vector-workloads.svg"},{"title":"Advanced PostgreSQL 17 Tuning at Scale, A Practical Guide","summary":"How to tune PostgreSQL 17 for real production scale, with concrete settings, diagnostic queries, and the pitfalls that bite teams under load.","tags":["postgres","performance","tuning"],"tracks":["programming"],"url":"/blog/advanced-postgresql-17-tuning-at-scale/","date":"2025-06-02","img":"/images/blog/advanced-postgresql-17-tuning-at-scale.svg"},{"title":"Postmortem Automation with LLMs, Drafts That Don't Lie","summary":"A draft-only postmortem pipeline that respects timestamps, refuses to invent causes, and produces a blameless template a human can finish in 30 minutes.","tags":["aiops","postmortem","incident-response"],"tracks":["programming"],"url":"/blog/postmortem-automation-with-llms-drafts-that-dont-lie/","date":"2025-05-23","img":"/images/blog/postmortem-automation-with-llms-drafts-that-dont-lie.svg"},{"title":"Chaos Engineering with AI Augmented Hypotheses","summary":"AI-proposed chaos hypotheses, human-approved blast radii, and LitmusChaos execution on Kubernetes 1.32 with rollback on SLO breach.","tags":["aiops","chaos-engineering","kubernetes"],"tracks":["programming"],"url":"/blog/chaos-engineering-with-ai-augmented-hypotheses/","date":"2025-05-21","img":"/images/blog/chaos-engineering-with-ai-augmented-hypotheses.svg"},{"title":"SLOs and Burn Rate Alerting in 2025, A Practical Guide","summary":"Practical SLO design, error budget math, and multi-window burn rate alerting rules ready to paste into Prometheus 3.0.","tags":["aiops","slo","prometheus"],"tracks":["programming"],"url":"/blog/slos-and-burn-rate-alerting-in-2025-a-practical-guide/","date":"2025-05-19","img":"/images/blog/slos-and-burn-rate-alerting-in-2025-a-practical-guide.svg"},{"title":"Incident Response Automation with LangGraph, A Step by Step Tutorial","summary":"Treat incident response as a typed state machine in LangGraph 0.2, with deterministic transitions, audit logging, and bounded LLM use.","tags":["aiops","langgraph","incident-response"],"tracks":["programming"],"url":"/blog/incident-response-automation-with-langgraph-a-step-by-step-tutorial/","date":"2025-05-16","img":"/images/blog/incident-response-automation-with-langgraph-a-step-by-step-tutorial.svg"},{"title":"Anomaly Detection on Prometheus Metrics, A Hands On Guide","summary":"A working senior SRE's tour through metric anomaly detection, from cheap z-score rules to isolation forest sidecars on Prometheus 3.0.","tags":["aiops","prometheus","anomaly-detection"],"tracks":["programming"],"url":"/blog/anomaly-detection-on-prometheus-metrics-a-hands-on-guide/","date":"2025-05-14","img":"/images/blog/anomaly-detection-on-prometheus-metrics-a-hands-on-guide.svg"},{"title":"Building an SRE Copilot for On Call Engineers","summary":"A senior backend engineer's design for an LLM-powered on-call assistant with tool use, context shaping, and a read-only blast radius.","tags":["aiops","sre","copilot"],"tracks":["programming"],"url":"/blog/building-an-sre-copilot-for-on-call-engineers/","date":"2025-05-12","img":"/images/blog/building-an-sre-copilot-for-on-call-engineers.svg"},{"title":"AI Driven Log Analysis at Scale, A Production Tutorial","summary":"A production pattern for AI log analysis using template mining, vector retrieval, and bounded LLM summarization on Loki 3.3.","tags":["aiops","logging","loki"],"tracks":["programming"],"url":"/blog/ai-driven-log-analysis-at-scale-a-production-tutorial/","date":"2025-05-09","img":"/images/blog/ai-driven-log-analysis-at-scale-a-production-tutorial.svg"},{"title":"Auto Remediation Pipelines with LLM Agents and Argo Events","summary":"A practical walkthrough of LLM-proposed, deterministically-executed remediation using Argo Events and Argo Workflows on Kubernetes 1.32.","tags":["aiops","argo","remediation"],"tracks":["programming"],"url":"/blog/auto-remediation-pipelines-with-llm-agents-and-argo-events/","date":"2025-05-07","img":"/images/blog/auto-remediation-pipelines-with-llm-agents-and-argo-events.svg"},{"title":"AIOps in May 2025, What Actually Works in Production","summary":"Field notes on AIOps in production, what to adopt, what to defer, and where LLMs earn their keep on the platform team.","tags":["aiops","sre","observability"],"tracks":["programming"],"url":"/blog/aiops-in-may-2025-what-actually-works-in-production/","date":"2025-05-05","img":"/images/blog/aiops-in-may-2025-what-actually-works-in-production.svg"},{"title":"Observability for Edge Fleets at Scale, Patterns That Work","summary":"Production observability for edge fleets. OpenTelemetry Collector at the edge, local aggregation, smart sampling, and alerts that survive WAN outages.","tags":["edge-ai","observability","opentelemetry"],"tracks":["programming"],"url":"/blog/observability-edge-fleets-at-scale-patterns-that-work/","date":"2025-04-30","img":"/images/blog/observability-edge-fleets-at-scale-patterns-that-work.svg"},{"title":"Deploying Models with TFLite Micro on Constrained Devices","summary":"Deploy real models on microcontrollers with TFLite Micro. Conversion, quantization, arena sizing, custom ops, and a working keyword-spotter on a Cortex-M4.","tags":["edge-ai","tflite-micro","embedded"],"tracks":["programming"],"url":"/blog/deploying-models-tflite-micro-constrained-devices/","date":"2025-04-28","img":"/images/blog/deploying-models-tflite-micro-constrained-devices.svg"},{"title":"Bridging OPC UA and Modbus to MQTT in Go, A Step by Step Guide","summary":"A Go bridge from OPC UA and Modbus to MQTT 5. Subscriptions, polling, normalization, security, and the gotchas that come with legacy PLCs.","tags":["edge-ai","opc-ua","modbus"],"tracks":["programming"],"url":"/blog/bridging-opc-ua-modbus-mqtt-go-step-by-step/","date":"2025-04-23","img":"/images/blog/bridging-opc-ua-modbus-mqtt-go-step-by-step.svg"},{"title":"Streaming Inference Pipelines with Kafka and Go, A Production Walkthrough","summary":"Production streaming inference with Kafka 3.9 and Go 1.24. Partitioning strategies, exactly-once, dynamic batching for GPU inference, and DLQs you can replay.","tags":["edge-ai","kafka","streaming"],"tracks":["programming"],"url":"/blog/streaming-inference-pipelines-kafka-go-production-walkthrough/","date":"2025-04-21","img":"/images/blog/streaming-inference-pipelines-kafka-go-production-walkthrough.svg"},{"title":"ONNX Runtime on Edge Devices, A Comprehensive Tutorial","summary":"Practical ONNX Runtime 1.20 on edge devices. Execution providers, quantization, threading, memory arenas, and a benchmark harness in Go and Python.","tags":["edge-ai","onnx","inference"],"tracks":["programming"],"url":"/blog/onnx-runtime-edge-devices-comprehensive-tutorial/","date":"2025-04-16","img":"/images/blog/onnx-runtime-edge-devices-comprehensive-tutorial.svg"},{"title":"Advanced MQTT Clustering with EMQX 5.8, A Production Guide","summary":"Clustering EMQX 5.8 in production. Mria architecture, persistent sessions, shared subscriptions, and rolling upgrades without dropping clients.","tags":["edge-ai","mqtt","emqx"],"tracks":["programming"],"url":"/blog/advanced-mqtt-clustering-emqx-5-8-production-guide/","date":"2025-04-14","img":"/images/blog/advanced-mqtt-clustering-emqx-5-8-production-guide.svg"},{"title":"Real Time Telemetry Processing in Go 1.24, A Hands On Tutorial","summary":"A practical Go 1.24 telemetry pipeline. Channels with backpressure, the new map internals, generic ring buffers, and a sliding window aggregator that holds up under load.","tags":["edge-ai","go","telemetry"],"tracks":["programming"],"url":"/blog/real-time-telemetry-processing-go-1-24-tutorial/","date":"2025-04-09","img":"/images/blog/real-time-telemetry-processing-go-1-24-tutorial.svg"},{"title":"Edge AI Hardware in April 2025, Jetson, Coral, and Raspberry Pi 5 AI Hat","summary":"What edge AI hardware looks like in April 2025. Jetson Orin Nano Super, Coral Edge TPU, Raspberry Pi 5 AI Hat. Picking, provisioning, and benchmarking each one.","tags":["edge-ai","hardware","jetson"],"tracks":["programming"],"url":"/blog/edge-ai-hardware-april-2025-jetson-coral-raspberry-pi-5-ai-hat/","date":"2025-04-07","img":"/images/blog/edge-ai-hardware-april-2025-jetson-coral-raspberry-pi-5-ai-hat.svg"},{"title":"Observability for Multi Agent Systems, LangSmith and Phoenix in 2025","summary":"Hands-on observability for multi-agent systems with LangSmith, Phoenix, OpenTelemetry, plus what to alert on and what to ignore.","tags":["multi-agent","observability","langsmith"],"tracks":["programming"],"url":"/blog/observability-for-multi-agent-systems-langsmith-and-phoenix-in-2025/","date":"2025-03-26","img":"/images/blog/observability-for-multi-agent-systems-langsmith-and-phoenix-in-2025.svg"},{"title":"Long Running Autonomous Agent Workflows, Checkpoints and Retries","summary":"Patterns and runnable code for long-running agent workflows, durable checkpoints, idempotent retries, deadlines, and circuit breakers.","tags":["multi-agent","reliability","langgraph"],"tracks":["programming"],"url":"/blog/long-running-autonomous-agent-workflows-checkpoints-and-retries/","date":"2025-03-24","img":"/images/blog/long-running-autonomous-agent-workflows-checkpoints-and-retries.svg"},{"title":"Agent to Agent Communication Protocols, Choosing the Right One","summary":"A senior engineer's guide to picking an agent-to-agent communication protocol, with shared state, typed actors, MCP, brokers, and HTTP compared.","tags":["multi-agent","protocols","architecture"],"tracks":["programming"],"url":"/blog/agent-to-agent-communication-protocols-choosing-the-right-one/","date":"2025-03-19","img":"/images/blog/agent-to-agent-communication-protocols-choosing-the-right-one.svg"},{"title":"Model Context Protocol Explained, Building MCP Servers in 2025","summary":"Hands-on guide to the Model Context Protocol from Anthropic, building a Python MCP server with tools, resources, and prompts, and integrating it.","tags":["multi-agent","mcp","anthropic"],"tracks":["programming"],"url":"/blog/model-context-protocol-explained-building-mcp-servers-in-2025/","date":"2025-03-17","img":"/images/blog/model-context-protocol-explained-building-mcp-servers-in-2025.svg"},{"title":"AutoGen 0.4 Deep Dive, What Changed and How to Use It","summary":"What changed in the AutoGen 0.4 rewrite, the new actor model, AgentChat patterns, async runtime, and the migration moves from 0.2.","tags":["multi-agent","autogen","python"],"tracks":["programming"],"url":"/blog/autogen-0-4-deep-dive-what-changed-and-how-to-use-it/","date":"2025-03-12","img":"/images/blog/autogen-0-4-deep-dive-what-changed-and-how-to-use-it.svg"},{"title":"Role Based Agent Teams with CrewAI, A Production Walkthrough","summary":"Build a research-and-writing crew with CrewAI 0.86, including custom tools, hierarchical mode, memory configuration, and what to skip.","tags":["multi-agent","crewai","python"],"tracks":["programming"],"url":"/blog/role-based-agent-teams-with-crewai-a-production-walkthrough/","date":"2025-03-10","img":"/images/blog/role-based-agent-teams-with-crewai-a-production-walkthrough.svg"},{"title":"Production Multi Agent Systems with LangGraph 0.2, A Hands On Tutorial","summary":"Hands-on LangGraph 0.2 tutorial covering Postgres checkpointers, retries, interrupts, streaming, and the gotchas that bite when you ship.","tags":["multi-agent","langgraph","python"],"tracks":["programming"],"url":"/blog/production-multi-agent-systems-with-langgraph-0-2-a-hands-on-tutorial/","date":"2025-03-05","img":"/images/blog/production-multi-agent-systems-with-langgraph-0-2-a-hands-on-tutorial.svg"},{"title":"Multi Agent Systems in 2025, Architecture Patterns That Work","summary":"Practical patterns for multi-agent systems in 2025 with runnable LangGraph and CrewAI snippets, plus the gotchas that bite teams in production.","tags":["multi-agent","architecture","langgraph"],"tracks":["programming"],"url":"/blog/multi-agent-systems-in-2025-architecture-patterns-that-work/","date":"2025-03-03","img":"/images/blog/multi-agent-systems-in-2025-architecture-patterns-that-work.svg"},{"title":"Running Wasm at the Edge, Cloudflare Workers and Fastly Compute","summary":"Deploy real Wasm services at the edge, Cloudflare Workers and Fastly Compute compared with Rust examples, KV usage, and operational notes.","tags":["wasm","edge","cloudflare"],"tracks":["programming"],"url":"/blog/running-wasm-at-the-edge-cloudflare-workers-fastly-compute/","date":"2025-02-26","img":"/images/blog/running-wasm-at-the-edge-cloudflare-workers-fastly-compute.svg"},{"title":"The Wasm Component Model in Production, A Practical Walkthrough","summary":"Production patterns for the Wasm component model, WIT contracts, composition with wasm-tools compose, versioning, and operational lessons learned.","tags":["wasm","component-model","wit"],"tracks":["programming"],"url":"/blog/wasm-component-model-in-production-practical-walkthrough/","date":"2025-02-24","img":"/images/blog/wasm-component-model-in-production-practical-walkthrough.svg"},{"title":"Distributed Wasm Apps with wasmCloud, A Production Tutorial","summary":"Ship a distributed Wasm app with wasmCloud 1.4, including components, capability providers, links, and the NATS lattice.","tags":["wasm","wasmcloud","distributed"],"tracks":["programming"],"url":"/blog/distributed-wasm-apps-with-wasmcloud-production-tutorial/","date":"2025-02-19","img":"/images/blog/distributed-wasm-apps-with-wasmcloud-production-tutorial.svg"},{"title":"Wasm vs Docker, Where the Lightweight Container Story Holds Up","summary":"Where Wasm beats Docker and where it doesn't, with cold-start numbers, density math, and a decision framework grounded in real workloads.","tags":["wasm","docker","containers"],"tracks":["programming"],"url":"/blog/wasm-vs-docker-where-lightweight-container-story-holds-up/","date":"2025-02-17","img":"/images/blog/wasm-vs-docker-where-lightweight-container-story-holds-up.svg"},{"title":"Building Wasm Microservices with Spin, From Hello World to Production","summary":"Build, test, and deploy a real HTTP microservice with Spin 3.1, covering routing, persistence, secrets, and production deployment.","tags":["wasm","spin","fermyon"],"tracks":["programming"],"url":"/blog/building-wasm-microservices-with-spin-hello-world-to-production/","date":"2025-02-12","img":"/images/blog/building-wasm-microservices-with-spin-hello-world-to-production.svg"},{"title":"Embedding wasmtime in a Rust Host, A Hands On Guide","summary":"A practical embedding tutorial for wasmtime 28, with resource limits, fuel-based metering, async, and clean shutdown patterns.","tags":["wasm","wasmtime","rust"],"tracks":["programming"],"url":"/blog/embedding-wasmtime-in-a-rust-host-hands-on-guide/","date":"2025-02-10","img":"/images/blog/embedding-wasmtime-in-a-rust-host-hands-on-guide.svg"},{"title":"Compiling Rust to Wasm with cargo component, A Step by Step Tutorial","summary":"Build a real WASI 0.2 component from scratch with cargo-component 0.18, WIT bindings, and a wasmtime host that calls it.","tags":["wasm","rust","cargo-component"],"tracks":["programming"],"url":"/blog/compiling-rust-to-wasm-with-cargo-component-step-by-step-tutorial/","date":"2025-02-05","img":"/images/blog/compiling-rust-to-wasm-with-cargo-component-step-by-step-tutorial.svg"},{"title":"Server Side WebAssembly in February 2025, A Practical Survey","summary":"Where server-side Wasm actually stands in early 2025, runtimes compared, WASI 0.2 caveats, and the workloads where it pays off.","tags":["wasm","webassembly","wasi"],"tracks":["programming"],"url":"/blog/server-side-webassembly-february-2025-practical-survey/","date":"2025-02-03","img":"/images/blog/server-side-webassembly-february-2025-practical-survey.svg"},{"title":"Benchmarking SLMs for Your Use Case, From Lmeval to Custom Suites","summary":"Public leaderboards lie about your task. Build a benchmark that measures what your users actually need.","tags":["slm","benchmarking","evaluation","lm-eval"],"tracks":["programming"],"url":"/blog/benchmarking-slms-for-your-use-case-lmeval-to-custom/","date":"2025-01-29","img":"/images/blog/benchmarking-slms-for-your-use-case-lmeval-to-custom.svg"},{"title":"Local RAG with SLMs, Private Knowledge Without the Cloud","summary":"End-to-end local RAG, no cloud. Embeddings, vectors, retrieval, and grounded generation on a single box.","tags":["slm","rag","embeddings","local"],"tracks":["programming"],"url":"/blog/local-rag-with-slms-private-knowledge-without-cloud/","date":"2025-01-27","img":"/images/blog/local-rag-with-slms-private-knowledge-without-cloud.svg"},{"title":"Structured Output and Function Calling on Local SLMs","summary":"Get production-grade JSON and tool calls out of 3B models. Constrained decoding, schemas, and what actually works.","tags":["slm","structured-output","function-calling","json"],"tracks":["programming"],"url":"/blog/structured-output-and-function-calling-on-local-slms/","date":"2025-01-22","img":"/images/blog/structured-output-and-function-calling-on-local-slms.svg"},{"title":"Fine Tuning SLMs with LoRA and QLoRA, A Hands On Tutorial","summary":"When prompting plateaus, LoRA and QLoRA take you the next mile. A real fine-tuning walkthrough on consumer GPUs.","tags":["slm","fine-tuning","lora","qlora"],"tracks":["programming"],"url":"/blog/fine-tuning-slms-with-lora-and-qlora-hands-on/","date":"2025-01-20","img":"/images/blog/fine-tuning-slms-with-lora-and-qlora-hands-on.svg"},{"title":"Serving SLMs at Scale with vLLM, A Production Guide","summary":"When Ollama and llama.cpp stop scaling, vLLM is what you reach for. PagedAttention, batching, and the real tradeoffs.","tags":["slm","vllm","serving","inference"],"tracks":["programming"],"url":"/blog/serving-slms-at-scale-with-vllm-production-guide/","date":"2025-01-15","img":"/images/blog/serving-slms-at-scale-with-vllm-production-guide.svg"},{"title":"llama.cpp Deep Dive, Quantization, GGUF, and Inference Speed","summary":"Where Ollama ends, llama.cpp begins. Quantization, GGUF, KV cache, and squeezing tokens per second.","tags":["slm","llama-cpp","quantization","gguf"],"tracks":["programming"],"url":"/blog/llama-cpp-deep-dive-quantization-gguf-inference-speed/","date":"2025-01-13","img":"/images/blog/llama-cpp-deep-dive-quantization-gguf-inference-speed.svg"},{"title":"Running SLMs Locally with Ollama, A Step by Step Tutorial","summary":"Everything I do to ship a local SLM behind Ollama 0.5, from install to a real production endpoint.","tags":["slm","ollama","local-inference"],"tracks":["programming"],"url":"/blog/running-slms-locally-with-ollama-step-by-step/","date":"2025-01-08","img":"/images/blog/running-slms-locally-with-ollama-step-by-step.svg"},{"title":"Small Language Models in January 2025, A Practical Survey","summary":"Where the small language model landscape actually stands in January 2025, from a backend engineer's bench.","tags":["slm","llama","phi","qwen","gemma"],"tracks":["programming"],"url":"/blog/slm-landscape-january-2025-practical-survey/","date":"2025-01-06","img":"/images/blog/slm-landscape-january-2025-practical-survey.svg"},{"title":"Lessons From a Year of Rust, Postgres, and AI Agents","summary":"The combination that defined my 2024. What I learned about each, what I learned about their intersection, and what I would do differently.","tags":["leadership","rust","postgres","agentic-ai","year-in-review"],"tracks":["programming"],"url":"/blog/lessons-from-year-rust-postgres-ai-agents/","date":"2024-12-20","img":"/images/blog/lessons-from-year-rust-postgres-ai-agents.svg"},{"title":"Predictions for 2025, Platform Engineering and Agentic AI","summary":"Twelve calls on platform engineering and agentic AI for 2025. Specific enough to be wrong. Pinned to December 2024 context.","tags":["leadership","predictions","platform-engineering","agentic-ai"],"tracks":["programming"],"url":"/blog/predictions-2025-platform-engineering-agentic-ai/","date":"2024-12-18","img":"/images/blog/predictions-2025-platform-engineering-agentic-ai.svg"},{"title":"The 2024 Wrap Up, The Agentic Era for Backend Engineers","summary":"Looking back at a year where agents moved from demo to production. What actually shipped, what stayed brittle, and what the next year demands of backend engineers.","tags":["leadership","agentic-ai","year-in-review"],"tracks":["programming"],"url":"/blog/2024-wrap-up-agentic-era-backend-engineers/","date":"2024-12-16","img":"/images/blog/2024-wrap-up-agentic-era-backend-engineers.svg"},{"title":"Roadmaps That Survive Contact with Reality","summary":"Most roadmaps die at first contact with the actual quarter. Here is how I build the kind that does not.","tags":["leadership","planning","roadmaps"],"tracks":["programming"],"url":"/blog/roadmaps-that-survive-contact-with-reality/","date":"2024-12-13","img":"/images/blog/roadmaps-that-survive-contact-with-reality.svg"},{"title":"Cost Justifying Platform Investments, The CFO Friendly Pitch","summary":"Platform investments live or die on the business case. Here is how to write one that survives the finance review.","tags":["leadership","platform-engineering","finance"],"tracks":["programming"],"url":"/blog/cost-justifying-platform-investments-cfo-friendly-pitch/","date":"2024-12-11","img":"/images/blog/cost-justifying-platform-investments-cfo-friendly-pitch.svg"},{"title":"Communicating Tradeoffs to Non Engineers Without Dumbing Down","summary":"Translating tradeoffs is a senior skill. The trick is to compress without distorting, and to let the listener make the choice.","tags":["leadership","communication","tradeoffs"],"tracks":["programming"],"url":"/blog/communicating-tradeoffs-non-engineers-without-dumbing-down/","date":"2024-12-09","img":"/images/blog/communicating-tradeoffs-non-engineers-without-dumbing-down.svg"},{"title":"Reading the Room, Navigating Politics in Technical Decisions","summary":"Politics is a constraint, not a smell. Senior engineers who learn to read the room get to ship what they design.","tags":["leadership","politics","stakeholder-management"],"tracks":["programming"],"url":"/blog/reading-the-room-politics-technical-decisions/","date":"2024-12-06","img":"/images/blog/reading-the-room-politics-technical-decisions.svg"},{"title":"Translating Business Impact into Architecture Decisions","summary":"Architecture decisions are business decisions in disguise. Here is how to write ADRs that hold up when the budget conversation arrives.","tags":["leadership","architecture","adr"],"tracks":["programming"],"url":"/blog/translating-business-impact-architecture-decisions/","date":"2024-12-04","img":"/images/blog/translating-business-impact-architecture-decisions.svg"},{"title":"Consultative Discovery for Engineering Leaders, A Playbook","summary":"Discovery is a senior engineering skill, not a sales ritual. Here is the playbook I use to get to the real problem before architecture starts.","tags":["leadership","discovery","stakeholder-management"],"tracks":["programming"],"url":"/blog/consultative-discovery-engineering-leaders-playbook/","date":"2024-12-02","img":"/images/blog/consultative-discovery-engineering-leaders-playbook.svg"},{"title":"Zero Downtime Postgres Migrations in 2024","summary":"A field guide to running zero downtime schema migrations against Postgres 17, with expand-contract, backfill batching, and lock-aware DDL.","tags":["postgres","migrations","operations"],"tracks":["programming"],"url":"/blog/zero-downtime-postgres-migrations-in-2024/","date":"2024-11-22","img":"/images/blog/zero-downtime-postgres-migrations-in-2024.svg"},{"title":"Vacuum and Bloat Management for Busy Postgres Tables","summary":"Practical vacuum tuning for write-heavy Postgres 17 workloads, with autovacuum parameters, bloat detection queries, and pg_repack guidance.","tags":["postgres","vacuum","bloat"],"tracks":["programming"],"url":"/blog/vacuum-and-bloat-management-for-busy-postgres-tables/","date":"2024-11-20","img":"/images/blog/vacuum-and-bloat-management-for-busy-postgres-tables.svg"},{"title":"Native Postgres Partitioning, Patterns That Hold at Scale","summary":"Field-tested patterns for native Postgres partitioning in 17, with sizing rules, partition pruning, foreign keys, and the gotchas you only learn at scale.","tags":["postgres","partitioning","scaling"],"tracks":["programming"],"url":"/blog/native-postgres-partitioning-patterns-that-hold-at-scale/","date":"2024-11-18","img":"/images/blog/native-postgres-partitioning-patterns-that-hold-at-scale.svg"},{"title":"Logical Replication for Blue Green Postgres Deploys","summary":"End-to-end blue green Postgres cutover using logical replication on 17, with the cutover runbook, slot sync, and the failure modes.","tags":["postgres","logical-replication","migrations"],"tracks":["programming"],"url":"/blog/logical-replication-for-blue-green-postgres-deploys/","date":"2024-11-15","img":"/images/blog/logical-replication-for-blue-green-postgres-deploys.svg"},{"title":"pgvector Tuning in 2024, HNSW and IVFFlat in Production","summary":"How to size and tune pgvector 0.7.4 indexes in production, with concrete parameters, recall benchmarks, and the failure modes nobody mentions.","tags":["postgres","pgvector","vector-search"],"tracks":["programming"],"url":"/blog/pgvector-tuning-in-2024-hnsw-and-ivfflat-in-production/","date":"2024-11-13","img":"/images/blog/pgvector-tuning-in-2024-hnsw-and-ivfflat-in-production.svg"},{"title":"Choosing the Right Postgres Index, BRIN, GIN, HNSW, IVFFlat","summary":"When to reach for BRIN, GIN, GiST, BTREE, HNSW or IVFFlat in Postgres 17, with realistic sizing and a flowchart-style decision tree.","tags":["postgres","indexes","pgvector"],"tracks":["programming"],"url":"/blog/choosing-the-right-postgres-index-brin-gin-hnsw-ivfflat/","date":"2024-11-11","img":"/images/blog/choosing-the-right-postgres-index-brin-gin-hnsw-ivfflat.svg"},{"title":"Reading EXPLAIN ANALYZE Like a Senior DBA","summary":"A senior DBA's reading order for EXPLAIN ANALYZE output in Postgres 17, with real plans, estimation skew detection, and BUFFERS interpretation.","tags":["postgres","explain-analyze","query-tuning"],"tracks":["programming"],"url":"/blog/reading-explain-analyze-like-a-senior-dba/","date":"2024-11-08","img":"/images/blog/reading-explain-analyze-like-a-senior-dba.svg"},{"title":"Connection Pooling with PgBouncer, Setup That Survives 10K Clients","summary":"Hands-on guide to running PgBouncer 1.23 in front of Postgres 17 at 10k+ client connections, with config, ops, and the gotchas.","tags":["postgres","pgbouncer","connection-pooling"],"tracks":["programming"],"url":"/blog/connection-pooling-with-pgbouncer-setup-that-survives-10k-clients/","date":"2024-11-06","img":"/images/blog/connection-pooling-with-pgbouncer-setup-that-survives-10k-clients.svg"},{"title":"PostgreSQL 17 in Production, Features Worth Using","summary":"Practical look at the Postgres 17 features that move the needle for production workloads, with real psql snippets and upgrade notes.","tags":["postgres","postgresql-17","performance"],"tracks":["programming"],"url":"/blog/postgres-17-in-production-features-worth-using/","date":"2024-11-04","img":"/images/blog/postgres-17-in-production-features-worth-using.svg"},{"title":"LLM Red Teaming, Practical Techniques for 2024","summary":"How to run an LLM red team that produces actionable findings instead of party tricks, with attack inventory and triage flow.","tags":["security","llm","red-team"],"tracks":["programming"],"url":"/blog/llm-red-teaming-practical-techniques-2024/","date":"2024-10-30","img":"/images/blog/llm-red-teaming-practical-techniques-2024.svg"},{"title":"Container Image Signing with cosign and Sigstore in 2024","summary":"A working guide to signing container images with cosign and Sigstore, including keyless signing and Kubernetes admission enforcement.","tags":["security","containers","supply-chain"],"tracks":["programming"],"url":"/blog/container-image-signing-cosign-sigstore-2024/","date":"2024-10-28","img":"/images/blog/container-image-signing-cosign-sigstore-2024.svg"},{"title":"Securing RAG Systems Against Data Exfiltration","summary":"How to design RAG systems so that prompt injection and over-eager retrieval don't become an exfiltration channel.","tags":["security","rag","llm"],"tracks":["programming"],"url":"/blog/securing-rag-systems-against-data-exfiltration/","date":"2024-10-23","img":"/images/blog/securing-rag-systems-against-data-exfiltration.svg"},{"title":"SAST in 2024, Semgrep and AI Triage for Real Codebases","summary":"Combining Semgrep with LLM triage to make SAST output actionable on production-sized codebases.","tags":["security","sast","semgrep"],"tracks":["programming"],"url":"/blog/sast-semgrep-ai-triage-real-codebases/","date":"2024-10-21","img":"/images/blog/sast-semgrep-ai-triage-real-codebases.svg"},{"title":"Secrets Scanning in 2024, TruffleHog and Gitleaks in CI","summary":"A working setup for secrets scanning across TruffleHog and Gitleaks, with pre-receive enforcement and verifier-based prioritization.","tags":["security","secrets","ci-cd"],"tracks":["programming"],"url":"/blog/secrets-scanning-trufflehog-gitleaks-ci-2024/","date":"2024-10-16","img":"/images/blog/secrets-scanning-trufflehog-gitleaks-ci-2024.svg"},{"title":"Auto Remediation for Cloud Security Findings","summary":"A pragmatic blueprint for safe auto remediation of cloud security findings across AWS Security Hub and GCP SCC.","tags":["security","cloud","remediation"],"tracks":["programming"],"url":"/blog/auto-remediation-cloud-security-findings/","date":"2024-10-14","img":"/images/blog/auto-remediation-cloud-security-findings.svg"},{"title":"AI Assisted Detection Rules, Sigma and YARA in 2024","summary":"A pragmatic look at LLM-assisted authoring of Sigma and YARA detections, including evaluation harnesses and review gates.","tags":["security","detection","sigma"],"tracks":["programming"],"url":"/blog/ai-assisted-detection-rules-sigma-yara-2024/","date":"2024-10-09","img":"/images/blog/ai-assisted-detection-rules-sigma-yara-2024.svg"},{"title":"Prompt Injection Defenses in LLM Apps, Patterns for 2024","summary":"Hardening patterns for prompt injection across system prompts, tools, and retrieval, with code and policy guidance.","tags":["security","llm","prompt-injection"],"tracks":["programming"],"url":"/blog/prompt-injection-defenses-llm-apps-2024/","date":"2024-10-07","img":"/images/blog/prompt-injection-defenses-llm-apps-2024.svg"},{"title":"Auditing Low Code Workflows for SOC 2 and ISO 27001","summary":"Auditing low-code workflows for SOC 2 and ISO 27001. Control mapping for n8n and Make, evidence collection, and what auditors actually want to see.","tags":["low-code","compliance","soc2"],"tracks":["programming"],"url":"/blog/auditing-low-code-workflows-soc2-iso27001/","date":"2024-09-25","img":"/images/blog/auditing-low-code-workflows-soc2-iso27001.svg"},{"title":"When Pro Code Wins Over Low Code, A Decision Matrix","summary":"When pro-code beats low-code. A decision matrix on latency, consistency, complexity, audit, and ownership, with concrete thresholds for 2024.","tags":["low-code","decision-matrix","architecture"],"tracks":["programming"],"url":"/blog/when-pro-code-wins-over-low-code-decision-matrix/","date":"2024-09-23","img":"/images/blog/when-pro-code-wins-over-low-code-decision-matrix.svg"},{"title":"Identity Federation for Citizen Developers, Keycloak and Auth0","summary":"Identity federation for low-code platforms. Keycloak 25 and Auth0 in front of n8n and Make, with SAML, OIDC, group claims, and operational notes.","tags":["low-code","identity","keycloak"],"tracks":["programming"],"url":"/blog/identity-federation-citizen-developers-keycloak-auth0/","date":"2024-09-18","img":"/images/blog/identity-federation-citizen-developers-keycloak-auth0.svg"},{"title":"Building Reusable Connectors for n8n and Make in 2024","summary":"Reusable connectors for n8n and Make in 2024. Custom node code, OAuth scaffolding, dynamic options, and how to ship them to citizen devs without operational pain.","tags":["low-code","n8n","make"],"tracks":["programming"],"url":"/blog/reusable-connectors-n8n-make-2024/","date":"2024-09-16","img":"/images/blog/reusable-connectors-n8n-make-2024.svg"},{"title":"Webhook Reliability Patterns, Retries, Idempotency, Signatures","summary":"Outbound webhook reliability done right. Retries with jitter, idempotency keys, HMAC-SHA256 signing, and a Go 1.23 reference implementation.","tags":["low-code","webhooks","reliability"],"tracks":["programming"],"url":"/blog/webhook-reliability-patterns-retries-idempotency-signatures/","date":"2024-09-11","img":"/images/blog/webhook-reliability-patterns-retries-idempotency-signatures.svg"},{"title":"Securely Exposing Enterprise APIs to Citizen Developers","summary":"Exposing internal APIs to citizen devs safely. Kong 3.8 patterns, scoped tokens, rate limits, audit, and the bits that actually fail in practice.","tags":["low-code","api-gateway","kong"],"tracks":["programming"],"url":"/blog/securely-exposing-enterprise-apis-citizen-developers/","date":"2024-09-09","img":"/images/blog/securely-exposing-enterprise-apis-citizen-developers.svg"},{"title":"Self Hosting n8n for Engineering Teams in 2024","summary":"How to self-host n8n 1.58 properly. Postgres, queue mode, workers, secrets, upgrades, and the real operational footprint.","tags":["low-code","n8n","self-hosting"],"tracks":["programming"],"url":"/blog/self-hosting-n8n-engineering-teams-2024/","date":"2024-09-04","img":"/images/blog/self-hosting-n8n-engineering-teams-2024.svg"},{"title":"Low Code in the Enterprise, A Pro Code Engineer's Honest View","summary":"Low-code in the enterprise from a pro-code engineer. What n8n and Make are good for, what they break, and how to engage as a backend team.","tags":["low-code","n8n","enterprise"],"tracks":["programming"],"url":"/blog/low-code-enterprise-pro-code-view/","date":"2024-09-02","img":"/images/blog/low-code-enterprise-pro-code-view.svg"},{"title":"Digital Twins for Industrial Systems, Real Telemetry Edition","summary":"Digital twins built on real telemetry, with state models, sync patterns and worthwhile use cases.","tags":["iiot","digital-twin","architecture"],"tracks":["programming"],"url":"/blog/digital-twins-real-telemetry/","date":"2024-08-23","img":"/images/blog/digital-twins-real-telemetry.svg"},{"title":"Securing the OT IT Boundary in Industrial Networks","summary":"Practical OT/IT boundary security in 2024, with segmentation, auth and monitoring.","tags":["iiot","security","ot"],"tracks":["programming"],"url":"/blog/securing-ot-it-boundary/","date":"2024-08-21","img":"/images/blog/securing-ot-it-boundary.svg"},{"title":"Real Time Anomaly Detection for IIoT Telemetry","summary":"Real-time anomaly detection for industrial telemetry, practical approaches and alert hygiene.","tags":["iiot","anomaly-detection","ml"],"tracks":["programming"],"url":"/blog/realtime-anomaly-detection-iiot/","date":"2024-08-19","img":"/images/blog/realtime-anomaly-detection-iiot.svg"},{"title":"Bridging OPC UA to MQTT and Kafka, A 2024 Playbook","summary":"Bridging OPC UA into MQTT and Kafka with open62541 1.4 and clean schemas.","tags":["iiot","opc-ua","kafka"],"tracks":["programming"],"url":"/blog/opcua-mqtt-kafka-bridging/","date":"2024-08-16","img":"/images/blog/opcua-mqtt-kafka-bridging.svg"},{"title":"Time Series for IIoT, Timescale and InfluxDB Compared","summary":"TimescaleDB 2.16 versus InfluxDB 3.x for industrial telemetry, with the trade-offs that decide it.","tags":["iiot","time-series","database"],"tracks":["programming"],"url":"/blog/timeseries-timescale-influx-compared/","date":"2024-08-14","img":"/images/blog/timeseries-timescale-influx-compared.svg"},{"title":"Edge AI on Industrial Gateways, TFLite and ONNX in 2024","summary":"Running ML on industrial gateways with TFLite 2.16 and ONNX Runtime 1.18 in 2024.","tags":["iiot","edge-ai","ml"],"tracks":["programming"],"url":"/blog/edge-ai-tflite-onnx-2024/","date":"2024-08-12","img":"/images/blog/edge-ai-tflite-onnx-2024.svg"},{"title":"Scaling MQTT Brokers, EMQX and HiveMQ in Production","summary":"Scaling EMQX 5.7 and HiveMQ 4.28 for industrial workloads, with concrete tuning.","tags":["iiot","mqtt","scaling"],"tracks":["programming"],"url":"/blog/scaling-mqtt-emqx-hivemq/","date":"2024-08-09","img":"/images/blog/scaling-mqtt-emqx-hivemq.svg"},{"title":"MQTT 5 for Industrial, The Features That Actually Pay Off","summary":"The MQTT 5 features worth using in industrial, and the ones that aren't.","tags":["iiot","mqtt","protocols"],"tracks":["programming"],"url":"/blog/mqtt5-industrial-features/","date":"2024-08-07","img":"/images/blog/mqtt5-industrial-features.svg"},{"title":"Industrial IoT in 2024, A Reference Architecture That Scales","summary":"Reference IIoT architecture for 2024, edge to analytics, with the trade-offs that matter.","tags":["iiot","architecture","mqtt"],"tracks":["programming"],"url":"/blog/iiot-reference-architecture-2024/","date":"2024-08-05","img":"/images/blog/iiot-reference-architecture-2024.svg"},{"title":"mTLS, Service Mesh or Application Layer in 2024","summary":"Choosing between mesh-terminated and application-terminated mTLS in 2024, with Envoy 1.30 and Go 1.22 implementations and the failure modes that decide it.","tags":["api","mtls","security"],"tracks":["programming"],"url":"/blog/mtls-service-mesh-or-application-layer/","date":"2024-07-24","img":"/images/blog/mtls-service-mesh-or-application-layer.svg"},{"title":"OpenAPI First API Design in Go, oapi-codegen in 2024","summary":"How I run an OpenAPI-first workflow with oapi-codegen 2.x in Go 1.22, including schema patterns and CI discipline that keeps spec and code aligned.","tags":["api","openapi","go"],"tracks":["programming"],"url":"/blog/openapi-first-go-oapi-codegen/","date":"2024-07-22","img":"/images/blog/openapi-first-go-oapi-codegen.svg"},{"title":"Rate Limiting at Scale, Token Bucket and Sliding Window in Redis","summary":"Token bucket vs sliding window rate limiting in Redis, with Go code, Lua scripts, and the operational tradeoffs that decide which one to ship.","tags":["api","redis","rate-limiting"],"tracks":["programming"],"url":"/blog/rate-limiting-redis-token-bucket-sliding-window/","date":"2024-07-17","img":"/images/blog/rate-limiting-redis-token-bucket-sliding-window.svg"},{"title":"Choosing an API Gateway in 2024, Kong, Tyk, and Envoy Gateway","summary":"Comparing Kong 3.7, Tyk, and Envoy Gateway in 2024 by the operational tradeoffs that actually decide gateway choice in production.","tags":["api","gateway","infrastructure"],"tracks":["programming"],"url":"/blog/choosing-api-gateway-2024/","date":"2024-07-15","img":"/images/blog/choosing-api-gateway-2024.svg"},{"title":"Securing Go Microservices with JWT, Patterns That Hold Up","summary":"Production JWT patterns for Go microservices in 2024 using golang-jwt v5, covering signing, validation, and context plumbing.","tags":["api","security","go"],"tracks":["programming"],"url":"/blog/securing-go-microservices-jwt/","date":"2024-07-10","img":"/images/blog/securing-go-microservices-jwt.svg"},{"title":"gRPC for Internal Services in Go, A buf Powered Workflow","summary":"How I wire up gRPC for internal Go services in 2024 with buf CLI 1.34, lint rules, and breaking change detection.","tags":["api","grpc","go"],"tracks":["programming"],"url":"/blog/grpc-internal-services-go-buf/","date":"2024-07-08","img":"/images/blog/grpc-internal-services-go-buf.svg"},{"title":"Federated GraphQL with Apollo Router, Patterns for 2024","summary":"Federated GraphQL patterns I rely on with Apollo Router 1.48 in 2024, drawn from real subgraph deployments.","tags":["api","graphql","federation"],"tracks":["programming"],"url":"/blog/federated-graphql-apollo-router/","date":"2024-07-03","img":"/images/blog/federated-graphql-apollo-router.svg"},{"title":"GraphQL vs REST in 2024, An Honest Take After Five Years","summary":"An opinionated comparison of GraphQL and REST in 2024, drawn from production Go services, not benchmarks.","tags":["api","graphql","rest"],"tracks":["programming"],"url":"/blog/graphql-vs-rest-2024/","date":"2024-07-01","img":"/images/blog/graphql-vs-rest-2024.svg"},{"title":"Synthetic Monitoring and Canary Deploys, A Practical Pairing","summary":"Canaries catch regressions. Synthetics catch silent failures. Wire them together and you get progressive delivery that knows when to roll back without a human.","tags":["sre","canary","synthetic-monitoring"],"tracks":["programming"],"url":"/blog/synthetic-monitoring-and-canary-deploys/","date":"2024-06-26","img":"/images/blog/synthetic-monitoring-and-canary-deploys.svg"},{"title":"Blameless Postmortems That Actually Change Behavior","summary":"Blameless doesn't mean toothless. A postmortem template, the five questions that matter, and the followup ritual that closes the loop.","tags":["sre","postmortem","incident-response"],"tracks":["programming"],"url":"/blog/blameless-postmortems-that-actually-change-behavior/","date":"2024-06-24","img":"/images/blog/blameless-postmortems-that-actually-change-behavior.svg"},{"title":"Service Mesh Resilience, Istio Ambient vs Linkerd in 2024","summary":"Istio Ambient just hit GA. Linkerd 2.15 is still the simplicity champion. Here's how they compare for the resilience patterns that actually matter.","tags":["sre","service-mesh","istio"],"tracks":["programming"],"url":"/blog/service-mesh-resilience-istio-ambient-vs-linkerd-2024/","date":"2024-06-19","img":"/images/blog/service-mesh-resilience-istio-ambient-vs-linkerd-2024.svg"},{"title":"eBPF Plus OpenTelemetry, The Observability Pairing for 2024","summary":"eBPF gives you kernel-truth signals without instrumenting code. OpenTelemetry gives you a vendor-neutral pipeline. Together they're the cheapest observability you can stand up in 2024.","tags":["sre","ebpf","opentelemetry"],"tracks":["programming"],"url":"/blog/ebpf-plus-opentelemetry-observability-2024/","date":"2024-06-17","img":"/images/blog/ebpf-plus-opentelemetry-observability-2024.svg"},{"title":"Auto Remediation on Kubernetes, Argo Events and Policy as Code","summary":"Auto-remediation is high-leverage and high-risk. Argo Events plus Kyverno gives you declarative remediation. Here's the pattern and the guardrails it needs.","tags":["sre","auto-remediation","kubernetes"],"tracks":["programming"],"url":"/blog/auto-remediation-kubernetes-argo-events-policy/","date":"2024-06-12","img":"/images/blog/auto-remediation-kubernetes-argo-events-policy.svg"},{"title":"Chaos Engineering on Kubernetes, Litmus and Chaos Mesh in 2024","summary":"Litmus and Chaos Mesh have both matured. Here's how to pick between them, the experiments worth running first, and the safety scaffolding nobody talks about.","tags":["sre","chaos-engineering","kubernetes"],"tracks":["programming"],"url":"/blog/chaos-engineering-kubernetes-litmus-chaos-mesh-2024/","date":"2024-06-10","img":"/images/blog/chaos-engineering-kubernetes-litmus-chaos-mesh-2024.svg"},{"title":"SLOs and Error Budgets That Engineers Actually Use","summary":"SLOs are easy to write and hard to use. Here's how to build budgets your team will reach for during incidents and planning, not just QBRs.","tags":["sre","slo","observability"],"tracks":["programming"],"url":"/blog/slos-error-budgets-engineers-actually-use/","date":"2024-06-05","img":"/images/blog/slos-error-budgets-engineers-actually-use.svg"},{"title":"Digital Immune Systems for Engineers, What Gartner Got Right","summary":"Cutting through the analyst gloss on Digital Immune Systems. Six concrete pillars, the ones worth your time, and the ones that are just rebrands.","tags":["sre","digital-immune-system","resilience"],"tracks":["programming"],"url":"/blog/digital-immune-systems-for-engineers/","date":"2024-06-03","img":"/images/blog/digital-immune-systems-for-engineers.svg"},{"title":"Evaluating LLM Agents, From Vibes to Regression Suites","summary":"A practical agent evaluation system with deterministic checks, LLM-as-judge rubrics, and the regression discipline that survives model upgrades.","tags":["agents","evaluation","testing"],"tracks":["programming"],"url":"/blog/evaluating-llm-agents/","date":"2024-05-24","img":"/images/blog/evaluating-llm-agents.svg"},{"title":"Cost Control for LLM Agents, Token Budgets and Anthropic Prompt Caching","summary":"How to keep agent bills under control with hard budgets, per-step caps, model routing, and the prompt caching feature Anthropic just shipped.","tags":["agents","cost","anthropic"],"tracks":["programming"],"url":"/blog/cost-control-for-llm-agents/","date":"2024-05-22","img":"/images/blog/cost-control-for-llm-agents.svg"},{"title":"Guardrails for LLM Agents in 2024, Llama Guard, Rebuff, and NeMo","summary":"Where Llama Guard, Rebuff, and NeMo each earn their place in an agent guardrail stack, and the layered approach that keeps the false positive rate bearable.","tags":["agents","guardrails","safety"],"tracks":["programming"],"url":"/blog/guardrails-for-llm-agents-2024/","date":"2024-05-20","img":"/images/blog/guardrails-for-llm-agents-2024.svg"},{"title":"Memory for AI Agents, Short Term, Long Term, and What to Store Where","summary":"How to give agents memory without overstuffing the context window or building a vector database mausoleum, with concrete patterns and code.","tags":["agents","memory","vector-search"],"tracks":["programming"],"url":"/blog/memory-for-ai-agents/","date":"2024-05-17","img":"/images/blog/memory-for-ai-agents.svg"},{"title":"ReAct, Reflexion, and Planner Executor, Agent Loop Patterns That Work","summary":"Three agent loop patterns, when each is the right shape, and the code to build them with LangChain 0.1 and OpenAI's function calling.","tags":["agents","react","reflexion"],"tracks":["programming"],"url":"/blog/react-reflexion-planner-executor-agent-loops/","date":"2024-05-15","img":"/images/blog/react-reflexion-planner-executor-agent-loops.svg"},{"title":"Multi Agent Conversations with AutoGen, Patterns and Pitfalls","summary":"When AutoGen's multi-agent model earns its keep, when it does not, and the patterns that prevent infinite loops and budget blowups.","tags":["agents","autogen","multi-agent"],"tracks":["programming"],"url":"/blog/multi-agent-conversations-with-autogen/","date":"2024-05-13","img":"/images/blog/multi-agent-conversations-with-autogen.svg"},{"title":"Designing Tools for LLM Agents, Function Schemas That Survive Production","summary":"The tool layer is where most agents quietly fail. This is the schema, validation, and error-design playbook that keeps yours working.","tags":["agents","tools","function-calling"],"tracks":["programming"],"url":"/blog/designing-tools-for-llm-agents/","date":"2024-05-10","img":"/images/blog/designing-tools-for-llm-agents.svg"},{"title":"Production Agents with LangGraph, State Machines Over Chains","summary":"A practical walkthrough of building agents that survive production with LangGraph state machines, checkpointing, and explicit edges.","tags":["agents","langgraph","state-machines"],"tracks":["programming"],"url":"/blog/production-agents-langgraph-state-machines/","date":"2024-05-08","img":"/images/blog/production-agents-langgraph-state-machines.svg"},{"title":"The Agentic AI Landscape in May 2024, LangGraph, AutoGen, CrewAI","summary":"Comparing the three agent frameworks that matter right now, with code, and the architectural decisions that follow from each.","tags":["agents","langgraph","autogen"],"tracks":["programming"],"url":"/blog/agentic-ai-landscape-may-2024/","date":"2024-05-06","img":"/images/blog/agentic-ai-landscape-may-2024.svg"},{"title":"From VS Code to Neovim in 30 Days, A Senior Dev's Migration Plan","summary":"A pragmatic 30-day plan for migrating from VS Code to Neovim as a senior developer.","tags":["neovim","vscode","migration"],"tracks":["programming"],"url":"/blog/from-vs-code-to-neovim-in-30-days-a-senior-devs-migration-plan/","date":"2024-04-24","img":"/images/blog/from-vs-code-to-neovim-in-30-days-a-senior-devs-migration-plan.svg"},{"title":"AI Assist in Neovim, Copilot, Codeium, and ChatGPT in 2024","summary":"How Copilot, Codeium, and ChatGPT integrations stack up in Neovim in 2024.","tags":["neovim","ai","copilot"],"tracks":["programming"],"url":"/blog/ai-assist-in-neovim-copilot-codeium-and-chatgpt-in-2024/","date":"2024-04-22","img":"/images/blog/ai-assist-in-neovim-copilot-codeium-and-chatgpt-in-2024.svg"},{"title":"Debugging in Neovim with nvim-dap, Go and Python in 2024","summary":"Configure nvim-dap for real debugging in Go and Python projects from Neovim.","tags":["neovim","nvim-dap","debugging"],"tracks":["programming"],"url":"/blog/debugging-in-neovim-with-nvim-dap-go-and-python-in-2024/","date":"2024-04-17","img":"/images/blog/debugging-in-neovim-with-nvim-dap-go-and-python-in-2024.svg"},{"title":"Tmux and Neovim Together, A Keyboard Only Workflow That Sticks","summary":"A keyboard-only workflow combining tmux and Neovim for backend development.","tags":["neovim","tmux","workflow"],"tracks":["programming"],"url":"/blog/tmux-and-neovim-together-a-keyboard-only-workflow-that-sticks/","date":"2024-04-15","img":"/images/blog/tmux-and-neovim-together-a-keyboard-only-workflow-that-sticks.svg"},{"title":"Treesitter for Real Refactoring, Structural Edits in Neovim","summary":"How to use Treesitter for real structural refactoring in Neovim.","tags":["neovim","treesitter","refactoring"],"tracks":["programming"],"url":"/blog/treesitter-for-real-refactoring-structural-edits-in-neovim/","date":"2024-04-10","img":"/images/blog/treesitter-for-real-refactoring-structural-edits-in-neovim.svg"},{"title":"Fast Code Navigation in Neovim, Telescope and fzf-lua Patterns","summary":"Practical navigation workflows in Neovim using telescope.nvim and fzf-lua.","tags":["neovim","telescope","fzf-lua"],"tracks":["programming"],"url":"/blog/fast-code-navigation-in-neovim-telescope-and-fzf-lua-patterns/","date":"2024-04-08","img":"/images/blog/fast-code-navigation-in-neovim-telescope-and-fzf-lua-patterns.svg"},{"title":"Bootstrapping Neovim with lazy.nvim and Mason, A Backend Dev Setup","summary":"How to bootstrap Neovim with lazy.nvim and Mason for backend development in 2024.","tags":["neovim","lazy.nvim","mason"],"tracks":["programming"],"url":"/blog/bootstrapping-neovim-with-lazy-nvim-and-mason-a-backend-dev-setup/","date":"2024-04-03","img":"/images/blog/bootstrapping-neovim-with-lazy-nvim-and-mason-a-backend-dev-setup.svg"},{"title":"Why Senior Developers Are Moving to Neovim in 2024","summary":"The technical and ergonomic reasons Neovim is winning over senior developers in 2024.","tags":["neovim","developer-tools","productivity"],"tracks":["programming"],"url":"/blog/why-senior-developers-are-moving-to-neovim-in-2024/","date":"2024-04-01","img":"/images/blog/why-senior-developers-are-moving-to-neovim-in-2024.svg"},{"title":"Shipping Rust to Kubernetes, Smaller Images and Faster Cold Starts","summary":"Production guide to shipping Rust to Kubernetes with multi-stage Docker, distroless images, and cross-compilation.","tags":["rust","kubernetes","docker","distroless","devops"],"tracks":["programming"],"url":"/blog/shipping-rust-kubernetes-distroless-docker-2024/","date":"2024-03-27","img":"/images/blog/shipping-rust-kubernetes-distroless-docker-2024.svg"},{"title":"Rust Service Observability in 2024, Metrics, Logs, and Traces That Help","summary":"Production observability for Rust services with the metrics crate, Prometheus, tracing, and OpenTelemetry.","tags":["rust","observability","prometheus","opentelemetry","tracing"],"tracks":["programming"],"url":"/blog/rust-service-observability-metrics-logs-traces-2024/","date":"2024-03-25","img":"/images/blog/rust-service-observability-metrics-logs-traces-2024.svg"},{"title":"Safe Shared State in Rust, Arc, Mutex, and the Channel You Should Pick","summary":"Practical guide to Arc, Mutex, RwLock, and channel choices for safe shared state in async and threaded Rust.","tags":["rust","concurrency","tokio","arc","mutex"],"tracks":["programming"],"url":"/blog/rust-shared-state-arc-mutex-channels-2024/","date":"2024-03-20","img":"/images/blog/rust-shared-state-arc-mutex-channels-2024.svg"},{"title":"Rust to WebAssembly at the Edge, Wasmtime and WASI in 2024","summary":"Compile Rust to WebAssembly for edge runtimes with wasmtime 18, WASI Preview 2, and the component model.","tags":["rust","webassembly","wasm","wasmtime","wasi","edge"],"tracks":["programming"],"url":"/blog/rust-webassembly-edge-wasmtime-wasi-2024/","date":"2024-03-18","img":"/images/blog/rust-webassembly-edge-wasmtime-wasi-2024.svg"},{"title":"Embedded Rust in 2024, Embassy and the no_std Stack","summary":"Practical guide to embedded Rust in 2024 with embassy 0.5, no_std, and async on Cortex-M and ESP32 hardware.","tags":["rust","embedded","embassy","no_std","iot"],"tracks":["programming"],"url":"/blog/embedded-rust-embassy-no-std-2024/","date":"2024-03-13","img":"/images/blog/embedded-rust-embassy-no-std-2024.svg"},{"title":"Building an HTTP Service with Axum 0.7, From Zero to Tracing","summary":"Axum 0.7 end-to-end. Extractors, error types, middleware layers, OpenTelemetry tracing. The setup that pays off by week two.","tags":["rust","axum","tracing","opentelemetry"],"tracks":["programming"],"url":"/blog/axum-http-service-tracing-2024/","date":"2024-03-11","img":"/images/blog/axum-http-service-tracing-2024.svg"},{"title":"Async Rust Without the Footguns, Tokio Patterns in 2024","summary":"Async Tokio patterns that survive prod. Cancellation, JoinSet, select, bounded channels. The footguns and how to dodge them.","tags":["rust","async","tokio","concurrency"],"tracks":["programming"],"url":"/blog/async-rust-tokio-patterns-2024/","date":"2024-03-06","img":"/images/blog/async-rust-tokio-patterns-2024.svg"},{"title":"Rust in Production, Where the 2024 Stack Has Matured","summary":"Rust in production 2024 — what's mature, what still bites. Async runtimes, frameworks, observability, deploy. Honest survey for backend devs.","tags":["rust","production","tokio","axum"],"tracks":["programming"],"url":"/blog/rust-production-2024-stack/","date":"2024-03-04","img":"/images/blog/rust-production-2024-stack.svg"},{"title":"Evaluating RAG, Beyond Vibes-Based Testing","summary":"Ragas, TruLens, DeepEval — measuring RAG quality. Faithfulness, context precision, answer relevance. CI integration without LLM-as-judge bills.","tags":["rag","evaluation","ragas","trulens","llm"],"tracks":["ai"],"url":"/blog/rag-evaluation-ragas-trulens-deepeval/","date":"2024-02-26","img":"/images/blog/rag-evaluation-ragas-trulens-deepeval.svg"},{"title":"Re-ranking and Reciprocal Rank Fusion in RAG Pipelines","summary":"Cross-encoder rerankers turn top-50 retrieval into clean top-5. Cohere Rerank vs BGE-reranker, latency budgets, where it slots in your RAG pipeline.","tags":["rag","reranking","cohere","bge"],"tracks":["ai"],"url":"/blog/rag-reranking-rrf-cohere-bge/","date":"2024-02-21","img":"/images/blog/rag-reranking-rrf-cohere-bge.svg"},{"title":"Securing RAG, Per-User Document Access Without Re-indexing","summary":"Multi-tenant RAG without leaks. Metadata filtering at retrieval, ACL design, audit trails, and prompt-side defenses for what filters miss.","tags":["rag","security","access-control","multi-tenant"],"tracks":["ai"],"url":"/blog/rag-security-access-control-multi-tenant/","date":"2024-02-19","img":"/images/blog/rag-security-access-control-multi-tenant.svg"},{"title":"Hybrid Search, BM25 Plus Vectors for Better RAG Recall","summary":"Pure vector search misses exact-match queries. Hybrid BM25 + dense + RRF closes the gap. Real code, real numbers, real trade-offs.","tags":["rag","hybrid-search","bm25","qdrant","elasticsearch"],"tracks":["ai"],"url":"/blog/hybrid-search-bm25-vectors-rag/","date":"2024-02-14","img":"/images/blog/hybrid-search-bm25-vectors-rag.svg"},{"title":"Chunking Strategies for RAG That Survive Real Documents","summary":"Chunking is where RAG quality is won or lost. Semantic, hierarchical, sentence-window strategies and concrete code for documents that break defaults.","tags":["rag","chunking","llamaindex","langchain"],"tracks":["ai"],"url":"/blog/rag-chunking-strategies-real-documents/","date":"2024-02-12","img":"/images/blog/rag-chunking-strategies-real-documents.svg"},{"title":"Embedding Models in 2024, OpenAI vs Cohere vs Open Source","summary":"text-embedding-3, Cohere v3, bge-m3 — which embedding model in 2024. Dimension trade-offs, multilingual, cost. Honest comparison.","tags":["embeddings","openai","cohere","rag"],"tracks":["ai"],"url":"/blog/embedding-models-2024-openai-cohere-open-source/","date":"2024-02-07","img":"/images/blog/embedding-models-2024-openai-cohere-open-source.svg"},{"title":"Choosing a Vector Database, Pinecone vs Qdrant vs pgvector","summary":"Pinecone serverless, Qdrant v1.7, pgvector 0.5 — how to pick. Cost, hybrid search, filtering, ops. Honest trade-offs, no marketing.","tags":["vector-database","pinecone","qdrant","pgvector","rag"],"tracks":["ai"],"url":"/blog/vector-database-pinecone-qdrant-pgvector/","date":"2024-02-05","img":"/images/blog/vector-database-pinecone-qdrant-pgvector.svg"},{"title":"Why Naive RAG Fails in Production, A 2024 Reality Check","summary":"Naive RAG breaks in prod. Recall gaps, chunk boundaries, stale data. What the 2024 RAG stack changed and where the demo-to-prod gap still hides.","tags":["rag","llm","vector-database","production-ai"],"tracks":["ai"],"url":"/blog/naive-rag-failures-production-2024/","date":"2024-02-02","img":"/images/blog/naive-rag-failures-production-2024.svg"},{"title":"Self-Service Infrastructure with Argo CD ApplicationSets","summary":"Argo CD ApplicationSets turn self-service GitOps real. Generators, multi-cluster fan-out, and the patterns that scale past 200 services.","tags":["argo-cd","applicationsets","gitops","platform-engineering"],"tracks":["programming"],"url":"/blog/argo-cd-applicationsets-self-service/","date":"2024-01-29","img":"/images/blog/argo-cd-applicationsets-self-service.svg"},{"title":"Workload Specifications with Score, Decoupling Code from Deploy","summary":"Score decouples app spec from deploy target. Same workload runs on K8s, ECS, or Nomad. What it actually buys you, where it falls short.","tags":["score","workload-specification","platform-engineering","kubernetes"],"tracks":["programming"],"url":"/blog/score-workload-spec-platform/","date":"2024-01-24","img":"/images/blog/score-workload-spec-platform.svg"},{"title":"Measuring Developer Experience, DORA Metrics in Practice","summary":"DX metrics that survive a year. DORA, SPACE, and the practical instrumentation for a platform team in 2024 without surveillance optics.","tags":["developer-experience","dora-metrics","platform-engineering","observability"],"tracks":["programming"],"url":"/blog/developer-experience-metrics-dora-2024/","date":"2024-01-22","img":"/images/blog/developer-experience-metrics-dora-2024.svg"},{"title":"Designing a Service Catalog Developers Actually Use","summary":"A Backstage service catalog that survives. Entity model, ownership, automation, and the rot patterns that kill it within a year.","tags":["backstage","service-catalog","platform-engineering","developer-experience"],"tracks":["programming"],"url":"/blog/service-catalog-backstage-design/","date":"2024-01-17","img":"/images/blog/service-catalog-backstage-design.svg"},{"title":"Crossplane vs Terraform for Platform Teams","summary":"Crossplane v1.14 vs Terraform 1.6 for platform teams. Honest trade-offs, drift handling, where each one belongs in your IDP.","tags":["crossplane","terraform","platform-engineering","kubernetes"],"tracks":["programming"],"url":"/blog/crossplane-vs-terraform-platform-teams/","date":"2024-01-15","img":"/images/blog/crossplane-vs-terraform-platform-teams.svg"},{"title":"Golden Paths, How Self-Service Actually Sticks","summary":"Golden paths beat shelfware when they're opinionated, versioned, and updateable. How to design templates devs don't abandon at day 30.","tags":["golden-paths","developer-experience","backstage","platform-engineering"],"tracks":["programming"],"url":"/blog/golden-paths-self-service-developer-experience/","date":"2024-01-10","img":"/images/blog/golden-paths-self-service-developer-experience.svg"},{"title":"Building an Internal Developer Platform with Backstage and Kubernetes","summary":"Minimum viable IDP on Backstage 1.21 + K8s 1.29. Catalog model, scaffolder, what to ship in 90 days, what to defer.","tags":["backstage","kubernetes","idp","platform-engineering"],"tracks":["programming"],"url":"/blog/internal-developer-platform-backstage-kubernetes/","date":"2024-01-08","img":"/images/blog/internal-developer-platform-backstage-kubernetes.svg"},{"title":"Why Platform Engineering Won the DevOps Debate in 2024","summary":"Platform engineering replaced DevOps-for-everyone in 2024. What changed, what an IDP delivers, and why cognitive load is the real metric.","tags":["platform-engineering","devops","idp","developer-experience"],"tracks":["programming"],"url":"/blog/platform-engineering-vs-devops-2024/","date":"2024-01-03","img":"/images/blog/platform-engineering-vs-devops-2024.svg"},{"title":"2023 Year-End Retrospective, What I Learned, What I'd Do Differently","summary":"Twelve months of leadership and team work, written honestly. Wins, misses, and what I'm taking into 2024.","tags":["retrospective","leadership","year-end"],"tracks":["programming"],"url":"/blog/2023-year-end-retrospective/","date":"2023-12-28","img":"/images/blog/2023-year-end-retrospective.svg"},{"title":"The 2023 LLM Tooling Retrospective, What Actually Changed About My Workflow","summary":"Which 2023 LLM tools actually earned their place in a senior engineer's daily workflow, and which got dropped.","tags":["retrospective","llm","tooling","ai"],"tracks":["programming"],"url":"/blog/2023-llm-tooling-retrospective/","date":"2023-12-27","img":"/images/blog/2023-llm-tooling-retrospective.svg"},{"title":"Event Storming for Discovery, Drawing the Business on a Wall","summary":"Event storming is the fastest way to map a complex business domain. A practical guide to running your first session.","tags":["leadership","discovery","event-storming","ddd"],"tracks":["programming"],"url":"/blog/event-storming-for-discovery/","date":"2023-12-22","img":"/images/blog/event-storming-for-discovery.svg"},{"title":"Decision Logs and Async Leadership, Running a Team That Doesn't Share a Time Zone","summary":"Distributed teams fail when leaders lead synchronously. Decision logs and async habits that make it work.","tags":["leadership","remote","async"],"tracks":["programming"],"url":"/blog/decision-logs-and-async-leadership/","date":"2023-12-20","img":"/images/blog/decision-logs-and-async-leadership.svg"},{"title":"RFCs and ADRs as Leadership Tools, Writing Is the Job","summary":"RFCs and ADRs are leverage, not process. Templates and the cultural moves that make them stick.","tags":["leadership","rfc","adr","documentation"],"tracks":["programming"],"url":"/blog/rfcs-and-adrs-as-leadership-tools/","date":"2023-12-18","img":"/images/blog/rfcs-and-adrs-as-leadership-tools.svg"},{"title":"Managing Multidisciplinary Teams, Why Most Cross-Functional Friction Is Structural","summary":"Cross-functional friction is usually about team structure, not personalities. A field guide to fixing the topology.","tags":["leadership","team-topologies","multidisciplinary"],"tracks":["programming"],"url":"/blog/managing-multidisciplinary-teams/","date":"2023-12-13","img":"/images/blog/managing-multidisciplinary-teams.svg"},{"title":"Discovery Questionnaires and the Mom Test, Questions That Actually Surface Truth","summary":"Specific question patterns for discovery, borrowed from the Mom Test and refined across many projects.","tags":["leadership","discovery","product"],"tracks":["programming"],"url":"/blog/discovery-questionnaires-and-the-mom-test/","date":"2023-12-11","img":"/images/blog/discovery-questionnaires-and-the-mom-test.svg"},{"title":"Consultative Discovery for Software Projects, Beyond the Requirements Doc","summary":"Stated requirements are almost never the real requirements. A framework for running discovery sessions that surface the actual problem.","tags":["leadership","discovery","consulting"],"tracks":["programming"],"url":"/blog/consultative-discovery-for-software-projects/","date":"2023-12-06","img":"/images/blog/consultative-discovery-for-software-projects.svg"},{"title":"From Senior Engineer to Tech Lead, The Identity Shift Nobody Warns You About","summary":"The hardest part of becoming a tech lead isn't the new responsibilities — it's letting go of the identity that got you the role.","tags":["leadership","career","tech-lead"],"tracks":["programming"],"url":"/blog/from-senior-engineer-to-tech-lead/","date":"2023-12-04","img":"/images/blog/from-senior-engineer-to-tech-lead.svg"},{"title":"LLM Vendor Risk, A Failover Playbook After the OpenAI Weekend","summary":"A failover playbook for LLM apps after the OpenAI weekend — multi-provider routing, abstraction layers, and what's worth doing.","tags":["llm","vendor-risk","architecture"],"tracks":["ai"],"url":"/blog/llm-vendor-risk-failover-strategy/","date":"2023-11-30","img":"/images/blog/llm-vendor-risk-failover-strategy.svg"},{"title":"LangChain LCEL vs LlamaIndex, Picking a Framework in Late 2023","summary":"Picking between LangChain LCEL and LlamaIndex in late 2023 — orchestration vs retrieval, when to use each, and where they overlap.","tags":["llm","langchain","llamaindex"],"tracks":["ai"],"url":"/blog/langchain-lcel-vs-llamaindex-routing/","date":"2023-11-28","img":"/images/blog/langchain-lcel-vs-llamaindex-routing.svg"},{"title":"Claude 2.1 vs GPT-4 Turbo, A Side-by-Side at 100K Context","summary":"Side-by-side notes on Claude 2.1 200K vs GPT-4 Turbo 128K — long-context recall, document QA, function calling, and production fit.","tags":["llm","claude","anthropic"],"tracks":["ai"],"url":"/blog/claude-2-1-200k-context-comparison/","date":"2023-11-24","img":"/images/blog/claude-2-1-200k-context-comparison.svg"},{"title":"LLM Observability in Practice, Logs, Traces, and a Useful Dashboard","summary":"Practical LLM observability — what to log, what to alert on, and what a useful dashboard for a RAG system looks like.","tags":["llm","observability","monitoring"],"tracks":["ai"],"url":"/blog/llm-observability-monitoring-dashboard/","date":"2023-11-22","img":"/images/blog/llm-observability-monitoring-dashboard.svg"},{"title":"Putting a RAG Evaluation Pipeline in CI, The Setup I Actually Use","summary":"A practical RAG eval setup wired into CI — retrieval and generation metrics, golden questions, and catching silent regressions.","tags":["llm","evaluation","rag"],"tracks":["ai"],"url":"/blog/rag-evaluation-pipeline-ci/","date":"2023-11-20","img":"/images/blog/rag-evaluation-pipeline-ci.svg"},{"title":"Hybrid Retrieval with pgvector and BM25, A Practical Walkthrough","summary":"Building hybrid retrieval on Postgres with pgvector 0.5 and BM25 — schema, query, score fusion, and trade-offs vs managed vector DBs.","tags":["llm","pgvector","postgres"],"tracks":["ai"],"url":"/blog/hybrid-retrieval-pgvector-bm25/","date":"2023-11-16","img":"/images/blog/hybrid-retrieval-pgvector-bm25.svg"},{"title":"Securing an Internal LLM Chatbot, Threats, Boundaries, and What I Got Wrong","summary":"A practical guide to securing internal LLM chatbots — prompt injection, leakage, access control, and the gaps people miss.","tags":["llm","security","rag"],"tracks":["ai"],"url":"/blog/securing-internal-llm-chatbot-data/","date":"2023-11-14","img":"/images/blog/securing-internal-llm-chatbot-data.svg"},{"title":"The OpenAI Assistants API in Production, A Cautious Take","summary":"An honest production review of the OpenAI Assistants API beta — what it solves, where it falls short, and why I'm cautious about adoption.","tags":["llm","openai","assistants-api"],"tracks":["ai"],"url":"/blog/openai-assistants-api-production-review/","date":"2023-11-10","img":"/images/blog/openai-assistants-api-production-review.svg"},{"title":"Migrating to GPT-4 Turbo, What 128K Context Actually Changes","summary":"Migrating a production RAG chatbot from gpt-3.5-turbo-16k to GPT-4 Turbo 128K — cost, latency, and when context matters.","tags":["llm","openai","gpt-4-turbo"],"tracks":["ai"],"url":"/blog/gpt-4-turbo-128k-context-migration/","date":"2023-11-08","img":"/images/blog/gpt-4-turbo-128k-context-migration.svg"},{"title":"Shipping an Internal RAG Chatbot with LlamaIndex 0.8, What Actually Matters","summary":"Lessons from building a production internal RAG chatbot with LlamaIndex 0.8 — retrieval design, chunking, and the plumbing that makes it work.","tags":["llm","llamaindex","rag"],"tracks":["ai"],"url":"/blog/internal-rag-chatbot-llamaindex/","date":"2023-11-02","img":"/images/blog/internal-rag-chatbot-llamaindex.svg"},{"title":"Repository Pattern Done Right in PHP and Go, A Decade of Mistakes Distilled","summary":"The repository pattern, demystified. When to use it, when not to, and the specific mistakes I made over ten years. Real examples in PHP 8.2 and Go 1.21.","tags":["architecture","php","go"],"tracks":["programming"],"url":"/blog/repository-pattern-done-right-php-and-go/","date":"2023-10-26","img":"/images/blog/repository-pattern-done-right-php-and-go.svg"},{"title":"Decoupling Laravel From Eloquent Without Fighting the Framework","summary":"How to decouple application code from Eloquent in Laravel 10 without ditching it. Mapping patterns, transaction boundaries, and the case for keeping Eloquent.","tags":["laravel","architecture","eloquent"],"tracks":["programming"],"url":"/blog/decoupling-laravel-from-eloquent-without-fighting-the-framework/","date":"2023-10-23","img":"/images/blog/decoupling-laravel-from-eloquent-without-fighting-the-framework.svg"},{"title":"Dependency Injection in Laravel 10, Container Patterns That Earn Their Keep","summary":"Practical Laravel 10 service container patterns: contextual bindings, scoped instances, and tagged services. With production examples and anti-patterns.","tags":["laravel","architecture","php"],"tracks":["programming"],"url":"/blog/dependency-injection-laravel-container-patterns/","date":"2023-10-19","img":"/images/blog/dependency-injection-laravel-container-patterns.svg"},{"title":"Domain Layer Purity in Laravel 10, Entities, Value Objects, and Where Most Codebases Lose It","summary":"Building a real domain layer in Laravel 10 without Eloquent leaking through. Entities, value objects, and the discipline to keep them framework-free.","tags":["laravel","architecture","ddd"],"tracks":["programming"],"url":"/blog/domain-layer-purity-in-laravel-10/","date":"2023-10-16","img":"/images/blog/domain-layer-purity-in-laravel-10.svg"},{"title":"Ports and Adapters in Go 1.21 with Wire and uber-go/fx","summary":"Hexagonal architecture in idiomatic Go 1.21. When to use Wire, when to use fx, and when to just write the wiring by hand. With production-tested patterns.","tags":["go","architecture","dependency-injection"],"tracks":["programming"],"url":"/blog/ports-and-adapters-in-go-with-wire-and-fx/","date":"2023-10-12","img":"/images/blog/ports-and-adapters-in-go-with-wire-and-fx.svg"},{"title":"Hexagonal Architecture Explained for PHP and Go Developers","summary":"Hexagonal architecture, ports and adapters, explained without the dogma. With concrete PHP 8.2 and Go 1.21 code, and the parts I think Cockburn got right.","tags":["architecture","go","php"],"tracks":["programming"],"url":"/blog/hexagonal-architecture-explained-for-php-and-go-devs/","date":"2023-10-09","img":"/images/blog/hexagonal-architecture-explained-for-php-and-go-devs.svg"},{"title":"Clean Architecture in PHP Without the Cult, A Pragmatic Take","summary":"Clean Architecture in PHP without the dogma. Use cases, entities, and where to stop folder-splitting. A pragmatic guide from a Laravel 10 production codebase.","tags":["php","architecture","laravel"],"tracks":["programming"],"url":"/blog/clean-architecture-php-without-the-cult/","date":"2023-10-05","img":"/images/blog/clean-architecture-php-without-the-cult.svg"},{"title":"Upgrading to Laravel 10, A Real-World Checklist From a Production Codebase","summary":"What actually breaks when upgrading a Laravel 9 app to Laravel 10 in production. PHP 8.1 floor, native types, deprecations, and the migrations that bit me.","tags":["laravel","architecture","php"],"tracks":["programming"],"url":"/blog/upgrading-laravel-10-real-world-checklist/","date":"2023-10-02","img":"/images/blog/upgrading-laravel-10-real-world-checklist.svg"},{"title":"Pod Security Standards in 2023, Migrating Off PSPs Without Breaking Everything","summary":"Migrating from PodSecurityPolicy to Pod Security Standards on Kubernetes 1.28 — namespace labels, audit-mode rollout, and the workloads guaranteed to break.","tags":["security","kubernetes","pod-security","psp","devsecops"],"tracks":["programming"],"url":"/blog/pod-security-standards-migration/","date":"2023-09-28","img":"/images/blog/pod-security-standards-migration.svg"},{"title":"SLSA v1.0 in Practice, Build Provenance Without Boiling the Ocean","summary":"Pragmatic SLSA v1.0 provenance with GitHub Actions and Cosign — what Level 2 actually delivers, and the operational lift to reach Level 3.","tags":["security","slsa","supply-chain","provenance","github-actions"],"tracks":["programming"],"url":"/blog/slsa-provenance-build-attestations/","date":"2023-09-25","img":"/images/blog/slsa-provenance-build-attestations.svg"},{"title":"OPA 0.55 and Gatekeeper 3.13, Writing Admission Policies People Will Actually Maintain","summary":"Practical Gatekeeper 3.13 admission policy patterns — constraint templates, audit mode, mutation, and Rego that is actually maintainable.","tags":["security","opa","gatekeeper","kubernetes","policy"],"tracks":["programming"],"url":"/blog/opa-gatekeeper-admission-policy/","date":"2023-09-21","img":"/images/blog/opa-gatekeeper-admission-policy.svg"},{"title":"Falco 0.35 in Production, Runtime Detection Without the Alert Fatigue","summary":"Running Falco 0.35 in production Kubernetes with the modern eBPF driver — rule tuning, output routing to Slack and SIEM, and the defaults to switch off.","tags":["security","falco","runtime-security","kubernetes","ebpf"],"tracks":["programming"],"url":"/blog/falco-runtime-security-kubernetes/","date":"2023-09-18","img":"/images/blog/falco-runtime-security-kubernetes.svg"},{"title":"Vault 1.14 Dynamic Secrets in Kubernetes, Past the Sidecar Demo","summary":"Running Vault 1.14 dynamic database secrets in Kubernetes 1.28 — injector vs CSI, lease renewal, and the failure modes that bite under load.","tags":["security","vault","secrets-management","kubernetes","devsecops"],"tracks":["programming"],"url":"/blog/vault-dynamic-secrets-kubernetes/","date":"2023-09-14","img":"/images/blog/vault-dynamic-secrets-kubernetes.svg"},{"title":"SBOMs That Are Actually Useful, Syft, CycloneDX 1.5, and the Limits of Static Analysis","summary":"Producing accurate SBOMs with Syft and CycloneDX 1.5, the gaps you will not see, and how to attach them as signed attestations.","tags":["security","sbom","supply-chain","cyclonedx","syft"],"tracks":["programming"],"url":"/blog/sbom-syft-cyclonedx-pipeline/","date":"2023-09-11","img":"/images/blog/sbom-syft-cyclonedx-pipeline.svg"},{"title":"Keyless Container Signing With Cosign 2.2, A Setup That Survives an Audit","summary":"Production-grade keyless container signing with Cosign 2.2 and Sigstore — the OIDC trust chain, Rekor verification, and air-gap caveats.","tags":["security","sigstore","cosign","supply-chain","containers"],"tracks":["programming"],"url":"/blog/sigstore-cosign-keyless-signing/","date":"2023-09-07","img":"/images/blog/sigstore-cosign-keyless-signing.svg"},{"title":"Wiring Trivy 0.45 Into a CI Pipeline That Actually Blocks Bad Builds","summary":"Trivy 0.45 in CI: severity gating, ignore policies, DB caching, and the gotchas that bite teams shipping containers daily.","tags":["security","trivy","containers","devsecops","ci-cd"],"tracks":["programming"],"url":"/blog/trivy-container-scanning-pipeline/","date":"2023-09-04","img":"/images/blog/trivy-container-scanning-pipeline.svg"},{"title":"Backpressure and Reliability Patterns for IIoT Pipelines","summary":"End-to-end backpressure, DLQs, and graceful degradation patterns for IIoT pipelines, edge to cloud.","tags":["iot","reliability","kafka"],"tracks":["programming"],"url":"/blog/iiot-backpressure-reliability-patterns/","date":"2023-08-30","img":"/images/blog/iiot-backpressure-reliability-patterns.svg"},{"title":"Bridging OPC UA to MQTT 5, Where OT Meets IT Without Pain","summary":"Translate OPC UA subscriptions to MQTT 5 topics for IIoT — node mapping, security, sampling, lifecycle.","tags":["iot","opc-ua","mqtt"],"tracks":["programming"],"url":"/blog/opc-ua-to-mqtt-bridge/","date":"2023-08-26","img":"/images/blog/opc-ua-to-mqtt-bridge.svg"},{"title":"Running IIoT Workloads on K3s at the Edge, A Field Pattern","summary":"Deploy K3s on edge gateways for IIoT preprocessing, local rules, store-and-forward across 200 sites.","tags":["iot","k3s","edge"],"tracks":["programming"],"url":"/blog/edge-computing-k3s-iiot/","date":"2023-08-23","img":"/images/blog/edge-computing-k3s-iiot.svg"},{"title":"Kafka 3.5 as the Durable Buffer for Industrial IoT Ingestion","summary":"Use Kafka 3.5 as the durable backbone between MQTT and IIoT consumers — topics, partitions, EOS.","tags":["iot","kafka","streaming"],"tracks":["programming"],"url":"/blog/kafka-for-iiot-ingestion/","date":"2023-08-19","img":"/images/blog/kafka-for-iiot-ingestion.svg"},{"title":"TimescaleDB 2.11 vs InfluxDB 2.7 for Industrial Sensor Storage","summary":"When to pick TimescaleDB 2.11 over InfluxDB 2.7 for IIoT — schema, joins, compression, continuous aggregates.","tags":["iot","timescaledb","influxdb"],"tracks":["programming"],"url":"/blog/timescaledb-vs-influxdb-sensor-storage/","date":"2023-08-16","img":"/images/blog/timescaledb-vs-influxdb-sensor-storage.svg"},{"title":"From MQTT to InfluxDB 2.7, A Telegraf Pipeline That Won't Drop Data","summary":"Wire Telegraf 1.27 between MQTT and InfluxDB 2.7 with proper buffering, batching, and line-protocol.","tags":["iot","telegraf","influxdb"],"tracks":["programming"],"url":"/blog/telegraf-influxdb-mqtt-pipeline/","date":"2023-08-12","img":"/images/blog/telegraf-influxdb-mqtt-pipeline.svg"},{"title":"EMQX 5.1 Clustering for Multi-Site IIoT Without the Foot-Guns","summary":"Cluster EMQX 5.1 across plants with Mria core/replicant topology, auth, rules, and DR patterns.","tags":["iot","emqx","mqtt"],"tracks":["programming"],"url":"/blog/emqx-5-clustering-for-iiot/","date":"2023-08-09","img":"/images/blog/emqx-5-clustering-for-iiot.svg"},{"title":"Tuning Eclipse Mosquitto 2.0 for 50k Industrial Sensors on One Box","summary":"Kernel, TLS, persistence, and ACL tuning to push Mosquitto 2.0.x past default limits for IIoT.","tags":["iot","mosquitto","mqtt"],"tracks":["programming"],"url":"/blog/tuning-mosquitto-2-at-scale/","date":"2023-08-05","img":"/images/blog/tuning-mosquitto-2-at-scale.svg"},{"title":"Choosing an MQTT 5.0 Broker for Industrial IoT in 2023","summary":"Field-tested comparison of Mosquitto 2.0, EMQX 5.1, and HiveMQ 4 for IIoT workloads at scale.","tags":["iot","mqtt","broker"],"tracks":["programming"],"url":"/blog/choosing-mqtt-5-broker-iiot/","date":"2023-08-02","img":"/images/blog/choosing-mqtt-5-broker-iiot.svg"},{"title":"Rustls vs OpenSSL for Backend TLS in 2023","summary":"When to pick rustls and when to stay with OpenSSL for Rust backend TLS — performance, deployment, and compliance trade-offs from production experience.","tags":["rust","tls","rustls","openssl","security"],"tracks":["programming"],"url":"/blog/rustls-vs-openssl-backend-tls/","date":"2023-07-28","img":"/images/blog/rustls-vs-openssl-backend-tls.svg"},{"title":"Production HTTP APIs with axum 0.6","summary":"A production-shaped axum 0.6 service — state, extractors, middleware, tracing, and the patterns that survive load testing.","tags":["rust","axum","http","backend"],"tracks":["programming"],"url":"/blog/axum-0-6-production-apis/","date":"2023-07-25","img":"/images/blog/axum-0-6-production-apis.svg"},{"title":"Error Handling in Rust, thiserror, anyhow, and the Patterns That Scale","summary":"Rust error handling that holds up in production: thiserror for libraries, anyhow for applications, and the context patterns in between.","tags":["rust","error-handling","production"],"tracks":["programming"],"url":"/blog/error-handling-thiserror-anyhow/","date":"2023-07-21","img":"/images/blog/error-handling-thiserror-anyhow.svg"},{"title":"Building Secure CLIs in Rust with clap 4","summary":"Design patterns for secure CLI tools in Rust using clap 4: secret handling, input validation, static binaries, and predictable exit codes.","tags":["rust","cli","clap","security"],"tracks":["programming"],"url":"/blog/building-secure-clis-clap-4/","date":"2023-07-18","img":"/images/blog/building-secure-clis-clap-4.svg"},{"title":"Async Rust with tokio 1.29, A Production Mental Model","summary":"A working model of async Rust on tokio 1.29 — futures, the runtime, cancellation, and the patterns that hold up in production.","tags":["rust","async","tokio"],"tracks":["programming"],"url":"/blog/async-rust-tokio-1-29/","date":"2023-07-14","img":"/images/blog/async-rust-tokio-1-29.svg"},{"title":"Memory Safety Without a Garbage Collector, What Rust Actually Guarantees","summary":"The real scope of Rust's memory safety guarantees, the classes of bugs they eliminate, and the ones they don't.","tags":["rust","memory-safety","security"],"tracks":["programming"],"url":"/blog/memory-safety-without-gc/","date":"2023-07-11","img":"/images/blog/memory-safety-without-gc.svg"},{"title":"Ownership and Borrowing in Practice, A Working Mental Model","summary":"A working mental model for Rust ownership and borrowing built from production backend code, not toy examples.","tags":["rust","ownership","borrowing"],"tracks":["programming"],"url":"/blog/ownership-borrowing-in-practice/","date":"2023-07-07","img":"/images/blog/ownership-borrowing-in-practice.svg"},{"title":"Why Rust Is Growing Fast in Backend Engineering","summary":"Why Rust adoption is accelerating in backend teams in 2023, the real production wins, and the friction points nobody talks about.","tags":["rust","backend","systems-programming"],"tracks":["programming"],"url":"/blog/why-rust-growing-fast-backend/","date":"2023-07-04","img":"/images/blog/why-rust-growing-fast-backend.svg"},{"title":"Cluster Cost Engineering, Karpenter, KEDA, and the End of Static Node Groups","summary":"Cluster autoscaler plus static node groups is the 2019 cost model. Here is how Karpenter and KEDA together turn capacity into a tracked, optimized line item.","tags":["kubernetes","cost-optimization","karpenter","keda"],"tracks":["programming"],"url":"/blog/cluster-cost-engineering-karpenter-keda/","date":"2023-06-27","img":"/images/blog/cluster-cost-engineering-karpenter-keda.svg"},{"title":"Advanced GitHub Actions, Reusable Workflows, OIDC, and Matrix Patterns That Don't Become Spaghetti","summary":"How to share CI logic across repos without copy-paste, authenticate to AWS and GCP without long-lived keys, and make matrix builds maintainable.","tags":["ci-cd","github-actions","platform-engineering"],"tracks":["programming"],"url":"/blog/advanced-github-actions-reusable-workflows-oidc/","date":"2023-06-23","img":"/images/blog/advanced-github-actions-reusable-workflows-oidc.svg"},{"title":"Backstage 1.14 as the Backbone of an Internal Developer Platform","summary":"Backstage is glue, not a platform. Here is how to wire it to ArgoCD, GitHub Actions, Kubernetes, and Crossplane so it stops being a wiki and starts being a control plane.","tags":["kubernetes","backstage","platform-engineering"],"tracks":["programming"],"url":"/blog/backstage-internal-developer-platform-backbone/","date":"2023-06-20","img":"/images/blog/backstage-internal-developer-platform-backbone.svg"},{"title":"Progressive Delivery in 2023, Argo Rollouts and Flagger Side by Side","summary":"How to build a progressive delivery pipeline that actually rolls back on its own, using Argo Rollouts or Flagger with Prometheus-driven analysis.","tags":["kubernetes","progressive-delivery","argo-rollouts","flagger"],"tracks":["programming"],"url":"/blog/progressive-delivery-argo-rollouts-flagger/","date":"2023-06-16","img":"/images/blog/progressive-delivery-argo-rollouts-flagger.svg"},{"title":"FluxCD 2.0 vs ArgoCD 2.7, A Real Comparison After Running Both in Production","summary":"ArgoCD wins on UX, Flux wins on composability. Here's how to actually choose between them in 2023 based on team shape and operational appetite.","tags":["kubernetes","gitops","fluxcd","argocd"],"tracks":["programming"],"url":"/blog/fluxcd-vs-argocd-real-comparison/","date":"2023-06-13","img":"/images/blog/fluxcd-vs-argocd-real-comparison.svg"},{"title":"Kubernetes 1.27 Multi-Tenancy, What's Actually Safe and What Still Isn't","summary":"Namespace-as-tenant works for most internal platforms. Here are the controls that make it safe on Kubernetes 1.27 and the failure modes that still demand cluster separation.","tags":["kubernetes","multi-tenancy","security"],"tracks":["programming"],"url":"/blog/kubernetes-1-27-multi-tenancy-patterns/","date":"2023-06-09","img":"/images/blog/kubernetes-1-27-multi-tenancy-patterns.svg"},{"title":"ArgoCD ApplicationSets at Scale, A Multi-Tenant Pattern That Survives 200 Services","summary":"How to structure ArgoCD ApplicationSets, generators, and AppProjects so one platform team can serve dozens of stream teams without becoming a bottleneck.","tags":["kubernetes","argocd","gitops"],"tracks":["programming"],"url":"/blog/argocd-applicationsets-scale-multi-tenant/","date":"2023-06-06","img":"/images/blog/argocd-applicationsets-scale-multi-tenant.svg"},{"title":"Platform Engineering Is Not DevOps Rebranded, Building an IDP With Team Topologies in Mind","summary":"Platform engineering treats the platform as a product. Here is how Team Topologies, golden paths, and a thin-slice IDP actually change how teams ship.","tags":["kubernetes","platform-engineering","internal-developer-platform"],"tracks":["programming"],"url":"/blog/platform-engineering-team-topologies-idp/","date":"2023-06-02","img":"/images/blog/platform-engineering-team-topologies-idp.svg"},{"title":"Building a Unified Developer Productivity Dashboard With n8n, Postgres, and Metabase","summary":"How to build a developer productivity dashboard people will actually use: data model, ingestion via n8n, metric definitions, and how to avoid the vanity-metrics trap.","tags":["dashboard","automation","metrics"],"tracks":["programming"],"url":"/blog/unified-developer-productivity-dashboard/","date":"2023-05-30","img":"/images/blog/unified-developer-productivity-dashboard.svg"},{"title":"n8n vs Zapier vs Power Automate for Engineering Teams, An Honest Comparison","summary":"Where n8n, Zapier, and Power Automate each make sense for engineering teams in 2023. Pricing math, extensibility, ops burden, governance, and a decision framework that's served me well.","tags":["n8n","automation","zapier"],"tracks":["programming"],"url":"/blog/n8n-vs-zapier-vs-power-automate-dev-teams/","date":"2023-05-25","img":"/images/blog/n8n-vs-zapier-vs-power-automate-dev-teams.svg"},{"title":"Slack-Driven Approval Flows for Dev Backlogs With n8n and Block Kit","summary":"How to keep humans in the loop without breaking flow: Slack-driven approvals for backlog automation. Block Kit, interactivity URLs, signing, and the audit story that matters.","tags":["slack","automation","n8n"],"tracks":["programming"],"url":"/blog/slack-approval-flows-dev-backlogs/","date":"2023-05-23","img":"/images/blog/slack-approval-flows-dev-backlogs.svg"},{"title":"Two-Way Sync Between Jira and GitHub Issues Without Losing Your Mind","summary":"Designing a two-way Jira \u003c-\u003e GitHub Issues sync that survives webhook loops, conflicting edits, and field-mapping mismatches. The patterns that actually work in production.","tags":["jira","github","automation"],"tracks":["programming"],"url":"/blog/jira-github-issues-two-way-sync/","date":"2023-05-18","img":"/images/blog/jira-github-issues-two-way-sync.svg"},{"title":"Auto-Triaging PMO Tickets With n8n and OpenAI, Lessons From Three Months In","summary":"Three months of using GPT-4 to triage incoming tickets in n8n. Prompt patterns, structured output via function calling, cost containment, and where to leave the human in the loop.","tags":["openai","automation","n8n"],"tracks":["programming"],"url":"/blog/auto-triage-pmo-tickets-openai-n8n/","date":"2023-05-16","img":"/images/blog/auto-triage-pmo-tickets-openai-n8n.svg"},{"title":"Orchestrating GitHub Actions From n8n, Webhooks, Dispatch, and Sanity","summary":"Practical guide to triggering GitHub Actions from n8n: repository_dispatch vs workflow_dispatch, GitHub App auth, webhook signing, and where to draw the orchestration boundary.","tags":["github-actions","automation","n8n"],"tracks":["programming"],"url":"/blog/github-actions-n8n-webhook-orchestration/","date":"2023-05-11","img":"/images/blog/github-actions-n8n-webhook-orchestration.svg"},{"title":"Linear's GraphQL API for Backlog Sync, A Backend Engineer's Field Notes","summary":"How to actually use the Linear GraphQL API for backlog automation: SDK trade-offs, cursor pagination, webhook verification, and sync patterns that don't deadlock.","tags":["linear","automation","graphql"],"tracks":["programming"],"url":"/blog/linear-graphql-api-backlog-sync/","date":"2023-05-09","img":"/images/blog/linear-graphql-api-backlog-sync.svg"},{"title":"Jira REST API v3, Automation Patterns That Don't Hate You Back","summary":"Hard-won lessons from wiring Jira Cloud into n8n and Node automations. Auth, ADF documents, JQL pagination, webhook signatures, and the gotchas that ate my week.","tags":["jira","automation","api"],"tracks":["programming"],"url":"/blog/jira-rest-api-v3-automation-patterns/","date":"2023-05-04","img":"/images/blog/jira-rest-api-v3-automation-patterns.svg"},{"title":"Self-Hosting n8n for Engineering Teams, A Pragmatic Setup Guide","summary":"A pragmatic guide to deploying n8n self-hosted for dev teams: Docker Compose, Postgres backend, queue mode with Redis, and the gotchas nobody warns you about.","tags":["n8n","automation","docker"],"tracks":["programming"],"url":"/blog/n8n-self-hosted-dev-teams/","date":"2023-05-02","img":"/images/blog/n8n-self-hosted-dev-teams.svg"},{"title":"LangChain 0.0.13x, The Framework, the Hype, and the Real Engineering Tradeoffs","summary":"A senior engineer's view of LangChain 0.0.13x - what it actually does, where it earns its complexity, and where you should write the code yourself instead.","tags":["langchain","llm","vector-db"],"tracks":["ai"],"url":"/blog/langchain-framework-intro/","date":"2023-04-27","img":"/images/blog/langchain-framework-intro.svg"},{"title":"Chroma 0.3, The Local-First Vector Database for Notebook-Scale Prototyping","summary":"Chroma 0.3 for notebook-scale semantic search prototyping - embedded mode, persistence, LangChain integration, and when it's time to graduate to a real database.","tags":["chroma","vector-db","prototyping"],"tracks":["ai"],"url":"/blog/chroma-local-prototyping/","date":"2023-04-24","img":"/images/blog/chroma-local-prototyping.svg"},{"title":"Weaviate 1.18 and Hybrid Search, When Keyword and Vector Search Are Both Right","summary":"Hybrid search with Weaviate 1.18 - combining BM25 with vector similarity, tuning the alpha parameter, and when hybrid actually beats pure vector retrieval.","tags":["weaviate","vector-db","hybrid-search"],"tracks":["ai"],"url":"/blog/weaviate-hybrid-search/","date":"2023-04-20","img":"/images/blog/weaviate-hybrid-search.svg"},{"title":"Milvus 2.2 in Production, Self-Hosting the Heavyweight Open-Source Vector Database","summary":"Practical guide to Milvus 2.2 in production - architecture, Helm install, index selection, and the operational gotchas you'll hit running it at scale.","tags":["milvus","vector-db","kubernetes"],"tracks":["ai"],"url":"/blog/milvus-self-hosted-production/","date":"2023-04-17","img":"/images/blog/milvus-self-hosted-production.svg"},{"title":"Building Semantic Search From Scratch, A Production Walkthrough","summary":"End-to-end semantic search build covering ingestion, chunking, embedding, indexing, and serving with Pinecone, OpenAI, and FastAPI - the parts that actually break in production.","tags":["semantic-search","pinecone","vector-db","fastapi"],"tracks":["ai"],"url":"/blog/semantic-search-from-scratch/","date":"2023-04-13","img":"/images/blog/semantic-search-from-scratch.svg"},{"title":"Embedding Models in 2023, ada-002, sentence-transformers, and What Actually Matters","summary":"Comparing text-embedding-ada-002 and sentence-transformers for semantic search, covering dimensions, cost, latency, and the quality tradeoffs that matter in practice.","tags":["embeddings","vector-db","openai"],"tracks":["ai"],"url":"/blog/embedding-models-deep-dive/","date":"2023-04-10","img":"/images/blog/embedding-models-deep-dive.svg"},{"title":"Pinecone in Production, Pod Sizing, Upserts, and the Cost Math That Surprises Teams","summary":"A practical Pinecone walkthrough covering pod selection, batched upserts, metadata filtering, and the cost math most teams miss on their first deployment.","tags":["pinecone","vector-db","semantic-search"],"tracks":["ai"],"url":"/blog/pinecone-getting-started-pod-based/","date":"2023-04-06","img":"/images/blog/pinecone-getting-started-pod-based.svg"},{"title":"The Vector Database Landscape in 2023, Pinecone, Milvus, Weaviate, and Chroma Compared","summary":"A senior engineer's honest comparison of Pinecone, Milvus, Weaviate, and Chroma in April 2023, covering architecture, pricing, and when each makes sense.","tags":["vector-db","pinecone","milvus","weaviate","chroma"],"tracks":["ai"],"url":"/blog/vector-databases-landscape-2023/","date":"2023-04-03","img":"/images/blog/vector-databases-landscape-2023.svg"},{"title":"Testing gRPC Services in Go with testcontainers and bufconn","summary":"Unit, integration, and contract testing for Go gRPC services — bufconn, testcontainers-go, and where the lines belong.","tags":["golang","grpc","testing"],"tracks":["programming"],"url":"/blog/testing-grpc-services-golang-testcontainers/","date":"2023-03-30","img":"/images/blog/testing-grpc-services-golang-testcontainers.svg"},{"title":"Observability for Go gRPC Services with OpenTelemetry","summary":"Traces, metrics, and logs in a Go gRPC service with OpenTelemetry — propagation, conventions, and sampling that scale.","tags":["golang","grpc","opentelemetry"],"tracks":["programming"],"url":"/blog/observability-grpc-opentelemetry-golang/","date":"2023-03-27","img":"/images/blog/observability-grpc-opentelemetry-golang.svg"},{"title":"Connection Pooling for gRPC and Postgres in Go","summary":"Right-sizing pgx pools and gRPC client connections in Go — the tuning, lifecycle, and math that survives real traffic.","tags":["golang","postgres","grpc"],"tracks":["programming"],"url":"/blog/connection-pooling-grpc-postgres-golang/","date":"2023-03-20","img":"/images/blog/connection-pooling-grpc-postgres-golang.svg"},{"title":"gRPC Interceptors in Go, Auth, Logging, and Recovery","summary":"Unary and stream interceptors in gRPC-Go — the middleware patterns for auth, logging, and recovery you'll actually run in prod.","tags":["golang","grpc","middleware"],"tracks":["programming"],"url":"/blog/grpc-interceptors-middleware-golang/","date":"2023-03-16","img":"/images/blog/grpc-interceptors-middleware-golang.svg"},{"title":"Context, Deadlines, and Cancellation in gRPC Microservices","summary":"Context propagation across gRPC boundaries — deadlines, cancellation, and the subtle bugs that hide between services.","tags":["golang","grpc","context"],"tracks":["programming"],"url":"/blog/context-deadlines-grpc-microservices/","date":"2023-03-13","img":"/images/blog/context-deadlines-grpc-microservices.svg"},{"title":"Goroutine Patterns for Production Go Microservices","summary":"Worker pools, fan-out/fan-in, errgroup, and rate-limited dispatch — Go concurrency patterns that survive real load.","tags":["golang","concurrency","goroutines"],"tracks":["programming"],"url":"/blog/golang-goroutine-patterns-microservices/","date":"2023-03-09","img":"/images/blog/golang-goroutine-patterns-microservices.svg"},{"title":"gRPC Streaming RPCs in Go, Server, Client, and Bidirectional","summary":"The four RPC types in gRPC explained with Go 1.20 examples — when streaming helps and when it just adds complexity.","tags":["golang","grpc","streaming"],"tracks":["programming"],"url":"/blog/grpc-streaming-rpcs-golang/","date":"2023-03-06","img":"/images/blog/grpc-streaming-rpcs-golang.svg"},{"title":"gRPC Basics in Go, From Proto to Production Server","summary":"A pragmatic walkthrough of gRPC fundamentals in Go 1.20: protobuf schemas, code generation, and server setup.","tags":["golang","grpc","protobuf"],"tracks":["programming"],"url":"/blog/grpc-basics-golang-microservices/","date":"2023-03-02","img":"/images/blog/grpc-basics-golang-microservices.svg"},{"title":"TypeScript 5.0 Beta, What's Actually Changing","summary":"TypeScript 5.0 beta preview — new decorators, const type parameters, bundler resolution, and the speed improvements from the migration to ES modules.","tags":["typescript","5.0","decorators"],"tracks":["programming"],"url":"/blog/typescript-5-0-beta-preview-decorators/","date":"2023-02-27","img":"/images/blog/typescript-5-0-beta-preview-decorators.svg"},{"title":"Type-Safe API Routes in Next.js 13","summary":"Building type-safe API routes in Next.js 13 with Zod, inferred types, and the new route handler conventions in app router.","tags":["nextjs","typescript","zod"],"tracks":["programming"],"url":"/blog/type-safe-api-routes-nextjs-13/","date":"2023-02-23","img":"/images/blog/type-safe-api-routes-nextjs-13.svg"},{"title":"TypeScript Strict Mode, Which Flags Actually Pay for Themselves","summary":"A flag-by-flag tour of TypeScript strict mode in 2023 — what each setting prevents, what it costs, and what to add on top.","tags":["typescript","configuration","tooling"],"tracks":["programming"],"url":"/blog/typescript-strict-mode-config-worth-it/","date":"2023-02-20","img":"/images/blog/typescript-strict-mode-config-worth-it.svg"},{"title":"React Server Components in Next.js 13, The Mental Model","summary":"How to think about React Server Components in Next.js 13. Composition rules, the client/server boundary, and where they break.","tags":["react","nextjs","server-components"],"tracks":["programming"],"url":"/blog/react-server-components-nextjs-13/","date":"2023-02-16","img":"/images/blog/react-server-components-nextjs-13.svg"},{"title":"Next.js 13 App Router, A Backend Dev's First Impressions","summary":"Next.js 13 app router from a backend dev's view: server components, data fetching, the still-beta status, and what production-ready looks like.","tags":["nextjs","react","typescript"],"tracks":["programming"],"url":"/blog/nextjs-13-app-router-first-impressions/","date":"2023-02-13","img":"/images/blog/nextjs-13-app-router-first-impressions.svg"},{"title":"Practical Patterns for the TypeScript 4.9 `satisfies` Operator","summary":"The satisfies operator in TypeScript 4.9 unlocks better config, routing, and enum-like patterns. Real production examples.","tags":["typescript","language","patterns"],"tracks":["programming"],"url":"/blog/typescript-4-9-satisfies-operator-patterns/","date":"2023-02-09","img":"/images/blog/typescript-4-9-satisfies-operator-patterns.svg"},{"title":"Migrating a Large JavaScript Codebase to TypeScript Without Stopping Feature Work","summary":"Migrating a large JS codebase to TypeScript without freezing features. Incremental rollout, JSDoc bridges, CI gates, real timelines.","tags":["typescript","javascript","migration"],"tracks":["programming"],"url":"/blog/migrating-large-javascript-codebase-typescript/","date":"2023-02-06","img":"/images/blog/migrating-large-javascript-codebase-typescript.svg"},{"title":"Why TypeScript Is Winning Over JavaScript in 2023","summary":"Why TypeScript adoption keeps growing in 2023. The 4.9 sweet spot, real team wins, and where JS holdouts still have a point.","tags":["typescript","javascript","tooling"],"tracks":["programming"],"url":"/blog/why-typescript-winning-over-javascript-2023/","date":"2023-02-02","img":"/images/blog/why-typescript-winning-over-javascript-2023.svg"},{"title":"Error Handling and Retries for LLM APIs","summary":"OpenAI error handling: transient vs permanent, backoff, fallbacks, keep service up.","tags":["llm","openai","error-handling","reliability"],"tracks":["ai"],"url":"/blog/llm-error-handling-retries/","date":"2023-01-27","img":"/images/blog/llm-error-handling-retries.svg"},{"title":"LLM Cost Control and Token Budgets","summary":"LLM cost control: budgets, compression, caching, model selection, alerts on runaway.","tags":["llm","cost","openai","observability"],"tracks":["ai"],"url":"/blog/llm-cost-control-token-budgets/","date":"2023-01-24","img":"/images/blog/llm-cost-control-token-budgets.svg"},{"title":"Streaming Responses from LLM APIs","summary":"Stream OpenAI responses via SSE. UX matters, Python + Node patterns, proxy + CDN gotchas.","tags":["streaming","sse","llm","openai"],"tracks":["ai"],"url":"/blog/streaming-llm-responses-sse/","date":"2023-01-20","img":"/images/blog/streaming-llm-responses-sse.svg"},{"title":"Few-Shot Prompting and In-Context Learning","summary":"Few-shot prompting: 2-3 examples beat long instructions. Cost trade-offs, example selection, where it wins.","tags":["prompt-engineering","few-shot","llm","ai"],"tracks":["ai"],"url":"/blog/few-shot-prompting-in-context/","date":"2023-01-17","img":"/images/blog/few-shot-prompting-in-context.svg"},{"title":"Prompt Engineering Basics for Engineers","summary":"Prompt engineering for engineers: structure, role priming, examples, schema. From 50% to 90% accuracy.","tags":["prompt-engineering","llm","ai","openai"],"tracks":["ai"],"url":"/blog/prompt-engineering-basics-engineers/","date":"2023-01-13","img":"/images/blog/prompt-engineering-basics-engineers.svg"},{"title":"Calling OpenAI from Node.js","summary":"Node + OpenAI in 2023: SDK, prompt templates, Zod validation, p-retry, production patterns.","tags":["nodejs","openai","llm","ai","typescript"],"tracks":["ai"],"url":"/blog/openai-nodejs-integration-2023/","date":"2023-01-10","img":"/images/blog/openai-nodejs-integration-2023.svg"},{"title":"Calling OpenAI from Python, Patterns and Pitfalls","summary":"Python + OpenAI in 2023: SDK, prompt templates, JSON parsing, retries, async, production pitfalls.","tags":["python","openai","llm","ai"],"tracks":["ai"],"url":"/blog/openai-python-patterns-pitfalls/","date":"2023-01-06","img":"/images/blog/openai-python-patterns-pitfalls.svg"},{"title":"Why Every Backend Needs an LLM Integration in 2023","summary":"Why backend engineers should integrate LLMs in 2023. Real cases beyond chatbots, OpenAI today, realistic path.","tags":["llm","openai","ai","backend"],"tracks":["ai"],"url":"/blog/why-llm-integration-backend-2023/","date":"2023-01-03","img":"/images/blog/why-llm-integration-backend-2023.svg"},{"title":"Productivity Metrics That Actually Matter","summary":"Engineering productivity metrics 2022: DORA, SPACE, what changes with AI. Anti-patterns.","tags":["productivity","metrics","engineering"],"tracks":["programming"],"url":"/blog/engineering-productivity-metrics-2022/","date":"2022-12-23","img":"/images/blog/engineering-productivity-metrics-2022.svg"},{"title":"IP, Licensing, and AI-Generated Code","summary":"AI code legal: training data, Copilot lawsuit, commercial use, compliance guidance.","tags":["ai","legal","licensing","compliance"],"tracks":["ai"],"url":"/blog/ai-code-licensing-ip/","date":"2022-12-21","img":"/images/blog/ai-code-licensing-ip.svg"},{"title":"Beyond Copilot, Tabnine, Codeium, Amazon CodeWhisperer","summary":"AI coding tools 2022: Tabnine, Codeium, CodeWhisperer. Privacy, perf, language coverage.","tags":["ai","coding-tools","copilot","tabnine"],"tracks":["ai"],"url":"/blog/ai-coding-tools-2022/","date":"2022-12-19","img":"/images/blog/ai-coding-tools-2022.svg"},{"title":"Codespaces + Copilot, Cloud Dev Loops","summary":"Codespaces + Copilot: cloud dev environments. When they earn cost; AI workflow.","tags":["codespaces","copilot","cloud-dev"],"tracks":["ai"],"url":"/blog/codespaces-copilot-cloud-dev/","date":"2022-12-16","img":"/images/blog/codespaces-copilot-cloud-dev.svg"},{"title":"Copilot for Tests, TDD or Anti-TDD?","summary":"Copilot for tests: where it helps, where it misses, TDD compatibility.","tags":["copilot","ai","tdd","testing"],"tracks":["ai"],"url":"/blog/copilot-for-tests-tdd/","date":"2022-12-14","img":"/images/blog/copilot-for-tests-tdd.svg"},{"title":"Pair Programming With an AI Assistant","summary":"Pair programming with AI: what works, what doesn't, vs human pairing dynamic.","tags":["ai","pair-programming","copilot"],"tracks":["ai"],"url":"/blog/ai-pair-programming-2022/","date":"2022-12-12","img":"/images/blog/ai-pair-programming-2022.svg"},{"title":"Reviewing AI-Suggested Code","summary":"Reviewing AI code: checklist, failure modes, why not to trust, vs human-written.","tags":["copilot","ai","code-review"],"tracks":["ai"],"url":"/blog/reviewing-ai-suggested-code/","date":"2022-12-09","img":"/images/blog/reviewing-ai-suggested-code.svg"},{"title":"Prompt-Style Comments to Steer Copilot","summary":"Prompt-style comments steer Copilot. Patterns that improve quality, with examples.","tags":["copilot","ai","productivity"],"tracks":["ai"],"url":"/blog/copilot-prompt-style-comments/","date":"2022-12-07","img":"/images/blog/copilot-prompt-style-comments.svg"},{"title":"What Copilot Is Good At (and What It Isn't)","summary":"Copilot's strengths + failures: granular. Excels at, fakes well, net-negative categories.","tags":["copilot","ai","developer-tools"],"tracks":["ai"],"url":"/blog/what-copilot-is-good-at/","date":"2022-12-05","img":"/images/blog/what-copilot-is-good-at.svg"},{"title":"A Year With GitHub Copilot in Production","summary":"Honest year with Copilot: where it accelerates, where it misleads, real workflow shift.","tags":["copilot","ai","productivity","developer-tools"],"tracks":["ai"],"url":"/blog/a-year-with-github-copilot-in-production/","date":"2022-12-02","img":"/images/blog/a-year-with-github-copilot-in-production.svg"},{"title":"November Retro, Security Hardening Sprint","summary":"November retro: API security audits. What changed, what's still open, reader notes.","tags":["security","retro"],"tracks":["programming"],"url":"/blog/november-retro-api-security/","date":"2022-11-30","img":"/images/blog/november-retro-api-security.svg"},{"title":"Audit Logging for Backend APIs","summary":"Backend audit logging: what to log, what not, immutable storage, retention.","tags":["audit-logging","security","compliance"],"tracks":["programming"],"url":"/blog/backend-audit-logging/","date":"2022-11-28","img":"/images/blog/backend-audit-logging.svg"},{"title":"Input Validation and the OWASP Top 10","summary":"Input validation + OWASP Top 10: SQLi, XSS, SSRF, command injection. The discipline.","tags":["owasp","security","validation"],"tracks":["programming"],"url":"/blog/input-validation-owasp-top-10/","date":"2022-11-25","img":"/images/blog/input-validation-owasp-top-10.svg"},{"title":"CSRF Defense Patterns in 2022","summary":"CSRF defense: synchronizer tokens, double-submit, SameSite, custom headers. Layered approach.","tags":["csrf","security","web"],"tracks":["programming"],"url":"/blog/csrf-defense-patterns/","date":"2022-11-23","img":"/images/blog/csrf-defense-patterns.svg"},{"title":"CORS, What It Actually Protects","summary":"CORS demystified: same-origin policy, what it protects, preflight, safe configurations.","tags":["cors","security","web"],"tracks":["programming"],"url":"/blog/cors-security/","date":"2022-11-21","img":"/images/blog/cors-security.svg"},{"title":"API Keys vs OAuth for Third-Party Access","summary":"API keys vs OAuth for third-party access: use cases, security, scopes, rotation.","tags":["api-keys","oauth","security"],"tracks":["programming"],"url":"/blog/api-keys-vs-oauth/","date":"2022-11-18","img":"/images/blog/api-keys-vs-oauth.svg"},{"title":"Distributed Rate Limiting with Redis","summary":"Distributed rate limiting in Redis: token bucket via Lua, sliding window via sorted sets.","tags":["rate-limiting","redis","security"],"tracks":["programming"],"url":"/blog/redis-rate-limiting-distributed/","date":"2022-11-16","img":"/images/blog/redis-rate-limiting-distributed.svg"},{"title":"Rate Limiting Algorithms, Token Bucket, Leaky Bucket, Sliding Window","summary":"Rate limit algos: token bucket, leaky bucket, fixed + sliding window. When each wins.","tags":["rate-limiting","security","performance"],"tracks":["programming"],"url":"/blog/rate-limiting-algorithms/","date":"2022-11-14","img":"/images/blog/rate-limiting-algorithms.svg"},{"title":"OAuth 2.1 vs OAuth 2.0, What Changed","summary":"OAuth 2.1: PKCE always, no implicit, no password grant. Aligning your implementation.","tags":["oauth","security","auth"],"tracks":["programming"],"url":"/blog/oauth-21-vs-20/","date":"2022-11-11","img":"/images/blog/oauth-21-vs-20.svg"},{"title":"Refresh Tokens and Token Revocation","summary":"Refresh tokens correctly: short access + long refresh, rotation, revocation lists, defeat theft.","tags":["jwt","refresh-tokens","security","auth"],"tracks":["programming"],"url":"/blog/refresh-tokens-revocation/","date":"2022-11-09","img":"/images/blog/refresh-tokens-revocation.svg"},{"title":"Why JWT for Sessions Is Usually Wrong","summary":"JWT vs server sessions. When JWT pays off, when it costs. Migration paths.","tags":["jwt","sessions","security","auth"],"tracks":["programming"],"url":"/blog/jwt-for-sessions-usually-wrong/","date":"2022-11-07","img":"/images/blog/jwt-for-sessions-usually-wrong.svg"},{"title":"JWT Done Right, Signing, Verifying, Rotating Keys","summary":"JWT done right: RS256/ES256, expiry, audience, JWKS rotation. Patterns that prevent disaster.","tags":["jwt","security","auth"],"tracks":["programming"],"url":"/blog/jwt-done-right/","date":"2022-11-04","img":"/images/blog/jwt-done-right.svg"},{"title":"Backend API Security in 2022, The Threat Model","summary":"Backend API security threat model 2022: real threats, working mitigations, priority order.","tags":["security","api","backend","owasp"],"tracks":["programming"],"url":"/blog/backend-api-security-2022/","date":"2022-11-02","img":"/images/blog/backend-api-security-2022.svg"},{"title":"October Retro, ETL Pragmatism","summary":"October retro: lightweight ETL shipped. What worked, what bounced.","tags":["etl","retro","data-engineering"],"tracks":["programming"],"url":"/blog/october-retro-etl/","date":"2022-10-31","img":"/images/blog/october-retro-etl.svg"},{"title":"Monitoring ETL Pipelines, Lag, Errors, Throughput","summary":"ETL monitoring: lag, row counts, errors, throughput. Metrics + dashboards + alerts.","tags":["etl","monitoring","prometheus","data-engineering"],"tracks":["programming"],"url":"/blog/etl-monitoring-lag-errors/","date":"2022-10-28","img":"/images/blog/etl-monitoring-lag-errors.svg"},{"title":"Backfilling Historical Data Safely","summary":"Backfill safely: chunked, rate-limited, parallel, merge with live data.","tags":["etl","backfill","data-engineering"],"tracks":["programming"],"url":"/blog/etl-backfill-historical/","date":"2022-10-26","img":"/images/blog/etl-backfill-historical.svg"},{"title":"Postgres Bulk Loading, COPY and Prepared Statements","summary":"Postgres bulk loading: COPY beats INSERT 100x. UNLOGGED, index management, fast ETL writes.","tags":["postgres","etl","performance"],"tracks":["programming"],"url":"/blog/postgres-bulk-loading-copy/","date":"2022-10-24","img":"/images/blog/postgres-bulk-loading-copy.svg"},{"title":"Debezium for Postgres → Kafka CDC","summary":"Debezium 2.0: Postgres → Kafka CDC setup, config, snapshot, ops gotchas.","tags":["debezium","kafka","postgres","cdc"],"tracks":["programming"],"url":"/blog/debezium-postgres-cdc/","date":"2022-10-21","img":"/images/blog/debezium-postgres-cdc.svg"},{"title":"Kafka as a Sync Backbone","summary":"Kafka 3.2 as sync backbone: topic-per-table, consumers, when it pays off vs simpler tools.","tags":["kafka","etl","data-engineering"],"tracks":["programming"],"url":"/blog/kafka-sync-backbone/","date":"2022-10-19","img":"/images/blog/kafka-sync-backbone.svg"},{"title":"Schema Drift, Handling Source Changes Without Breaking Pipelines","summary":"ETL schema drift: detect, additive vs breaking, flexible patterns that don't lose data.","tags":["etl","schema","data-engineering"],"tracks":["programming"],"url":"/blog/etl-schema-drift/","date":"2022-10-17","img":"/images/blog/etl-schema-drift.svg"},{"title":"Idempotent Pipelines and Watermarks","summary":"Idempotent ETL: watermarks, upsert dedup, exactly-once, double-write failure modes.","tags":["etl","idempotent","watermarks","data-engineering"],"tracks":["programming"],"url":"/blog/etl-idempotent-watermarks/","date":"2022-10-14","img":"/images/blog/etl-idempotent-watermarks.svg"},{"title":"Building an ETL Pipeline in Go","summary":"Go ETL: pgx, COPY bulk, concurrent ETL stages. When Go beats Python.","tags":["go","etl","postgres","data-engineering"],"tracks":["programming"],"url":"/blog/go-etl-pipeline/","date":"2022-10-12","img":"/images/blog/go-etl-pipeline.svg"},{"title":"Building an ETL Pipeline in Python","summary":"Python ETL: SQLAlchemy, Polars, BigQuery client. Incremental sync, errors, monitoring.","tags":["python","etl","data-engineering","sqlalchemy"],"tracks":["programming"],"url":"/blog/python-etl-pipeline/","date":"2022-10-10","img":"/images/blog/python-etl-pipeline.svg"},{"title":"Postgres Logical Replication for CDC","summary":"Postgres logical replication for CDC: publications, slots, wal2json / pgoutput consumption.","tags":["postgres","cdc","logical-replication","etl"],"tracks":["programming"],"url":"/blog/postgres-logical-replication-cdc/","date":"2022-10-07","img":"/images/blog/postgres-logical-replication-cdc.svg"},{"title":"CDC vs Polling, Choosing Your Sync Strategy","summary":"CDC vs polling for data sync. When each wins, ops trade-offs, hybrid approach.","tags":["etl","cdc","data-engineering"],"tracks":["programming"],"url":"/blog/cdc-vs-polling/","date":"2022-10-05","img":"/images/blog/cdc-vs-polling.svg"},{"title":"Why Lightweight ETL Beats Big Data Tools for Most Teams","summary":"Lightweight ETL: Python/Go beats Spark/Airflow for most teams. When 'big data' is overkill.","tags":["etl","data-engineering","python","go"],"tracks":["programming"],"url":"/blog/lightweight-etl-vs-big-data/","date":"2022-10-03","img":"/images/blog/lightweight-etl-vs-big-data.svg"},{"title":"September Retro, One Stack to Watch Them All","summary":"September retro: full obs stack for factory. Wins, costs, cuts.","tags":["observability","retro","prometheus","grafana"],"tracks":["programming"],"url":"/blog/september-retro-observability/","date":"2022-09-30","img":"/images/blog/september-retro-observability.svg"},{"title":"Prometheus Cardinality and Cost Control","summary":"Control Prometheus cost: cardinality limits, drop high-card metrics, recording rules, retention math.","tags":["prometheus","cost","cardinality","observability"],"tracks":["programming"],"url":"/blog/prometheus-cardinality-cost/","date":"2022-09-28","img":"/images/blog/prometheus-cardinality-cost.svg"},{"title":"Error Budgets and Burn Rates","summary":"Error budgets + burn rate alerts. Multi-window math, dashboards, action policies.","tags":["slo","error-budget","alerting"],"tracks":["programming"],"url":"/blog/error-budgets-burn-rate/","date":"2022-09-26","img":"/images/blog/error-budgets-burn-rate.svg"},{"title":"Service-Level Objectives in Practice","summary":"SLOs in practice: SLIs, targets, error budgets from Prometheus, org dynamics.","tags":["slo","sre","observability"],"tracks":["programming"],"url":"/blog/slo-practice/","date":"2022-09-23","img":"/images/blog/slo-practice.svg"},{"title":"Tempo for Distributed Tracing","summary":"Tempo 1.5: distributed tracing, OTel SDK for Go/Node, sampling, exploration in Grafana.","tags":["tempo","tracing","observability","opentelemetry"],"tracks":["programming"],"url":"/blog/tempo-distributed-tracing/","date":"2022-09-21","img":"/images/blog/tempo-distributed-tracing.svg"},{"title":"Promtail Pipelines and Log Parsing","summary":"Promtail pipelines: JSON parse, label extraction, dropping, Docker + journald.","tags":["loki","promtail","logs"],"tracks":["programming"],"url":"/blog/promtail-pipelines-parsing/","date":"2022-09-19","img":"/images/blog/promtail-pipelines-parsing.svg"},{"title":"Loki for Logs, Self-Hosted Aggregation","summary":"Loki 2.6: self-hosted logs, label index, LogQL, retention. Cheaper than ELK; where it doesn't fit.","tags":["loki","logs","observability"],"tracks":["programming"],"url":"/blog/loki-log-aggregation/","date":"2022-09-16","img":"/images/blog/loki-log-aggregation.svg"},{"title":"Alerting with Prometheus Alertmanager","summary":"Alertmanager: routing, grouping, inhibition, silencing, Slack/PD. Useful, not noisy.","tags":["prometheus","alertmanager","observability"],"tracks":["programming"],"url":"/blog/prometheus-alertmanager/","date":"2022-09-14","img":"/images/blog/prometheus-alertmanager.svg"},{"title":"Grafana Dashboards That Actually Help","summary":"Grafana dashboards engineers use, not just look at. RED/USE, hierarchy, 6-panel rule.","tags":["grafana","observability","dashboards"],"tracks":["programming"],"url":"/blog/grafana-dashboards-that-help/","date":"2022-09-12","img":"/images/blog/grafana-dashboards-that-help.svg"},{"title":"Instrumenting Node.js Services for Prometheus","summary":"Node + Prometheus via prom-client: defaults, HTTP middleware, business metrics, Express/Fastify.","tags":["node","prometheus","observability"],"tracks":["programming"],"url":"/blog/node-prometheus-instrumentation/","date":"2022-09-09","img":"/images/blog/node-prometheus-instrumentation.svg"},{"title":"Instrumenting Go Services for Prometheus","summary":"Go + Prometheus: client_golang, counters, histograms, HTTP middleware, runtime metrics.","tags":["go","prometheus","observability"],"tracks":["programming"],"url":"/blog/go-prometheus-instrumentation/","date":"2022-09-07","img":"/images/blog/go-prometheus-instrumentation.svg"},{"title":"Prometheus 101, Metrics, Scraping, and PromQL","summary":"Prometheus 2.37 basics: metric types, scraping, labels, PromQL with backend examples.","tags":["prometheus","observability","metrics"],"tracks":["programming"],"url":"/blog/prometheus-101-metrics-promql/","date":"2022-09-05","img":"/images/blog/prometheus-101-metrics-promql.svg"},{"title":"Building an Observability Stack in 2022","summary":"Self-host obs stack 2022: Prometheus + Grafana + Loki + Tempo + Alertmanager. Metrics, logs, traces.","tags":["observability","prometheus","grafana"],"tracks":["programming"],"url":"/blog/observability-stack-2022/","date":"2022-09-02","img":"/images/blog/observability-stack-2022.svg"},{"title":"August Retro, IIoT Production Lessons","summary":"August retro: IIoT lessons. Where web-backend instincts misled, what's next.","tags":["iiot","retro","mqtt","lessons"],"tracks":["programming"],"url":"/blog/august-retro-iiot/","date":"2022-08-29","img":"/images/blog/august-retro-iiot.svg"},{"title":"Securing MQTT, Auth, ACLs, and Certificate Rotation","summary":"MQTT security: TLS, per-device creds, ACLs, cert rotation. Real threats + mitigations.","tags":["mqtt","security","iiot","certificates"],"tracks":["programming"],"url":"/blog/mqtt-security-acls-certificates/","date":"2022-08-26","img":"/images/blog/mqtt-security-acls-certificates.svg"},{"title":"Alerting on Sensor Anomalies in IIoT","summary":"IIoT anomaly alerting: threshold, rate-of-change, missing-data. Grafana 9, Alertmanager.","tags":["iiot","alerting","grafana","alertmanager"],"tracks":["programming"],"url":"/blog/iiot-anomaly-alerting/","date":"2022-08-24","img":"/images/blog/iiot-anomaly-alerting.svg"},{"title":"Real-Time Dashboards for IIoT with Grafana 9","summary":"Grafana 9 dashboards for IIoT: panels, live queries, MQTT streaming, shop-floor displays.","tags":["grafana","iiot","dashboards","timescaledb"],"tracks":["programming"],"url":"/blog/grafana-iiot-dashboards/","date":"2022-08-22","img":"/images/blog/grafana-iiot-dashboards.svg"},{"title":"Bridging OPC UA to MQTT","summary":"OPC UA → MQTT bridge in 2022. Gateways, custom code, node selection, gotchas.","tags":["opc-ua","mqtt","iiot","bridge"],"tracks":["programming"],"url":"/blog/opc-ua-mqtt-bridge/","date":"2022-08-19","img":"/images/blog/opc-ua-mqtt-bridge.svg"},{"title":"Sparkplug B for Industrial OT","summary":"Sparkplug B: MQTT spec for industrial OT. Birth/death, metrics, when to use.","tags":["mqtt","sparkplug-b","iiot","industrial"],"tracks":["programming"],"url":"/blog/sparkplug-b-industrial-ot/","date":"2022-08-17","img":"/images/blog/sparkplug-b-industrial-ot.svg"},{"title":"Ingesting MQTT into TimescaleDB","summary":"MQTT → TimescaleDB consumer in Go. Hypertables, COPY inserts, retention, backpressure.","tags":["mqtt","timescaledb","postgres","iiot"],"tracks":["programming"],"url":"/blog/mqtt-timescaledb-ingest/","date":"2022-08-15","img":"/images/blog/mqtt-timescaledb-ingest.svg"},{"title":"Reading Sensors from Go on the Edge","summary":"Go edge service: read sensors, publish to MQTT, handle disconnects. Working code.","tags":["go","edge","iiot","mqtt"],"tracks":["programming"],"url":"/blog/go-sensor-reader-edge/","date":"2022-08-12","img":"/images/blog/go-sensor-reader-edge.svg"},{"title":"Sensor Data Schemas, JSON, Protobuf, CBOR","summary":"Sensor data formats: JSON, Protobuf, CBOR. When each wins on IIoT MQTT.","tags":["iiot","data-formats","protobuf","json"],"tracks":["programming"],"url":"/blog/sensor-data-schemas-json-protobuf-cbor/","date":"2022-08-10","img":"/images/blog/sensor-data-schemas-json-protobuf-cbor.svg"},{"title":"Self-Hosting Mosquitto with TLS and Auth","summary":"Mosquitto 2.0 production setup. TLS, auth, ACLs, persistence, Compose stack.","tags":["mqtt","mosquitto","security","iiot"],"tracks":["programming"],"url":"/blog/self-host-mosquitto-tls-auth/","date":"2022-08-08","img":"/images/blog/self-host-mosquitto-tls-auth.svg"},{"title":"MQTT Broker Comparison, Mosquitto, EMQX, HiveMQ in 2022","summary":"MQTT broker picks: Mosquitto, EMQX, HiveMQ, VerneMQ. Capacity, clustering, license, ops.","tags":["mqtt","broker","iiot","infrastructure"],"tracks":["programming"],"url":"/blog/mqtt-broker-comparison-mosquitto-emqx-hivemq/","date":"2022-08-05","img":"/images/blog/mqtt-broker-comparison-mosquitto-emqx-hivemq.svg"},{"title":"MQTT 101, Pub/Sub for the Edge","summary":"MQTT for backend devs: topics, QoS, retained, will, MQTT 5. How it differs from Kafka/AMQP.","tags":["mqtt","iiot","messaging"],"tracks":["programming"],"url":"/blog/mqtt-101-pub-sub-edge/","date":"2022-08-03","img":"/images/blog/mqtt-101-pub-sub-edge.svg"},{"title":"Why I'm Touching Industrial IoT in 2022","summary":"IIoT in 2022 from a web-backend POV. MQTT, sensors, edge, what's different.","tags":["iiot","mqtt","edge","industrial"],"tracks":["programming"],"url":"/blog/why-industrial-iot-2022/","date":"2022-08-01","img":"/images/blog/why-industrial-iot-2022.svg"},{"title":"July Retro, Compose in Production-Adjacent Workflows","summary":"July retro: Compose patterns shipped. Mac perf, dev loop, where Compose ends.","tags":["docker-compose","retro","local-dev"],"tracks":["programming"],"url":"/blog/july-retro-docker-compose/","date":"2022-07-29","img":"/images/blog/july-retro-docker-compose.svg"},{"title":"Docker Compose vs Kubernetes for Local Development","summary":"Compose vs k3d/minikube/Kind for local dev. When each wins, parity vs simplicity, hybrid approach.","tags":["docker-compose","kubernetes","local-dev"],"tracks":["programming"],"url":"/blog/docker-compose-vs-kubernetes-local/","date":"2022-07-27","img":"/images/blog/docker-compose-vs-kubernetes-local.svg"},{"title":"Docker Compose for CI, Ephemeral Stacks per Test Run","summary":"Compose in CI: ephemeral stacks per run, isolation, parallel safety, teardown, GH Actions.","tags":["docker-compose","ci-cd","github-actions","testing"],"tracks":["programming"],"url":"/blog/docker-compose-ci-ephemeral-stacks/","date":"2022-07-25","img":"/images/blog/docker-compose-ci-ephemeral-stacks.svg"},{"title":"Docker Compose Resource Limits, Memory and CPU","summary":"Compose resource limits: memory + CPU caps. deploy.resources syntax, tuning for JVM/Node/Go.","tags":["docker-compose","resource-limits","performance"],"tracks":["programming"],"url":"/blog/docker-compose-resource-limits/","date":"2022-07-22","img":"/images/blog/docker-compose-resource-limits.svg"},{"title":"Building Images Inside Docker Compose, build vs image","summary":"Compose build vs image: build local vs pull, multi-stage targets, build args, caching.","tags":["docker-compose","build","docker"],"tracks":["programming"],"url":"/blog/docker-compose-build-vs-image/","date":"2022-07-20","img":"/images/blog/docker-compose-build-vs-image.svg"},{"title":"Networking in Docker Compose, Bridges, Aliases, External Networks","summary":"Compose networking: bridge, aliases, external networks, cross-stack shared DBs.","tags":["docker-compose","networking","infrastructure"],"tracks":["programming"],"url":"/blog/docker-compose-networking/","date":"2022-07-18","img":"/images/blog/docker-compose-networking.svg"},{"title":"Docker Volumes vs Bind Mounts, When to Use Each","summary":"Volumes vs bind mounts vs tmpfs: how each works, perf, when to use each.","tags":["docker","volumes","bind-mounts","storage"],"tracks":["programming"],"url":"/blog/docker-volumes-vs-bind-mounts/","date":"2022-07-15","img":"/images/blog/docker-volumes-vs-bind-mounts.svg"},{"title":"Compose Watch and Live Reload for Local Development","summary":"Compose v2.6 watch: file-watch live reload, no bind mounts. Sync, rebuild, restart. Go/Node/Python.","tags":["docker-compose","live-reload","local-dev"],"tracks":["programming"],"url":"/blog/docker-compose-watch-live-reload/","date":"2022-07-13","img":"/images/blog/docker-compose-watch-live-reload.svg"},{"title":"Healthchecks and Service Dependencies in Docker Compose","summary":"Compose healthchecks + depends_on conditions: service_healthy, started, completed_successfully.","tags":["docker-compose","healthchecks","depends-on"],"tracks":["programming"],"url":"/blog/compose-healthchecks-depends-on/","date":"2022-07-11","img":"/images/blog/compose-healthchecks-depends-on.svg"},{"title":"Environment Variables and Secrets in Docker Compose","summary":"Compose env vars + secrets: .env, env_file, secrets top-level. Safe vs leaky patterns.","tags":["docker-compose","secrets","environment"],"tracks":["programming"],"url":"/blog/docker-compose-env-secrets/","date":"2022-07-08","img":"/images/blog/docker-compose-env-secrets.svg"},{"title":"Docker Compose Profiles, Opt-In Services Done Right","summary":"Compose profiles: opt-in services, gotchas, depends_on combinations, patterns for big stacks.","tags":["docker-compose","profiles","local-dev"],"tracks":["programming"],"url":"/blog/docker-compose-profiles/","date":"2022-07-06","img":"/images/blog/docker-compose-profiles.svg"},{"title":"Multi-Service Docker Compose for Polyglot Stacks","summary":"Compose for polyglot dev: Go + Node + Python in one stack. Cross-repo build contexts, conventions.","tags":["docker-compose","polyglot","local-dev"],"tracks":["programming"],"url":"/blog/multi-service-compose-polyglot/","date":"2022-07-04","img":"/images/blog/multi-service-compose-polyglot.svg"},{"title":"Beyond docker-compose up, Real-World Patterns in 2022","summary":"Compose v2.6 patterns: profiles, watch, secrets, healthchecks, depends-on. Scale past the README example.","tags":["docker-compose","docker","local-dev"],"tracks":["programming"],"url":"/blog/beyond-docker-compose-up-2022-patterns/","date":"2022-07-01","img":"/images/blog/beyond-docker-compose-up-2022-patterns.svg"},{"title":"June Retro, Clean Architecture in Practice","summary":"June retro: Clean Arch in Go + Laravel. Where it paid off, where it overkilled.","tags":["clean-architecture","retro","go","laravel"],"tracks":["programming"],"url":"/blog/june-retro-clean-architecture/","date":"2022-06-29","img":"/images/blog/june-retro-clean-architecture.svg"},{"title":"Testing Clean Architecture, Unit, Use Case, Integration","summary":"Test strategy for Clean Architecture: pure unit (domain), fast use case (fakes), integration (adapters).","tags":["testing","clean-architecture","go","laravel"],"tracks":["programming"],"url":"/blog/clean-architecture-testing/","date":"2022-06-27","img":"/images/blog/clean-architecture-testing.svg"},{"title":"Eloquent vs Domain Models in Clean Architecture","summary":"Eloquent vs domain models in Clean Architecture: when to use as-is, when to wrap, conversion patterns.","tags":["laravel","eloquent","domain-models","clean-architecture"],"tracks":["programming"],"url":"/blog/eloquent-vs-domain-models/","date":"2022-06-24","img":"/images/blog/eloquent-vs-domain-models.svg"},{"title":"Laravel Service Container for Dependency Injection","summary":"Laravel service container for DI: bindings, singletons, contextual, explicit + testable wiring.","tags":["laravel","dependency-injection","service-container"],"tracks":["programming"],"url":"/blog/laravel-service-container-di/","date":"2022-06-22","img":"/images/blog/laravel-service-container-di.svg"},{"title":"Clean Architecture in Laravel 9, Project Layout","summary":"Clean Architecture in Laravel 9: layout, Domain/UseCase/Repository, Eloquent at edges, framework compromises.","tags":["laravel","clean-architecture","php"],"tracks":["programming"],"url":"/blog/laravel-9-clean-architecture/","date":"2022-06-20","img":"/images/blog/laravel-9-clean-architecture.svg"},{"title":"Adapters in Go, HTTP, gRPC, and Worker Patterns","summary":"Adapters in Go: HTTP, gRPC, workers. Translate between transport DTOs and use cases. Frameworks at edges.","tags":["go","adapters","http","grpc","clean-architecture"],"tracks":["programming"],"url":"/blog/go-adapter-pattern/","date":"2022-06-17","img":"/images/blog/go-adapter-pattern.svg"},{"title":"Use Cases in Go, Coordinating Domain Logic","summary":"Use cases in Go: one per operation, DTOs, dependency wiring, fast unit tests.","tags":["go","use-cases","clean-architecture"],"tracks":["programming"],"url":"/blog/go-use-case-pattern/","date":"2022-06-15","img":"/images/blog/go-use-case-pattern.svg"},{"title":"Repositories and Interfaces in Go","summary":"Repository pattern in Go. Ports in use-case layer, Postgres implementations, transactions.","tags":["go","repository-pattern","postgres","clean-architecture"],"tracks":["programming"],"url":"/blog/go-repository-pattern/","date":"2022-06-13","img":"/images/blog/go-repository-pattern.svg"},{"title":"Domain-Driven Entities in Go","summary":"Domain entities in Go: identity, invariants, constructors, value objects. Keep business logic out of frameworks.","tags":["go","domain-driven-design","clean-architecture"],"tracks":["programming"],"url":"/blog/go-domain-entities/","date":"2022-06-10","img":"/images/blog/go-domain-entities.svg"},{"title":"Dependency Injection in Go Without a Framework","summary":"Go DI without a framework. Constructor injection, interfaces, manual wire, when google/wire earns it.","tags":["go","dependency-injection","clean-architecture"],"tracks":["programming"],"url":"/blog/go-dependency-injection-no-framework/","date":"2022-06-08","img":"/images/blog/go-dependency-injection-no-framework.svg"},{"title":"Clean Architecture in Go, Project Layout","summary":"Pragmatic Go layout for Clean Architecture. Folders, package boundaries, naming, Go-native patterns.","tags":["go","clean-architecture","project-layout"],"tracks":["programming"],"url":"/blog/clean-architecture-go-layout/","date":"2022-06-06","img":"/images/blog/clean-architecture-go-layout.svg"},{"title":"Layers of Clean Architecture, Domain, Use Case, Adapter, Infra","summary":"Four layers of Clean Architecture: domain, use case, adapter, infra. What goes where + dependency rule.","tags":["architecture","clean-architecture","fundamentals"],"tracks":["programming"],"url":"/blog/clean-architecture-layers/","date":"2022-06-03","img":"/images/blog/clean-architecture-layers.svg"},{"title":"Why I'm Trying Clean Architecture in 2022","summary":"Clean Architecture in 2022: why now, what it buys, what it costs. Pragmatic take.","tags":["architecture","clean-architecture","go","laravel"],"tracks":["programming"],"url":"/blog/why-clean-architecture-in-2022/","date":"2022-06-01","img":"/images/blog/why-clean-architecture-in-2022.svg"},{"title":"May Retro, A Month of Workflow Automation","summary":"May retro: n8n automations in prod. Numbers, wins, surprises, what to skip.","tags":["n8n","retro","automation","internal-tools"],"tracks":["programming"],"url":"/blog/may-retro-workflow-automation/","date":"2022-05-30","img":"/images/blog/may-retro-workflow-automation.svg"},{"title":"Monitoring n8n in Production","summary":"Monitor n8n in prod: health checks, execution rates, Prometheus, log aggregation, useful dashboards.","tags":["n8n","monitoring","observability","prometheus"],"tracks":["programming"],"url":"/blog/n8n-monitoring-production/","date":"2022-05-27","img":"/images/blog/n8n-monitoring-production.svg"},{"title":"Securing n8n, Credentials, OAuth, and Encryption","summary":"Secure n8n: credentials manager, OAuth, encryption key mgmt, network exposure, audit checklist.","tags":["n8n","security","credentials","oauth"],"tracks":["programming"],"url":"/blog/n8n-security-credentials-oauth/","date":"2022-05-25","img":"/images/blog/n8n-security-credentials-oauth.svg"},{"title":"Building a Standup Bot in n8n + Slack","summary":"Standup bot in n8n + Slack: 9 AM DMs, collect, post summary. Modals + working workflow.","tags":["n8n","slack","standup","bot"],"tracks":["programming"],"url":"/blog/n8n-slack-standup-bot/","date":"2022-05-23","img":"/images/blog/n8n-slack-standup-bot.svg"},{"title":"Error Handling and Retries in n8n","summary":"n8n error handling: retries, error trigger workflows, dead-letters, alerting on consecutive failures.","tags":["n8n","error-handling","reliability","automation"],"tracks":["programming"],"url":"/blog/n8n-error-handling-retries/","date":"2022-05-20","img":"/images/blog/n8n-error-handling-retries.svg"},{"title":"Webhooks 101 for Engineering Workflows","summary":"Webhooks for engineering automation. How they work, signatures, retries, idempotency, replay protection.","tags":["webhooks","automation","n8n","security"],"tracks":["programming"],"url":"/blog/webhooks-101-engineering-workflows/","date":"2022-05-18","img":"/images/blog/webhooks-101-engineering-workflows.svg"},{"title":"Notion to Jira Sync with n8n","summary":"Notion → Jira sync with n8n. One-way and two-way patterns, dedup, conflict rules to prevent loops.","tags":["n8n","notion","jira","sync"],"tracks":["programming"],"url":"/blog/notion-jira-sync-n8n/","date":"2022-05-16","img":"/images/blog/notion-jira-sync-n8n.svg"},{"title":"Slack Slash Commands via n8n","summary":"Slack slash commands via n8n: app setup, signature verification, response handling, interactive responses.","tags":["n8n","slack","slash-commands","automation"],"tracks":["programming"],"url":"/blog/slack-slash-commands-n8n/","date":"2022-05-13","img":"/images/blog/slack-slash-commands-n8n.svg"},{"title":"Auto-Assigning Jira Tickets from GitHub PR Events with n8n","summary":"n8n workflow: GitHub PR events → auto-assign + transition Jira tickets. Webhook → parser → Jira API.","tags":["n8n","jira","github","automation"],"tracks":["programming"],"url":"/blog/jira-auto-assignment-github-events/","date":"2022-05-11","img":"/images/blog/jira-auto-assignment-github-events.svg"},{"title":"Connecting n8n to the Jira REST API v3","summary":"Connect n8n to Jira REST API v3. API token, built-in node, JQL, HTTP fallback for missing operations.","tags":["n8n","jira","api","automation"],"tracks":["programming"],"url":"/blog/n8n-jira-rest-api-v3/","date":"2022-05-09","img":"/images/blog/n8n-jira-rest-api-v3.svg"},{"title":"n8n Workflow Basics, Triggers, Nodes, Connections","summary":"n8n workflows: triggers, nodes, connections, expressions, Code node, where the visual model ends.","tags":["n8n","workflows","automation","tutorial"],"tracks":["programming"],"url":"/blog/n8n-workflow-basics-triggers-nodes/","date":"2022-05-06","img":"/images/blog/n8n-workflow-basics-triggers-nodes.svg"},{"title":"Self-Hosting n8n with Docker Compose","summary":"Self-host n8n with Docker Compose + Postgres + reverse proxy. Env vars + production setup.","tags":["n8n","docker","self-hosted","infrastructure"],"tracks":["programming"],"url":"/blog/self-host-n8n-docker-compose/","date":"2022-05-04","img":"/images/blog/self-host-n8n-docker-compose.svg"},{"title":"Why I'm Building Internal Tools With n8n","summary":"n8n vs Zapier vs scripts for engineering internal tools. Self-hosted, OSS, code-friendly, no per-task billing.","tags":["n8n","automation","internal-tools","devops"],"tracks":["programming"],"url":"/blog/why-build-internal-tools-with-n8n/","date":"2022-05-02","img":"/images/blog/why-build-internal-tools-with-n8n.svg"},{"title":"April Retro, React 18 and Next.js in Production","summary":"April retro: React 18 + Next.js 12 in production. Wins, surprises, bugs caught, what's next.","tags":["react","nextjs","retro","frontend"],"tracks":["programming"],"url":"/blog/april-retro-react-18-nextjs/","date":"2022-04-29","img":"/images/blog/april-retro-react-18-nextjs.svg"},{"title":"Deploying Next.js 12, Vercel vs Self-Hosted","summary":"Next.js 12 deployment: Vercel vs self-hosted on Node/Docker/k8s. Feature parity, cost, when each wins.","tags":["nextjs","deployment","vercel","self-hosted"],"tracks":["programming"],"url":"/blog/nextjs-deployment-vercel-vs-self-hosted/","date":"2022-04-27","img":"/images/blog/nextjs-deployment-vercel-vs-self-hosted.svg"},{"title":"Image Optimization with next/image in Next.js 12","summary":"next/image in Next.js 12. Layouts, sizes, lazy loading, WebP/AVIF, remote patterns, perf wins.","tags":["nextjs","performance","images","frontend"],"tracks":["programming"],"url":"/blog/nextjs-image-optimization/","date":"2022-04-25","img":"/images/blog/nextjs-image-optimization.svg"},{"title":"Next.js 12 Middleware for Auth and Redirects","summary":"Next.js 12 middleware. Edge auth, redirects, A/B tests, bot blocking. Patterns + limits.","tags":["nextjs","middleware","auth","edge"],"tracks":["programming"],"url":"/blog/nextjs-middleware-auth-redirects/","date":"2022-04-22","img":"/images/blog/nextjs-middleware-auth-redirects.svg"},{"title":"Next.js 12 Data Fetching, SSG, SSR, and ISR Explained","summary":"Next.js 12 data fetching: SSG, SSR, ISR. getStaticProps, getServerSideProps, getStaticPaths, ISR. When each wins.","tags":["nextjs","ssg","ssr","isr"],"tracks":["programming"],"url":"/blog/nextjs-data-fetching-ssg-ssr-isr/","date":"2022-04-20","img":"/images/blog/nextjs-data-fetching-ssg-ssr-isr.svg"},{"title":"Next.js 12 Routing, Pages, Dynamic, Catch-All, and Nested Layouts","summary":"Next.js 12 routing. File-based, dynamic, catch-all, optional, nested layouts, useRouter idioms.","tags":["nextjs","routing","react","frontend"],"tracks":["programming"],"url":"/blog/nextjs-routing-pages-dynamic/","date":"2022-04-18","img":"/images/blog/nextjs-routing-pages-dynamic.svg"},{"title":"Migrating from Create React App to Next.js 12","summary":"CRA → Next.js 12 in 2022. Pages, routing, env vars, build, what breaks.","tags":["nextjs","cra","migration","react"],"tracks":["programming"],"url":"/blog/cra-to-nextjs-12-migration/","date":"2022-04-15","img":"/images/blog/cra-to-nextjs-12-migration.svg"},{"title":"Upgrading a React 17 App to React 18, A Working Checklist","summary":"Concrete walkthrough: React 17 → 18 upgrade. Packages, createRoot, TS types, Strict Effects, library compat.","tags":["react","react-18","upgrade","migration"],"tracks":["programming"],"url":"/blog/upgrading-react-17-to-react-18/","date":"2022-04-13","img":"/images/blog/upgrading-react-17-to-react-18.svg"},{"title":"React 18 New Hooks, useId, useSyncExternalStore, and When You'll Actually Use Them","summary":"React 18 new hooks: useId for SSR-safe IDs, useSyncExternalStore for external state, useInsertionEffect for CSS-in-JS.","tags":["react","react-18","hooks","ssr"],"tracks":["programming"],"url":"/blog/react-18-useid-usesyncexternalstore/","date":"2022-04-11","img":"/images/blog/react-18-useid-usesyncexternalstore.svg"},{"title":"React 18 Automatic Batching, One Render Pass For All Your State Updates","summary":"React 18 batches all state updates, not just event handlers. flushSync to opt out. Free perf win for most apps.","tags":["react","react-18","performance","rendering"],"tracks":["programming"],"url":"/blog/react-18-automatic-batching/","date":"2022-04-08","img":"/images/blog/react-18-automatic-batching.svg"},{"title":"React 18 Suspense for Data Fetching (Without Server Components)","summary":"React 18 Suspense for data fetching today. SWR 1.3, React Query 4, working patterns, effect-related gotchas.","tags":["react","suspense","data-fetching","swr"],"tracks":["programming"],"url":"/blog/react-suspense-data-fetching-2022/","date":"2022-04-06","img":"/images/blog/react-suspense-data-fetching-2022.svg"},{"title":"React Concurrent Rendering, useTransition and useDeferredValue Explained","summary":"React 18 concurrent rendering. useTransition for non-urgent updates, useDeferredValue for derived values. When each wins.","tags":["react","react-18","concurrent-rendering","performance"],"tracks":["programming"],"url":"/blog/react-concurrent-rendering-usetransition/","date":"2022-04-04","img":"/images/blog/react-concurrent-rendering-usetransition.svg"},{"title":"React 18 Is Here, What Actually Changed for App Developers","summary":"React 18 shipped Mar 2022. Concurrent rendering, automatic batching, new hooks, Suspense data fetching, Strict Effects.","tags":["react","react-18","frontend","concurrent-rendering"],"tracks":["programming"],"url":"/blog/react-18-changes-for-app-devs/","date":"2022-04-01","img":"/images/blog/react-18-changes-for-app-devs.svg"},{"title":"March Retro, What Rust Earned Its Keep For","summary":"One month of backend Rust. What stuck, what bounced, where it fits, what to warn the next person about.","tags":["rust","retro","backend","lessons"],"tracks":["programming"],"url":"/blog/march-retro-rust-backend/","date":"2022-03-30","img":"/images/blog/march-retro-rust-backend.svg"},{"title":"Rust vs Go for Backend APIs, When Each One Wins","summary":"Rust vs Go for backend APIs in 2022. Compile times, perf, ergonomics, ecosystem, hiring. Honest after shipping both.","tags":["rust","go","backend","comparison"],"tracks":["programming"],"url":"/blog/rust-vs-go-backend-api/","date":"2022-03-28","img":"/images/blog/rust-vs-go-backend-api.svg"},{"title":"Containerizing a Rust Service, A Sub-25MB Production Image","summary":"Sub-25 MB Rust image. cargo-chef, musl static linking, distroless, BuildKit cache. Full Dockerfile + CI.","tags":["rust","docker","distroless","ci-cd"],"tracks":["programming"],"url":"/blog/rust-docker-image-small-distroless/","date":"2022-03-25","img":"/images/blog/rust-docker-image-small-distroless.svg"},{"title":"Structured Logging in Rust with tracing","summary":"Rust structured logging with tracing. Spans, events, request context, JSON output, production patterns.","tags":["rust","tracing","observability","logging"],"tracks":["programming"],"url":"/blog/rust-structured-logging-tracing/","date":"2022-03-23","img":"/images/blog/rust-structured-logging-tracing.svg"},{"title":"Serde JSON Patterns, Tagged Enums and the Tricks That Save Time","summary":"Practical serde JSON patterns. Tagged enums, rename_all, flatten, custom serializers — handle real APIs cleanly.","tags":["rust","serde","json","patterns"],"tracks":["programming"],"url":"/blog/rust-serde-json-patterns/","date":"2022-03-21","img":"/images/blog/rust-serde-json-patterns.svg"},{"title":"Postgres in Rust with sqlx, A Practical Setup","summary":"Postgres in Rust with sqlx 0.5. Compile-time SQL checking, query macros, migrations, transactions, gotchas.","tags":["rust","sqlx","postgres","database"],"tracks":["programming"],"url":"/blog/rust-sqlx-postgres/","date":"2022-03-18","img":"/images/blog/rust-sqlx-postgres.svg"},{"title":"Building a JSON API in Rust with Axum 0.4","summary":"JSON API in Rust with Axum 0.4. Router, extractors, state, error handling, tower middleware. Minimal real backend.","tags":["rust","axum","tokio","api"],"tracks":["programming"],"url":"/blog/rust-json-api-axum/","date":"2022-03-16","img":"/images/blog/rust-json-api-axum.svg"},{"title":"Async Rust with Tokio in 2022","summary":"Async Rust with Tokio. What async/await compiles to, picking a runtime, tasks vs threads, maintainable async patterns.","tags":["rust","tokio","async","concurrency"],"tracks":["programming"],"url":"/blog/async-rust-tokio-2022/","date":"2022-03-14","img":"/images/blog/async-rust-tokio-2022.svg"},{"title":"Cargo Workspaces for Backend Services","summary":"Cargo workspaces for Rust backends. Layout, shared crates, per-binary builds, compile-time wins.","tags":["rust","cargo","workspaces","project-layout"],"tracks":["programming"],"url":"/blog/cargo-workspaces-backend-services/","date":"2022-03-11","img":"/images/blog/cargo-workspaces-backend-services.svg"},{"title":"Rust Error Handling, Result, ?, thiserror, anyhow","summary":"Rust error handling. Result, ?, thiserror for libs, anyhow for apps. Patterns that replace try/catch.","tags":["rust","error-handling","thiserror","anyhow"],"tracks":["programming"],"url":"/blog/rust-error-handling-result-thiserror/","date":"2022-03-09","img":"/images/blog/rust-error-handling-result-thiserror.svg"},{"title":"Rust Lifetimes Without the Fear","summary":"Rust lifetimes demystified. Why they exist, what 'a means, elision, and the three patterns that cover 95% of code.","tags":["rust","lifetimes","borrow-checker","fundamentals"],"tracks":["programming"],"url":"/blog/rust-lifetimes-without-fear/","date":"2022-03-07","img":"/images/blog/rust-lifetimes-without-fear.svg"},{"title":"Rust Ownership and Borrowing for People Who Already Know Pointers","summary":"Rust ownership for people who know pointers. Move semantics, \u0026T vs \u0026mut T, three rules, patterns that click.","tags":["rust","ownership","borrowing","go"],"tracks":["programming"],"url":"/blog/rust-ownership-borrowing-for-go-devs/","date":"2022-03-04","img":"/images/blog/rust-ownership-borrowing-for-go-devs.svg"},{"title":"Why I'm Learning Rust in 2022 (as a Go Developer)","summary":"A Go dev picks up Rust in 2022. Where it wins, where it doesn't, and what the first month feels like.","tags":["rust","go","backend","career"],"tracks":["programming"],"url":"/blog/why-learn-rust-in-2022/","date":"2022-03-02","img":"/images/blog/why-learn-rust-in-2022.svg"},{"title":"Deploying Docker Images from GitHub Actions to Staging","summary":"GitHub Actions deploy to staging: build + push to GHCR + kubectl/SSH apply. OIDC over long-lived secrets. Working workflow.","tags":["github-actions","ci-cd","deployment","docker"],"tracks":["programming"],"url":"/blog/github-actions-deploy-docker-staging/","date":"2022-02-28","img":"/images/blog/github-actions-deploy-docker-staging.svg"},{"title":"GitHub Actions Matrix Builds and Parallel Test Sharding","summary":"Matrix builds in GitHub Actions. Multi-version, multi-OS, parallel test sharding, fail-fast trade-offs.","tags":["github-actions","ci-cd","matrix-builds","testing"],"tracks":["programming"],"url":"/blog/github-actions-matrix-parallel-tests/","date":"2022-02-25","img":"/images/blog/github-actions-matrix-parallel-tests.svg"},{"title":"GitHub Actions Caching, actions/cache + BuildKit Registry Cache","summary":"GitHub Actions cache strategies. actions/cache@v3 keys, BuildKit registry cache for Docker, and the fixes that cut builds 6× faster.","tags":["github-actions","ci-cd","docker","buildkit"],"tracks":["programming"],"url":"/blog/github-actions-cache-buildkit/","date":"2022-02-23","img":"/images/blog/github-actions-cache-buildkit.svg"},{"title":"GitHub Actions for Go Monorepos, A 2022 Setup","summary":"GitHub Actions for Go monorepos. Path filters, module cache, golangci-lint, race tests, sub-3-min CI.","tags":["github-actions","go","ci-cd","monorepo"],"tracks":["programming"],"url":"/blog/github-actions-go-monorepo/","date":"2022-02-21","img":"/images/blog/github-actions-go-monorepo.svg"},{"title":"Postgres Multi-Column Indexes, Column Order Is Almost Everything","summary":"Multi-column index column order in Postgres. Leftmost prefix, INCLUDE, and the three patterns that decide useful vs useless.","tags":["postgres","indexing","composite-index","performance"],"tracks":["programming"],"url":"/blog/postgres-multi-column-index-order/","date":"2022-02-18","img":"/images/blog/postgres-multi-column-index-order.svg"},{"title":"Postgres Partial Indexes That Make Slow Queries Disappear","summary":"Postgres partial indexes — index only the rows that matter. Four patterns that catch most production wins.","tags":["postgres","indexing","performance","partial-index"],"tracks":["programming"],"url":"/blog/postgres-partial-indexes/","date":"2022-02-16","img":"/images/blog/postgres-partial-indexes.svg"},{"title":"Postgres Index Types, B-tree, GIN, GiST, BRIN, When Each One Wins","summary":"Postgres index types compared. B-tree, GIN, GiST, BRIN, Hash. When each wins, with real queries and trade-offs.","tags":["postgres","indexing","performance","database"],"tracks":["programming"],"url":"/blog/postgres-index-types-btree-gin-gist-brin/","date":"2022-02-14","img":"/images/blog/postgres-index-types-btree-gin-gist-brin.svg"},{"title":"PgBouncer Connection Pooling for Postgres, A Practical Setup","summary":"PgBouncer in front of Postgres 14. Transaction pooling, pool sizing, prepared-statement gotchas, deploy patterns.","tags":["postgres","pgbouncer","connection-pooling","infrastructure"],"tracks":["programming"],"url":"/blog/pgbouncer-connection-pooling-postgres/","date":"2022-02-11","img":"/images/blog/pgbouncer-connection-pooling-postgres.svg"},{"title":"Postgres Autovacuum, When Defaults Fail and How to Fix Them","summary":"Autovacuum defaults fail on write-heavy tables. Spot the bloat, set per-table overrides, prove it works with metrics.","tags":["postgres","autovacuum","performance","maintenance"],"tracks":["programming"],"url":"/blog/postgres-autovacuum-tuning/","date":"2022-02-09","img":"/images/blog/postgres-autovacuum-tuning.svg"},{"title":"Tuning Postgres Memory, shared_buffers, work_mem, effective_cache_size","summary":"Four Postgres memory settings that decide whether queries fit in RAM or spill. shared_buffers, work_mem, effective_cache_size, maintenance_work_mem.","tags":["postgres","memory","performance","tuning"],"tracks":["programming"],"url":"/blog/postgres-memory-shared-buffers-work-mem/","date":"2022-02-07","img":"/images/blog/postgres-memory-shared-buffers-work-mem.svg"},{"title":"Reading the Postgres Query Planner, A Practical EXPLAIN Walkthrough","summary":"Read Postgres EXPLAIN ANALYZE without faking it. Plan nodes, cost vs actual, trouble patterns, and the fix per pattern.","tags":["postgres","explain","performance","query-planner"],"tracks":["programming"],"url":"/blog/postgres-query-planner-explain/","date":"2022-02-04","img":"/images/blog/postgres-query-planner-explain.svg"},{"title":"Postgres Performance Tuning, My 2022 Checklist","summary":"Practical Postgres 14 performance checklist. Memory, autovacuum, indexes, pooling, and the metrics that prove it worked.","tags":["postgres","performance","database","tuning"],"tracks":["programming"],"url":"/blog/postgres-performance-tuning-checklist/","date":"2022-02-02","img":"/images/blog/postgres-performance-tuning-checklist.svg"},{"title":"What I Learned Containerizing 11 Services in One Month","summary":"End-of-month retro on containerizing a monolith + extracting Go microservices. What worked, what failed, what I'd skip.","tags":["docker","microservices","retro","lessons"],"tracks":["programming"],"url":"/blog/lessons-containerizing-11-services/","date":"2022-01-31","img":"/images/blog/lessons-containerizing-11-services.svg"},{"title":"Sharing a Postgres Database Between a Monolith and New Services","summary":"Sharing Postgres between monolith and microservices without coupling them. Schemas, roles, FK boundaries, ownership migration.","tags":["postgres","microservices","database","architecture"],"tracks":["programming"],"url":"/blog/shared-database-monolith-microservices/","date":"2022-01-28","img":"/images/blog/shared-database-monolith-microservices.svg"},{"title":"Containerizing a Go Service, A Sub-15MB Production Image","summary":"Shipping a Go service in 14 MB with distroless + static linking + Buildx. Full Dockerfile, CVE wins, CI cache wins.","tags":["go","docker","distroless","production"],"tracks":["programming"],"url":"/blog/go-docker-image-small-distroless/","date":"2022-01-26","img":"/images/blog/go-docker-image-small-distroless.svg"},{"title":"Health Checks and Graceful Shutdown in Go Web Services","summary":"Liveness vs readiness, signal handling, draining in-flight requests. The Go shutdown pattern that plays nice with Kubernetes.","tags":["go","graceful-shutdown","health-checks","kubernetes"],"tracks":["programming"],"url":"/blog/go-graceful-shutdown-health-checks/","date":"2022-01-24","img":"/images/blog/go-graceful-shutdown-health-checks.svg"},{"title":"Structured Logging in Go Microservices with Zap","summary":"Structured logging in Go with zap. JSON output, request-scoped fields, sampling, and the pattern that survives production.","tags":["go","logging","zap","observability"],"tracks":["programming"],"url":"/blog/go-structured-logging-zap/","date":"2022-01-21","img":"/images/blog/go-structured-logging-zap.svg"},{"title":"Configuration Management for Go Services, Viper, Env, or Just Flags?","summary":"Viper vs env vars vs flags for Go services. Trade-offs, the boring default that wins, and a 60-line loader you can copy-paste.","tags":["go","configuration","viper","best-practices"],"tracks":["programming"],"url":"/blog/go-config-management-viper-env-flags/","date":"2022-01-19","img":"/images/blog/go-config-management-viper-env-flags.svg"},{"title":"Local Development with Docker Compose for a Polyglot Stack","summary":"Docker Compose v2.2 for local microservices dev. Polyglot stack, healthchecks, profiles, ten-minute onboarding.","tags":["docker","docker-compose","microservices","local-dev"],"tracks":["programming"],"url":"/blog/docker-compose-polyglot-microservices/","date":"2022-01-17","img":"/images/blog/docker-compose-polyglot-microservices.svg"},{"title":"Communicating Between Go Microservices, REST vs gRPC in 2022","summary":"REST vs gRPC for Go microservices. Real benchmarks, ergonomics, the hidden cost of HTTP/JSON at scale, and what we picked for billing.","tags":["go","grpc","rest","microservices"],"tracks":["programming"],"url":"/blog/grpc-vs-rest-go-microservices/","date":"2022-01-14","img":"/images/blog/grpc-vs-rest-go-microservices.svg"},{"title":"Designing the Service Boundary, Lessons from Splitting a Billing Module","summary":"Drawing the boundary when extracting a billing module. Aggregate roots, event contracts, and the questions to answer before you write any code.","tags":["microservices","architecture","ddd","billing"],"tracks":["programming"],"url":"/blog/microservice-boundaries-billing-module/","date":"2022-01-12","img":"/images/blog/microservice-boundaries-billing-module.svg"},{"title":"From Monolith to First Go Microservice, A Pragmatic Cutover","summary":"Carving the first Go microservice out of a PHP monolith. Pragmatic cutover, traffic shadowing, and the boring service to start with.","tags":["go","microservices","monoliths","architecture"],"tracks":["programming"],"url":"/blog/monolith-to-first-go-microservice/","date":"2022-01-10","img":"/images/blog/monolith-to-first-go-microservice.svg"},{"title":"Multi-Stage Docker Builds Cut Our Image Size by 70%","summary":"Multi-stage Docker builds, real numbers. 70% smaller images with Buildx, distroless, and Alpine. CI cache layers that actually save time.","tags":["docker","buildx","alpine","performance"],"tracks":["programming"],"url":"/blog/multi-stage-docker-build-image-size/","date":"2022-01-07","img":"/images/blog/multi-stage-docker-build-image-size.svg"},{"title":"Writing a Production Dockerfile for a 5-Year-Old PHP Monolith","summary":"Line-by-line production Dockerfile for a legacy PHP monolith. Composer caching, opcache, FPM tuning, and the trade-offs nobody documents.","tags":["docker","php","composer","production"],"tracks":["programming"],"url":"/blog/production-dockerfile-php-monolith/","date":"2022-01-05","img":"/images/blog/production-dockerfile-php-monolith.svg"},{"title":"Why I'm Finally Containerizing My Monolith in 2022","summary":"Three years of putting it off. Now the monolith goes in a container. Here is why 2022 is the year the tooling finally got out of the way.","tags":["docker","monoliths","containers","devops"],"tracks":["programming"],"url":"/blog/why-im-containerizing-my-monolith-in-2022/","date":"2022-01-03","img":"/images/blog/why-im-containerizing-my-monolith-in-2022.svg"}]