Personal blog (“Wine Coding”) by Ivan Shafran about Android & tech. Built with Jekyll + the Minimal Mistakes theme (loaded as a remote theme), hosted on GitHub Pages at https://shafran.dev.
master branch triggers the GitHub Pages build — there is no
separate CI step. master is the live branch.remote_theme: mmistakes/minimal-mistakes, so the theme’s files
are not in this repo. Customizations are done via overrides (see below).CNAME (shafran.dev) and url: in _config.yml.bundle exec jekyll serve — the toolchain needs Ruby ≥ 3.0; the repo’s Gemfile
pins github-pages. Most changes are verified by inspection + the GitHub Pages build
rather than a local run.
| Path | Purpose |
|---|---|
_posts/ |
Blog posts (YYYY-MM-DD-title.md). |
_pages/ |
Standalone pages — about.md, talks.md, archive pages. |
_data/navigation.yml |
Top nav menu. |
_data/talks.yml |
Source data for the Talks timeline. |
_layouts/home.html |
Custom home layout: magazine card grid for posts (inherits the theme’s archive layout, so the author sidebar is untouched). |
_includes/head/custom.html |
Analytics (gtag), favicons, and the Fraunces web font. |
assets/css/main.scss |
All custom styling (brand skin overrides + custom components). |
assets/images/ |
Images; post teasers go in assets/images/posts/. |
dark, overridden with a wine/burgundy accent.
Brand colors live at the top of assets/css/main.scss:
$primary-color: #8c2f39 (wine), $link-color: #d06b76 (lighter wine for links).custom.html) is applied only to the “Wine Coding” masthead
title — not to other headings.main.scss:
.talks-timeline — the Talks page (vertical wine line, year markers, date/
conference/language badges)..post-grid / .post-card — the home page magazine cards (2 columns on
desktop, 1 column ≤600px)._data/talks.yml (newest first). Fields:
date (YYYY-MM-DD), title, url (optional), conference, lang (EN/RU).
The timeline renders itself._posts/YYYY-MM-DD-title.md with front matter
(title, date, optional tags). Posts use the permalink /:title/
(categories are intentionally not used).assets/images/posts/ and reference it in the post’s front matter:
header:
teaser: /assets/images/posts/my-post.jpg
Cards without a teaser render text-only (no broken image).
og_image in _config.yml is the default share image;
a post can override with header.image.paginate: 10).