Six months of daily Claude Code use with nothing but a terminal - no dedicated desktop app, no GUI shortcuts - is an education in what the tool actually does versus what the documentation leads you to expect.
The basic pattern most people use: describe a task, review the output, iterate. That loop works, but it barely touches Claude Code's actual capabilities. Developers who've pushed past it consistently find the same set of features doing the real work.
The Configuration Layer
CLAUDE.md is a file you place in any project directory that Claude reads automatically at the start of every session. Not prominently documented, but practically essential: it lets you encode your architecture decisions, naming conventions, banned patterns, and workflow requirements once. Claude follows them in every session without you re-explaining your codebase. For teams with strict conventions, this is the feature that makes the difference between Claude being useful immediately versus needing a 10-minute briefing each time.
Hooks in settings.json let you run shell commands automatically before or after Claude takes certain actions - run a linter after every file write, trigger tests when Claude saves code, get a desktop notification when a long background task completes. On Linux without a GUI to provide visual feedback on what Claude is doing, hooks are the main way to integrate Claude into a development pipeline that already has its own automation and conventions.
Execution Models
Sub-agents let Claude run independent parts of a task in parallel rather than sequentially. Three unrelated bug fixes don't need to happen one at a time - Claude can fan them out simultaneously and bring the results back together. Most users ask Claude to work through tasks serially without knowing parallel execution is available. For batch work, the time difference is substantial.
The --print flag runs a prompt and exits without starting an interactive session, making Claude Code callable from shell scripts, CI pipelines, and scheduled jobs. This is where Claude Code moves from a tool you use to a tool you build with.
Data Access
MCP (Model Context Protocol) is an open standard that lets Claude connect to external services - databases, internal APIs, custom data sources - without you pasting content into the chat. Claude queries your actual systems directly. Configuration takes time upfront, but it eliminates the constant friction of manually feeding Claude the context it needs to be useful on real projects.
The common thread: Claude Code is a configurable agent framework, and the terminal interface exposes that configurability more directly than GUI wrappers typically do. Most users are running on defaults and haven't found the programmable layer underneath.