This repository is a bilingual Jekyll CV and technical blog. This guide describes how to add articles, pages, and tools without breaking the existing design, SEO, or validation.
main. Create an issue, work on a branch, and open
a pull request._site/. It is generated by Jekyll.github-pages gem.css/main.scss is the source; css/main.css is committed and served.js/.jekyll-sitemap into _site/sitemap.xml./blog/:year/:month/:day/:title/.https://www.obocat.com.ruby script/check_bilingual_content.rb.Use an issue that describes the article or change. The issue title and body can be in English; the published article must be bilingual.
If gh is unavailable, use the GitHub API with credentials from
git credential fill. Do not invent issue or pull-request numbers.
maingit switch main
git pull --ff-only
git switch -c feature/<issue-number>-<short-slug>
Example: feature/15-ios-tools-and-agent-guide.
Use a lowercase ASCII slug:
_posts/YYYY-MM-DD-slug.markdown
The date in the filename is the publication date. Future-dated posts are
excluded from normal builds; preview them with --future:
bundle exec jekyll build --future
bundle exec jekyll serve --future
Do not backdate a post just to make it visible in a normal build.
Every post must include:
---
title: "Título en español"
title_en: "Title in English"
date: 2026-11-06 00:00:00
description: "Resumen en español para la tarjeta y SEO."
description_en: "English summary for the card and SEO."
lang: es
tags: [iOS, SwiftUI]
categories: blog
layout: blog
reading_time: 7
---
title_en and description_en are required by the validator.reading_time manually on bilingual posts. The layout otherwise counts
both languages together.Wrap each language in a single container with markdown="1":
<div class="lang-es" lang="es" markdown="1">
Contenido en español.
</div>
<div class="lang-en" lang="en" markdown="1">
Content in English.
</div>
Rules:
div.lang-es or div.lang-en wrappers.struct, property, or function.#Preview when it makes the example easier to try in Xcode.Type-check Swift examples when possible:
swiftc -typecheck /tmp/example.swift
Run the same checks as CI:
ruby script/check_bilingual_content.rb
bundle exec jekyll build --future
Check the generated page and sitemap:
test -f "_site/blog/YYYY/MM/DD/slug/index.html"
grep -n "/blog/YYYY/MM/DD/slug/" _site/sitemap.xml
If SCSS changed, compile the served stylesheet:
bundle exec sass --sourcemap=auto css/main.scss css/main.css
Then rebuild. Always commit the compiled css/main.css when SCSS changes.
Use an English commit message with the issue number:
docs: add custom SF Symbols article (#13)
Push the branch and open a PR against main. The PR body should include:
Closes #<issue>.After the PR check finishes, comment on the issue with:
lang-es and lang-en blocks are non-empty.reading_time is set for bilingual posts.bundle exec jekyll build --future passes.tools/index.html, with a
layout and an explicit permalink.tools/<slug>/index.html and use
layout: tool. Shared tool markup goes in _includes/tools/._layouts/; put page-specific behavior in js/.--bg, --text, --accent, --border, etc.)
instead of hard-coded light/dark colors._site/sitemap.xml after building.sitemap: false explicitly and
explain why in the PR.bundle exec jekyll serve --future
Open http://127.0.0.1:4000/. Use the language switch to verify both versions.
Future-dated posts require --future; without it they will not appear.