Tutto.Praxis · talking deck
Praxis: built from Anthropic's Claude Code in Action

Watch Claude Code
actually do the work.

Fourteen ideas, one per screen, from install to hooks. Each is a thing to point at while you explain. The drama is in the watching, so take the silences.

01
Tutto.The shape of the course
Where we're going

The whole course on one screen

Four moves: see what the agent is, get it running, drive it day to day, then make the must-haves guaranteed.

Foundation

  1. 1 What a coding assistant is
  2. 2 Claude Code in action
  3. 3 Installing it

Get going

  1. 4 A project to work on
  2. 5 Adding context
  3. 6 Making changes

Drive & customise

  1. 7 Controlling context
  2. 8 Custom commands
  3. 9 MCP servers
  4. 10 GitHub integration

Hooks & SDK

  1. 11 Hooks: the guarantee
  2. 12 Defining a hook
  3. 13 Hooks in practice
  4. 14 The Claude Code SDK
02
Tutto.Lesson 1 · Foundation
Lesson 1

From autocomplete to a teammate that acts

A coding assistant sits on a spectrum. At one end it guesses your next line; at the other it reads your project and does the work.

Autocomplete suggests the next line Chat assistant answers; you copy it across Claude Code acts inside your repo More of the work shifts from you to the tool, left to right. Claude Code is the agent end of the line

An agent doesn't just talk about the code. It works inside your terminal and your repo: reading files, editing across them, running commands, and deciding what to do next.

03
Tutto.Lesson 2 · Foundation
Lesson 2

What a session actually looks like

You ask in plain English. Claude reads the relevant files, makes the edits, runs them, and shows you the result to review.

You ask plain English Claude Code reads the files · edits across them runs commands to check Result + diff shown back to you you review and refine, go round again

The course demos this on a small UI-generation app (uigen), but nothing is special about it: you can follow along on a codebase of your own.

04
Tutto.Lesson 3 · Foundation
Lesson 3

One command to install

One line in your terminal, whatever the platform. Then run claude, pick a theme and sign in.

1 · Install curl -fsSL https://claude.ai/install.sh | bash macOS · Linux · WSL irm https://claude.ai/install.ps1 | iex Windows PowerShell brew install --cask claude-code macOS · Homebrew 2 · Run it claude pick a colour theme sign in with your claude.ai account

Hit a "command not found", network or permissions error? The docs' "Troubleshoot installation" page is the first stop. Running through Bedrock, Vertex or Foundry has its own setup.

05
Tutto.Lesson 4 · Get going
Lesson 4

Point it at a real project

Claude Code is more interesting with something to work on. The course ships a small UI-generation app to explore.

uigen.zip download + extract npm run setup deps + local SQLite .env key optional npm run dev app running Without an API key the app still generates static placeholder code, or skip the sample and use your own repo.

The Anthropic API key is optional; it only powers the app's own UI generation. Node JS is the one real prerequisite.

06
Tutto.Lesson 5 · Get going
Lesson 5

Context in: how Claude learns your project

Claude only knows what's in its context window. You pull the right files, output and rules in before you ask.

@file name a file or folder Paste errors · logs · images CLAUDE.md in every session It reads searches the repo itself Context window what Claude can see right now

Be specific about what matters. The less Claude has to guess, the less it wanders, and the less context (and money) each run burns.

07
Tutto.Lesson 6 · Get going
Lesson 6

Making changes: describe it, review the diff

You say what you want; Claude edits across the files and shows you a diff. You approve, refine, and only then commit.

Your request plain English Claude edits across the files · shows a diff You review approve or refine Commit when it's right refine, go round again

You stay in control: every edit is reviewable, and you can steer, undo or redirect before anything lands in the repo.

08
Tutto.Lesson 7 · Drive & customise
Lesson 7

Controlling context: keep the window lean

A long session fills the window. Three commands keep it focused on what matters now.

The context window limit prompts · files · tool results → auto-compacts near the limit /clear wipe it: starting a new, unrelated task /compact summarise, keep the thread: same task, running long /context see what's filling it up, and by how much

Clear between unrelated tasks; compact to keep a long thread alive; check /context when answers start to drift; that's usually a full window.

09
Tutto.Lesson 8 · Drive & customise
Lesson 8

Custom commands: save a prompt you reuse

A prompt you type often becomes a slash command: a Markdown file Claude runs on demand.

A prompt you type often .claude/commands/name.md the prompt, saved to a file /name expands to the full prompt save invoke Pass arguments with $ARGUMENTS. Keep commands in the repo and the whole team gets the same shortcuts.

Anything you find yourself re-explaining (a review checklist, a release routine) is a candidate. Write it once; call it with a slash.

Key conceptRuntime parameters: $ARGUMENTS takes everything the user typed; $1 $2 $3 take positional args. → full detail (!`cmd`, @file, argument-hint) in the teacher notes.

10
Tutto.Lesson 9 · Drive & customise
Lesson 9

MCP: reach the tools outside your code

Most of what you need lives in other systems: issues, docs, databases. MCP connects Claude Code to them as tools.

Claude Code claude mcp add … Linear · issues Docs Databases GitHub · repos Scope it local · user · project project = .mcp.json in the repo

Watch the cost: every server loads its tool definitions into context whether you use them or not. Add what you need, and disable the rest with /mcp.

Key conceptRunning MCP in GitHub Actions takes a two-level permission model: configure the server (--mcp-config) and allow-list each tool by name (mcp__server__tool). Both are required. → full detail in the teacher notes.

11
Tutto.Lesson 10 · Drive & customise
Lesson 10

GitHub: from local change to pull request

Claude Code drives the GitHub CLI to commit, push and open a PR, and the GitHub app can run it in CI when you mention it.

Local changes commit push gh pr create open the PR Pull request @claude mention on an issue / PR Runs in CI Claude Code, on a runner Back to the PR review · commit · triage

Top row is you, locally. Bottom row is hands-off: tag @claude on an issue or PR and the GitHub app runs Claude Code in CI to triage, review or implement.

12
Tutto.Lesson 11 · Hooks & SDK
Lesson 11: if you take one thing away

A prompt is a request. A hook is a guarantee.

Asking Claude to "always run the formatter" is a request it might forget. A hook is a shell command that runs every time, no exceptions.

Same intent, two ways Prompt "always run the formatter" sometimes runs sometimes skipped probabilistic: may forget Hook PostToolUse → format runs every time deterministic: guaranteed

The purpose of a hook: turn what you'd ask Claude to do into what always happens. Run by the harness, not the model. If something must happen every time, don't put it in a prompt. That's what moves a team from "we'll review it after" to "it can't happen in the first place".

Key conceptPrompts are probabilistic; hooks are deterministic. That's the whole point. → the three shapes (guarantee / block / inject context) are in the teacher notes.

13
Tutto.Lesson 12 · Hooks & SDK
Lesson 12

Defining a hook: event → matcher → command

A hook is three things in settings.json: which lifecycle event, which tool it matches, and the command to run.

settings.json "PreToolUse": [ event "matcher": "Bash", which tool "command": "./guard.sh" what runs ] use an absolute path for the script When the tool fires tool about to run hook runs exit 0 · allow exit 2 · block

PreToolUse is the one hook that runs before a tool, so it's the only one that can stop a call: exit 2 (or return "permissionDecision":"deny") and the rm -rf or the commit to main is blocked before it happens, not after.

Key conceptThe hook sees the tool name and its input, so you gate on conditions: block Bash on a deny-list, or any edit touching .env. → teacher notes for the deny/allow/ask decisions.

14
Tutto.Lesson 13 · Hooks & SDK
Lesson 13

Hooks in practice: share them, debug them

Two real problems the course solves: sharing hooks across machines, and knowing the shape of the input a hook receives.

Share across machines settings.example.json ($PWD) npm run setup → init-claude.js settings.local.json (real paths) Debug the input Not sure what stdin a hook gets? "command": "jq . > log.json" → writes the exact input to a file Nine lifecycle events: PreToolUse · PostToolUse · Notification Stop · SubagentStop · PreCompact UserPromptSubmit · SessionStart · SessionEnd

The input on stdin changes per event and per tool, so log it first. Absolute paths are recommended for security, which is why shared settings use a $PWD placeholder that setup expands.

15
Tutto.Lesson 14 · Hooks & SDK
Lesson 14

The SDK: Claude Code as a building block

The same agent you run in the terminal can be embedded in your own scripts and apps through the SDK.

Claude Code the terminal agent Agent SDK TypeScript · Python same loop, as a library Code-review bots Batch refactors Custom agents · CI

Wrap the agentic loop (tools, context, permissions) inside your own software, and Claude Code stops being just a CLI and becomes a component you build on.

16
Tutto.Praxis
The whole thing, in one line

See it act.
Drive it daily.
Make it guaranteed.

Install Claude Code, work the edit-and-review loop, connect it out with MCP and GitHub, then lock in the must-haves with hooks, and build on it with the SDK.

tutto.one/praxis · daniel@tutto.one

17
← → or space · F11 fullscreen