41554 blogs · [ { "id": "01a087da-3f04-710e-9332-7d741695c116", "title": "The Real Cost of Model Migration - What Swapping LLMs Actually Requires", "url": "https://www.safjan.com/the-real-cost-of-model-migration-what-swapping-llms-actually-requires/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2026-04-08T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d7417591d6d", "title": "The illusion of control in AI-assisted engineering", "url": "https://www.safjan.com/the-illusion-of-control-in-ai-assisted-engineering/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2026-03-02T23:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d7417e46c64", "title": "Version Your Vectors - Index Versioning as the Missing Layer in RAG Observability and Compliance", "url": "https://www.safjan.com/version-your-vectors-index-versioning-as-the-missing-layer-in-rag/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2026-02-25T23:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d74186a8883", "title": "Publishing a Python CLI Tool to Homebrew", "url": "https://www.safjan.com/publishing-python-cli-tool-to-homebrew/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2026-02-04T23:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d74189d3c32", "title": "The limiting factor at work isn't writing code anymore", "url": "https://www.safjan.com/the-limiting-factor-at-work-isnt-writing-code-anymore/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2026-01-27T23:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d7419815de2", "title": "Using MLflow-RAGAS Integration Without Tracing", "url": "https://www.safjan.com/using-mlflowragas-integration-without-tracing/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2026-01-10T23:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d7419ea6548", "title": "RAG Evaluation with RAGAS and MLflow - A Practical Guide", "url": "https://www.safjan.com/ragas-mlflow-rag-evaluation-tutorial/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2026-01-07T23:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d741a1c3297", "title": "Working Faster with Git Worktrees and AI-Based Multi-Workflow Development", "url": "https://www.safjan.com/git-worktrees-ai-multi-workflows/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-11-27T23:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d741a9470a3", "title": "Using Git Worktrees as Clean Rooms for AI-Assisted Coding", "url": "https://www.safjan.com/git-worktrees-for-ai-coding/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-11-27T23:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d741ab00e00", "title": "Avoiding Homebrew Upgrades That Require Sudo on macOS", "url": "https://www.safjan.com/avoid-homebrew-sudo-upgrades/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-10-30T23:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d741b5704dc", "title": "Understanding Python Protocols - Structural Subtyping in Practice", "url": "https://www.safjan.com/python-protocols-structural-subtyping/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-10-28T23:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d741bae2f8a", "title": "Evolution of Type Hints in Python — From Comments to Inline Typing and Beyond", "url": "https://www.safjan.com/evolution-of-type-hints-in-python/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-10-23T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d741c3cf36e", "title": "Keeping performance results in a separate Git branch using `git checkout --orphan`", "url": "https://www.safjan.com/git-checkout-orphan-gh-pages-performance-results/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-10-23T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d741c6bc9f2", "title": "Understanding the Language Server Protocol through a Minimal Working Example", "url": "https://www.safjan.com/language-server-protocol-minimal-example/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-10-15T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d741ceeebb3", "title": "Using CSS Variables for Dynamic and Reusable Styling", "url": "https://www.safjan.com/css-variables-dynamic-reusable-styling/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-10-13T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d741de074fc", "title": "Bare Asterisk in Python Function Signatures - Keyword Only Arguments", "url": "https://www.safjan.com/bare-asterisk-in-python-function-signatures/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-10-09T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d741e7a951d", "title": "Six Weeks, Real Progress - Exploring Shape Up for Product Work", "url": "https://www.safjan.com/six-weeks-real-progress-exploring-shape-up-for-product-work/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-10-05T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d741ef9d55d", "title": "Simpler Parallelism with concurrent.futures", "url": "https://www.safjan.com/concurrent-futures-simpler-parallelism/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-09-20T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d741fdeafe0", "title": "Threading vs Multiprocessing in Python - GIL Implications and Choosing the Right Tool", "url": "https://www.safjan.com/threading-vs-multiprocessing-gil-implications/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-09-09T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d742084d5dd", "title": "asyncio Basics - async/await and When to Actually Use Them", "url": "https://www.safjan.com/asyncio-basics-async-await-when-to-use/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-09-08T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d74210ea317", "title": "Replacing Makefile with Invoke for Cross-Platform Python Tasks", "url": "https://www.safjan.com/replacing-makefile-with-invoke-for-crossplatform-python-tasks/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-08-13T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d7421bd4eef", "title": "Using OpenAI Python SDK with Local Ollama Models (and When to Opt for Alternatives)", "url": "https://www.safjan.com/openai-python-sdk-with-local-ollama-models-and-alternatives/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-07-28T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d74221ab4db", "title": "Building a Multi-Notebook Report with Quarto", "url": "https://www.safjan.com/building-a-multinotebook-report-with-quarto/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-07-22T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d7422f08e5f", "title": "Downgrade or Upgrade Your Python Version with uv", "url": "https://www.safjan.com/downgrade-or-upgrade-your-python-version-with-uv/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-06-25T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d742354ad79", "title": "Beyond Coverage - Building Truly Complete Test Suites with GitHub Copilot", "url": "https://www.safjan.com/beyond-coverage-building-truly-complete-test-suites-with-github-copilot/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-06-14T22:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d7423887cce", "title": "Understanding Python's `copy` vs `deepcopy` - When to Use Each", "url": "https://www.safjan.com/understanding-pythons-copy-vs-deepcopy-when-to-use-each/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-03-19T23:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d7424826ad6", "title": "Tracking Down zsh Alias Plugin Sources", "url": "https://www.safjan.com/tracking-down-zsh-alias-plugin-sources/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-02-27T23:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d742575491e", "title": "Guide to Managing VS Code Keyboard Shortcuts", "url": "https://www.safjan.com/managing-vs-code-keyboard-shortcuts-a-complete-guide/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-02-10T23:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d74266b3ef0", "title": "Simple In-Memory Knowledge Graphs for Quick Graph Querying", "url": "https://www.safjan.com/simple-inmemory-knowledge-graphs-for-quick-graph-querying/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2025-01-15T23:00:00+00:00" }, { "id": "01a087da-3f04-710e-9332-7d74269c37cb", "title": "Quick Ways to Disable GitHub Actions Workflows Without Deletion", "url": "https://www.safjan.com/quick-ways-to-disable-github-actions-workflows-without-deletion/?utm_source=rss&utm_medium=feed&utm_campaign=safjan-blog", "published_at": "2024-10-02T22:00:00+00:00" } ] posts Claim your blog
Back to izik
Blog · corpus.blog/blogs/safjan.com/posts

izik

safjan.com

2026

2025

2024