56,966 blogs · [ { "id": "01a0e324-b9d4-7206-98a1-ce555b9182c8", "title": "Enforce Tailwind CSS Design Tokens in Vue with @shadcn/lint", "url": "https://alexop.dev/posts/enforce-tailwind-design-system-shadcn-lint/", "published_at": "2026-09-27T00:00:00+00:00" }, { "id": "01a0d51c-8869-7288-9efa-4909f6b9728f", "title": "What my first Tacon taught me: give AI a better testing process and know your audience", "url": "https://alexop.dev/posts/my-first-time-at-tacon/", "published_at": "2026-09-18T09:06:57+00:00" }, { "id": "01a0d51c-8869-7288-9efa-4909f75d0504", "title": "What Should a Green Test Prove? Vue Testing with Vitest Browser Mode", "url": "https://alexop.dev/posts/what-should-a-green-test-prove-vitest-browser-mode/", "published_at": "2026-09-14T12:00:00+00:00" }, { "id": "01a08724-a21c-717b-924b-b3a535a3e7d6", "title": "Stop using the Clanker for my writing", "url": "https://alexop.dev/posts/stop-using-the-clanker-for-my-writing/", "published_at": "2026-09-05T06:56:10+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91907fa9d1", "title": "The Democratization of Software Development", "url": "https://alexop.dev/posts/the-democratization-of-software-development/", "published_at": "2026-07-18T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919134cba2", "title": "Clean Code Is Sexy Again: Making Your Vue Project AI-Ready", "url": "https://alexop.dev/posts/clean-code-is-sexy-again-vue-ai-ready/", "published_at": "2026-06-27T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db9191ef092e", "title": "How VS Code Copilot Chat Compacts Your Conversation", "url": "https://alexop.dev/posts/how-vscode-copilot-chat-conversation-compaction-works/", "published_at": "2026-06-27T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91921e973e", "title": "Open Knowledge Format: I Already Do This, and Now It Has a Name", "url": "https://alexop.dev/posts/open-knowledge-format-markdown-frontmatter-agent-knowledge/", "published_at": "2026-06-27T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db9192542739", "title": "The Four Types of Memory for AI Agents (and How Claude Code Implements Each)", "url": "https://alexop.dev/posts/four-types-memory-coding-agents-claude-code/", "published_at": "2026-06-21T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db9192afcb0f", "title": "Build Your Own Eval Harness from Scratch with Bun and claude -p", "url": "https://alexop.dev/posts/build-your-own-eval-harness-bun-claude-p/", "published_at": "2026-06-14T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919361eaef", "title": "I Rebuilt Cloudflare's AI Code Review in a 250-Line Workflow", "url": "https://alexop.dev/posts/ultracode-review-workflow-cloudflare/", "published_at": "2026-06-08T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919408d630", "title": "How I Became an International Speaker", "url": "https://alexop.dev/posts/how-i-became-an-international-speaker/", "published_at": "2026-05-30T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db9194a22872", "title": "Claude Code Workflows: Deterministic Multi-Agent Orchestration", "url": "https://alexop.dev/posts/claude-code-workflows-deterministic-orchestration/", "published_at": "2026-05-28T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db9195562b35", "title": "How to do AFK Coding", "url": "https://alexop.dev/posts/how-to-do-afk-coding/", "published_at": "2026-05-10T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db9195a307b1", "title": "How to Write UI Components That Stay Flexible", "url": "https://alexop.dev/posts/compound-components-in-vue-shadcn/", "published_at": "2026-04-29T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db9195d97945", "title": "A Modern Quality Pipeline and Testing Strategy for Frontend Projects", "url": "https://alexop.dev/posts/modern-frontend-quality-pipeline/", "published_at": "2026-04-25T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91967d8450", "title": "Exploratory QA with AI Agents: Building a Site-Agnostic Harness", "url": "https://alexop.dev/posts/exploratory-qa-ai-agents-site-agnostic-harness/", "published_at": "2026-04-19T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db9196aab150", "title": "How to Use Claude Code as an AI QA Tester with Agent Browser", "url": "https://alexop.dev/posts/automated-qa-claude-code-agent-browser-cli-github-actions/", "published_at": "2026-04-11T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91972cdfdd", "title": "How to Catch Hydration Errors in Playwright Tests (Astro, Nuxt, React SSR)", "url": "https://alexop.dev/posts/catch-hydration-errors-playwright-tests/", "published_at": "2026-04-06T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91975f1506", "title": "App Screenshots: An AI Coding Agent Skill for Visual Documentation", "url": "https://alexop.dev/posts/app-screenshots-claude-code-skill/", "published_at": "2026-03-27T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91980abb8a", "title": "The Software Factory: Why Your Team Will Never Work the Same Again", "url": "https://alexop.dev/posts/the-software-factory/", "published_at": "2026-03-22T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91981a5ae5", "title": "Building a Real-Time Todo App with Jazz and Vue 3", "url": "https://alexop.dev/posts/building-real-time-todo-app-jazz-vue/", "published_at": "2026-03-07T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91982090b8", "title": "How I Turned Claude Code's Thinking Indicator into a One Piece Adventure", "url": "https://alexop.dev/posts/claude-code-spinner-verbs-one-piece/", "published_at": "2026-02-12T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db9198ab38c3", "title": "How I Added Sound Effects to Claude Code with Hooks", "url": "https://alexop.dev/posts/how-i-added-sound-effects-to-claude-code-with-hooks/", "published_at": "2026-02-11T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91996cac58", "title": "Building a Walkthrough Skill for AI Coding Agents", "url": "https://alexop.dev/posts/building-walkthrough-skill-claude-code/", "published_at": "2026-02-08T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db9199edc0bd", "title": "Claude Code Agent Teams: How Multiple Sessions Coordinate (2026)", "url": "https://alexop.dev/posts/from-tasks-to-swarms-agent-teams-in-claude-code/", "published_at": "2026-02-08T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919ac39e02", "title": "VMark: Hand-Drawn Annotations for Presentations", "url": "https://alexop.dev/posts/vmark-tutorial/", "published_at": "2026-02-03T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919af7af54", "title": "Spec-Driven Development with Claude Code in Action", "url": "https://alexop.dev/posts/spec-driven-development-claude-code-in-action/", "published_at": "2026-02-01T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919bc6e927", "title": "My Opinionated ESLint + Oxlint Setup for Vue Projects", "url": "https://alexop.dev/posts/opinionated-eslint-setup-vue-projects/", "published_at": "2026-01-31T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919c701b62", "title": "Next Level GitHub Copilot: Agents, Instructions & Automation in VS Code", "url": "https://alexop.dev/posts/vs-code-copilot-workshop/", "published_at": "2026-01-24T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919ce1a738", "title": "What's New in VS Code Copilot: January 2026 Update", "url": "https://alexop.dev/posts/whats-new-vscode-copilot-january-2026/", "published_at": "2026-01-24T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919cf59bf4", "title": "Presentation Mode: Turn Your Blog Posts into Slides", "url": "https://alexop.dev/posts/presentation-mode-demo/", "published_at": "2026-01-23T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919d44afb5", "title": "Stop Bloating Your CLAUDE.md: Progressive Disclosure for AI Coding Tools", "url": "https://alexop.dev/posts/stop-bloating-your-claude-md-progressive-disclosure-ai-coding-tools/", "published_at": "2026-01-18T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919e0a8926", "title": "How I Built a Skill That Lets Me Talk to Claude's Conversation Memory", "url": "https://alexop.dev/posts/building-conversation-search-skill-claude-code/", "published_at": "2026-01-17T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919e3da7e1", "title": "In Five Years, Developers Won't Write Code By Hand", "url": "https://alexop.dev/posts/developers-wont-write-code-by-hand/", "published_at": "2026-01-14T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919e5d93a2", "title": "Mutation Testing with AI Agents When Stryker Doesn't Work", "url": "https://alexop.dev/posts/mutation-testing-ai-agents-vitest-browser-mode/", "published_at": "2026-01-13T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919f31379f", "title": "Why You Don't Need the Nuxt MCP When You Use Claude Code", "url": "https://alexop.dev/posts/why-you-dont-need-nuxt-mcp-claude-code/", "published_at": "2025-12-31T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919fdde652", "title": "Claude Code Customization Guide (2026): CLAUDE.md vs Skills vs Subagents", "url": "https://alexop.dev/posts/claude-code-customization-guide-claudemd-skills-subagents/", "published_at": "2025-12-21T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db919ff2cdf5", "title": "How to Customize Your Claude Code Status Line", "url": "https://alexop.dev/posts/customize_claude_code_status_line/", "published_at": "2025-12-14T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a0d7508d", "title": "Vue 3 Testing Pyramid: A Practical Guide with Vitest Browser Mode", "url": "https://alexop.dev/posts/vue3_testing_pyramid_vitest_browser_mode/", "published_at": "2025-12-14T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a15840a3", "title": "Building an AI QA Engineer with Claude Code and Playwright MCP", "url": "https://alexop.dev/posts/building_ai_qa_engineer_claude_code_playwright/", "published_at": "2025-12-13T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a1c8fc94", "title": "Vue Composables Style Guide: Lessons from VueUse's Codebase", "url": "https://alexop.dev/posts/vueuse_composables_style_guide/", "published_at": "2025-12-13T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a272db1b", "title": "A Claude Code TDD Skill: Forcing Red-Green-Refactor Discipline", "url": "https://alexop.dev/posts/custom-tdd-workflow-claude-code-vue/", "published_at": "2025-11-30T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a35b9de6", "title": "Claude Code Notifications: Get Alerts When Tasks Finish (Hooks Setup)", "url": "https://alexop.dev/posts/claude-code-notification-hooks/", "published_at": "2025-11-23T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a4363cea", "title": "Claude Code Slash Commands: A Complete Guide (2026)", "url": "https://alexop.dev/posts/claude-code-slash-commands-guide/", "published_at": "2025-11-22T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a4fc7293", "title": "Claude Code Explained (2026): MCP, Skills, Subagents, Hooks & Plugins", "url": "https://alexop.dev/posts/understanding-claude-code-full-stack/", "published_at": "2025-11-09T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a52f3210", "title": "How to Build a Claude Code Plugin: Skills, Agents & Commands", "url": "https://alexop.dev/posts/building-my-first-claude-code-plugin/", "published_at": "2025-11-08T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a53256a5", "title": "Building a Modular Monolith with Nuxt Layers: A Practical Guide", "url": "https://alexop.dev/posts/nuxt-layers-modular-monolith/", "published_at": "2025-11-02T10:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a5ec2278", "title": "How to Handle API Calls in Pinia with The Elm Pattern", "url": "https://alexop.dev/posts/handling-api-calls-pinia-elm-pattern/", "published_at": "2025-10-17T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a6947bba", "title": "How to Write Better Pinia Stores with the Elm Pattern", "url": "https://alexop.dev/posts/tea-architecture-pinia-private-store-pattern/", "published_at": "2025-10-03T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a73a3f52", "title": "How to build Microfrontends with Module Federation and Vue", "url": "https://alexop.dev/posts/how-to-build-microfrontends-with-module-federation-and-vue/", "published_at": "2025-09-10T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a7a6114b", "title": "Why You Need Something Hard in Your Life", "url": "https://alexop.dev/posts/why-you-need-something-hard-in-your-life/", "published_at": "2025-09-10T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a7c51cc7", "title": "What Is the Model Context Protocol (MCP)? How It Works", "url": "https://alexop.dev/posts/what-is-model-context-protocol-mcp/", "published_at": "2025-08-10T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a85b2243", "title": "How VueUse Solves SSR Window Errors in Vue Applications", "url": "https://alexop.dev/posts/how-vueuse-solves-ssr-window-errors-vue-applications/", "published_at": "2025-07-14T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91a93f5055", "title": "Mastering GraphQL Fragments in Vue 3: Component-Driven Data Fetching", "url": "https://alexop.dev/posts/mastering-graphql-fragments-vue3-component-driven-data-fetching/", "published_at": "2025-07-06T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91aa29d8bf", "title": "How I Use Claude Code for Doing SEO Audits", "url": "https://alexop.dev/posts/how-i-use-claude-code-for-doing-seo-audits/", "published_at": "2025-06-26T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91aa79c849", "title": "The Age of the Generalist", "url": "https://alexop.dev/posts/the-age-of-the-generalist/", "published_at": "2025-06-15T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91ab4b970f", "title": "How I Use LLMs", "url": "https://alexop.dev/posts/how-i-use-llms/", "published_at": "2025-05-25T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91ab5c6d9c", "title": "No Server, No Database: Smarter Related Posts in Astro with `transformers.js`", "url": "https://alexop.dev/posts/semantic-related-posts-astro-transformersjs/", "published_at": "2025-05-18T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91abd82bfa", "title": "Type-Safe GraphQL Queries in Vue 3 with GraphQL Code Generator", "url": "https://alexop.dev/posts/type-safe-graphql-queries-vue3-codegen/", "published_at": "2025-05-04T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91ac9b2b25", "title": "LLM-Powered Search: o4-mini-high vs o3 vs Deep Research", "url": "https://alexop.dev/posts/llm-powered-search-comparison-o4-mini-high-o3-deep-research/", "published_at": "2025-05-01T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91ad8fd021", "title": "Watching OpenAI's o3 Model Sweat Over a Paul Morphy Mate-in-2", "url": "https://alexop.dev/posts/how-03-model-tries-chess-puzzle/", "published_at": "2025-04-27T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91ae87ceb5", "title": "Getting Started with GraphQL in Vue 3 — Complete Setup with Apollo", "url": "https://alexop.dev/posts/getting-started-graphql-vue3-apollo-typescript/", "published_at": "2025-04-26T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91aeec81cb", "title": "How ChatGPT Works (for Dummies)", "url": "https://alexop.dev/posts/how-chatgpt-works-for-dummies/", "published_at": "2025-04-21T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91af57d3ab", "title": "Stop White Box Testing Vue Components Use Testing Library Instead", "url": "https://alexop.dev/posts/stop-white-box-testing-vue/", "published_at": "2025-04-19T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b0254649", "title": "The Computed Inlining Refactoring Pattern in Vue", "url": "https://alexop.dev/posts/computed-inlining-refactoring-pattern-in-vue/", "published_at": "2025-04-03T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b0ae306b", "title": "Are LLMs Creative?", "url": "https://alexop.dev/posts/are-llms-creative/", "published_at": "2025-04-01T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b12b040a", "title": "The Inline Vue Composables Refactoring pattern", "url": "https://alexop.dev/posts/inline-vue-composables-refactoring/", "published_at": "2025-04-01T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b212eccb", "title": "Math Notation from 0 to 1: A Beginner's Guide", "url": "https://alexop.dev/posts/math-notation-from-0-to-1/", "published_at": "2025-03-09T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b270f4df", "title": "How to Implement a Cosine Similarity Function in TypeScript for Vector Comparison", "url": "https://alexop.dev/posts/how-to-implement-a-cosine-similarity-function-in-typescript-for-vector-comparison/", "published_at": "2025-03-08T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b366482a", "title": "How I Added llms.txt to My Astro Blog", "url": "https://alexop.dev/posts/how-i-added-llms-txt-to-my-astro-blog/", "published_at": "2025-03-03T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b450497f", "title": "How to Do Visual Regression Testing in Vue with Vitest?", "url": "https://alexop.dev/posts/visual-regression-testing-with-vue-and-vitest-browser/", "published_at": "2025-02-22T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b48b1d3d", "title": "How to Test Vue Router Components with Testing Library and Vitest", "url": "https://alexop.dev/posts/how-to-test-vue-router-components-with-testing-library-and-vitest/", "published_at": "2025-02-16T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b49b361e", "title": "Building a Pinia Plugin for Cross-Tab State Syncing", "url": "https://alexop.dev/posts/building-pinia-plugin-cross-tab-sync/", "published_at": "2025-02-09T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b5940091", "title": "How to Use AI for Effective Diagram Creation: A Guide to ChatGPT and Mermaid", "url": "https://alexop.dev/posts/how-to-use-ai-for-effective-diagram-creation-a-guide-to-chatgpt-and-mermaid/", "published_at": "2025-02-09T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b594bd16", "title": "The Browser That Speaks 200 Languages: Building an AI Translator Without APIs", "url": "https://alexop.dev/posts/building-client-side-ai-translator-vue/", "published_at": "2025-02-02T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b5b2918e", "title": "Solving Prop Drilling in Vue: Modern State Management Strategies", "url": "https://alexop.dev/posts/solving-prop-drilling-in-vue/", "published_at": "2025-01-25T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b5bb9ab1", "title": "Building Local-First Apps with Vue and Dexie.js", "url": "https://alexop.dev/posts/building-local-first-apps-vue-dexie/", "published_at": "2025-01-18T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b690d219", "title": "Adding Obsidian-Style Wiki Links to My Astro Blog", "url": "https://alexop.dev/posts/adding-obsidian-wiki-links-to-astro-blog/", "published_at": "2025-01-10T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b6ad39f7", "title": "Unlocking Reading Insights: A Guide to Data Analysis with Claude and Readwise", "url": "https://alexop.dev/posts/supercharging-reading-comprehension-claude-readwise/", "published_at": "2025-01-05T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b781c896", "title": "The What Why and How of Goal Settings", "url": "https://alexop.dev/posts/the-what-why-and-how-of-goal-settings/", "published_at": "2024-12-31T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b82155aa", "title": "XML-Style Tagged Prompts: A Framework for Reliable AI Responses", "url": "https://alexop.dev/posts/xml-tagged-prompts-framework-reliable-ai-responses/", "published_at": "2024-12-22T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b8787c41", "title": "How to Use the Variant Props Pattern in Vue", "url": "https://alexop.dev/posts/vue-typescript-variant-props-type-safe-props/", "published_at": "2024-12-15T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91b9346606", "title": "SQLite in Vue: Complete Guide to Building Offline-First Web Apps", "url": "https://alexop.dev/posts/sqlite-vue3-offline-first-web-apps-guide/", "published_at": "2024-11-25T07:44:12+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91ba0a413d", "title": "Create Dark Mode-Compatible Technical Diagrams in Astro with Excalidraw: A Complete Guide", "url": "https://alexop.dev/posts/excalidraw-dark-mode-astro-diagrams/", "published_at": "2024-10-27T07:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91ba8c3135", "title": "Frontend Testing Guide: 10 Essential Rules for Naming Tests", "url": "https://alexop.dev/posts/frontend-testing-guide-10-essential-rules/", "published_at": "2024-10-26T08:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91bb8ad38d", "title": "Create a Native-Like App in 4 Steps: PWA Magic with Vue 3 and Vite", "url": "https://alexop.dev/posts/create-pwa-vue3-vite-4-steps/", "published_at": "2024-10-20T07:44:12+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91bba78844", "title": "Atomic Architecture: Structuring Vue and Nuxt Projects", "url": "https://alexop.dev/posts/atomic-design-vue-or-nuxt/", "published_at": "2024-10-08T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91bbf16879", "title": "Bolt Your Presentations: AI-Powered Slides", "url": "https://alexop.dev/posts/create-ai-presentations-fast/", "published_at": "2024-10-05T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91bc72d1cc", "title": "10 Rules for Better Writing from the Book Economical Writing", "url": "https://alexop.dev/posts/10-rules-better-writing-economical-writing-book/", "published_at": "2024-09-28T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91bd61a257", "title": "TypeScript Tutorial: Extracting All Keys from Nested Object", "url": "https://alexop.dev/posts/typescript-extract-all-keys-nested-objects/", "published_at": "2024-09-23T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91be2dd68f", "title": "TypeScript Snippets in Astro: Show, Don't Tell", "url": "https://alexop.dev/posts/typescript-snippets-astro-show-dont-tell/", "published_at": "2024-09-22T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91be7cdb27", "title": "Vue 3.5's onWatcherCleanup: Mastering Side Effect Management in Vue Applications", "url": "https://alexop.dev/posts/vue-35s-onwatchercleanup-mastering-side-effect-management-in-vue-applications/", "published_at": "2024-09-04T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91bf0cf62a", "title": "How to Build Your Own Vue-like Reactivity System from Scratch", "url": "https://alexop.dev/posts/how-to-build-your-own-vue-like-reactivity-system-from-scratch/", "published_at": "2024-08-04T00:00:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91bf61826e", "title": "What is Local-first Web Development?", "url": "https://alexop.dev/posts/what-is-local-first-web-development/", "published_at": "2024-05-29T15:22:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91bfc75189", "title": "Vue Accessibility Blueprint: 8 Steps", "url": "https://alexop.dev/posts/vue-accessibility-blueprint-8-steps/", "published_at": "2024-05-18T15:22:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91bfe8a5b3", "title": "How to Structure Vue Projects", "url": "https://alexop.dev/posts/how-to-structure-vue-projects/", "published_at": "2024-05-12T15:22:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91c0bcdd12", "title": "How to Persist User Data with LocalStorage in Vue", "url": "https://alexop.dev/posts/how-to-persist-user-data-with-localstorage-in-vue/", "published_at": "2024-04-21T15:22:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91c1ab8f2b", "title": "How to Write Clean Vue Components", "url": "https://alexop.dev/posts/how-to-write-clean-vue-components/", "published_at": "2024-01-28T15:22:00+00:00" }, { "id": "01a08724-a21d-73a0-a210-db91c1e9c60b", "title": "The Problem with as in TypeScript: Why It's a Shortcut We Should Avoid", "url": "https://alexop.dev/posts/the-problem-with-as-in-typescript-why-its-a-shortcut-we-should-avoid/", "published_at": "2024-01-21T15:22:00+00:00" } ] posts Claim your blog
Back to alexop.dev
Blog · corpus.blog/blogs/alexop.dev/posts

alexop.dev

alexop.dev

2026

2025

2024