diff --git a/.editorconfig b/.editorconfig
index 257221d2..5e9a93ea 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -12,3 +12,6 @@ trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
+
+[*.yml]
+indent_size = 2
diff --git a/.github/workflows/jekyll-gh-pages.yml b/.github/workflows/jekyll-gh-pages.yml
new file mode 100644
index 00000000..91e101e6
--- /dev/null
+++ b/.github/workflows/jekyll-gh-pages.yml
@@ -0,0 +1,57 @@
+name: Deploy Jekyll with GitHub Pages
+
+on:
+ pull_request: # TEMPORARY !!!
+ push:
+ branches: ["master"]
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: "pages"
+ cancel-in-progress: false
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v6
+
+ - name: Install dependencies
+ run: |
+ docker run --rm \
+ --user $(id -u):$(id -g) \
+ -v "${{ github.workspace }}:/srv/jekyll" \
+ -w /srv/jekyll \
+ -e BUNDLE_PATH=/srv/jekyll/vendor/bundle \
+ jekyll/jekyll:4.2.2 \
+ bundle install
+
+ - name: Build site
+ run: |
+ docker run --rm \
+ --user $(id -u):$(id -g) \
+ -v "${{ github.workspace }}:/srv/jekyll" \
+ -w /srv/jekyll \
+ -e BUNDLE_PATH=/srv/jekyll/vendor/bundle \
+ jekyll/jekyll:4.2.2 \
+ bundle exec jekyll build -d ./_site
+
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v4
+
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.gitignore b/.gitignore
index 4f895a9d..2f2678c9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,4 +16,8 @@ Thumbs.db
.DS_Store
# po4a .mo files
-*.mo
\ No newline at end of file
+*.mo
+
+# Jekyll
+/.jekyll-cache/
+/_site/
diff --git a/.nojekyll b/.nojekyll
deleted file mode 100644
index e69de29b..00000000
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 00000000..a2ec72f6
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,12 @@
+source "https://rubygems.org"
+
+gem "jekyll", "~> 4.2.2"
+gem "minima", "~> 2.5.2"
+gem "webrick", "~> 1.8"
+
+group :jekyll_plugins do
+ gem "jekyll-seo-tag", "~> 2.8.0"
+ gem "jekyll-optional-front-matter", "~> 0.3.2"
+ gem "jekyll-readme-index", "~> 0.3.0"
+ gem "jekyll-relative-links", "~> 0.7.0"
+end
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 00000000..86ef4217
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,88 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ addressable (2.8.8)
+ public_suffix (>= 2.0.2, < 8.0)
+ colorator (1.1.0)
+ concurrent-ruby (1.3.6)
+ em-websocket (0.5.3)
+ eventmachine (>= 0.12.9)
+ http_parser.rb (~> 0)
+ eventmachine (1.2.7)
+ ffi (1.17.2-x86_64-linux-musl)
+ forwardable-extended (2.6.0)
+ http_parser.rb (0.8.0)
+ i18n (1.14.8)
+ concurrent-ruby (~> 1.0)
+ jekyll (4.2.2)
+ addressable (~> 2.4)
+ colorator (~> 1.0)
+ em-websocket (~> 0.5)
+ i18n (~> 1.0)
+ jekyll-sass-converter (~> 2.0)
+ jekyll-watch (~> 2.0)
+ kramdown (~> 2.3)
+ kramdown-parser-gfm (~> 1.0)
+ liquid (~> 4.0)
+ mercenary (~> 0.4.0)
+ pathutil (~> 0.9)
+ rouge (~> 3.0)
+ safe_yaml (~> 1.0)
+ terminal-table (~> 2.0)
+ jekyll-feed (0.17.0)
+ jekyll (>= 3.7, < 5.0)
+ jekyll-optional-front-matter (0.3.2)
+ jekyll (>= 3.0, < 5.0)
+ jekyll-readme-index (0.3.0)
+ jekyll (>= 3.0, < 5.0)
+ jekyll-relative-links (0.7.0)
+ jekyll (>= 3.3, < 5.0)
+ jekyll-sass-converter (2.2.0)
+ sassc (> 2.0.1, < 3.0)
+ jekyll-seo-tag (2.8.0)
+ jekyll (>= 3.8, < 5.0)
+ jekyll-watch (2.2.1)
+ listen (~> 3.0)
+ kramdown (2.5.1)
+ rexml (>= 3.3.9)
+ kramdown-parser-gfm (1.1.0)
+ kramdown (~> 2.0)
+ liquid (4.0.4)
+ listen (3.9.0)
+ rb-fsevent (~> 0.10, >= 0.10.3)
+ rb-inotify (~> 0.9, >= 0.9.10)
+ mercenary (0.4.0)
+ minima (2.5.2)
+ jekyll (>= 3.5, < 5.0)
+ jekyll-feed (~> 0.9)
+ jekyll-seo-tag (~> 2.1)
+ pathutil (0.16.2)
+ forwardable-extended (~> 2.6)
+ public_suffix (6.0.2)
+ rb-fsevent (0.11.2)
+ rb-inotify (0.11.1)
+ ffi (~> 1.0)
+ rexml (3.4.4)
+ rouge (3.30.0)
+ safe_yaml (1.0.5)
+ sassc (2.4.0)
+ ffi (~> 1.9)
+ terminal-table (2.0.0)
+ unicode-display_width (~> 1.1, >= 1.1.1)
+ unicode-display_width (1.8.0)
+ webrick (1.9.2)
+
+PLATFORMS
+ x86_64-linux-musl
+
+DEPENDENCIES
+ jekyll (~> 4.2.2)
+ jekyll-optional-front-matter (~> 0.3.2)
+ jekyll-readme-index (~> 0.3.0)
+ jekyll-relative-links (~> 0.7.0)
+ jekyll-seo-tag (~> 2.8.0)
+ minima (~> 2.5.2)
+ webrick (~> 1.8)
+
+BUNDLED WITH
+ 2.3.25
diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..a8de00dd
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,7 @@
+serve:
+ docker run --rm -it \
+ -p 4000:4000 \
+ -v $(PWD):/srv/jekyll \
+ --name yiisoft-docs-dev \
+ jekyll/jekyll:4.2.2 \
+ jekyll serve --host 0.0.0.0 --livereload
diff --git a/_config.yml b/_config.yml
new file mode 100644
index 00000000..a8a99461
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1,10 @@
+defaults:
+ - scope:
+ path: ""
+ values:
+ layout: "default"
+ render_with_liquid: false
+baseurl: "/docs"
+theme: minima
+relative_links:
+ enabled: true
diff --git a/_layouts/default.html b/_layouts/default.html
new file mode 100644
index 00000000..f819227d
--- /dev/null
+++ b/_layouts/default.html
@@ -0,0 +1,28 @@
+
+
+
+ {%- include head.html -%}
+
+
+
+ {%- include header.html -%}
+
+
+
+ {{ content }}
+
+
+
+ {%- include footer.html -%}
+
+
+
+
+
+
diff --git a/_translations/guide/po/es/start_workflow.md.po b/_translations/guide/po/es/start_workflow.md.po
index b6b2c01c..924f1674 100644
--- a/_translations/guide/po/es/start_workflow.md.po
+++ b/_translations/guide/po/es/start_workflow.md.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2025-10-19 11:32+0000\n"
+"POT-Creation-Date: 2025-12-20 13:19+0000\n"
"PO-Revision-Date: 2025-09-04 11:19+0500\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -40,7 +40,7 @@ msgstr ""
#. type: Plain text
#: ../../guide/en/start/workflow.md
-msgid "The installed application has only the homepage, which displays when you access the URL `http://localhost/`. It shares a common layout that you can reuse on further pages."
+msgid "The installed application contains only one page, accessible at `http://localhost/`. It shares a common layout that you can reuse on further pages."
msgstr ""
#. type: Plain text
@@ -133,9 +133,24 @@ msgstr ""
msgid "The following diagram shows how an application handles a request."
msgstr ""
-#. type: Plain text
+#. type: Fenced code block (mermaid)
#: ../../guide/en/start/workflow.md
-msgid ""
+#, no-wrap
+msgid ""
+"flowchart LR\n"
+" user[User's client] --> index\n"
+" index[index.php] --> DI[Initialize Dependency Container]\n"
+" config[configs] -.-> DI\n"
+" DI --> RequestFactory[RequestFactory]\n"
+" RequestFactory -->|Request| app[Application]\n"
+" app -->|Request| middleware[Middleware]\n"
+" middleware -->|Request| router[Router]\n"
+" router -->|Request| action[Action Handler]\n"
+" action -->|Response| emitter[SapiEmitter]\n"
+" router -->|Response| emitter\n"
+" middleware -->|Response| emitter\n"
+" app -->|Response| emitter\n"
+" emitter --> user\n"
msgstr ""
#. type: Bullet: '1. '
diff --git a/_translations/guide/po/id/start_workflow.md.po b/_translations/guide/po/id/start_workflow.md.po
index 185c9f50..cbc391a2 100644
--- a/_translations/guide/po/id/start_workflow.md.po
+++ b/_translations/guide/po/id/start_workflow.md.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2025-10-19 11:32+0000\n"
+"POT-Creation-Date: 2025-12-20 13:19+0000\n"
"PO-Revision-Date: 2025-09-04 11:19+0500\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -39,7 +39,7 @@ msgstr ""
#. type: Plain text
#: ../../guide/en/start/workflow.md
-msgid "The installed application has only the homepage, which displays when you access the URL `http://localhost/`. It shares a common layout that you can reuse on further pages."
+msgid "The installed application contains only one page, accessible at `http://localhost/`. It shares a common layout that you can reuse on further pages."
msgstr ""
#. type: Plain text
@@ -132,9 +132,24 @@ msgstr ""
msgid "The following diagram shows how an application handles a request."
msgstr ""
-#. type: Plain text
+#. type: Fenced code block (mermaid)
#: ../../guide/en/start/workflow.md
-msgid ""
+#, no-wrap
+msgid ""
+"flowchart LR\n"
+" user[User's client] --> index\n"
+" index[index.php] --> DI[Initialize Dependency Container]\n"
+" config[configs] -.-> DI\n"
+" DI --> RequestFactory[RequestFactory]\n"
+" RequestFactory -->|Request| app[Application]\n"
+" app -->|Request| middleware[Middleware]\n"
+" middleware -->|Request| router[Router]\n"
+" router -->|Request| action[Action Handler]\n"
+" action -->|Response| emitter[SapiEmitter]\n"
+" router -->|Response| emitter\n"
+" middleware -->|Response| emitter\n"
+" app -->|Response| emitter\n"
+" emitter --> user\n"
msgstr ""
#. type: Bullet: '1. '
diff --git a/_translations/guide/po/ru/start_workflow.md.po b/_translations/guide/po/ru/start_workflow.md.po
index d9268109..f6c70341 100644
--- a/_translations/guide/po/ru/start_workflow.md.po
+++ b/_translations/guide/po/ru/start_workflow.md.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2025-10-19 11:32+0000\n"
+"POT-Creation-Date: 2025-12-20 13:19+0000\n"
"PO-Revision-Date: 2025-09-04 11:19+0500\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -41,7 +41,7 @@ msgstr "Определение псевдонимов "
msgid "The following diagram shows how an application handles a request."
msgstr ""
-#. type: Plain text
+#. type: Fenced code block (mermaid)
#: ../../guide/en/start/workflow.md
-msgid ""
+#, no-wrap
+msgid ""
+"flowchart LR\n"
+" user[User's client] --> index\n"
+" index[index.php] --> DI[Initialize Dependency Container]\n"
+" config[configs] -.-> DI\n"
+" DI --> RequestFactory[RequestFactory]\n"
+" RequestFactory -->|Request| app[Application]\n"
+" app -->|Request| middleware[Middleware]\n"
+" middleware -->|Request| router[Router]\n"
+" router -->|Request| action[Action Handler]\n"
+" action -->|Response| emitter[SapiEmitter]\n"
+" router -->|Response| emitter\n"
+" middleware -->|Response| emitter\n"
+" app -->|Response| emitter\n"
+" emitter --> user\n"
msgstr ""
#. type: Bullet: '1. '
diff --git a/_translations/guide/pot/start_workflow.md.pot b/_translations/guide/pot/start_workflow.md.pot
index 94ea186f..65235a19 100644
--- a/_translations/guide/pot/start_workflow.md.pot
+++ b/_translations/guide/pot/start_workflow.md.pot
@@ -7,7 +7,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2025-10-19 11:32+0000\n"
+"POT-Creation-Date: 2025-12-20 13:19+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -47,9 +47,8 @@ msgstr ""
#. type: Plain text
#: ../../guide/en/start/workflow.md
msgid ""
-"The installed application has only the homepage, which displays when you "
-"access the URL `http://localhost/`. It shares a common layout that you can "
-"reuse on further pages."
+"The installed application contains only one page, accessible at `http://"
+"localhost/`. It shares a common layout that you can reuse on further pages."
msgstr ""
#. type: Plain text
@@ -165,9 +164,24 @@ msgstr ""
msgid "The following diagram shows how an application handles a request."
msgstr ""
-#. type: Plain text
+#. type: Fenced code block (mermaid)
#: ../../guide/en/start/workflow.md
-msgid ""
+#, no-wrap
+msgid ""
+"flowchart LR\n"
+" user[User's client] --> index\n"
+" index[index.php] --> DI[Initialize Dependency Container]\n"
+" config[configs] -.-> DI\n"
+" DI --> RequestFactory[RequestFactory]\n"
+" RequestFactory -->|Request| app[Application]\n"
+" app -->|Request| middleware[Middleware]\n"
+" middleware -->|Request| router[Router]\n"
+" router -->|Request| action[Action Handler]\n"
+" action -->|Response| emitter[SapiEmitter]\n"
+" router -->|Response| emitter\n"
+" middleware -->|Response| emitter\n"
+" app -->|Response| emitter\n"
+" emitter --> user\n"
msgstr ""
#. type: Bullet: '1. '
diff --git a/guide/es/start/workflow.md b/guide/es/start/workflow.md
index 696d9556..2adb636b 100644
--- a/guide/es/start/workflow.md
+++ b/guide/es/start/workflow.md
@@ -10,9 +10,9 @@ you need.
## Functionality
-The installed application has only the homepage, which displays when you
-access the URL `http://localhost/`. It shares a common layout that you can
-reuse on further pages.
+The installed application contains only one page, accessible at
+`http://localhost/`. It shares a common layout that you can reuse on
+further pages.
index
+ index[index.php] --> DI[Initialize Dependency Container]
+ config[configs] -.-> DI
+ DI --> RequestFactory[RequestFactory]
+ RequestFactory -->|Request| app[Application]
+ app -->|Request| middleware[Middleware]
+ middleware -->|Request| router[Router]
+ router -->|Request| action[Action Handler]
+ action -->|Response| emitter[SapiEmitter]
+ router -->|Response| emitter
+ middleware -->|Response| emitter
+ app -->|Response| emitter
+ emitter --> user
+```
1. A user makes a request to the [entry
script](../structure/entry-script.md) `public/index.php`.
diff --git a/guide/id/start/workflow.md b/guide/id/start/workflow.md
index 696d9556..2adb636b 100644
--- a/guide/id/start/workflow.md
+++ b/guide/id/start/workflow.md
@@ -10,9 +10,9 @@ you need.
## Functionality
-The installed application has only the homepage, which displays when you
-access the URL `http://localhost/`. It shares a common layout that you can
-reuse on further pages.
+The installed application contains only one page, accessible at
+`http://localhost/`. It shares a common layout that you can reuse on
+further pages.
index
+ index[index.php] --> DI[Initialize Dependency Container]
+ config[configs] -.-> DI
+ DI --> RequestFactory[RequestFactory]
+ RequestFactory -->|Request| app[Application]
+ app -->|Request| middleware[Middleware]
+ middleware -->|Request| router[Router]
+ router -->|Request| action[Action Handler]
+ action -->|Response| emitter[SapiEmitter]
+ router -->|Response| emitter
+ middleware -->|Response| emitter
+ app -->|Response| emitter
+ emitter --> user
+```
1. A user makes a request to the [entry
script](../structure/entry-script.md) `public/index.php`.
diff --git a/guide/ru/start/workflow.md b/guide/ru/start/workflow.md
index 696d9556..2adb636b 100644
--- a/guide/ru/start/workflow.md
+++ b/guide/ru/start/workflow.md
@@ -10,9 +10,9 @@ you need.
## Functionality
-The installed application has only the homepage, which displays when you
-access the URL `http://localhost/`. It shares a common layout that you can
-reuse on further pages.
+The installed application contains only one page, accessible at
+`http://localhost/`. It shares a common layout that you can reuse on
+further pages.
index
+ index[index.php] --> DI[Initialize Dependency Container]
+ config[configs] -.-> DI
+ DI --> RequestFactory[RequestFactory]
+ RequestFactory -->|Request| app[Application]
+ app -->|Request| middleware[Middleware]
+ middleware -->|Request| router[Router]
+ router -->|Request| action[Action Handler]
+ action -->|Response| emitter[SapiEmitter]
+ router -->|Response| emitter
+ middleware -->|Response| emitter
+ app -->|Response| emitter
+ emitter --> user
+```
1. A user makes a request to the [entry
script](../structure/entry-script.md) `public/index.php`.