Blog
Mert Özen's blog posts on software development, backend, frontend, and DevOps.
Getting Started with Claude Code: Installation, First Session and Understanding the Agentic Loop
The most expensive mistake when starting with Claude Code is signing in with the wrong account: on a company repo use the company's Team or Enterprise account and check the active credential with /status. Native installer, WinGet and WSL installs on Windows, the Bash versus PowerShell tool and Git for Windows, the three phases of the agentic loop, and a first small, test-verified change in Bookstore.
CLAUDE.md and Memory: Teaching Claude Code Your Project
CLAUDE.md is context, not a rules engine: Claude reads it as a message after the system prompt and tries to follow it, but a hard block needs a permission rule or a hook. File locations and load order, the 200-line guideline, imports, path-specific rules with .claude/rules/, AGENTS.md support, auto memory and a short CLAUDE.md for Bookstore.
Permission Modes, Settings and Sandbox: Running Claude Code Under Control
What Claude Code is allowed to do is decided by permission rules that Claude Code itself enforces, not by CLAUDE.md: a deny wins at every level and in every mode, but a Bash rule matches command text, not the program. The six permission modes, the Auto mode classifier, settings.json layers and precedence, allow/ask/deny syntax, Bookstore's team settings and the sandbox that native Windows lacks.
Plan Mode and the Daily Workflow: Explore, Plan, Implement, Verify and Manage Context
The safe way to have Claude Code build a large feature is to get a plan with a file list in plan mode, fix it with Ctrl+G, approve it and commit after every verified layer; checkpoints don't roll back files changed by Bash or the database. Plan approval options, a completion condition with /goal, compaction and Compact Instructions, /clear, /resume, /branch and /rewind.
Skills and Slash Commands in Claude Code: Packaging Repeated Work
In Claude Code a repeated procedure belongs in a skill, not in CLAUDE.md: only its description is listed at session start and the content loads when invoked; for jobs with side effects, disable-model-invocation lets only you call it. Bundled skills, custom commands merged into skills, locations and priority, allowed-tools as a grant rather than a restriction, and the /add-migration and angular-component skills for Bookstore.
Subagents in Claude Code: Splitting Context, Specializing and Running in Parallel
In Claude Code a subagent is a separate Claude instance that the main session hands a side task to and that works in its own context window: it doesn't see the conversation history, does see CLAUDE.md, and returns only a summary. The .claude/agents/ file format, the tools allowlist, the model and memory fields, the background and forks, worktree isolation, and ef-query-reviewer, angular-a11y-checker and test-runner for Bookstore.
Claude Code Hooks: Enforcing Rules, Formatting and Running Tests Automatically
The way to enforce a rule in Claude Code is a hook, not CLAUDE.md: Claude Code runs your script at a set moment, and exit code 2 or a deny decision stops the tool call. The event, matcher and handler structure, stdin JSON, exit codes, writing hooks for Windows in PowerShell, and for Bookstore a guard for committed migrations, formatting the changed file, shortening test output and a Stop check.
Connecting MCP Servers to Claude Code: The Bookstore MCP Server, the Database and the Browser
You connect an MCP server to Claude Code with claude mcp add or, for the team, with .mcp.json at the repository root; project servers ask for approval in interactive sessions and load without asking in claude -p. Scopes, ${VAR} expansion, tool search and output limits, and for Bookstore the C# MCP server, SQL Server through a read-only login and DBHub, Playwright MCP and a ui-tester subagent.
Working in Parallel: Worktrees, Desktop, Cloud Sessions and Following Up from Mobile
For parallel work in Claude Code, start each session in its own git worktree with claude --worktree; files are separated, but user-secrets, the database and ports are not. Worktree cleanup, .worktreeinclude, shared approvals and hooks, a database per worktree for Bookstore, and Desktop, VS Code and JetBrains, cloud sessions, --teleport, Remote Control and the mobile app.
Headless Claude Code and CI: `claude -p`, GitHub Actions and Pull Request Review
You run Claude Code from scripts and CI with claude -p; --bare leaves out project hooks and MCP servers, dontAsk denies every call that would prompt, and --max-turns and --max-budget-usd cap the cost. A release note draft with structured output, @claude and PR review workflows with anthropics/claude-code-action@v1, credential options, and how Code Review and /code-review ultra differ.
Claude Code in a Team: The Shared .claude Folder, Plugins, Output Styles and Managed Settings
To share a Claude Code setup in a team, package the skills, subagents, hooks and MCP configuration into a plugin and distribute it from a marketplace in the repository; the organization then limits logins, versions, marketplaces and hooks with managed settings. The bookstore-dev plugin for Bookstore, renamed tools and permission rules, code intelligence plugins, Learning and a custom output style, allowManagedHooksOnly and its effect on CI.
Introduction to the Claude Agent SDK: Using Claude Code as a Library
The Claude Agent SDK lets you call Claude Code's tools, agent loop and permission system from TypeScript and Python; each query() starts a separate Claude Code process. A nightly dependency report agent for Bookstore: narrow permissions with settingSources, tools, allowedTools and dontAsk, structured output, turn and budget caps, the env trap and scheduling with GitHub Actions.