56,966 blogs · [ { "id": "01a087a0-a3c0-7051-9125-6065d2f65754", "title": "Code Reviews Will (and Have to) Die!", "url": "https://markus.oberlehner.net/blog/code-reviews-will-and-have-to-die/", "published_at": "2026-06-06T07:00:00+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065d336b856", "title": "What We Do", "url": "https://markus.oberlehner.net/blog/what-we-do/", "published_at": "2025-11-01T09:53:08+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065d34b2a92", "title": "Escaping the Apple Ecosystem - My Journey to Digital Sovereignty", "url": "https://markus.oberlehner.net/blog/escaping-the-apple-ecosystem-my-journey-to-digital-sovereignty/", "published_at": "2025-10-05T09:18:18+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065d38e69fb", "title": "Visual Regression Testing With Vitest", "url": "https://markus.oberlehner.net/blog/visual-regression-testing-with-vitest/", "published_at": "2025-10-01T17:32:10+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065d456f324", "title": "Let's Share Our Failures Not Our Successes!", "url": "https://markus.oberlehner.net/blog/lets-share-our-failures-not-our-successes/", "published_at": "2025-04-02T07:00:00+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065d4fed8d9", "title": "Understanding 'Magic' in Programming Frameworks: Examples, Pros and Cons", "url": "https://markus.oberlehner.net/blog/what-is-magic-in-programming-frameworks-examples-pros-and-cons/", "published_at": "2025-03-23T07:00:00+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065d5f6ad89", "title": "Will LLMs Ever Be Creative Enough To Solve Programming?", "url": "https://markus.oberlehner.net/blog/will-llms-ever-be-creative-enough-to-solve-programming/", "published_at": "2025-03-23T06:00:00+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065d6bd825c", "title": "Nomenclature in Microservices Architecture: Modules, Components, and Services", "url": "https://markus.oberlehner.net/blog/nomenclature-in-microservices-architecture-modules-components-and-services/", "published_at": "2025-03-19T06:00:00+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065d6fe02d6", "title": "Parallelizing Specmatic Contract Tests with Playwright", "url": "https://markus.oberlehner.net/blog/parallelizing-specmatic-contract-tests-with-playwright/", "published_at": "2025-02-20T06:00:00+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065d71b2f46", "title": "You Can't Fight 'Not-enoughness' with 'More'", "url": "https://markus.oberlehner.net/blog/you-cant-fight-not-enoughness-with-more/", "published_at": "2025-02-16T09:00:00+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065d77777f3", "title": "Using react-hook-form with React 19, useActionState, and Next.js 15 App Router", "url": "https://markus.oberlehner.net/blog/using-react-hook-form-with-react-19-use-action-state-and-next-js-15-app-router/", "published_at": "2025-01-18T09:00:00+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065d7b866d2", "title": "Non-English Variable, Function, and Symbol Names in Code", "url": "https://markus.oberlehner.net/blog/non-english-variable-function-and-symbol-names-in-code/", "published_at": "2024-12-17T09:00:00+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065d81a93c6", "title": "Running Visual Regression Tests with Storybook and Playwright for Free", "url": "https://markus.oberlehner.net/blog/running-visual-regression-tests-with-storybook-and-playwright-for-free/", "published_at": "2024-10-08T07:07:07+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065d8eb2f7d", "title": "Running Next.js with Docker", "url": "https://markus.oberlehner.net/blog/running-nextjs-with-docker/", "published_at": "2024-09-22T07:07:07+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065d9b289c8", "title": "The Microservices and Microfrontend Mindset: Think Decoupled", "url": "https://markus.oberlehner.net/blog/the-microservices-and-microfrontend-mindset-think-decoupled/", "published_at": "2024-09-15T08:00:00+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065da2575da", "title": "Microservices, the Expulsion From E2E Testing Paradise, and the Path to Salvation: Contract Testing", "url": "https://markus.oberlehner.net/blog/microservices-the-expulsion-from-e2e-testing-paradise-and-the-path-to-salvation-contract-testing/", "published_at": "2024-07-13T04:07:07+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065da5f7b38", "title": "Using Testing Library jest-dom with Vitest", "url": "https://markus.oberlehner.net/blog/using-testing-library-jest-dom-with-vitest/", "published_at": "2024-06-04T04:15:33+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065dab9bedf", "title": "AI-Enhanced Development: Building Successful Applications with the Support of LLMs", "url": "https://markus.oberlehner.net/blog/ai-enhanced-development-building-successful-applications-with-the-support-of-llms/", "published_at": "2024-05-28T07:07:07+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065dad7d6eb", "title": "No More Mocking! Write Better Tests for Microservices-powered Server-side Rendered Applications with Contract Tests", "url": "https://markus.oberlehner.net/blog/no-more-mocking-write-better-tests-for-microservices-powered-server-side-rendered-applications-with-contract-tests/", "published_at": "2024-03-23T14:07:07+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065dbb4ae29", "title": "Nuxt: Building a Similar Products Feature with Vector Search and SQLite", "url": "https://markus.oberlehner.net/blog/nuxt-building-a-similar-products-feature-with-vector-search-and-sqlite/", "published_at": "2024-02-23T14:07:07+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065dbddb8d5", "title": "Your Own Vector Search in 5 Minutes with SQLite, OpenAI Embeddings, and Node.js", "url": "https://markus.oberlehner.net/blog/your-own-vector-search-in-5-minutes-with-sqlite-openai-embeddings-and-nodejs/", "published_at": "2024-02-18T14:07:07+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065dc100a58", "title": "Is Returning Composables from Composables an Anti-Pattern in Vue Applications?", "url": "https://markus.oberlehner.net/blog/is-returning-composables-from-composables-an-anti-pattern-in-vue-applications/", "published_at": "2024-01-26T08:07:07+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065dc723823", "title": "Reactive Data Fetching and Updating in Nuxt 3: Automatically Refresh `useFetch()` When Deleting or Updating Data", "url": "https://markus.oberlehner.net/blog/reactive-data-fetching-and-updating-in-nuxt-3/", "published_at": "2024-01-25T08:07:07+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065dd471bfb", "title": "Test Smarter, Not Harder: Focus on Outcomes, Not Outputs", "url": "https://markus.oberlehner.net/blog/test-smarter-not-harder-focus-on-outcomes-not-outputs/", "published_at": "2023-12-31T09:07:07+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065dda6d601", "title": "Embracing Simplicity: The Rule of Least Power", "url": "https://markus.oberlehner.net/blog/embracing-simplicity-the-rule-of-least-power/", "published_at": "2023-12-31T08:07:07+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065de15f19c", "title": "Building a Chatbot with Next.js Running LLaMA 2 Locally", "url": "https://markus.oberlehner.net/blog/building-a-chatbot-with-nextjs-running-llama-2-locally/", "published_at": "2023-07-22T18:07:07+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065dee0099c", "title": "Running Nuxt 3 in a Docker Container", "url": "https://markus.oberlehner.net/blog/running-nuxt-3-in-a-docker-container/", "published_at": "2023-07-08T12:07:07+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065dfa53abe", "title": "Leveraging Docker to Run CLI Tools in Languages Like Java, Ruby, and PHP Without Local Installation", "url": "https://markus.oberlehner.net/blog/leveraging-docker-to-run-cli-tools-in-languages-like-java-ruby-and-php-without-local-installation/", "published_at": "2023-07-06T18:21:21+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065dfc5aa56", "title": "Beware of Leaky Abstractions When Relying on Attribute Inheritance in Vue Components", "url": "https://markus.oberlehner.net/blog/beware-of-leaky-abstractions-when-relying-on-attribute-inheritance-in-vue-components/", "published_at": "2023-06-06T16:13:13+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e045ec2d", "title": "The Best of Both Worlds: Progressive Enhanced Hybrid Applications", "url": "https://markus.oberlehner.net/blog/the-best-of-both-worlds-progressive-enhanced-hybrid-applications/", "published_at": "2023-05-22T08:00:54+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e0ba1561", "title": "Building a ChatGPT Client with Remix: Leveraging Response Streaming for a Chat-like Experience", "url": "https://markus.oberlehner.net/blog/building-a-chatgpt-client-with-remix-leveraging-response-streaming-for-a-chat-like-experience/", "published_at": "2023-05-10T08:00:54+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e104622e", "title": "Using Error Boundaries in Remix to Prevent Broken Pages on Client-Side-Only Errors", "url": "https://markus.oberlehner.net/blog/using-error-boundaries-in-remix-to-prevent-broken-pages-on-client-side-errors/", "published_at": "2023-05-09T08:00:54+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e1c5152a", "title": "Building a ChatGPT Client with Nuxt 3: Leveraging Response Streaming for a Chat-like Experience", "url": "https://markus.oberlehner.net/blog/building-a-chatgpt-client-with-nuxt-leveraging-response-streaming-for-a-chat-like-experience/", "published_at": "2023-05-07T08:00:54+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e1f34a92", "title": "Utilize TypeScript's Omit & Partial for Data Creation & Update Scenarios", "url": "https://markus.oberlehner.net/blog/utilize-typescripts-omit-and-partial-for-data-creation-and-update-scenarios/", "published_at": "2023-05-06T17:00:54+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e2334d5c", "title": "Harnessing ChatGPT as Your Writing Assistant: A Step-by-Step Guide", "url": "https://markus.oberlehner.net/blog/harnessing-chatgpt-as-your-writing-assistant-a-step-by-step-guide/", "published_at": "2023-04-28T11:54:54+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e283f459", "title": "The Three-Layer UI Component Architecture: Versatile Building Blocks for Crafting Multiple Design Systems", "url": "https://markus.oberlehner.net/blog/the-three-layer-ui-component-architecture-versatile-building-blocks-for-crafting-multiple-design-systems/", "published_at": "2023-03-20T10:54:54+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e381fe6f", "title": "How To Fix Spacing Between Text Blocks When Using Tailwind CSS", "url": "https://markus.oberlehner.net/blog/how-to-fix-spacing-between-text-blocks-when-using-tailwind-css/", "published_at": "2022-12-24T10:46:46+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e400a4c1", "title": "Using Mock Service Worker with Vitest and fetch", "url": "https://markus.oberlehner.net/blog/using-mock-service-worker-with-vitest-and-fetch/", "published_at": "2022-06-25T06:15:33+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e4bede1f", "title": "Refactoring a House: Software Architecture is Architecture After All", "url": "https://markus.oberlehner.net/blog/refactoring-a-house-software-architecture-is-architecture-after-all/", "published_at": "2022-05-24T07:33:33+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e4c77e49", "title": "TODO Timeboxing", "url": "https://markus.oberlehner.net/blog/todo-timeboxing/", "published_at": "2022-01-11T16:22:22+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e5c60e64", "title": "Manual testing, E2E testing, unit testing – how to decide which testing strategy to use?", "url": "https://markus.oberlehner.net/blog/manual-testing-e2e-testing-unit-testing-how-to-decide-which-testing-strategy-to-use/", "published_at": "2021-11-27T12:55:55+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e61d2937", "title": "How to Clean Up Global Event Listeners, Intervals, and Third-party Libraries in Vue Components", "url": "https://markus.oberlehner.net/blog/how-to-clean-up-global-event-listeners-intervals-and-third-party-libraries-in-vue-components/", "published_at": "2021-10-02T16:49:49+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e642741e", "title": "Multiple Root Nodes and Attribute Inheritance in Vue 3", "url": "https://markus.oberlehner.net/blog/multiple-root-nodes-and-attribute-inheritance-in-vue-3/", "published_at": "2021-09-05T07:12:12+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e686a6ce", "title": "Vue Project Directory Structure: Keep It Flat or Group by Domain", "url": "https://markus.oberlehner.net/blog/vue-project-directory-structure-keep-it-flat-or-group-by-domain/", "published_at": "2021-08-25T18:09:09+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e6c720f0", "title": "Vue Composition API: VueUse Composable Library", "url": "https://markus.oberlehner.net/blog/vue-composition-api-vueuse-composable-library/", "published_at": "2021-08-24T15:36:36+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e762e582", "title": "Maintaining Shared Code and the Inversion of Responsibility Principle", "url": "https://markus.oberlehner.net/blog/maintaining-shared-code-and-the-inversion-of-responsibility-principle/", "published_at": "2021-08-21T15:53:53+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e8104f9c", "title": "Vue Composition API: Composables", "url": "https://markus.oberlehner.net/blog/vue-composition-api-composables/", "published_at": "2021-08-05T17:02:02+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e8a92861", "title": "Don't Write Documentation!", "url": "https://markus.oberlehner.net/blog/dont-write-documentation/", "published_at": "2021-07-24T09:24:24+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e97b3a48", "title": "Cypress Live-Reload Tests on Code Changes", "url": "https://markus.oberlehner.net/blog/cypress-live-reload-tests-on-code-changes/", "published_at": "2021-07-19T18:10:10+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e9f258ff", "title": "Decoupling Component Tests From Implementation Details with Preconditions", "url": "https://markus.oberlehner.net/blog/decoupling-component-tests-from-implementation-details-with-preconditions/", "published_at": "2021-07-10T08:42:42+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065e9fcfc1c", "title": "Vue 3 Composition API vs. Options API", "url": "https://markus.oberlehner.net/blog/vue-3-composition-api-vs-options-api/", "published_at": "2021-07-03T06:29:29+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065eaceec7f", "title": "CSS: The Spacing Between Elements Should Be Determined by the Parent Element", "url": "https://markus.oberlehner.net/blog/css-the-spacing-between-elements-should-be-determined-by-the-parent-element/", "published_at": "2021-06-21T11:00:00+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065eadd117b", "title": "Vue 3 Composition API: ref() vs. reactive()", "url": "https://markus.oberlehner.net/blog/vue-3-composition-api-ref-vs-reactive/", "published_at": "2021-04-20T19:26:26+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065eba6b20b", "title": "Premium Vue and Nuxt Templates for Web Apps and Sites", "url": "https://markus.oberlehner.net/blog/premium-vue-and-nuxt-templates-for-web-apps-and-sites/", "published_at": "2021-03-07T11:13:13+00:00" }, { "id": "01a087a0-a3c0-7051-9125-6065ec40b932", "title": "Tailwind CSS: The Antifragile CSS Framework", "url": "https://markus.oberlehner.net/blog/tailwind-css-the-antifragile-css-framework/", "published_at": "2021-01-24T07:33:33+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786477807ad4", "title": "Your Components Do Too Much", "url": "https://markus.oberlehner.net/blog/your-components-do-too-much/", "published_at": "2021-01-17T06:56:56+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786477bcb4b0", "title": "Events and Callbacks: Parent/Child Component Communication in Vue", "url": "https://markus.oberlehner.net/blog/events-and-callbacks-parent-child-component-communication-in-vue/", "published_at": "2021-01-10T08:25:25+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864789b7ec9", "title": "What Makes a Senior Developer? It Depends!", "url": "https://markus.oberlehner.net/blog/what-makes-a-senior-developer-it-depends/", "published_at": "2021-01-03T07:04:04+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78647953fd43", "title": "Building Vue.js Applications Without webpack", "url": "https://markus.oberlehner.net/blog/goodbye-webpack-building-vue-applications-without-webpack/", "published_at": "2020-12-27T09:18:18+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786479636378", "title": "JavaScript Runtime Bundling Concept", "url": "https://markus.oberlehner.net/blog/javascript-runtime-bundling-concept/", "published_at": "2020-12-20T06:44:44+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786479d7686a", "title": "What Developers Can Learn from Playing Chess and Video Games", "url": "https://markus.oberlehner.net/blog/what-developers-can-learn-from-playing-chess-and-video-games/", "published_at": "2020-12-13T10:03:03+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78647ac3c58f", "title": "Utilize the File Structure to Decide When to Use Vue.js Slots", "url": "https://markus.oberlehner.net/blog/utilize-the-file-structure-to-decide-when-to-use-vuejs-slots/", "published_at": "2020-12-06T09:11:11+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78647b7aae7f", "title": "Progressive Enhancement and the Modern Web", "url": "https://markus.oberlehner.net/blog/progressive-enhancement-and-the-modern-web/", "published_at": "2020-11-29T07:34:34+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78647c2309f3", "title": "Group, Extract, Share: Working with the Vue Composition API", "url": "https://markus.oberlehner.net/blog/group-extract-share-working-with-the-vue-composition-api/", "published_at": "2020-11-22T08:29:29+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78647cd04212", "title": "watch vs. watchEffect when to use what with Vue.js", "url": "https://markus.oberlehner.net/blog/watch-vs-watcheffect-when-to-use-what-with-vue/", "published_at": "2020-11-15T09:20:20+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78647d7e0e7d", "title": "Partial Hydration Concepts: Lazy and Active", "url": "https://markus.oberlehner.net/blog/partial-hydration-concepts-lazy-and-active/", "published_at": "2020-11-08T06:58:58+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78647e2a612c", "title": "Automatic Dependency Injection in Vue with Context Providers", "url": "https://markus.oberlehner.net/blog/automatic-dependency-injection-in-vue-with-context-providers/", "published_at": "2020-11-01T06:15:15+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78647ef5be42", "title": "Vue.js Feature Toggle Context Provider", "url": "https://markus.oberlehner.net/blog/vuejs-feature-toggle-context-provider/", "published_at": "2020-10-25T04:47:47+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78647f13acc8", "title": "useState and useReducer with the Vue 3 Composition API", "url": "https://markus.oberlehner.net/blog/usestate-and-usereducer-with-the-vue-3-composition-api/", "published_at": "2020-10-18T05:15:15+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78647fc12b60", "title": "Application State Management with Vue 3", "url": "https://markus.oberlehner.net/blog/application-state-management-with-vue-3/", "published_at": "2020-10-11T05:59:59+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78648060e144", "title": "Wrap Third-Party Libraries", "url": "https://markus.oberlehner.net/blog/wrap-third-party-libraries/", "published_at": "2020-10-04T08:36:36+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864807b7dd4", "title": "Vue.js Style Provider Pattern", "url": "https://markus.oberlehner.net/blog/vuejs-style-provider-pattern/", "published_at": "2020-09-27T07:13:13+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864816ef961", "title": "Avoid Opaque Dependency Injection Techniques with Vue.js", "url": "https://markus.oberlehner.net/blog/avoid-opaque-dependency-injection-techniques-with-vuejs/", "published_at": "2020-09-20T06:27:27+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786481f637bd", "title": "We Have Solved CSS! With BEM, Scoped Components, and Utility First Frameworks", "url": "https://markus.oberlehner.net/blog/we-have-solved-css-with-bem-scoped-components-and-utility-first-frameworks/", "published_at": "2020-09-12T08:42:42+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786482706a7b", "title": "When and When Not to Use Utility Classes With BEM", "url": "https://markus.oberlehner.net/blog/when-and-when-not-to-use-utility-classes-with-bem/", "published_at": "2020-09-06T05:58:58+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864834b5036", "title": "Antifragile Web Development", "url": "https://markus.oberlehner.net/blog/antifragile-web-development/", "published_at": "2020-08-30T08:47:47+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78648395093f", "title": "Automatically Generate Responsive Image Attributes Based on the Context of a Vue Component", "url": "https://markus.oberlehner.net/blog/automatically-generate-responsive-image-attributes-based-on-the-context-of-a-vue-component/", "published_at": "2020-08-23T06:28:28+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786483a22d83", "title": "Cross-Browser Acceptance Tests with LambdaTest and TestCafe", "url": "https://markus.oberlehner.net/blog/cross-browser-acceptance-tests-with-lambdatest-and-testcafe/", "published_at": "2020-08-16T05:07:07+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864840d1e48", "title": "Context-Aware Props in Vue.js Components", "url": "https://markus.oberlehner.net/blog/context-aware-props-in-vuejs-components/", "published_at": "2020-08-09T06:18:18+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864845e7e48", "title": "Tight Coupling vs. Loose Coupling in Vue.js", "url": "https://markus.oberlehner.net/blog/tight-coupling-vs-loose-coupling-in-vuejs/", "published_at": "2020-08-02T06:20:20+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78648467d4d5", "title": "Retry Failed API Requests with JavaScript", "url": "https://markus.oberlehner.net/blog/retry-failed-api-requests-with-javascript/", "published_at": "2020-07-26T05:36:36+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864855ae10d", "title": "How to Avoid Bugs from Unanticipated Behavior?", "url": "https://markus.oberlehner.net/blog/how-to-avoid-bugs-from-unanticipated-behavior/", "published_at": "2020-07-19T06:21:21+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786485c9afc1", "title": "Business Logic in Fat Client Applications", "url": "https://markus.oberlehner.net/blog/business-logic-in-fat-client-applications/", "published_at": "2020-07-12T08:41:41+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786485ff61f1", "title": "Make it Simple", "url": "https://markus.oberlehner.net/blog/make-it-simple/", "published_at": "2020-07-05T11:17:17+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864860be4af", "title": "Fighting Procrastination", "url": "https://markus.oberlehner.net/blog/fighting-procrastination/", "published_at": "2020-06-28T07:38:38+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864860f8a80", "title": "Break out of CSS Grid: Align Image or Background at the Edge of the Screen", "url": "https://markus.oberlehner.net/blog/break-out-of-css-grid-align-image-or-background-at-the-edge-of-the-screen/", "published_at": "2020-06-21T05:16:16+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864861f0f6c", "title": "Variable Naming: Arrays and Booleans", "url": "https://markus.oberlehner.net/blog/variable-naming-arrays-and-booleans/", "published_at": "2020-06-14T04:35:35+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786486bd49b6", "title": "$refs and the Vue 3 Composition API", "url": "https://markus.oberlehner.net/blog/refs-and-the-vue-3-composition-api/", "published_at": "2020-06-07T07:33:33+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786486deeba9", "title": "Are my Component Names Too Long? Vue.js Component Naming Best Practices", "url": "https://markus.oberlehner.net/blog/are-my-component-names-too-long-vuejs-component-naming-best-practices/", "published_at": "2020-05-31T05:27:27+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864877f929e", "title": "React Context and Provider Pattern with the Vue 3 Composition API", "url": "https://markus.oberlehner.net/blog/context-and-provider-pattern-with-the-vue-3-composition-api/", "published_at": "2020-05-24T07:05:05+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786487d7d7c2", "title": "Automatically Generate your Vue Router Configuration with vue-auto-routing", "url": "https://markus.oberlehner.net/blog/automatically-generate-your-vue-router-configuration-with-vue-auto-routing/", "published_at": "2020-05-17T06:38:38+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78648837b809", "title": "Stale-While-Revalidate Data Fetching Composable with Vue 3 Composition API", "url": "https://markus.oberlehner.net/blog/stale-while-revalidate-data-fetching-composable-with-vue-3-composition-api/", "published_at": "2020-05-10T08:28:28+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-786488aba065", "title": "Using Netlify Redirects to Proxy Images Hosted on a Third Party Image Provider or a Headless CMS", "url": "https://markus.oberlehner.net/blog/using-netlify-redirects-to-proxy-images-hosted-on-a-third-party-image-provider-or-a-headless-cms/", "published_at": "2020-05-03T06:51:51+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-7864896eac4d", "title": "Super Simple Progressively Enhanced Carousel with CSS Scroll Snap", "url": "https://markus.oberlehner.net/blog/super-simple-progressively-enhanced-carousel-with-css-scroll-snap/", "published_at": "2020-04-26T06:16:16+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78648a5db0eb", "title": "Simple Solution for Anchor Links Behind Sticky Headers", "url": "https://markus.oberlehner.net/blog/simple-solution-for-anchor-links-behind-sticky-headers/", "published_at": "2020-04-19T05:31:31+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78648b2ceacb", "title": "Lint Only Files with Changes on pre-commit", "url": "https://markus.oberlehner.net/blog/lint-only-files-with-changes-on-pre-commit/", "published_at": "2020-04-12T09:27:27+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78648b65f982", "title": "Telling a Story with Test Code", "url": "https://markus.oberlehner.net/blog/telling-a-story-with-test-code/", "published_at": "2020-04-05T08:04:04+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78648c506e41", "title": "Cut Your Nuxt.js generate Build Time in Half with context.payload", "url": "https://markus.oberlehner.net/blog/cut-your-nuxt-generate-build-time-in-half-with-context-payload/", "published_at": "2020-03-29T05:37:37+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78648cf3e4dd", "title": "Building Partially Hydrated, Progressively Enhanced Static Websites with Isomorphic Preact and Eleventy", "url": "https://markus.oberlehner.net/blog/building-partially-hydrated-progressively-enhanced-static-websites-with-isomorphic-preact-and-eleventy/", "published_at": "2020-03-22T05:33:33+00:00" }, { "id": "01a087a0-a3c1-70b3-8260-78648de23883", "title": "Setting up Eleventy with Preact and htm", "url": "https://markus.oberlehner.net/blog/setting-up-eleventy-with-preact-and-htm/", "published_at": "2020-03-15T06:09:09+00:00" } ] posts Claim your blog
Back to markus.oberlehner.net
Blog · corpus.blog/blogs/markus.oberlehner.net/posts

markus.oberlehner.net

markus.oberlehner.net

2026

2025

2024

2023

2022

2021

2020