1
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
KASPAROV, DEEP BLUE I 1997.�
…and very briefly, some musings about�DDEV and what it has to do with WordPress and AI?!
Mladen Đurić
�@MacMladen
2
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
3
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
2005: Two amateurs and three PCs beat�grandmasters and supercomputers
Freestyle tournament on Playchess, June 2005. Anything goes: human, machine, team. Grandmasters take part with the strongest engines. The winner is ZackS — two American amateurs, Steven Cramton and Zackary Stephen, with three ordinary computers and a process of their own: which engine to ask, when, and how to combine the answers.
"Weak human + machine + better process was superior to a strong computer alone and, more remarkably, superior to a strong human + machine + inferior process."�— Garry Kasparov, The Chess Master and the Computer, NYRB 2010
4
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Process beats power.
Kasparov called it centaur chess.
We call it agent orchestration.
5
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
WORDPRESS, DOCKER AND AI AGENTS — HANDS ON
Mladen Đurić
�@MacMladen
6
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
$ whoami
7
A very boring, incompetent guy
MLADEN ĐURIĆ
a.k.a MacMladen
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
I’ve been in IT since the age of mainframes, 8th year of UNIX epoch.
8
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
I started with Z80 assembly
9
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
I really enjoyed hard core C
10
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
As soon as I started learning to code I was so fascinated and wanted to share what I learned. I was hardly into secondary school when I organised first computer club and gave first BASIC course. It was around 1982.
In 2016 I started a Professional Web Development School ]{oder.
11
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
DDEV
Ever heard of?
12
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
The tool to manage the container stack
DDEV is an open-source tool for launching local web development environments in minutes. It supports PHP, Node.js, and Python (experimental).
You can extend, version-control, and share these environments, so you can use a Docker workflow without Docker experience or custom configuration. You can change, power down, or remove projects as easily as you start them.
13
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Introduce
yourself!
14
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Three ways to follow. All three are fine.
Fell behind? git checkout cp-1 … cp-4 returns you to a known state.
Note: There is no wrong way. Checkpoint tags are the safety net, nobody has to “keep up”.
15
1
I work on my laptop
You type along with everyone. Prerequisites installed; ddev start already done at home.
2
I watch, then repeat at home
The repo and docs are written so the whole flow can be replayed step by step.
3
I just listen
No laptop. The repo stays as a reference; the slides are public.
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
What you take home
16
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
GitHub repository:
https://github.com/macmladen/workshop-wp-ddev-ai
17
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Timetable:
18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Chapter 1
THE THESIS
19
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
One-person studio with an AI team
20
A solo developer running a client project the way a small agency does: planning, estimates, parallel work, review, deploy, a record of the work. The agents are the team. The human is the architect.
Me — the architect
The agent — the team
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Agent
21
A program that sees your whole codebase, has tools (terminal, files, git, browser), makes a plan, executes it, checks the result and reports back. It runs in a loop until the criteria are met or you stop it.
"Chat"
Agent
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
A real task, a real estimate, a real price
22
AC-181 · Hotfix — category CTA: external registration link
Live Novi Pazar page: the CTA points to our signup, but this race registers via TrkaRS. Optional ACF field "External registration link"; when filled, the CTA goes there; when empty, behaviour unchanged.
Effort: S
Estimate: 1.5h
Actual: 2h
Billable: yes
AI value: plan + implementation + tests; human: the field decision, review, deploy
AI time: 1h 10min
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Three pillars
23
DDEV
Every project gets its own local environment that mirrors production: the same PHP, the same database, the same extensions. One config.yaml.
git worktree
Enables several tasks to run in parallel, each in its own folder and branch, in the same repo. The agent works where it is allowed to fail.
An agent with a contract
AGENTS.md says what it may do, what it may not, and what "done" looks like. Plan and criteria before code. A human reviews and commits.
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
24
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Chapter 2
THE DDEV
25
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
26
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Environment
27
CHECKPOINT 1
$ git clone https://github.com/macmladen/workshop-wp-ddev-ai.git
$ cd workshop-wp-ddev-ai
$ ddev start
$ ddev launch
$ ddev wp option get siteurl
Expected
The site opens in the browser at
�https://workshop-wp-ddev-ai.ddev.site �
and the wp command prints the same URL.
Stuck?
git checkout cp-1
8 minutes · we move on at 12:37
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Why DDEV: one file, the same machine for everyone
28
# .ddev/config.yaml
name: workshop-wp-ddev-ai
type: wordpress
php_version: "8.3"
webserver_type: apache-fpm
database:
type: mysql
version: "8.0"
hooks:
post-start:
- exec: ./scripts/wp-install.sh
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
WP-CLI through DDEV: everything that would be clicking
29
$ ddev wp plugin list
$ ddev wp plugin activate radionica-trening
$ ddev wp post create --post_type=trening --post_title="Tuesday 19:00"
$ ddev wp db export backup/local.sql
$ ddev wp search-replace https://old https://new --dry-run
$ ddev exec phpcs --standard=WordPress wp-content/plugins/radionica-trening
The agent uses the same commands.
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Chapter 3
THE CONTRACT
30
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
AGENTS.md is the contract
31
1
One task at a time. Execute, then stop.
No "while I'm here". I ask for the next step.
2
When something is off, ask — don't improvise.
An unexpected result is not an invitation to a workaround.
3
The agent never commits.
Files on disk. A human reviews, a human commits.
Same file for Claude Code (CLAUDE.md = @AGENTS.md), Codex (AGENTS.md) and Cursor (.cursor/rules).
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
The task before the code
32
---
id: TASK-1
title: 'WS-01: Plugin — show the next training session in the footer'
status: To Do
milestone: 'M1: Workshop'
---
## Description
Effort: S · Estimate: 45min · Actual: — · Billable: no
AI value: — · AI time: —
## Acceptance Criteria
- [ ] #1 Plugin activates without errors (ddev wp plugin activate)
- [ ] #2 Footer shows the nearest future session (date, time, name)
- [ ] #3 With no future session the block does not render
- [ ] #4 phpcs WordPress standard passes
- [ ] #5 No changes outside wp-content/plugins/radionica-trening
Let the model decide where judgment helps. Let code enforce the rules where reliability matters.
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
33
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Commit hook: the record as a by-product
34
type [WS-nn] Description.
feat [WS-01] Show the next training session in the footer. ✔
fix [WS-01] Do not render the block without a future session. ✔
update stuff ✖ hook rejects
git config core.hooksPath .githooks # once per clone
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Three tools, one contract
35
| Claude Code | Codex CLI | Cursor |
Reads rules from | CLAUDE.md → @AGENTS.md | AGENTS.md | .cursor/rules/*.mdc |
Works in | terminal | terminal | editor + terminal |
Subagents | yes, explicit model | yes | limited |
Plan before code | plan mode | prompt | prompt |
Today | on my screen | same flow | same flow |
The difference is the tool, not the method. The contract is the same.
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
NEVER DO A LIVE DEMO!*
-Morten Birch {{mortend.dk}}
36
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Chapter 4
THE WORKTREE
37
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
The plan
38
CHECKPOINT 2
$ git worktree add ../ws-01 -b ws-01
$ cd ../ws-01
$ claude # or: codex / cursor .
# Read backlog/tasks/task-1. Make a plan
# against the acceptance criteria. Do not write code.
Expected
The agent returns a plan: files it changes, the hook it uses, how it verifies #1–#5. You read it and say yes or send it back.
Stuck?
git checkout cp-2
12 minutes · we move on at 12:59
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
The plan before the code: what I look for
39
A good plan
I send it back when it
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
In parallel: two worktrees, two agents
40
$ git worktree add ../ws-02 -b ws-02 # second task
$ git worktree list
/…/workshop-wp-ddev-ai 3d29f8a [main]
/…/ws-01 3d29f8a [ws-01]
/…/ws-02 3d29f8a [ws-02]
Subagent | Model | Does |
scout | Haiku | search, inventory, counting |
worker | Sonnet | implementation, research |
judge | Opus | verification, review, verdict |
The main agent orchestrates. A subagent never inherits the model silently — each gets an explicit model and a bounded scope. Use a cheap model for search and an expensive one for judgment.
ws-01 and ws-02 should run at the same time.
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Chapter 5
THE AGENT
41
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Execution
42
CHECKPOINT 3
# Execute the plan. After every change run:
# ddev exec phpcs --standard=WordPress wp-content/plugins/radionica-trening
# ddev wp plugin activate radionica-trening
# When criteria #1–#5 are met, stop and report.
$ git diff --stat
$ git diff
Expected
Diff only in wp-content/plugins/radionica-trening. phpcs passes. The footer shows the next session.
Stuck?
git checkout cp-3
12 minutes · we move on at 13:11
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Review is the gate
43
What I look at in the diff
The agent's report ≠ the code
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Chapter 6
THE DEPLOY
44
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Ship it
45
CHECKPOINT 4
$ git add -p
$ git commit -m "feat [WS-01] Show the next training session in the footer."
$ ./scripts/deploy.sh test --dry-run
$ ./scripts/deploy.sh test
$ open https://<your-github>.radionica.macmladen.com
Expected
The hook accepts the message. rsync transfers only the plugin. Your URL on your phone shows the next session.
Stuck?
git checkout cp-4
10 minutes · content ends at 13:21
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
What never travels to the server
46
Stays local
The server owns
The rsync --exclude list is in the repo. �Before a deploy: compare WP versions, never downgrade production.
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
The same thing on Invictus, now
47
$ ssh invictus 'cd ~/public_html_test_… && wp core version'
$ ddev wp core version
$ cd new-design/challenge && npm run build && cd -
$ ./scripts/deploy.sh test
$ curl -sI https://test.invictuschallenge.rs | head -1
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Chapter 7
THE MYTHS
48
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
"AI will do it all by itself."
49
Without a task, criteria and review, you get fast code nobody understands.
Including the agent tomorrow. Process, not power.
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
"I can't trust code I didn't write."
50
You should not. That is what the review is for.
Neither you trust a plugin from wordpress.org: you check it. Same here.
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
"That's for big teams."
51
The other way round. One person with a contract, a backlog and agents works like a small team. Big teams have different problems.
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Chapter 8
THE CONCLUSION
52
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Five steps for your own project
53
1
ddev config on an existing project; match PHP and database to production
2
AGENTS.md with the three rules; CLAUDE.md = @AGENTS.md
3
backlog init; first task with criteria, Estimate and Billable
4
commit hook; git log becomes the record
5
deploy.sh with the exclude list; first deploy to test, never straight to live
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
The right tool for the job
54
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Chapter 9
THE RESOURCES
55
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
56
WP-CLI
git worktree
Backlog.md
Claude Code
Codex CLI
Cursor CLI
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Q & A
Mladen Đurić
�@MacMladen
57
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
Mladen Đurić
�@MacMladen
58
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
THANKS!
Mladen Đurić
�@MacMladen
59
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
60
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18
@MacMladen
WordPress, Docker i AI agenti — praktično
v.1 2026-09-18