Skip to content

Commit 71eca26

Browse files
docs: feature the Domain-Driven Design article on the home page (#23)
Both editions open with the DDD article in the featured block. The English latest list now comes from the catalog generator, which leaves out the featured article.
1 parent 9c19372 commit 71eca26

4 files changed

Lines changed: 68 additions & 80 deletions

File tree

‎docs/index.md‎

Lines changed: 34 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -122,23 +122,23 @@ hide:
122122
</section>
123123

124124
<section class="bdr-featured" markdown="0">
125-
<a class="bdr-featured__visual bdr-home-featured-art" href="blog/posts/2026-10-18-postgresql-partition-maintenance/" aria-label="Read Managing PostgreSQL partitions, one failure at a time"></a>
125+
<a class="bdr-featured__visual bdr-home-featured-art" href="blog/posts/2026-11-02-domain-driven-design/" aria-label="Read Domain-Driven Design: the model first, the patterns later"></a>
126126
<div>
127-
<div class="bdr-featured__eyebrow">Featured · Libraries</div>
127+
<div class="bdr-featured__eyebrow">Featured · Design</div>
128128
<h2 class="bdr-featured__title">
129-
<a href="blog/posts/2026-10-18-postgresql-partition-maintenance/">Managing PostgreSQL partitions, one failure at a time</a>
129+
<a href="blog/posts/2026-11-02-domain-driven-design/">Domain-Driven Design: the model first, the patterns later</a>
130130
</h2>
131131
<p class="bdr-featured__lede">
132-
Two ways a partitioned table gets you out of bed, and the library that grew out of
133-
them: a plan you can read before it runs, ownership that never drops a table it did
134-
not make, the same API async and sync, a command line and a container image for
135-
teams with no Python, hooks from a YAML document, and one page for the AI assistant
136-
doing the wiring.
132+
Every serious service has rules that developers did not invent. Once there are
133+
hundreds of them and the business changes them every quarter, code without a shared
134+
picture starts to fight back. An overview of DDD from strategy to tactics: the model
135+
and its ubiquitous language, bounded contexts, the trilemma of a pure domain,
136+
aggregates, domain events and tests, with the code checked on PostgreSQL.
137137
</p>
138138
<div class="bdr-featured__meta">
139-
<span>September 6, 2026</span>
139+
<span>November 2, 2026</span>
140140
<span>·</span>
141-
<span>Libraries · Tools</span>
141+
<span>Design</span>
142142
</div>
143143
</div>
144144
</section>
@@ -150,66 +150,30 @@ hide:
150150
</div>
151151

152152
<div class="bdr-grid">
153-
<a class="bdr-card" href="blog/posts/2026-10-21-zero-dependency-cores/">
154-
<div class="bdr-card__visual bdr-card__visual--design"></div>
155-
<div class="bdr-card__eyebrow">Design</div>
156-
<h3 class="bdr-card__title">Zero-dependency cores</h3>
157-
<p class="bdr-card__lede">
158-
An infrastructure library ends up in every service, and so does every dependency
159-
it declares. Measured: three of eight install exactly one distribution, and the FastAPI
160-
extra adds twenty-two.
161-
</p>
162-
<div class="bdr-card__meta">September 7, 2026</div>
163-
</a>
164-
165-
<a class="bdr-card" href="blog/posts/2026-10-22-python-library-from-template-to-release/">
166-
<div class="bdr-card__visual bdr-card__visual--meta"></div>
167-
<div class="bdr-card__eyebrow">Meta</div>
168-
<h3 class="bdr-card__title">How I start a production-grade Python library in 2026</h3>
169-
<p class="bdr-card__lede">
170-
One command, forty-one files, a green gate in three seconds. What each group of
171-
files decides, and the line of configuration that selected a rule family and then
172-
ignored it.
173-
</p>
174-
<div class="bdr-card__meta">September 7, 2026</div>
175-
</a>
176-
177-
<a class="bdr-card" href="blog/posts/2026-10-18-postgresql-partition-maintenance/">
178-
<div class="bdr-card__visual bdr-card__visual--tutorials"></div>
179-
<div class="bdr-card__eyebrow">Tutorials</div>
180-
<h3 class="bdr-card__title">Migrating from pg_partman to application-managed partitions</h3>
181-
<p class="bdr-card__lede">
182-
What happens to the partitions that already exist? Measured against pg_partman
183-
5.5: nothing. Both maintainers run side by side, and ownership is decided by bounds
184-
rather than names.
185-
</p>
186-
<div class="bdr-card__meta">September 7, 2026</div>
187-
</a>
188-
189-
190-
191-
192-
193-
194-
195-
196-
197-
198-
199-
200-
201-
202-
203-
204-
205-
206-
207-
208-
209-
210-
211-
212-
</div>
153+
<!-- catalog:home:start -->
154+
<a class="bdr-card" href="blog/posts/2026-10-29-ai-code-review-should-not-be-fully-autonomous/">
155+
<div class="bdr-card__visual" aria-hidden="true"></div>
156+
<div class="bdr-card__eyebrow">Tools</div>
157+
<h3 class="bdr-card__title">Why AI review findings need verification</h3>
158+
<p class="bdr-card__lede">Many teams now run an AI reviewer on merge requests. It writes findings as confidently as a senior colleague, but confidence does not make a finding true.</p>
159+
<div class="bdr-card__meta">2026-10-29</div>
160+
</a>
161+
<a class="bdr-card" href="blog/posts/2026-10-27-why-bedrock-python-libraries/">
162+
<div class="bdr-card__visual" aria-hidden="true"></div>
163+
<div class="bdr-card__eyebrow">Meta</div>
164+
<h3 class="bdr-card__title">Why extract Python service infrastructure into libraries</h3>
165+
<p class="bdr-card__lede">Once there is more than one service, they start sharing plumbing: connection pools, retries, request deadlines, shutdown order.</p>
166+
<div class="bdr-card__meta">2026-10-27</div>
167+
</a>
168+
<a class="bdr-card" href="blog/posts/2026-10-26-documentation-for-ai-coding-agents/">
169+
<div class="bdr-card__visual" aria-hidden="true"></div>
170+
<div class="bdr-card__eyebrow">Meta</div>
171+
<h3 class="bdr-card__title">Documentation that lets an AI coding agent write checkable code</h3>
172+
<p class="bdr-card__lede">More and more service code is written by AI coding agents, and they write it from whatever documentation the project has.</p>
173+
<div class="bdr-card__meta">2026-10-26</div>
174+
</a>
175+
<!-- catalog:home:end -->
176+
</div>
213177
</section>
214178

215179
<section class="bdr-home-pathways" aria-labelledby="home-pathways-title" markdown="0">

‎docs/stylesheets/home.css‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@
4242
.md-typeset .bdr-home-hero__proof a:hover { color: var(--bdr-accent); }
4343
.bdr-home-hero__proof > span[aria-hidden] { color: var(--bdr-border-2); }
4444
.bdr-home-hero a:focus-visible { outline: 2px solid var(--bdr-accent); outline-offset: 5px; }
45-
.bdr-home-featured-art { display: block; background: var(--bdr-surface-2) url("../assets/blog/2026-10-18-postgresql-partition-maintenance.webp") center / cover; border: 1px solid var(--bdr-border); transition: border-color .2s; }
45+
.bdr-home-featured-art { display: block; background: var(--bdr-surface-2) url("../assets/blog/2026-11-02-domain-driven-design.webp") center / cover; border: 1px solid var(--bdr-border); transition: border-color .2s; }
4646
.bdr-home-featured-art:hover { border-color: var(--bdr-accent); }
4747
.bdr-home-featured-art:focus-visible { outline: 2px solid var(--bdr-accent); outline-offset: 5px; }
48-
[data-md-color-scheme="slate"] .bdr-home-featured-art { background-image: url("../assets/blog/2026-10-18-postgresql-partition-maintenance-dark.webp"); }
48+
[data-md-color-scheme="slate"] .bdr-home-featured-art { background-image: url("../assets/blog/2026-11-02-domain-driven-design-dark.webp"); }
4949

5050
/* A few task-based entry points keep the homepage separate from the full catalogs. */
5151
.bdr-home-pathways { padding-top: 28px; margin-bottom: 40px; border-top: 1px solid var(--bdr-border); }

‎scripts/build_blog_catalog.py‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,11 @@ def build_catalog(blog: Path, language: str = "en", check: bool = False) -> list
274274
home_source = home.read_text(encoding="utf-8")
275275
home_start, home_end = "<!-- catalog:home:start -->", "<!-- catalog:home:end -->"
276276
if home_start in home_source and home_end in home_source:
277+
# The featured block above the list already shows its article.
278+
featured = re.search(r'class="bdr-featured__title">\s*<a href="blog/([^"]+)"', home_source)
279+
latest = [article for article in articles if not featured or article["url"] != featured[1]]
277280
cards = []
278-
for article in articles[:3]:
281+
for article in latest[:3]:
279282
cards.append(f'''<a class="bdr-card" href="blog/{html.escape(article['url'])}">
280283
<div class="bdr-card__visual" aria-hidden="true"></div>
281284
<div class="bdr-card__eyebrow">{html.escape(categories[article['categories'][0]])}</div>

‎translations/ru/index.md‎

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -121,17 +121,31 @@ hide:
121121
</figure>
122122
</section>
123123

124+
<section class="bdr-featured" markdown="0">
125+
<a class="bdr-featured__visual bdr-home-featured-art" href="blog/posts/2026-11-02-domain-driven-design/" aria-label="Читать статью Domain-Driven Design: сначала модель, потом паттерны"></a>
126+
<div>
127+
<div class="bdr-featured__eyebrow">Главное · Архитектура</div>
128+
<h2 class="bdr-featured__title">
129+
<a href="blog/posts/2026-11-02-domain-driven-design/">Domain-Driven Design: сначала модель, потом паттерны</a>
130+
</h2>
131+
<p class="bdr-featured__lede">
132+
В каждом серьёзном сервисе есть правила, которые придумали не разработчики. Когда их
133+
сотни и бизнес меняет их каждый квартал, код без общей картины начинает сопротивляться.
134+
Обзор DDD от стратегии к тактике: модель и единый язык, границы контекстов, трилемма
135+
чистого домена, агрегаты, доменные события и тесты, а код проверен на PostgreSQL.
136+
</p>
137+
<div class="bdr-featured__meta">
138+
<span>2 ноября 2026</span>
139+
<span>·</span>
140+
<span>Архитектура</span>
141+
</div>
142+
</div>
143+
</section>
144+
124145
<section markdown="0">
125146
<div class="bdr-section-head"><h2 class="bdr-section-head__title">Новое в блоге</h2><a class="bdr-section-head__link" href="blog/">Все статьи →</a></div>
126147
<div class="bdr-grid">
127148
<!-- catalog:home:start -->
128-
<a class="bdr-card" href="blog/posts/2026-11-02-domain-driven-design/">
129-
<div class="bdr-card__visual" aria-hidden="true"></div>
130-
<div class="bdr-card__eyebrow">Архитектура</div>
131-
<h3 class="bdr-card__title">Domain-Driven Design: сначала модель, потом паттерны</h3>
132-
<p class="bdr-card__lede">В каждом серьёзном сервисе есть правила, которые придумали не разработчики: когда клиенту положена скидка, кто считается сотрудником, сколько груза можно взять сверх нормы.</p>
133-
<div class="bdr-card__meta">2026-11-02</div>
134-
</a>
135149
<a class="bdr-card" href="blog/posts/2026-10-29-ai-code-review-should-not-be-fully-autonomous/">
136150
<div class="bdr-card__visual" aria-hidden="true"></div>
137151
<div class="bdr-card__eyebrow">Инструменты</div>
@@ -146,6 +160,13 @@ hide:
146160
<p class="bdr-card__lede">Когда сервисов становится больше одного, у них появляется общая обвязка: пул соединений, ретраи, дедлайн запроса, порядок остановки.</p>
147161
<div class="bdr-card__meta">2026-10-27</div>
148162
</a>
163+
<a class="bdr-card" href="blog/posts/2026-10-26-documentation-for-ai-coding-agents/">
164+
<div class="bdr-card__visual" aria-hidden="true"></div>
165+
<div class="bdr-card__eyebrow">Об экосистеме</div>
166+
<h3 class="bdr-card__title">Документация, с которой ИИ-агент пишет проверяемый код</h3>
167+
<p class="bdr-card__lede">Всё больше кода в сервисах пишут ИИ-агенты, и пишут его по той документации, которая есть у проекта. Чего в ней не хватает, агент додумывает сам, и не всегда верно.</p>
168+
<div class="bdr-card__meta">2026-10-26</div>
169+
</a>
149170
<!-- catalog:home:end -->
150171
</div>
151172
</section>

0 commit comments

Comments
 (0)