content/_template.md (3065B)
1 ---
2 title: ""
3 titleKo: ""
4 date:
5 deck: ""
6 type:
7 tags: []
8 draft:
9 ---
10
11 Copy this file to `content/writing/<slug>.md`, fill the front matter in from the top, and
12 replace everything below with the post. Keep it out of `content/writing/` while it is a
13 template: the collection loads every `.md` in that directory, and a blank has no date.
14
15 The filename is the address. A file named `tso.md` dated 2026-03-04 is published at
16 `/writing/2026/tso/`, so the slug is worth choosing before the first save and is awkward
17 to change afterwards — the old URL does not redirect.
18
19 Leave any line you have nothing to say on exactly as it ships. Blank does not mean an
20 empty element on the page: a blank field parses to nothing at all, and every page tests
21 for a value before it draws anything, so a blank `deck:` produces no deck paragraph
22 rather than an empty one. Only `title` and `date` have to be filled in.
23
24 **title** — required, and the string the post is known by everywhere: the heading, the
25 entry on /writing/, the browser tab, the feed item, the search result. Quoted because a
26 title containing `:` or opening with `#` breaks an unquoted YAML value.
27
28 **titleKo** — the original Korean title of a post that now carries an English one. No page
29 prints it today; it is kept so a rename does not lose the first title. Blank: nothing.
30
31 **date** — required, `YYYY-MM-DD`. It orders the whole site and supplies the year segment
32 of the URL, so changing it later moves the post's address. It ships blank on purpose: a
33 date inherited from a template is the day the template was written, and that wrong date
34 would be baked into the URL. Blank stops the build with `date is not YYYY-MM-DD: (none)`.
35
36 **deck** — the line under the title, set in the display face, saying what the post is. It
37 is also the page's `<meta name="description">` and the post's description in the RSS feed.
38 Blank: no deck is drawn, and the description falls back to the opening sentence of the
39 post itself.
40
41 **type** — `essay` or `research`, and nothing else; any other word stops the build. It is
42 published as a `data-type` attribute on the entry in /writing/, which is what a later
43 split into sub-views would key on. Blank: the attribute is omitted and the post is
44 untyped, which is what every post on the site is today.
45
46 **tags** — a list, written `tags: ["dns", "network"]`. The brackets ship filled in because
47 they are the shape: a bare word after the colon is a string, not a list, and is rejected.
48 Nothing on the site renders tags yet, so they are for the archive rather than the page.
49 Blank or `[]`: no tag list, and the content gate prints a warning naming the post.
50
51 **draft** — `true` withholds the post: it is dropped from /writing/ and from the feed, and
52 no page is generated for it, so its URL 404s. `false` publishes, and so does a blank line;
53 `yes` and `no` are words here, not booleans, and stop the build.
54 It ships blank rather than `true` because a template that hides whatever is written from
55 it produces a post that reads as finished, builds clean, and is nowhere on the site.