<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Buildando</title><description>Software development best practices, object-oriented design, and the craft of writing good code.</description><link>https://buildando.com/</link><language>en</language><item><title>What Buildando is</title><link>https://buildando.com/en/posts/what-is-buildando/</link><guid isPermaLink="true">https://buildando.com/en/posts/what-is-buildando/</guid><description>A static blog template in Astro: markdown content, no backend, strong SEO, and pluggable integrations. What it is and why it exists.</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Buildando&lt;/strong&gt; is a blog &lt;em&gt;template&lt;/em&gt;: a ready starting point to publish your own
blog in minutes and customize over time. It is what you are reading now — this
site is both the blog and the template anyone can clone.&lt;/p&gt;
&lt;p&gt;If you came for the template, start here and move on to
&lt;a href=&quot;https://buildando.com/en/posts/installing-and-customizing/&quot;&gt;Installing and customizing&lt;/a&gt; and
&lt;a href=&quot;https://buildando.com/en/posts/writing-posts/&quot;&gt;Writing posts&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-idea-in-one-sentence&quot;&gt;The idea in one sentence&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Writing a post is creating a folder with a markdown file — everything else (SEO,
feed, search, theme, languages) is already there, with no server at all.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;no-backend-on-purpose&quot;&gt;No backend, on purpose&lt;/h2&gt;
&lt;p&gt;The blog is &lt;strong&gt;fully static&lt;/strong&gt;: at build time everything the reader needs — pages,
search, feeds, structured data — becomes files any host can serve. No database, no
admin panel, no server to maintain. The two features that would normally need a
backend are delegated:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Search&lt;/strong&gt; is a static index &lt;strong&gt;of the posts&lt;/strong&gt;, built at build time and run in the browser.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comments&lt;/strong&gt; are GitHub Discussions (or another provider) embedded on the page.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That keeps the site fast, cheap to host, and its content versioned in git — where
text and code already feel at home.&lt;/p&gt;
&lt;h2 id=&quot;whats-included&quot;&gt;What’s included&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Markdown content&lt;/strong&gt;, one post per folder, images alongside.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SEO by construction&lt;/strong&gt;: title, description, canonical, Open Graph, Twitter
Card, JSON-LD, &lt;code&gt;sitemap.xml&lt;/code&gt;, &lt;code&gt;robots.txt&lt;/code&gt;, and RSS on every page. Cover-less
posts get an automatic branded social card.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Light/dark theme&lt;/strong&gt; with a toggle, remembered across visits.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multilingual&lt;/strong&gt; with per-locale routes, a switcher, and &lt;code&gt;hreflang&lt;/code&gt; — this post
has a Portuguese version (switch it in the top corner).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search&lt;/strong&gt; (posts only): a live preview in a modal (press &lt;code&gt;/&lt;/code&gt; or &lt;code&gt;⌘K&lt;/code&gt;) and, on
Enter, a &lt;strong&gt;results page&lt;/strong&gt; with the same cards as the feed. Plus a &lt;strong&gt;filter&lt;/strong&gt; by
category, tag, month on the home.&lt;/li&gt;
&lt;li&gt;Optional &lt;strong&gt;share&lt;/strong&gt;, &lt;strong&gt;newsletter&lt;/strong&gt;, and &lt;strong&gt;analytics/ads&lt;/strong&gt; with a consent banner.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;generic-and-contributable&quot;&gt;Generic and contributable&lt;/h2&gt;
&lt;p&gt;Integrations (comments, search, analytics) sit behind &lt;strong&gt;ports&lt;/strong&gt; with pluggable
&lt;strong&gt;adapters&lt;/strong&gt;: switching from giscus to another provider is a one-word config
change. The goal is that you — or anyone — can adapt the template to your stack and
contribute new adapters.&lt;/p&gt;
&lt;p&gt;All identity (name, colors, socials, domain) lives in &lt;strong&gt;one file&lt;/strong&gt;
(&lt;code&gt;src/config/site.ts&lt;/code&gt;), so a fork is editing that file and swapping the logo.&lt;/p&gt;
&lt;h2 id=&quot;who-its-for&quot;&gt;Who it’s for&lt;/h2&gt;
&lt;p&gt;For anyone who wants a &lt;strong&gt;fast, SEO-strong, low-maintenance blog&lt;/strong&gt; without running a
server — and likes writing markdown with content in git. If that’s you, next is
&lt;a href=&quot;https://buildando.com/en/posts/installing-and-customizing/&quot;&gt;install and customize&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>template</category><category>astro</category><category>about</category></item><item><title>Installing Buildando and customizing it</title><link>https://buildando.com/en/posts/installing-and-customizing/</link><guid isPermaLink="true">https://buildando.com/en/posts/installing-and-customizing/</guid><description>Install it, customize the identity and wire the integrations: languages, comments, analytics, ads and newsletter — including what each needs outside the code.</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You have seen &lt;a href=&quot;https://buildando.com/en/posts/what-is-buildando/&quot;&gt;what Buildando is&lt;/a&gt;. Now let’s put
yours online and make it look like you.&lt;/p&gt;
&lt;h2 id=&quot;1-get-the-template&quot;&gt;1. Get the template&lt;/h2&gt;
&lt;p&gt;The template lives at
&lt;a href=&quot;https://github.com/Buildando/template.buildando.com&quot;&gt;github.com/Buildando/template.buildando.com&lt;/a&gt;.
There, click &lt;strong&gt;“Use this template” → Create a new repository&lt;/strong&gt; (or fork it). Then
clone &lt;strong&gt;your&lt;/strong&gt; repository and install:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#F69D50&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt; clone&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt; https://github.com/YOUR-USER/YOUR-REPO.git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt; YOUR-REPO&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#F69D50&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt; install&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#F69D50&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt; dev&lt;/span&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#768390&quot;&gt;      # local server, with hot reload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Open &lt;code&gt;http://localhost:4321&lt;/code&gt; and the blog is already running. Requires Node 22+.&lt;/p&gt;
&lt;h2 id=&quot;2-the-single-configuration-surface&quot;&gt;2. The single configuration surface&lt;/h2&gt;
&lt;p&gt;Almost everything that is “yours” lives in &lt;strong&gt;one file&lt;/strong&gt;: &lt;code&gt;src/config/site.ts&lt;/code&gt;.
That is where you edit the name, domain, author, the &lt;strong&gt;skin&lt;/strong&gt; (colors and fonts —
see section 5), &lt;strong&gt;social links&lt;/strong&gt;, navigation, languages, and the integrations
(comments, search, analytics).&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt; SITE&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  name: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;My Blog&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  url: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;https://my-domain.com&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  author: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;Your Name&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#768390&quot;&gt;  // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Golden rule: if &lt;code&gt;buildando&lt;/code&gt;, the domain, or the author shows up &lt;strong&gt;outside&lt;/strong&gt; that
file, it’s a bug. That is what makes forking so simple.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Swap the assets in &lt;code&gt;public/&lt;/code&gt; too: &lt;code&gt;favicon.svg&lt;/code&gt; (the logo) and &lt;code&gt;og-default.svg&lt;/code&gt;
(the default social image).&lt;/p&gt;
&lt;h2 id=&quot;3-the-home-intro-before-the-feed&quot;&gt;3. The home intro (before the feed)&lt;/h2&gt;
&lt;p&gt;That block at the top of the home page — the title and welcome line, before the
list of posts — is &lt;strong&gt;free-form markdown&lt;/strong&gt;, one per language, in
&lt;code&gt;src/content/home/&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;src/content/home/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  pt.md      ← the Portuguese hero&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  en.md      ← the English hero&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Edit &lt;code&gt;en.md&lt;/code&gt; with whatever you want (title, paragraph, links) — the site’s CSS
handles the looks. Without that file, the home falls back to the site name and
description.&lt;/p&gt;
&lt;h2 id=&quot;4-the-about-the-author-page&quot;&gt;4. The “About the Author” page&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;About&lt;/strong&gt; page lives in &lt;code&gt;src/pages/[lang]/about.astro&lt;/code&gt;. The text for each
language sits right at the top of the file — replace it with yours. The menu link
already points at it.&lt;/p&gt;
&lt;h2 id=&quot;5-visual-identity-skins&quot;&gt;5. Visual identity (skins)&lt;/h2&gt;
&lt;p&gt;The blog’s looks — light/dark palettes, fonts, and reading width — are a &lt;strong&gt;skin&lt;/strong&gt;:
a preset of tokens in &lt;code&gt;src/config/skins.ts&lt;/code&gt;. Switching identity is &lt;strong&gt;one line&lt;/strong&gt; in
&lt;code&gt;site.ts&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt; ACTIVE_SKIN&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#6F42C1;--shiki-dark:#F69D50&quot;&gt; SkinName&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt; &quot;editorial&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Seven of them ship ready:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;terminal&lt;/code&gt;&lt;/strong&gt; — the default: dark, blue accent, Inter + Space Grotesk&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;editorial&lt;/code&gt;&lt;/strong&gt; — serif headings, warm paper, green accent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;mono&lt;/code&gt;&lt;/strong&gt; — monospaced headings, high contrast, amber accent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;minimal&lt;/code&gt;&lt;/strong&gt; — nearly monochrome, discreet lime accent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;warmDev&lt;/code&gt;&lt;/strong&gt; — the Solarized palette&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;brutalist&lt;/code&gt;&lt;/strong&gt; — radical: hard borders, square corners, offset shadows, violet accent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;berry&lt;/code&gt;&lt;/strong&gt; — vibrant magenta/pink over a plum base, wider reading column; changes &lt;strong&gt;structure&lt;/strong&gt; (the filter becomes a left sidebar on the home)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img __ASTRO_IMAGE_=&quot;{&amp;#x22;src&amp;#x22;:&amp;#x22;./skins.png&amp;#x22;,&amp;#x22;alt&amp;#x22;:&amp;#x22;The seven Buildando skins, each in light and dark&amp;#x22;,&amp;#x22;index&amp;#x22;:0}&quot;&gt;&lt;/p&gt;
&lt;p&gt;Each comes with light &lt;strong&gt;and&lt;/strong&gt; dark (the theme button toggles). To craft your own,
copy a preset in &lt;code&gt;skins.ts&lt;/code&gt; and edit the values — it is plain CSS. A skin can even
change &lt;strong&gt;structure&lt;/strong&gt;, not just color: rules scoped by &lt;code&gt;[data-skin=&quot;name&quot;]&lt;/code&gt; in
&lt;code&gt;src/styles/skins.css&lt;/code&gt; — &lt;code&gt;brutalist&lt;/code&gt; and &lt;code&gt;berry&lt;/code&gt; are the examples. More in the
&lt;strong&gt;Skins&lt;/strong&gt; section of the &lt;code&gt;README&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;6-one-language-or-several&quot;&gt;6. One language or several&lt;/h2&gt;
&lt;p&gt;The template ships bilingual (Portuguese and English), but that is configuration,
not structure. The &lt;code&gt;I18N&lt;/code&gt; block decides:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt; I18N&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  defaultLocale: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;pt&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  locales: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;    { code: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;pt&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, label: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;Português&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, htmlLang: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;pt-BR&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, ogLocale: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;pt_BR&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;    { code: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, label: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;English&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,   htmlLang: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,    ogLocale: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;en_US&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;To keep a single language&lt;/strong&gt;, delete the other line. The language switcher
disappears from the header on its own, and URLs stay locale-prefixed (&lt;code&gt;/en/...&lt;/code&gt;).
Delete that language’s hero in &lt;code&gt;src/content/home/&lt;/code&gt; and the posts written in it too —
a post whose &lt;code&gt;lang:&lt;/code&gt; no longer exists fails the build, naming the post.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To add a language&lt;/strong&gt;, add a line to &lt;code&gt;locales&lt;/code&gt; and translate the strings in
&lt;code&gt;src/i18n/ui.ts&lt;/code&gt;. You do not have to guess what is missing: run &lt;code&gt;npm test&lt;/code&gt; and
&lt;code&gt;config-integrity.test.ts&lt;/code&gt; lists exactly the keys the new language still owes.&lt;/p&gt;
&lt;p&gt;Each post declares the language it is written in and links its translations — that
belongs to &lt;a href=&quot;https://buildando.com/en/posts/writing-posts/&quot;&gt;writing posts&lt;/a&gt;. What matters here is that
&lt;strong&gt;nothing forces you to translate everything&lt;/strong&gt;: an untranslated post stays reachable
under the other languages, with the interface translated and the body in its
original language.&lt;/p&gt;
&lt;h2 id=&quot;7-logo-favicon-and-social-images&quot;&gt;7. Logo, favicon and social images&lt;/h2&gt;
&lt;p&gt;Three files and one field:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;public/favicon.svg      ← header logo AND browser-tab icon&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;public/og-default.svg   ← social image for pages with none of their own&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;src/assets/author.jpg   ← the photo on the About page&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The header logo comes from &lt;code&gt;SITE.logo&lt;/code&gt;, which points at &lt;code&gt;/favicon.svg&lt;/code&gt; — replace the
file keeping the name, or change the field. Being SVG, it stays sharp at any size and
weighs nothing.&lt;/p&gt;
&lt;p&gt;Posts need no image: one without a &lt;code&gt;cover&lt;/code&gt; automatically gets a social card generated
at build, carrying your brand and the skin’s colors.&lt;/p&gt;
&lt;h2 id=&quot;8-social-links-and-sharing&quot;&gt;8. Social links and sharing&lt;/h2&gt;
&lt;p&gt;Two different blocks. &lt;code&gt;SOCIAL&lt;/code&gt; is your own profiles, rendered as footer icons:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt; SOCIAL&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  { label: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;GitHub&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, href: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;https://github.com/your-user&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, icon: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;github&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  { label: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;LinkedIn&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, href: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;https://linkedin.com/in/you&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, icon: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;linkedin&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;icon&lt;/code&gt; is a &lt;a href=&quot;https://simple-icons.org&quot;&gt;simple-icons&lt;/a&gt; slug. Ready to use: &lt;code&gt;github&lt;/code&gt;,
&lt;code&gt;instagram&lt;/code&gt;, &lt;code&gt;threads&lt;/code&gt;, &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;tiktok&lt;/code&gt;, &lt;code&gt;facebook&lt;/code&gt;, &lt;code&gt;linkedin&lt;/code&gt;, &lt;code&gt;youtube&lt;/code&gt;, &lt;code&gt;telegram&lt;/code&gt;,
&lt;code&gt;whatsapp&lt;/code&gt; and &lt;code&gt;rss&lt;/code&gt;. An unknown slug simply draws nothing — to add another, edit
&lt;code&gt;src/components/Icon.astro&lt;/code&gt;. An empty list means a footer without icons.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SHARE&lt;/code&gt; is a different thing: the share buttons &lt;strong&gt;at the foot of each post&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt; SHARE&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  networks: [&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;x&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;whatsapp&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;telegram&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;linkedin&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;facebook&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  copyLink: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,   &lt;/span&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#768390&quot;&gt;// copy-link button&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  native: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,     &lt;/span&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#768390&quot;&gt;// the phone&apos;s own share sheet, where available&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;9-turning-integrations-on&quot;&gt;9. Turning integrations on&lt;/h2&gt;
&lt;p&gt;Every integration is opt-in and &lt;strong&gt;empty means off&lt;/strong&gt;: the template as you cloned it
makes not one third-party request. Turn on only what you use — and each one you turn
on changes what the privacy policy declares, on its own.&lt;/p&gt;
&lt;h3 id=&quot;91-comments-with-github-discussions-giscus&quot;&gt;9.1 Comments with GitHub Discussions (giscus)&lt;/h3&gt;
&lt;p&gt;giscus renders a GitHub discussion inside the post. There is no database: the
comments live on GitHub.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create a public repository just for comments&lt;/strong&gt; — say
&lt;code&gt;your-user/my-blog-comments&lt;/code&gt;. It has to be public, but the &lt;strong&gt;blog’s own repository
can stay private&lt;/strong&gt;: they are separate things, which is the reason to dedicate one.&lt;/li&gt;
&lt;li&gt;In that repository, go to &lt;em&gt;Settings → General → Features&lt;/em&gt; and tick &lt;strong&gt;Discussions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Install the giscus app on it: &lt;a href=&quot;https://github.com/apps/giscus&quot;&gt;github.com/apps/giscus&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Open &lt;a href=&quot;https://giscus.app&quot;&gt;giscus.app&lt;/a&gt; and enter &lt;code&gt;owner/repository&lt;/code&gt;. The page checks
the three prerequisites above and, if they hold, hands you &lt;strong&gt;&lt;code&gt;repoId&lt;/code&gt;&lt;/strong&gt; and
&lt;strong&gt;&lt;code&gt;categoryId&lt;/code&gt;&lt;/strong&gt; — pick the &lt;em&gt;Announcements&lt;/em&gt; category, which is announcement-only
and stops anyone opening loose threads.&lt;/li&gt;
&lt;li&gt;Paste into the &lt;code&gt;GISCUS&lt;/code&gt; block:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt; GISCUS&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  repo: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;your-user/my-blog-comments&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  repoId: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;R_kg...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  category: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;Announcements&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  categoryId: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;DIC_kw...&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  mapping: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;pathname&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,   &lt;/span&gt;&lt;span style=&quot;color:#6A737D;--shiki-dark:#768390&quot;&gt;// each post URL maps to a discussion&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  theme: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;site&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;mapping: &quot;pathname&quot;&lt;/code&gt; ties a post to its discussion by URL path. Which means
&lt;strong&gt;renaming a post’s folder orphans its comments&lt;/strong&gt; — the old discussion stays there,
pointing at an address that no longer exists.&lt;/p&gt;
&lt;p&gt;Leave &lt;code&gt;theme: &quot;site&quot;&lt;/code&gt; so the comments follow the blog’s theme button. giscus’s own
default, &lt;code&gt;preferred_color_scheme&lt;/code&gt;, follows the &lt;strong&gt;operating system&lt;/strong&gt;: a reader who puts
the site in light mode while their OS is dark gets dark comments in the middle of a
light page.&lt;/p&gt;
&lt;p&gt;While &lt;code&gt;repoId&lt;/code&gt; is empty the whole section is not rendered — no heading, no script, no
request.&lt;/p&gt;
&lt;h3 id=&quot;92-google-analytics&quot;&gt;9.2 Google Analytics&lt;/h3&gt;
&lt;p&gt;Of the snippet Google hands you, the blog needs &lt;strong&gt;one thing&lt;/strong&gt;: the measurement id.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In Google Analytics, create a GA4 property and a data stream for your domain. It
gives you an id shaped &lt;code&gt;G-XXXXXXXXXX&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Paste it into the config:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;ANALYTICS&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;.googleAnalytics &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt; &quot;G-XXXXXXXXXX&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Do not paste the &lt;code&gt;&amp;#x3C;script&gt;&lt;/code&gt;: the blog emits the very same &lt;code&gt;gtag&lt;/code&gt; calls, only &lt;strong&gt;after
consent&lt;/strong&gt;. Turning GA on lights up three things at once:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the &lt;strong&gt;cookie banner&lt;/strong&gt; starts appearing;&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;privacy policy&lt;/strong&gt; gains its Google Analytics section;&lt;/li&gt;
&lt;li&gt;the footer gains &lt;strong&gt;Cookie preferences&lt;/strong&gt;, for readers who change their mind.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So fill the &lt;code&gt;CONSENT&lt;/code&gt; block along with it (section 9.5). To check it is right, read
the published HTML: there must be no &lt;code&gt;&amp;#x3C;script src=&quot;...googletagmanager...&quot;&gt;&lt;/code&gt; on the
page — the address appears only inside the consent queue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plausible&lt;/strong&gt; is the cookieless alternative: &lt;code&gt;ANALYTICS.plausible = &quot;your-domain.com&quot;&lt;/code&gt;.
Setting no cookie, it triggers no banner.&lt;/p&gt;
&lt;h3 id=&quot;93-adsense&quot;&gt;9.3 AdSense&lt;/h3&gt;
&lt;p&gt;Only worth doing once AdSense has &lt;strong&gt;approved your site&lt;/strong&gt; — approval looks at volume
and originality, and a fresh blog usually waits.&lt;/p&gt;
&lt;p&gt;Three pieces, in three different places:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The publisher id&lt;/strong&gt;, in the config:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;ANALYTICS&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;.adsense &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt; &quot;ca-pub-0000000000000000&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ads.txt&lt;/code&gt;&lt;/strong&gt;, at the site root. Create &lt;code&gt;public/ads.txt&lt;/code&gt; with the exact line AdSense
gives you — everything in &lt;code&gt;public/&lt;/code&gt; lands at the domain root, which is where Google
looks:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;google.com, pub-0000000000000000, DIRECT, f08c47fec0942fa0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;The formats, in the AdSense dashboard&lt;/strong&gt;, under &lt;em&gt;Ads → By site&lt;/em&gt;. Without that step
the script loads and &lt;strong&gt;no ad appears&lt;/strong&gt; — a symptom indistinguishable from a bug.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The account-verification meta tag needs no pasting: it is emitted from the publisher
id. And since all advertising sits behind consent, readers who decline see no ads —
correct behaviour, and less revenue than the dashboard projects.&lt;/p&gt;
&lt;p&gt;Automatic formats let Google decide where to insert, including between paragraphs and
pinned to the bottom. To decide yourself, place &lt;code&gt;src/components/AdUnit.astro&lt;/code&gt; with a
slot created in the dashboard — &lt;strong&gt;no page uses it by default&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;94-newsletter&quot;&gt;9.4 Newsletter&lt;/h3&gt;
&lt;p&gt;First, a confusion that costs time: &lt;strong&gt;RSS does not send email&lt;/strong&gt;. The feed is a file
the site publishes; what reads it is a feed reader. Reaching an inbox takes a provider
in between, and that provider is what turns “a new post is out” into a message.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pick a provider with RSS-to-email.&lt;/strong&gt; Mind the plan: several charge for precisely
that automation, even with a handful of subscribers. Worth checking before signing up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Create one list per language.&lt;/strong&gt; The feed is per language, so a list fed from it is
too — someone subscribing in English should not receive Portuguese posts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Take the real form fields, not the iframe.&lt;/strong&gt; This is where it is easy to go wrong:
providers offer an iframe or a ready-made link, but what you need is the &lt;strong&gt;HTML form&lt;/strong&gt;.
If only the link exists, open the hosted form page and read its HTML — the three
things that matter are there:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the &lt;code&gt;action&lt;/code&gt; (where the form posts);&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;name of the email field&lt;/strong&gt;, often not &lt;code&gt;email&lt;/code&gt; (Brevo uses &lt;code&gt;EMAIL&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;hidden fields&lt;/strong&gt;, including the &lt;strong&gt;anti-bot honeypot&lt;/strong&gt; — a field that must be
submitted &lt;strong&gt;empty&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Posting without them is the worst kind of failure: the provider &lt;strong&gt;accepts&lt;/strong&gt; the request
and subscribes nobody. The form looks like it works.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt; NEWSLETTER&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  actionUrl: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;    pt: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;https://provider.example/serve/AAA&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;    en: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;https://provider.example/serve/BBB&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  emailField: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;EMAIL&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  hiddenFields: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;    pt: { locale: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;pt&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, email_address_check: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;    en: { locale: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;, email_address_check: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A language with no endpoint simply shows no form — better no form than the wrong list.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Close the loop in the dashboard:&lt;/strong&gt; create one RSS-to-email integration per list,
pointing at the matching feed (&lt;code&gt;/pt/rss.xml&lt;/code&gt;, &lt;code&gt;/en/rss.xml&lt;/code&gt;). From then on, publishing
a post sends the email by itself. Two things to watch on the first run: many providers
pull several items at once and your feed already has posts — check how many it intends
to send before letting it go; and there is usually a window of about an hour between
publishing and sending.&lt;/p&gt;
&lt;p&gt;With JavaScript the submission happens in the background and the reader stays on the
page; without it, the form posts normally. No subscriber data touches your site.&lt;/p&gt;
&lt;h3 id=&quot;95-consent-and-the-privacy-policy&quot;&gt;9.5 Consent and the privacy policy&lt;/h3&gt;
&lt;p&gt;This block turns nothing on — it governs what the others oblige:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt; CONSENT&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  required: &lt;/span&gt;&lt;span style=&quot;color:#005CC5;--shiki-dark:#6CB6FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  privacyUrl: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;/privacy&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  contact: &lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-dark:#96D0FF&quot;&gt;&quot;privacy@your-domain.com&quot;&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#D73A49;--shiki-dark:#F47067&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;contact&lt;/code&gt; is the address the policy offers for data-subject requests. Create the
mailbox before publishing: a policy pointing at an address that does not exist is
worse than no address at all.&lt;/p&gt;
&lt;p&gt;The privacy page &lt;strong&gt;assembles itself from the configuration&lt;/strong&gt;. You neither write nor
maintain that text: with Google Analytics on, its section appears; with a newsletter
in that language, the newsletter section appears; with no ads, the sentence mentioning
them goes away. And when &lt;strong&gt;nothing&lt;/strong&gt; is on — no analytics, no ads, no comments embed,
no signup form — there is no privacy page, no footer link and no banner: a blog that
collects nothing has nothing to declare.&lt;/p&gt;
&lt;p&gt;Do read the page once everything is configured. It describes what the site really
does, but you are the one answering for the text.&lt;/p&gt;
&lt;h3 id=&quot;96-search&quot;&gt;9.6 Search&lt;/h3&gt;
&lt;p&gt;Nothing to configure beyond on or off: &lt;code&gt;INTEGRATIONS.search = &quot;pagefind&quot;&lt;/code&gt; or &lt;code&gt;&quot;none&quot;&lt;/code&gt;.
The index is built at build time, split by language, and runs in the browser — there
is no search server to keep.&lt;/p&gt;
&lt;h2 id=&quot;10-rss&quot;&gt;10. RSS&lt;/h2&gt;
&lt;p&gt;Nothing to configure: the feed is generated on its own, &lt;strong&gt;one per language&lt;/strong&gt;, at
&lt;code&gt;/pt/rss.xml&lt;/code&gt; and &lt;code&gt;/en/rss.xml&lt;/code&gt;. It is already announced in the &lt;code&gt;&amp;#x3C;head&gt;&lt;/code&gt; of every
page, so feed readers find it by themselves, and there is an icon in the footer.
Title, description and domain come from &lt;code&gt;SITE&lt;/code&gt; — changing your identity in step 2
already fixes the feed.&lt;/p&gt;
&lt;p&gt;Drafts never reach the feed.&lt;/p&gt;
&lt;h2 id=&quot;11-publishing&quot;&gt;11. Publishing&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;npm run build&lt;/code&gt; produces the static &lt;code&gt;dist/&lt;/code&gt; folder, which runs on &lt;strong&gt;any&lt;/strong&gt; host:
object storage, a CDN, a static host, or classic shared hosting.&lt;/p&gt;
&lt;p&gt;The template ships &lt;strong&gt;no&lt;/strong&gt; deploy workflow, deliberately: automation belongs to a
concrete site, with its own host and credentials, and a workflow that cannot run is
a red CI badge on every fork before it has decided anything. Once you have hosting,
the &lt;strong&gt;Deploying&lt;/strong&gt; section of the &lt;code&gt;README&lt;/code&gt; covers the two transports that fit shared
hosting — rsync over SSH and FTPS — with the traps of each.&lt;/p&gt;
&lt;p&gt;Before publishing, &lt;code&gt;npm test&lt;/code&gt; is worth the minute it takes: besides checking the
build, it verifies that your configuration hangs together — a language without its
translations, a skin that does not exist, consent switched off while analytics is on.&lt;/p&gt;
&lt;p&gt;There you go — the skeleton is yours. The next step is the one that matters most:
&lt;a href=&quot;https://buildando.com/en/posts/writing-posts/&quot;&gt;writing posts&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>setup</category><category>configuration</category><category>guide</category></item><item><title>Writing posts in Buildando</title><link>https://buildando.com/en/posts/writing-posts/</link><guid isPermaLink="true">https://buildando.com/en/posts/writing-posts/</guid><description>A post is a folder with a markdown file. Frontmatter, colocated images, drafts, and translations — without touching any code.</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;With the blog &lt;a href=&quot;https://buildando.com/en/posts/installing-and-customizing/&quot;&gt;installed and customized&lt;/a&gt;,
writing is the easy part — and the reason the template exists.&lt;/p&gt;
&lt;h2 id=&quot;a-post-is-a-folder&quot;&gt;A post is a folder&lt;/h2&gt;
&lt;p&gt;To publish, create a directory in &lt;code&gt;src/content/posts/&lt;/code&gt; with an &lt;code&gt;index.md&lt;/code&gt; inside.
Nothing else in the project changes.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;src/content/posts/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  my-first-post/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    index.md      ← the content&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    cover.png     ← images live next to the markdown&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;folder name&lt;/strong&gt; becomes the post’s address (its &lt;em&gt;slug&lt;/em&gt;): &lt;code&gt;my-first-post&lt;/code&gt; →
&lt;code&gt;/en/posts/my-first-post/&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-frontmatter&quot;&gt;The frontmatter&lt;/h2&gt;
&lt;p&gt;The block at the top of &lt;code&gt;index.md&lt;/code&gt; describes the post. Three fields are
&lt;strong&gt;required&lt;/strong&gt; — the build fails and names the post and the field when one is
missing:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;markdown&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#6CB6FF;--shiki-dark-font-weight:bold&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;title: &quot;Post title&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;description: &quot;A one-sentence summary — it becomes the search snippet and the social preview.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;publishDate: 2026-07-20&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;category: &quot;Best Practices&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;tags: [oo, testing]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;cover: ./cover.png       # image colocated in the same folder (optional)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;coverAlt: &quot;Description of the cover&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;draft: false             # true hides it from production&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#6CB6FF;--shiki-dark-font-weight:bold&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;Your content in &lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-light-font-weight:bold;--shiki-dark:#ADBAC7;--shiki-dark-font-weight:bold&quot;&gt;**markdown**&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt; here.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Everything else has a default. The full schema lives in &lt;code&gt;src/content/config.ts&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;images&quot;&gt;Images&lt;/h2&gt;
&lt;p&gt;Put images &lt;strong&gt;in the post’s folder&lt;/strong&gt; and reference them by relative path. At build
time they are &lt;strong&gt;optimized&lt;/strong&gt; and served in responsive sizes (WebP), with nothing
for you to configure:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;markdown&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;![&lt;/span&gt;&lt;span style=&quot;color:#032F62;--shiki-light-text-decoration:underline;--shiki-dark:#96D0FF;--shiki-dark-text-decoration:inherit&quot;&gt;A diagram&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;](&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-light-text-decoration:underline;--shiki-dark:#ADBAC7;--shiki-dark-text-decoration:underline&quot;&gt;./diagram.png&lt;/span&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A nice detail: if you set &lt;strong&gt;no&lt;/strong&gt; &lt;code&gt;cover&lt;/code&gt;, the post &lt;strong&gt;automatically&lt;/strong&gt; gets a
branded social card, generated at build — so every post has a good image when
shared, even when you draw none.&lt;/p&gt;
&lt;h2 id=&quot;drafts&quot;&gt;Drafts&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;draft: true&lt;/code&gt; keeps the post in the repository but &lt;strong&gt;out of production&lt;/strong&gt;: it shows
up only under &lt;code&gt;npm run dev&lt;/code&gt; and is excluded from pages, listings, facets, sitemap,
RSS, and search. Great for writing at your own pace before publishing.&lt;/p&gt;
&lt;h2 id=&quot;languages-and-translations&quot;&gt;Languages and translations&lt;/h2&gt;
&lt;p&gt;Every post declares its language with &lt;code&gt;lang:&lt;/code&gt; and links its translations with
&lt;code&gt;translations:&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark-dimmed&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#22272e;color:#24292e;--shiki-dark:#adbac7; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;markdown&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;lang: en&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;translations:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#24292E;--shiki-dark:#ADBAC7&quot;&gt;  pt: meu-primeiro-post   # the slug of the Portuguese version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The language switcher then goes straight to the translation. When there is none,
it keeps you on the post and translates only the page’s interface.&lt;/p&gt;
&lt;h2 id=&quot;what-about-css&quot;&gt;What about CSS?&lt;/h2&gt;
&lt;p&gt;You need none. Markdown inherits the &lt;strong&gt;site’s typography&lt;/strong&gt; — headings, lists,
tables, quotes, and code blocks come out styled already. Write the way you think.&lt;/p&gt;
&lt;p&gt;That’s it: delete the example posts, copy a folder as a base, and start writing.&lt;/p&gt;</content:encoded><category>posts</category><category>markdown</category><category>guide</category></item></channel></rss>