41554 blogs · [ { "id": "01a0876e-edec-736c-8f30-c60d34353728", "title": "How I Built the MCP Server That Publishes This Blog, Part 2: What Broke and What It Taught Me", "url": "https://dorokhovich.com/blog/building-my-mcp-server-what-broke", "published_at": "2026-09-01T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d343b582b", "title": "How I Built the MCP Server That Publishes This Blog, Part 1: Why", "url": "https://dorokhovich.com/blog/building-my-mcp-server-why", "published_at": "2026-08-31T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d34c65fda", "title": "A Tool Call Returned Success and the Work Never Happened", "url": "https://dorokhovich.com/blog/mcp-false-success", "published_at": "2026-08-26T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3511a452", "title": "Every MCP Revision, and What Each One Took Back", "url": "https://dorokhovich.com/blog/mcp-revision-history", "published_at": "2026-08-19T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d35b16c86", "title": "MCP vs REST API: Fifty Years of the Same Question", "url": "https://dorokhovich.com/blog/mcp-vs-rest-api", "published_at": "2026-08-05T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3690bdde", "title": "Inside MCP: What an MCP Server Is Made Of", "url": "https://dorokhovich.com/blog/how-mcp-works", "published_at": "2026-08-05T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d36abcaa3", "title": "MCP vs REST: The Bill Comes in Tokens", "url": "https://dorokhovich.com/blog/mcp-token-cost", "published_at": "2026-08-05T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d379896a8", "title": "Local Kubernetes Dev — Part 1: The inner dev loop and why run a cluster locally", "url": "https://dorokhovich.com/blog/local-k8s-inner-dev-loop", "published_at": "2026-06-14T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d37ce3657", "title": "Local Kubernetes Dev — Part 2: Production-like environments — what and why", "url": "https://dorokhovich.com/blog/local-k8s-production-like-environments", "published_at": "2026-06-13T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d388f2d64", "title": "Local Kubernetes Dev — Part 3: Tooling overview — who does what", "url": "https://dorokhovich.com/blog/local-k8s-tooling-overview", "published_at": "2026-06-12T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d39282ea0", "title": "Local Kubernetes Dev — Part 4: Setting up your workstation", "url": "https://dorokhovich.com/blog/local-k8s-workstation-setup", "published_at": "2026-06-11T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3a14cebe", "title": "Local Kubernetes Dev — Part 5: Spinning up a local cluster with k3d", "url": "https://dorokhovich.com/blog/local-k8s-cluster-with-k3d", "published_at": "2026-06-10T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3ab8e8c6", "title": "Local Kubernetes Dev — Part 6: Containerizing your service — writing a Dockerfile", "url": "https://dorokhovich.com/blog/local-k8s-containerizing-your-service", "published_at": "2026-06-09T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3acc0232", "title": "Local Kubernetes Dev — Part 7: Kubernetes manifests for your service", "url": "https://dorokhovich.com/blog/local-k8s-kubernetes-manifests", "published_at": "2026-06-08T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3ae340e8", "title": "Local Kubernetes Dev — Part 8: Tilt — a fast development loop", "url": "https://dorokhovich.com/blog/local-k8s-tilt-fast-dev-loop", "published_at": "2026-06-07T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3b23cad1", "title": "Local Kubernetes Dev — Part 9: Dependencies — databases, queues, caches", "url": "https://dorokhovich.com/blog/local-k8s-dependencies-databases-queues", "published_at": "2026-06-06T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3be96d59", "title": "Local Kubernetes Dev — Part 10: Configuration and secrets", "url": "https://dorokhovich.com/blog/local-k8s-configuration-and-secrets", "published_at": "2026-06-05T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3c193068", "title": "Local Kubernetes Dev — Part 11: Networking — reaching your service and Ingress", "url": "https://dorokhovich.com/blog/local-k8s-networking-and-ingress", "published_at": "2026-06-04T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3cddeb1a", "title": "Local Kubernetes Dev — Part 12: Debugging and observability", "url": "https://dorokhovich.com/blog/local-k8s-debugging-and-observability", "published_at": "2026-06-03T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3d81304b", "title": "Local Kubernetes Dev — Part 13: Making your local setup truly production-like", "url": "https://dorokhovich.com/blog/local-k8s-making-it-production-like", "published_at": "2026-06-02T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3d92506e", "title": "Local Kubernetes Dev — Part 14: Preparing for deployment and CI", "url": "https://dorokhovich.com/blog/local-k8s-preparing-for-deployment-and-ci", "published_at": "2026-06-01T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3e190b70", "title": "Local Kubernetes Dev — Part 15: Common problems and how to fix them", "url": "https://dorokhovich.com/blog/local-k8s-troubleshooting", "published_at": "2026-05-31T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3e3b18c5", "title": "Local Kubernetes Dev — Part 16: Conclusion and next steps", "url": "https://dorokhovich.com/blog/local-k8s-conclusion-and-next-steps", "published_at": "2026-05-30T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3f0a78c6", "title": "When the Internet's Foundation Cracks", "url": "https://dorokhovich.com/blog/cloudflare-outage-november-2025", "published_at": "2025-11-18T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d3faf7a09", "title": "Remote Access to Raspberry Pi via Reverse SSH Tunnel", "url": "https://dorokhovich.com/blog/rpi/reverse-ssh", "published_at": "2025-10-15T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d40998b4e", "title": "Setting Up VNC Access to Raspberry Pi via AWS EC2 and a Custom Domain", "url": "https://dorokhovich.com/blog/rpi/vnc-ec2-setup", "published_at": "2025-10-12T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d410399c9", "title": "Deployment Strategies", "url": "https://dorokhovich.com/blog/release-orchestration/deployment-strategies", "published_at": "2025-10-01T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d418c3269", "title": "Git Branching Fundamentals for Releases", "url": "https://dorokhovich.com/blog/release-orchestration/git-branching", "published_at": "2025-09-30T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d419b73a3", "title": "Release Orchestration: A Practical Guide for 2025", "url": "https://dorokhovich.com/blog/release-orchestration", "published_at": "2025-09-27T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d4248083a", "title": "Overview of Release Orchestration Approaches", "url": "https://dorokhovich.com/blog/release-orchestration/overview", "published_at": "2025-09-27T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d42a6ceee", "title": "Evolution of Practices: From Manual Releases to GitOps", "url": "https://dorokhovich.com/blog/release-orchestration/evolution", "published_at": "2025-09-27T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d42a93247", "title": "Release Orchestration Learning Path", "url": "https://dorokhovich.com/blog/release-orchestration/learning-path", "published_at": "2025-09-27T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d4363b065", "title": "Ruby Community Crisis: Ruby Central's Hostile Takeover of RubyGems", "url": "https://dorokhovich.com/blog/ruby-crisis-takeover", "published_at": "2025-09-23T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d4439c111", "title": "Incremental Constraints: How Small Rules Change Team Culture", "url": "https://dorokhovich.com/blog/incremental-constraints", "published_at": "2025-09-03T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d44674811", "title": "How RubyGems Protects Us From Supply Chain Attacks (And Why Every Ruby Developer Should Care)", "url": "https://dorokhovich.com/blog/rubygems-supply-chain-security", "published_at": "2025-09-01T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d448f981c", "title": "Blocking Unsafe Code: Security Audits in GitHub Actions", "url": "https://dorokhovich.com/blog/github-actions-security-audit", "published_at": "2025-09-01T00:00:00+00:00" }, { "id": "01a0876e-edec-736c-8f30-c60d45324d66", "title": "Retiring Rack::BodyProxy: Post-Response Hooks with rack.response_finished", "url": "https://dorokhovich.com/blog/rack-response-finished", "published_at": "2025-09-01T00:00:00+00:00" }, { "id": "01a0876e-eded-709b-8e9f-7ec19921b9ba", "title": "Database Schema Evolution: Safe DB Evolution Principles in Rails", "url": "https://dorokhovich.com/blog/rails-database-schema-evolution", "published_at": "2025-09-01T00:00:00+00:00" }, { "id": "01a0876e-eded-709b-8e9f-7ec1996884dc", "title": "Feature Flags (Feature Toggles) in Simple Terms", "url": "https://dorokhovich.com/blog/feature-flags", "published_at": "2025-05-03T00:00:00+00:00" }, { "id": "01a0876e-eded-709b-8e9f-7ec199915677", "title": "Keycloak and Identity Federation: A Comprehensive Guide", "url": "https://dorokhovich.com/blog/keycloak-identity-federation", "published_at": "2024-09-08T00:00:00+00:00" }, { "id": "01a0876e-eded-709b-8e9f-7ec199f35a9a", "title": "Extending Keycloak with Custom Providers", "url": "https://dorokhovich.com/blog/extending-keycloak-custom-providers", "published_at": "2024-09-08T00:00:00+00:00" }, { "id": "01a0876e-eded-709b-8e9f-7ec19a888ef2", "title": "Integration of Keycloak with Next.js", "url": "https://dorokhovich.com/blog/keycloak-nextjs-integration", "published_at": "2024-07-24T00:00:00+00:00" }, { "id": "01a0876e-eded-709b-8e9f-7ec19b14c5aa", "title": "Creating Applications with Different Access Levels Using Keycloak (RBAC)", "url": "https://dorokhovich.com/blog/creating-applications-with-different-access-levels-using-keycloak", "published_at": "2024-07-19T00:00:00+00:00" }, { "id": "01a0876e-eded-709b-8e9f-7ec19b6e34aa", "title": "Understanding Realms, Clients, and Roles in Keycloak", "url": "https://dorokhovich.com/blog/understanding-keycloak-realms-clients-roles", "published_at": "2024-07-18T00:00:00+00:00" }, { "id": "01a0876e-eded-709b-8e9f-7ec19c452ebf", "title": "How to Generate a requirements.txt File for an Existing Python Project", "url": "https://dorokhovich.com/blog/generate-requirements-txt-python-project", "published_at": "2024-06-21T00:00:00+00:00" }, { "id": "01a0876e-eded-709b-8e9f-7ec19c9175d4", "title": "Storytelling in Software Design: Methodologies and Importance", "url": "https://dorokhovich.com/blog/storytelling-software-design", "published_at": "2024-04-19T00:00:00+00:00" }, { "id": "01a0876e-eded-709b-8e9f-7ec19d30deb4", "title": "Deploying Keycloak on AWS ECS with Fargate using Terraform", "url": "https://dorokhovich.com/blog/deploying-keycloak-aws-ecs-fargate-terraform", "published_at": "2024-02-07T00:00:00+00:00" }, { "id": "01a0876e-eded-709b-8e9f-7ec19dd81c39", "title": "Mega Guide: How to Deploy Keycloak in a Cluster with Nginx in 10 Minutes!", "url": "https://dorokhovich.com/blog/keycloak-nginx-cluster", "published_at": "2024-02-04T00:00:00+00:00" }, { "id": "01a0876e-eded-709b-8e9f-7ec19dfa8f9c", "title": "Homebrew Services: How to Use, How It Works, and Alternatives", "url": "https://dorokhovich.com/blog/homebrew-services", "published_at": "2023-11-24T00:00:00+00:00" }, { "id": "01a0876e-eded-709b-8e9f-7ec19eb70817", "title": "LangChain. What is it for? Alternatives?", "url": "https://dorokhovich.com/blog/langchain-alternatives", "published_at": "2023-10-28T00:00:00+00:00" } ] posts Claim your blog
Back to dorokhovich.com
Blog · corpus.blog/blogs/dorokhovich.com/posts

dorokhovich.com

dorokhovich.com

2026

2025

2024

2023