[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-how-we-use-claude-code-nuxt-rust-monorepo":3},{"article":4,"author":63},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":16,"meta_description":17,"focus_keyword":18,"og_image":19,"canonical_url":19,"robots_meta":20,"created_at":15,"updated_at":15,"tags":21,"category_name":43,"related_articles":44},"dc000000-0000-0000-0000-000000000002","a0000000-0000-0000-0000-000000000006","How We Use Claude Code to Maintain a Nuxt 4 + Rust Monorepo","how-we-use-claude-code-nuxt-rust-monorepo","A behind-the-scenes look at how Open Soft uses Claude Code as a daily development tool for our production monorepo. Real workflows for multi-file refactoring, migration writing, test generation, code review, and custom tooling with hooks and MCP servers.","## Our Stack and Why Claude Code Fits\n\nAt Open Soft, our main product is a website built as a monorepo: a Nuxt 4 frontend with TypeScript and a Rust\u002FAxum backend API backed by PostgreSQL. The codebase spans two languages, two build systems, shared data contracts, database migrations, i18n files for 10 languages, and deployment infrastructure. Changes frequently touch both sides of the stack simultaneously.\n\nWe adopted Claude Code in mid-2025 and it has become our most-used development tool. Not because it writes code for us — but because it reasons about our entire codebase in ways that no other tool can. When you tell Claude Code \"add a `published_at` field to articles,\" it reads the Rust migration, updates the SQL queries in the handler, modifies the TypeScript types in the frontend, adjusts the Nuxt page component, updates all 10 locale files, and runs the build to verify. That cross-stack awareness is what makes it indispensable for monorepo development.\n\n## CLAUDE.md: Teaching the Agent Your Conventions\n\nThe foundation of effective Claude Code usage is the `CLAUDE.md` file. This is a project-level instruction file that Claude Code reads at the start of every session. Think of it as onboarding documentation, but for your AI agent.\n\nOur `CLAUDE.md` includes:\n\n- **Commit conventions:** Every commit must start with `TASK-XXX:` and use imperative mood\n- **Architecture overview:** Monorepo structure, which directories contain what\n- **Code style rules:** TypeScript strict mode, no `any`, Composition API only, `\u003Cscript setup>` syntax\n- **i18n rules:** All 10 locales must stay in sync, keys sorted alphabetically, plain English keys\n- **Security rules:** No secrets in commits, parameterized SQL, explicit CORS origins\n- **Development commands:** `npm run dev`, `cargo run`, `make fixtures`, etc.\n\nClaude Code follows these conventions consistently. When it generates a commit message, it uses the `TASK-XXX:` prefix. When it adds a translation key, it adds it to all 10 locale files in alphabetical order. When it writes SQL, it uses parameterized queries. This eliminates an entire category of code review feedback — convention violations.\n\n```markdown\n# Example CLAUDE.md excerpt\n## i18n Rules\nAll 10 locales MUST be kept in sync. When adding a translation key:\n1. Key format: Use plain English text as the key\n2. Alphabetical order: Keys in every locale file MUST be sorted A-Z\n3. All locales required: en, ru, id, zh, ja, ko, fr, de, es, ar\n```\n\nWe also maintain per-directory `CLAUDE.md` files for the backend (`\u002Fserver\u002FCLAUDE.md`) and fixtures (`\u002Fserver\u002Ffixtures\u002FCLAUDE.md`), providing context-specific instructions that activate when Claude Code works in those directories.\n\n## Multi-File Refactoring: The Killer Use Case\n\nThe workflow that saves us the most time is cross-stack refactoring. Here is a real example from our project.\n\n**Task:** Add SEO fields (`meta_title`, `meta_description`, `focus_keyword`, `robots_meta`) to the articles system.\n\nWithout Claude Code, this change requires:\n1. Write a SQL migration adding 4 columns\n2. Update the Rust `Article` model struct\n3. Update the Rust `CreateArticle` and `UpdateArticle` DTOs\n4. Update all SQL queries in the articles handler (SELECT, INSERT, UPDATE)\n5. Update the TypeScript `Article` type in the frontend\n6. Update the admin editor form to include the new fields\n7. Update the blog post page to render meta tags\n8. Update the sitemap generation logic\n9. Update all fixture files with the new fields\n10. Run migrations, rebuild, test\n\nWith Claude Code, we type one command:\n\n```\nAdd SEO fields (meta_title, meta_description, focus_keyword, robots_meta) to articles.\nWrite the migration, update the Rust model and handler, update the frontend types\nand admin editor, add meta tags to the blog page, and update fixtures.\n```\n\nClaude Code executes this as a single agentic loop:\n- Reads the existing migration files to understand the schema\n- Reads the Rust model to understand the current struct\n- Reads the handler to find all SQL queries\n- Reads the frontend types and components\n- Makes all changes across 12+ files\n- Runs `cargo check` to verify the Rust code compiles\n- Runs `npm run build` to verify the frontend builds\n- Fixes any errors and iterates until both pass\n\nThe entire process takes about 5 minutes, compared to 45-60 minutes doing it manually. More importantly, it catches cross-reference bugs that humans miss — like forgetting to add the new column to the UPDATE query or missing a fixture file.\n\n## Migration Writing\n\nDatabase migrations are particularly well-suited to Claude Code because they require understanding the current schema, the desired end state, and the safe transformation path between them.\n\nWhen we ask Claude Code to write a migration, it:\n1. Reads all existing migration files to understand the current schema\n2. Reads the Rust models to understand the target state\n3. Writes the migration SQL with proper `ALTER TABLE` statements\n4. Adds `IF NOT EXISTS` guards for idempotency where appropriate\n5. Creates a corresponding \"down\" migration if we use reversible migrations\n6. Updates the Rust models and handlers to use the new schema\n\nExample prompt:\n```\nAdd a locations table with id (UUID), slug, city_name, country, description,\nmeta_title, meta_description, latitude, longitude. Create the migration,\nRust model, handler with CRUD endpoints, and add the routes.\n```\n\nClaude Code produces a complete, working feature: migration file, model with serde derives, handler with all CRUD operations using parameterized sqlx queries, route registration in `main.rs`, and proper error handling throughout.\n\n## Test Generation\n\nWe use Claude Code extensively for generating test fixtures and SQL seed data. Our fixture files contain realistic, long-form content (1500+ word articles) with proper SEO metadata, and writing these by hand is tedious and error-prone.\n\nThe workflow:\n1. Describe the articles we need (topic, angle, technical depth)\n2. Claude Code generates the SQL INSERT statements with full Markdown content\n3. It follows our UUID conventions (`d0000000-...` for articles, `a0000000-...` for categories)\n4. It adds `ON CONFLICT (slug) DO NOTHING` for idempotency\n5. It links articles to tags via the `article_tags` junction table\n\nFor Rust unit tests, Claude Code reads the implementation, identifies edge cases, and generates test functions with descriptive names. It understands our testing patterns (using `sqlx::test` for database tests, `tokio::test` for async tests) and follows them consistently.\n\n## Code Review with Claude Code\n\nBefore opening a merge request, we run Claude Code as a reviewer:\n\n```\nReview all changes on this branch for bugs, security issues, performance\nproblems, and consistency with our CLAUDE.md conventions.\n```\n\nClaude Code:\n- Runs `git diff main...HEAD` to see all changes\n- Analyzes each file for potential issues\n- Checks for SQL injection (non-parameterized queries)\n- Verifies i18n keys are present in all 10 locales\n- Checks for `.unwrap()` calls in Rust production code\n- Verifies error handling follows our patterns\n- Reports findings with file paths and line numbers\n\nThis catches about 30% of the issues that would otherwise be found in human code review, letting our human reviewers focus on architecture and business logic.\n\n## Hooks: Automating Quality Gates\n\nClaude Code supports hooks — scripts that run automatically before or after certain actions. We use hooks to enforce quality:\n\n**Pre-commit hook:** Runs `cargo fmt --check` and `cargo clippy` before Claude Code creates a commit. If either fails, Claude Code fixes the issues and retries.\n\n**Post-edit hook:** After Claude Code modifies any file in `\u002Fi18n\u002Flocales\u002F`, a hook runs a script that verifies all 10 locale files have identical key sets. If keys are missing, Claude Code adds them.\n\nHooks transform Claude Code from a suggestion engine into a quality-enforcing agent. It cannot accidentally commit unformatted code or incomplete translations because the hooks catch it.\n\n## MCP Servers: Extending Claude Code's Capabilities\n\nModel Context Protocol (MCP) servers let you give Claude Code access to external tools. We run two custom MCP servers:\n\n1. **Database MCP server:** Lets Claude Code query our development PostgreSQL directly. When debugging a data issue, Claude Code can run `SELECT` queries to inspect the actual database state, understand the problem, and write the fix — all in one loop.\n\n2. **Deployment status MCP server:** Connects to our CI\u002FCD pipeline. Claude Code can check if the latest deployment succeeded, read build logs, and diagnose failures without us switching to the CI dashboard.\n\nMCP servers are simple JSON-RPC services. Implementing one takes about 100 lines of code. The leverage is enormous — every MCP server adds a new capability that Claude Code can use autonomously within its agent loop.\n\n## Tips for Large Codebases with 1M Context\n\nClaude Code's 1M token context window is its most powerful feature for monorepo work. Here is how we maximize it:\n\n**Let Claude Code explore.** Do not try to pre-select which files to show. Describe what you want and let Claude Code use its tools (`Grep`, `Glob`, `Read`) to find the relevant code. It is better at finding cross-references than you might expect.\n\n**Use CLAUDE.md for stable context.** Information that does not change between sessions — architecture, conventions, commands — goes in CLAUDE.md so Claude Code does not waste context re-discovering it.\n\n**Break mega-tasks into phases.** Even with 1M tokens, a task like \"refactor the entire authentication system\" benefits from phasing: first analyze and plan, then implement module by module, then test.\n\n**Trust the agentic loop.** When Claude Code makes a change, runs the build, sees an error, and fixes it — that loop is the feature. Do not interrupt it mid-cycle. Let it converge.\n\n## Pitfalls and Workarounds\n\n**Pitfall: Claude Code over-engineers.** Sometimes it adds abstractions or patterns that are not needed. Workaround: Add \"KISS — Keep it simple. Avoid over-engineering.\" to your CLAUDE.md. We did, and it helped.\n\n**Pitfall: Stale context in long sessions.** After many edits, Claude Code's understanding of the current file state can drift. Workaround: Start a new session for each major task. Sessions are cheap.\n\n**Pitfall: Non-deterministic output.** The same prompt can produce different code on different runs. Workaround: Use specific, detailed prompts. \"Add a published_at column as TIMESTAMPTZ NOT NULL DEFAULT NOW()\" is better than \"add a timestamp field.\"\n\n**Pitfall: Test data quality.** AI-generated test data can be internally inconsistent. Workaround: Always review generated fixtures and run the full test suite. Use ON CONFLICT guards for idempotency.\n\n**Pitfall: Aggressive file changes.** Claude Code sometimes modifies files you did not ask it to touch. Workaround: Review the diff carefully before accepting. Use `git diff` after every agentic session.\n\n## FAQ\n\n### How much does Claude Code cost for daily use?\n\nFor our team of 4 developers, we spend approximately $200-300\u002Fmonth on Claude Code API usage across all projects. The Max plan at $20\u002Fmonth per developer is a more predictable alternative that covers most use cases with its 5x usage allocation.\n\n### Does Claude Code work offline?\n\nNo. Claude Code requires an internet connection to communicate with Anthropic's API. All code processing happens server-side. Your code is sent to Anthropic's servers for processing — review their data retention policies for your compliance requirements.\n\n### Can Claude Code break our build?\n\nYes, but it catches most issues itself. Claude Code runs your build commands as part of its agentic loop. If `cargo check` fails, it reads the error and fixes it. In our experience, about 90% of builds succeed on the first pass, and 99% succeed after Claude Code's self-correction loop.\n\n### How do you handle secrets and environment variables?\n\nClaude Code respects `.gitignore` and can be configured to exclude sensitive files. We never store secrets in our repository. Our `.env` files are gitignored, and we use `.env.example` to document required variables without values.\n\n### Is Claude Code suitable for solo developers?\n\nAbsolutely. In some ways it is even more valuable for solo developers, because it serves as a second pair of eyes for code review, a knowledge base for remembering project conventions, and a force multiplier for tedious tasks like writing migrations and fixtures.\n\n## Conclusion\n\nClaude Code is not a magic wand that writes your application for you. It is a force multiplier that excels at cross-stack reasoning, convention enforcement, and tedious multi-file changes. The combination of CLAUDE.md for persistent project knowledge, hooks for quality enforcement, and MCP servers for external tool access makes it the most capable AI development tool we have used for monorepo work.\n\nThe key insight after 9 months of daily use: Claude Code is most valuable not for writing new code, but for maintaining existing code — refactoring, migrating, testing, and reviewing. These are the tasks that consume 70% of a developer's time and benefit most from an agent that understands your entire codebase.","\u003Ch2 id=\"our-stack-and-why-claude-code-fits\">Our Stack and Why Claude Code Fits\u003C\u002Fh2>\n\u003Cp>At Open Soft, our main product is a website built as a monorepo: a Nuxt 4 frontend with TypeScript and a Rust\u002FAxum backend API backed by PostgreSQL. The codebase spans two languages, two build systems, shared data contracts, database migrations, i18n files for 10 languages, and deployment infrastructure. Changes frequently touch both sides of the stack simultaneously.\u003C\u002Fp>\n\u003Cp>We adopted Claude Code in mid-2025 and it has become our most-used development tool. Not because it writes code for us — but because it reasons about our entire codebase in ways that no other tool can. When you tell Claude Code “add a \u003Ccode>published_at\u003C\u002Fcode> field to articles,” it reads the Rust migration, updates the SQL queries in the handler, modifies the TypeScript types in the frontend, adjusts the Nuxt page component, updates all 10 locale files, and runs the build to verify. That cross-stack awareness is what makes it indispensable for monorepo development.\u003C\u002Fp>\n\u003Ch2 id=\"claude-md-teaching-the-agent-your-conventions\">CLAUDE.md: Teaching the Agent Your Conventions\u003C\u002Fh2>\n\u003Cp>The foundation of effective Claude Code usage is the \u003Ccode>CLAUDE.md\u003C\u002Fcode> file. This is a project-level instruction file that Claude Code reads at the start of every session. Think of it as onboarding documentation, but for your AI agent.\u003C\u002Fp>\n\u003Cp>Our \u003Ccode>CLAUDE.md\u003C\u002Fcode> includes:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Commit conventions:\u003C\u002Fstrong> Every commit must start with \u003Ccode>TASK-XXX:\u003C\u002Fcode> and use imperative mood\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Architecture overview:\u003C\u002Fstrong> Monorepo structure, which directories contain what\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Code style rules:\u003C\u002Fstrong> TypeScript strict mode, no \u003Ccode>any\u003C\u002Fcode>, Composition API only, \u003Ccode>&lt;script setup&gt;\u003C\u002Fcode> syntax\u003C\u002Fli>\n\u003Cli>\u003Cstrong>i18n rules:\u003C\u002Fstrong> All 10 locales must stay in sync, keys sorted alphabetically, plain English keys\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Security rules:\u003C\u002Fstrong> No secrets in commits, parameterized SQL, explicit CORS origins\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Development commands:\u003C\u002Fstrong> \u003Ccode>npm run dev\u003C\u002Fcode>, \u003Ccode>cargo run\u003C\u002Fcode>, \u003Ccode>make fixtures\u003C\u002Fcode>, etc.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Claude Code follows these conventions consistently. When it generates a commit message, it uses the \u003Ccode>TASK-XXX:\u003C\u002Fcode> prefix. When it adds a translation key, it adds it to all 10 locale files in alphabetical order. When it writes SQL, it uses parameterized queries. This eliminates an entire category of code review feedback — convention violations.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-markdown\"># Example CLAUDE.md excerpt\n## i18n Rules\nAll 10 locales MUST be kept in sync. When adding a translation key:\n1. Key format: Use plain English text as the key\n2. Alphabetical order: Keys in every locale file MUST be sorted A-Z\n3. All locales required: en, ru, id, zh, ja, ko, fr, de, es, ar\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>We also maintain per-directory \u003Ccode>CLAUDE.md\u003C\u002Fcode> files for the backend (\u003Ccode>\u002Fserver\u002FCLAUDE.md\u003C\u002Fcode>) and fixtures (\u003Ccode>\u002Fserver\u002Ffixtures\u002FCLAUDE.md\u003C\u002Fcode>), providing context-specific instructions that activate when Claude Code works in those directories.\u003C\u002Fp>\n\u003Ch2 id=\"multi-file-refactoring-the-killer-use-case\">Multi-File Refactoring: The Killer Use Case\u003C\u002Fh2>\n\u003Cp>The workflow that saves us the most time is cross-stack refactoring. Here is a real example from our project.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Task:\u003C\u002Fstrong> Add SEO fields (\u003Ccode>meta_title\u003C\u002Fcode>, \u003Ccode>meta_description\u003C\u002Fcode>, \u003Ccode>focus_keyword\u003C\u002Fcode>, \u003Ccode>robots_meta\u003C\u002Fcode>) to the articles system.\u003C\u002Fp>\n\u003Cp>Without Claude Code, this change requires:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Write a SQL migration adding 4 columns\u003C\u002Fli>\n\u003Cli>Update the Rust \u003Ccode>Article\u003C\u002Fcode> model struct\u003C\u002Fli>\n\u003Cli>Update the Rust \u003Ccode>CreateArticle\u003C\u002Fcode> and \u003Ccode>UpdateArticle\u003C\u002Fcode> DTOs\u003C\u002Fli>\n\u003Cli>Update all SQL queries in the articles handler (SELECT, INSERT, UPDATE)\u003C\u002Fli>\n\u003Cli>Update the TypeScript \u003Ccode>Article\u003C\u002Fcode> type in the frontend\u003C\u002Fli>\n\u003Cli>Update the admin editor form to include the new fields\u003C\u002Fli>\n\u003Cli>Update the blog post page to render meta tags\u003C\u002Fli>\n\u003Cli>Update the sitemap generation logic\u003C\u002Fli>\n\u003Cli>Update all fixture files with the new fields\u003C\u002Fli>\n\u003Cli>Run migrations, rebuild, test\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>With Claude Code, we type one command:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Add SEO fields (meta_title, meta_description, focus_keyword, robots_meta) to articles.\nWrite the migration, update the Rust model and handler, update the frontend types\nand admin editor, add meta tags to the blog page, and update fixtures.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Claude Code executes this as a single agentic loop:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Reads the existing migration files to understand the schema\u003C\u002Fli>\n\u003Cli>Reads the Rust model to understand the current struct\u003C\u002Fli>\n\u003Cli>Reads the handler to find all SQL queries\u003C\u002Fli>\n\u003Cli>Reads the frontend types and components\u003C\u002Fli>\n\u003Cli>Makes all changes across 12+ files\u003C\u002Fli>\n\u003Cli>Runs \u003Ccode>cargo check\u003C\u002Fcode> to verify the Rust code compiles\u003C\u002Fli>\n\u003Cli>Runs \u003Ccode>npm run build\u003C\u002Fcode> to verify the frontend builds\u003C\u002Fli>\n\u003Cli>Fixes any errors and iterates until both pass\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The entire process takes about 5 minutes, compared to 45-60 minutes doing it manually. More importantly, it catches cross-reference bugs that humans miss — like forgetting to add the new column to the UPDATE query or missing a fixture file.\u003C\u002Fp>\n\u003Ch2 id=\"migration-writing\">Migration Writing\u003C\u002Fh2>\n\u003Cp>Database migrations are particularly well-suited to Claude Code because they require understanding the current schema, the desired end state, and the safe transformation path between them.\u003C\u002Fp>\n\u003Cp>When we ask Claude Code to write a migration, it:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Reads all existing migration files to understand the current schema\u003C\u002Fli>\n\u003Cli>Reads the Rust models to understand the target state\u003C\u002Fli>\n\u003Cli>Writes the migration SQL with proper \u003Ccode>ALTER TABLE\u003C\u002Fcode> statements\u003C\u002Fli>\n\u003Cli>Adds \u003Ccode>IF NOT EXISTS\u003C\u002Fcode> guards for idempotency where appropriate\u003C\u002Fli>\n\u003Cli>Creates a corresponding “down” migration if we use reversible migrations\u003C\u002Fli>\n\u003Cli>Updates the Rust models and handlers to use the new schema\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Example prompt:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Add a locations table with id (UUID), slug, city_name, country, description,\nmeta_title, meta_description, latitude, longitude. Create the migration,\nRust model, handler with CRUD endpoints, and add the routes.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Claude Code produces a complete, working feature: migration file, model with serde derives, handler with all CRUD operations using parameterized sqlx queries, route registration in \u003Ccode>main.rs\u003C\u002Fcode>, and proper error handling throughout.\u003C\u002Fp>\n\u003Ch2 id=\"test-generation\">Test Generation\u003C\u002Fh2>\n\u003Cp>We use Claude Code extensively for generating test fixtures and SQL seed data. Our fixture files contain realistic, long-form content (1500+ word articles) with proper SEO metadata, and writing these by hand is tedious and error-prone.\u003C\u002Fp>\n\u003Cp>The workflow:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Describe the articles we need (topic, angle, technical depth)\u003C\u002Fli>\n\u003Cli>Claude Code generates the SQL INSERT statements with full Markdown content\u003C\u002Fli>\n\u003Cli>It follows our UUID conventions (\u003Ccode>d0000000-...\u003C\u002Fcode> for articles, \u003Ccode>a0000000-...\u003C\u002Fcode> for categories)\u003C\u002Fli>\n\u003Cli>It adds \u003Ccode>ON CONFLICT (slug) DO NOTHING\u003C\u002Fcode> for idempotency\u003C\u002Fli>\n\u003Cli>It links articles to tags via the \u003Ccode>article_tags\u003C\u002Fcode> junction table\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>For Rust unit tests, Claude Code reads the implementation, identifies edge cases, and generates test functions with descriptive names. It understands our testing patterns (using \u003Ccode>sqlx::test\u003C\u002Fcode> for database tests, \u003Ccode>tokio::test\u003C\u002Fcode> for async tests) and follows them consistently.\u003C\u002Fp>\n\u003Ch2 id=\"code-review-with-claude-code\">Code Review with Claude Code\u003C\u002Fh2>\n\u003Cp>Before opening a merge request, we run Claude Code as a reviewer:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>Review all changes on this branch for bugs, security issues, performance\nproblems, and consistency with our CLAUDE.md conventions.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Claude Code:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Runs \u003Ccode>git diff main...HEAD\u003C\u002Fcode> to see all changes\u003C\u002Fli>\n\u003Cli>Analyzes each file for potential issues\u003C\u002Fli>\n\u003Cli>Checks for SQL injection (non-parameterized queries)\u003C\u002Fli>\n\u003Cli>Verifies i18n keys are present in all 10 locales\u003C\u002Fli>\n\u003Cli>Checks for \u003Ccode>.unwrap()\u003C\u002Fcode> calls in Rust production code\u003C\u002Fli>\n\u003Cli>Verifies error handling follows our patterns\u003C\u002Fli>\n\u003Cli>Reports findings with file paths and line numbers\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>This catches about 30% of the issues that would otherwise be found in human code review, letting our human reviewers focus on architecture and business logic.\u003C\u002Fp>\n\u003Ch2 id=\"hooks-automating-quality-gates\">Hooks: Automating Quality Gates\u003C\u002Fh2>\n\u003Cp>Claude Code supports hooks — scripts that run automatically before or after certain actions. We use hooks to enforce quality:\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Pre-commit hook:\u003C\u002Fstrong> Runs \u003Ccode>cargo fmt --check\u003C\u002Fcode> and \u003Ccode>cargo clippy\u003C\u002Fcode> before Claude Code creates a commit. If either fails, Claude Code fixes the issues and retries.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Post-edit hook:\u003C\u002Fstrong> After Claude Code modifies any file in \u003Ccode>\u002Fi18n\u002Flocales\u002F\u003C\u002Fcode>, a hook runs a script that verifies all 10 locale files have identical key sets. If keys are missing, Claude Code adds them.\u003C\u002Fp>\n\u003Cp>Hooks transform Claude Code from a suggestion engine into a quality-enforcing agent. It cannot accidentally commit unformatted code or incomplete translations because the hooks catch it.\u003C\u002Fp>\n\u003Ch2 id=\"mcp-servers-extending-claude-code-s-capabilities\">MCP Servers: Extending Claude Code’s Capabilities\u003C\u002Fh2>\n\u003Cp>Model Context Protocol (MCP) servers let you give Claude Code access to external tools. We run two custom MCP servers:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>\u003Cstrong>Database MCP server:\u003C\u002Fstrong> Lets Claude Code query our development PostgreSQL directly. When debugging a data issue, Claude Code can run \u003Ccode>SELECT\u003C\u002Fcode> queries to inspect the actual database state, understand the problem, and write the fix — all in one loop.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Deployment status MCP server:\u003C\u002Fstrong> Connects to our CI\u002FCD pipeline. Claude Code can check if the latest deployment succeeded, read build logs, and diagnose failures without us switching to the CI dashboard.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>MCP servers are simple JSON-RPC services. Implementing one takes about 100 lines of code. The leverage is enormous — every MCP server adds a new capability that Claude Code can use autonomously within its agent loop.\u003C\u002Fp>\n\u003Ch2 id=\"tips-for-large-codebases-with-1m-context\">Tips for Large Codebases with 1M Context\u003C\u002Fh2>\n\u003Cp>Claude Code’s 1M token context window is its most powerful feature for monorepo work. Here is how we maximize it:\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Let Claude Code explore.\u003C\u002Fstrong> Do not try to pre-select which files to show. Describe what you want and let Claude Code use its tools (\u003Ccode>Grep\u003C\u002Fcode>, \u003Ccode>Glob\u003C\u002Fcode>, \u003Ccode>Read\u003C\u002Fcode>) to find the relevant code. It is better at finding cross-references than you might expect.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Use CLAUDE.md for stable context.\u003C\u002Fstrong> Information that does not change between sessions — architecture, conventions, commands — goes in CLAUDE.md so Claude Code does not waste context re-discovering it.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Break mega-tasks into phases.\u003C\u002Fstrong> Even with 1M tokens, a task like “refactor the entire authentication system” benefits from phasing: first analyze and plan, then implement module by module, then test.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Trust the agentic loop.\u003C\u002Fstrong> When Claude Code makes a change, runs the build, sees an error, and fixes it — that loop is the feature. Do not interrupt it mid-cycle. Let it converge.\u003C\u002Fp>\n\u003Ch2 id=\"pitfalls-and-workarounds\">Pitfalls and Workarounds\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Pitfall: Claude Code over-engineers.\u003C\u002Fstrong> Sometimes it adds abstractions or patterns that are not needed. Workaround: Add “KISS — Keep it simple. Avoid over-engineering.” to your CLAUDE.md. We did, and it helped.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Pitfall: Stale context in long sessions.\u003C\u002Fstrong> After many edits, Claude Code’s understanding of the current file state can drift. Workaround: Start a new session for each major task. Sessions are cheap.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Pitfall: Non-deterministic output.\u003C\u002Fstrong> The same prompt can produce different code on different runs. Workaround: Use specific, detailed prompts. “Add a published_at column as TIMESTAMPTZ NOT NULL DEFAULT NOW()” is better than “add a timestamp field.”\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Pitfall: Test data quality.\u003C\u002Fstrong> AI-generated test data can be internally inconsistent. Workaround: Always review generated fixtures and run the full test suite. Use ON CONFLICT guards for idempotency.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Pitfall: Aggressive file changes.\u003C\u002Fstrong> Claude Code sometimes modifies files you did not ask it to touch. Workaround: Review the diff carefully before accepting. Use \u003Ccode>git diff\u003C\u002Fcode> after every agentic session.\u003C\u002Fp>\n\u003Ch2 id=\"faq\">FAQ\u003C\u002Fh2>\n\u003Ch3>How much does Claude Code cost for daily use?\u003C\u002Fh3>\n\u003Cp>For our team of 4 developers, we spend approximately $200-300\u002Fmonth on Claude Code API usage across all projects. The Max plan at $20\u002Fmonth per developer is a more predictable alternative that covers most use cases with its 5x usage allocation.\u003C\u002Fp>\n\u003Ch3>Does Claude Code work offline?\u003C\u002Fh3>\n\u003Cp>No. Claude Code requires an internet connection to communicate with Anthropic’s API. All code processing happens server-side. Your code is sent to Anthropic’s servers for processing — review their data retention policies for your compliance requirements.\u003C\u002Fp>\n\u003Ch3>Can Claude Code break our build?\u003C\u002Fh3>\n\u003Cp>Yes, but it catches most issues itself. Claude Code runs your build commands as part of its agentic loop. If \u003Ccode>cargo check\u003C\u002Fcode> fails, it reads the error and fixes it. In our experience, about 90% of builds succeed on the first pass, and 99% succeed after Claude Code’s self-correction loop.\u003C\u002Fp>\n\u003Ch3>How do you handle secrets and environment variables?\u003C\u002Fh3>\n\u003Cp>Claude Code respects \u003Ccode>.gitignore\u003C\u002Fcode> and can be configured to exclude sensitive files. We never store secrets in our repository. Our \u003Ccode>.env\u003C\u002Fcode> files are gitignored, and we use \u003Ccode>.env.example\u003C\u002Fcode> to document required variables without values.\u003C\u002Fp>\n\u003Ch3>Is Claude Code suitable for solo developers?\u003C\u002Fh3>\n\u003Cp>Absolutely. In some ways it is even more valuable for solo developers, because it serves as a second pair of eyes for code review, a knowledge base for remembering project conventions, and a force multiplier for tedious tasks like writing migrations and fixtures.\u003C\u002Fp>\n\u003Ch2 id=\"conclusion\">Conclusion\u003C\u002Fh2>\n\u003Cp>Claude Code is not a magic wand that writes your application for you. It is a force multiplier that excels at cross-stack reasoning, convention enforcement, and tedious multi-file changes. The combination of CLAUDE.md for persistent project knowledge, hooks for quality enforcement, and MCP servers for external tool access makes it the most capable AI development tool we have used for monorepo work.\u003C\u002Fp>\n\u003Cp>The key insight after 9 months of daily use: Claude Code is most valuable not for writing new code, but for maintaining existing code — refactoring, migrating, testing, and reviewing. These are the tasks that consume 70% of a developer’s time and benefit most from an agent that understands your entire codebase.\u003C\u002Fp>\n","en","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:34.436863Z","How We Use Claude Code for Nuxt 4 + Rust Monorepo Development","Learn how Open Soft uses Claude Code for multi-file refactoring, migration writing, test generation, and code review in a Nuxt 4 + Rust monorepo with real workflow examples.","claude code monorepo workflow",null,"index, follow",[22,27,31,35,39],{"id":23,"name":24,"slug":25,"created_at":26},"c0000000-0000-0000-0000-000000000008","AI","ai","2026-03-28T10:44:21.513630Z",{"id":28,"name":29,"slug":30,"created_at":26},"c0000000-0000-0000-0000-000000000012","DevOps","devops",{"id":32,"name":33,"slug":34,"created_at":26},"c0000000-0000-0000-0000-000000000004","Nuxt","nuxt",{"id":36,"name":37,"slug":38,"created_at":26},"c0000000-0000-0000-0000-000000000001","Rust","rust",{"id":40,"name":41,"slug":42,"created_at":26},"c0000000-0000-0000-0000-000000000002","TypeScript","typescript","Engineering",[45,51,57],{"id":46,"title":47,"slug":48,"excerpt":49,"locale":12,"category_name":43,"published_at":50},"d0200000-0000-0000-0000-000000000003","Why Bali Is Becoming Southeast Asia's Impact-Tech Hub in 2026","why-bali-becoming-southeast-asia-impact-tech-hub-2026","Bali ranks #16 among Southeast Asian startup ecosystems. With a growing concentration of Web3 builders, AI sustainability startups, and eco-travel tech companies, the island is carving a niche as the region's impact-tech capital.","2026-03-28T10:44:37.748283Z",{"id":52,"title":53,"slug":54,"excerpt":55,"locale":12,"category_name":43,"published_at":56},"d0200000-0000-0000-0000-000000000002","ASEAN Data Protection Patchwork: A Developer's Compliance Checklist","asean-data-protection-patchwork-developer-compliance-checklist","Seven ASEAN countries now have comprehensive data protection laws, each with different consent models, localization requirements, and penalty structures. Here is a practical compliance checklist for developers building multi-country applications.","2026-03-28T10:44:37.374741Z",{"id":58,"title":59,"slug":60,"excerpt":61,"locale":12,"category_name":43,"published_at":62},"d0200000-0000-0000-0000-000000000001","Indonesia's $29 Billion Digital Transformation: Opportunities for Software Companies","indonesia-29-billion-digital-transformation-opportunities-software-companies","Indonesia's IT services market is projected to reach $29.03 billion in 2026, up from $24.37 billion in 2025. Cloud infrastructure, AI, e-commerce, and data centers are driving the fastest growth in Southeast Asia.","2026-03-28T10:44:37.349311Z",{"id":13,"name":64,"slug":65,"bio":66,"photo_url":19,"linkedin":19,"role":67,"created_at":68,"updated_at":68},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]