demiculus.com — project rules
Personal essay site for Demi Yilmaz (cofounder of Colonist.io). Jekyll-based, hosted at demiculus.com. Essays are short, lean, contrarian — treat every sentence as a tax on the reader’s attention.
Stack & local dev
- Jekyll site. Run locally with
preview_starton thejekyllconfig (notbundle execin Bash). - Dev URL is
http://localhost:4000— plain HTTP.https://will fail. Jekyll does not serve HTTPS locally. _config.ymlchanges require a server restart. Jekyll does NOT hot-reload config. Usepreview_stop+preview_startafter editing it. Content/CSS changes do hot-reload.- CSS is cache-busted via
?v=1776789557in_includes/head.html. Don’t undo this. - Essays live as
.mdfiles at repo root (not_posts/). Pretty permalinks: a file atfoo.mdserves at/foo/. _data/writing.ymlis the source of truth for essay ordering on the home page (Recent Essays list). Slug must match the.mdfilename.
Essay lifecycle
Adding an essay
- Create
<slug>.mdat repo root with front matter:--- layout: default title: <Title> description: <One short sentence.> created: YYYY-MM-DD updated: YYYY-MM-DD --- - Add entry to
_data/writing.yml(slug + title, for home-page ordering). - Home page auto-limits to the first 6 entries in
_data/writing.yml— reorder that file to feature different essays.
Removing an essay
Two touch points, both required:
rm <slug>.md- Remove the
- slug: <slug>block from_data/writing.yml
Verify with curl -I http://localhost:4000/<slug>/ → 404.
Dates
Pull created / updated from git:
git log --follow --format='%ai' -- <slug>.md | tail -1 # created
git log --follow --format='%ai' -- <slug>.md | head -1 # updated
Dates render via _layouts/default.html when front matter has created: and/or updated:.
Writing-page plumbing
/writing/(writing.md) iteratessite.pagesand filters byp.description— any page with a description in its front matter is an essay.- Home (index.md) iterates
_data/writing.ymlwithlimit: 6. - Read More (
_includes/related.html) shows 3 random related essays under each essay. - All three views share the same description field — change it in one place and verify all three.
Copy style
- Descriptions are one short sentence. Ideally under 12 words. Sentence case, not Title Case.
- Offer 3–5 alternatives when proposing copy. The user iterates on wording and picks one. Don’t commit a single option unless asked.
- Match the site’s voice: direct, contrarian, no hedging, no “I think”, no “maybe.” Examples:
- Good: “Five sentences beat a hundred.”
- Good: “Remote isn’t freedom. It’s a different discipline.”
- Good: “Written rules are the decoy. The real ones stay hidden.”
- Avoid filler words. “Actually”, “really”, “just”, “basically” — cut them.
- Never use em-dashes unless the user asked. (Check the site — they’re used sparingly.)
Links & socials
- External socials block lives in
_includes/identity.html(home only). - Current socials: X, Instagram, GitHub, LinkedIn, Goodreads, RSS. Do not add others without asking.
- Contact links use
mailto:wrapped inonclick="return confirm(...)"in both_includes/topbar.htmland_includes/footer.html. Preserve the confirm dialog — it’s intentional friction to prevent accidental mail-app launches. - Email address:
[email protected](not demiculus@).
Content rules
- No horizontal rules (
---) inside essay bodies. They render as<hr>and look out of place. Section breaks use###headings instead. - Don’t commit emojis to any markdown, HTML, or CSS file.
- Games section in about.md is sorted newest-first. Add new entries at the top, not the bottom.
Verification
After any UI change, verify via preview_* tools (not manual browser). Specifically:
preview_evalto fetch the rendered HTML or query computed styles.preview_screenshotfor visual confirmation.preview_snapshotfor text/structure checks.
Remember: if computed styles don’t match the CSS file, it’s browser caching. Force-reload with the ?v= query string or hard-reload.
Essay metadata conventions (post-migration)
description,created,updatedlive in each essay’s front matter — not in_data/writing.yml._data/writing.ymlholds only slug+title, solely for home-page ordering (first 6 shown)._layouts/default.htmlrendersCreated ... · Updated ...automatically when the fields are present.- Filter
where_exp: "p", "p.description"is the “is this an essay?” predicate. Pages without a description are not essays and don’t appear on/writing/, the home list, or “Read more.” - If you add a non-essay page, do NOT give it a
description:in front matter (or it’ll show up in essay lists).