| name | seo-post-frontmatter |
| description | Apply SEO frontmatter (description, image, permalink, redirect_from, alt text) to a Jekyll _posts/*.md file so individual posts rank well on Google. Use this whenever the user creates a new post in `_posts/` and asks for SEO, "๊ฒ์ ์๋๊ฒ", "frontmatter ์ฑ์์ค", or otherwise wants the same treatment that was applied site-wide on 2026-05-07. |
Apply SEO frontmatter to a Jekyll post
This skill is the canonical "make this post Google-friendly" workflow for the repo. It's the same procedure that was applied site-wide on 2026-05-07; following it keeps every post's metadata shape consistent.
When to use
- User just wrote a new post under
_posts/ and asks for SEO / search optimization / frontmatter polishing.
- User says things like "์ด ๊ธ๋ SEO ์ ์ฉํด์ค", "permalink ๋ง๋ค์ด์ค", "๊ฒ์ ์ ๋๊ฒ".
- A post is missing one or more of:
description, image, permalink, redirect_from.
If the user wants you to apply this to MANY files at once (e.g., a series), still apply the rules below per-file; consider dispatching subagents for parallelism.
Inputs
- Path(s) to one or more
_posts/*.md files. If none provided, ask which post.
Steps for EACH file
- Read the file.
- Locate existing YAML frontmatter (between
--- delimiters at the top).
- Add these new keys without removing or modifying existing keys:
description: <Korean 1-2 sentences, 80-150 chars>
image: <first /img/... path in body, OMIT this key entirely if no image>
permalink: /YYYY/MM/DD/<english-slug>/
redirect_from:
- '/YYYY-MM-DD-<filename-stem>/'
- '/YYYY-MM-DD-<filename-stem-slugified>/'
- Improve image alt text in the body: replace any
 (empty alt) with . Don't change images that already have alt text. Don't modify other markdown.
- Write the file back.
Don't remove or change any existing frontmatter keys. Don't reflow code blocks, math, or tables.
Rules per key
description
1-2 Korean sentences, ~80-150 characters. Specific, with keywords from post topic. Match the existing voice of the post (-ํ๋ค/-์ด๋ค plain or -ํฉ๋๋ค formal).
GOOD:
"PCL VoxelGrid filter๋ก pointcloud๋ฅผ voxel ๋จ์๋ก ๋ค์ด์ํ๋งํด ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์ฐ๋์ ์ค์ด๋ ๋ฐฉ๋ฒ๊ณผ setLeafSize ์ฌ์ฉ๋ฒ์ ์ ๋ฆฌํ๋ค."
"GTSAM์ BetweenFactor๋ฅผ SLAM ์
๋ฌธ์๊ฐ ์ดํดํ ์ ์๋๋ก, factor graph ์์์ ๋ pose ์ฌ์ด์ ์๋ ๋ณํ์ ์ด๋ป๊ฒ ํํํ๋์ง ์ฐจ๊ทผ์ฐจ๊ทผ ํ์ด๋ณธ๋ค."
BAD (too generic):
"PCL ์ฌ์ฉ๋ฒ์ ์ค๋ช
ํ๋ค."
"์ด ๊ธ์์๋ ~์ ๋ค๋ฃฌ๋ค."
image
Scan the body for the FIRST /img/<filename>.<ext> reference (whether in  or <img src="path"> form). Use that path. If post has NO /img/ reference, OMIT the image: key entirely (don't write empty value).
permalink
Format: /YYYY/MM/DD/<english-slug>/. The date comes from the filename's YYYY-MM-DD- prefix or, if the filename lacks one, from the date: field in frontmatter.
Slug rules:
- lowercase, hyphens between tokens, no underscores/spaces/dots/parens
- English words verbatim, lowercased: "Ceres Solver" โ
ceres-solver
- Translate Korean to natural English keywords:
- ์ฌ์ด ์ค๋ช
โ drop or
easy-explanation
- ํ๋์ ๋ณด๊ธฐ โ
overview
- ์ฌ์ฉ๋ฒ โ
usage / tutorial
- ์ ๋ โ
derivation
- ์ดํดํ๊ธฐ โ drop or
understanding
- ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ โ
basic-usage
- ์ ๋ฆฌ โ
summary
- ํ์ฉํ โ
with / using
- ์ค์นํ๋ ๋ฒ โ
installation
- ์๋ฌ ํด๊ฒฐ / ํด๊ฒฐ ๋ฐฉ๋ฒ โ
error-fix / fix
- ๋ถ์ โ
analysis
- ์ธํ
โ
setup
- ๊น๊ฒ ์ดํดํ๊ธฐ โ
deep-dive or drop "๊น๊ฒ"
- Chapter/part numbers โ zero-padded 2-digit: "Lec 1" โ
lec-01, "Tutorial 8" โ tutorial-08
- Keep slug compact (3-7 hyphenated tokens is the sweet spot)
Examples:
| Filename | Permalink |
|---|
2021-09-12-ROS Point Cloud Library (PCL) - 5. Voxelization.md | /2021/09/12/pcl-tutorial-05-voxelization/ |
2024-12-01-GTSAM Tutorial 1. SLAM์ ์ํ Between Factor ์ฝ๊ฒ ์ดํดํ๊ธฐ.md | /2024/12/01/gtsam-tutorial-01-between-factor/ |
2024-01-01-Modern C++ for Robotics 6. std::move() ์ฌ์ด ์ค๋ช
.md | /2024/01/01/modern-cpp-robotics-06-std-move/ |
2026-05-07-Ceres Solver for Graph SLAM - 4. PoseGraph3dErrorTerm ๊น๊ฒ ์ดํดํ๊ธฐ.md | /2026/05/07/ceres-graph-slam-04-posegraph3d-error-term/ |
2022-04-01-IMU Preintegration (Easy) - 2. Preliminaries (1) Keyframe.md | /2022/04/01/imu-preintegration-02a-keyframe/ |
redirect_from
There are TWO URL forms a post may have served at, and external/internal links can use either. Add BOTH (when they differ) so legacy URLs don't 404:
- Spaces-form โ Jekyll's default permalink resolved with the filename:
/<filename without .md>/. Used when someone hardcodes the URL with spaces or %20 encoding.
- Slugified-form โ Jekyll's
:title slugify: spaces โ dashes, multiple dashes collapsed. Used when someone copies the URL from the rendered HTML or follows an old default Jekyll URL.
| Filename | redirect_from entries |
|---|
2021-09-12-ROS Point Cloud Library (PCL) - 5. Voxelization.md | '/2021-09-12-ROS Point Cloud Library (PCL) - 5. Voxelization/'
'/2021-09-12-ROS-Point-Cloud-Library-(PCL)-5.-Voxelization/' |
2024-12-01-GTSAM Tutorial 1. SLAM์ ์ํ Between Factor ์ฝ๊ฒ ์ดํดํ๊ธฐ.md | '/2024-12-01-GTSAM Tutorial 1. SLAM์ ์ํ Between Factor ์ฝ๊ฒ ์ดํดํ๊ธฐ/'
'/2024-12-01-GTSAM-Tutorial-1.-SLAM์-์ํ-Between-Factor-์ฝ๊ฒ-์ดํดํ๊ธฐ/' |
2024-01-01-Modern C++ for Robotics 1. Introduction.md | '/2024-01-01-Modern C++ for Robotics 1. Introduction/'
'/2024-01-01-Modern-C++-for-Robotics-1.-Introduction/' |
Slugify algorithm: replace any whitespace with -, then collapse consecutive dashes. Don't touch dots, parens, Korean chars, or other punctuation โ Jekyll keeps them as-is. The two forms are identical (so omit the slugified line) when the filename has no spaces (e.g., 2025-01-01-some-already-hyphenated-name.md).
For files WITHOUT a date prefix (e.g., LIO-SAM Line by Line - 1. Introduction.md), use the date: from frontmatter and the filename stem for both forms:
redirect_from:
- '/2022-04-07-LIO-SAM Line by Line - 1. Introduction/'
- '/2022-04-07-LIO-SAM-Line-by-Line-1.-Introduction/'
ALWAYS single-quote the URL string. If the URL itself contains a single quote (apostrophe), escape it by doubling: 'foo''bar' (YAML rule). Parens, dots, and Korean chars are fine inside single quotes without escaping.
When the post's filename is being renamed
If you're renaming an existing post (not adding a brand-new one), keep the OLD filename's spaces-form AND slugified-form in redirect_from too, on top of the new ones. Future-you with external backlinks will thank you. Walk back the rename chain if there are multiple prior names.
Image alt text
Find  patterns and add a short Korean alt:
 โ 
 โ 
Use 2-4 Korean words. If you genuinely can't tell from context, use a post-topic-related generic phrase. Skip images that already have non-empty alt text.
Sub-part / multi-file series
For posts with (1), (2), (3) sub-parts under the same major chapter (e.g., Lec 02 (1), Lec 02 (2)), use 02a, 02b, 02c in the permalink slug to keep them sortable but distinct:
imu-preintegration-02a-keyframe
imu-preintegration-02b-rotation-uncertainty
Tone and style notes
- Don't introduce em-dashes (
โ) โ Korean prose uses commas/colons/periods instead. (This was a separate cleanup pass on 2026-05-07.)
- Keep description concise; if you find yourself writing more than 2 sentences, trim.
- Match the existing voice (plain
-ํ๋ค vs formal -ํฉ๋๋ค) so the description doesn't clash with the post body.
After applying
- Suggest the user commit with a message like
Add SEO frontmatter to <post-slug>.
- If the post is part of a series and you've added a new post, remind the user to verify the relevant
_includes/post_links_*.html already picks it up (the includes filter on title contains 'X', so usually no edit is needed).
Related
slam-add-lecture โ full lecture publish workflow on /slam/.
slam-lecture-entry โ just the slam.md edit.