<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-07-05T13:03:44+00:00</updated><id>/feed.xml</id><title type="html">FENN</title><subtitle>News, releases, and deep dives on fenn, the open engine for deep learning workflows.</subtitle><author><name>fenn</name></author><entry><title type="html">How to Make a Post</title><link href="/how-to-make-a-post/" rel="alternate" type="text/html" title="How to Make a Post" /><published>2026-07-05T10:00:00+00:00</published><updated>2026-07-05T10:00:00+00:00</updated><id>/how-to-make-a-post</id><content type="html" xml:base="/how-to-make-a-post/"><![CDATA[<p>This page explains how to create and publish a new post on the <a href="https://github.com/pyfenn/fenn">fenn</a> blog.</p>

<h2 id="clone-the-blog-repository">Clone the blog repository</h2>

<p>Fork the <a href="https://github.com/pyfenn/blog">blog repository</a> on GitHub, then clone your fork:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://github.com/&lt;your-username&gt;/blog.git
<span class="nb">cd </span>blog
</code></pre></div></div>

<p>The blog is built with <a href="https://jekyllrb.com/">Jekyll</a>. Its Ruby dependencies are listed in the <code class="language-plaintext highlighter-rouge">Gemfile</code>, and <code class="language-plaintext highlighter-rouge">bundle install</code> installs them locally.</p>

<h2 id="set-up-the-blog-locally">Set up the blog locally</h2>

<p>Before writing or previewing posts, install the required Ruby gems:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bundle <span class="nb">install</span>
</code></pre></div></div>

<p>To start the local development server with live rebuild:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bundle <span class="nb">exec </span>jekyll serve
</code></pre></div></div>

<p>Then open:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>http://localhost:4000
</code></pre></div></div>

<p>To generate the static site once without running the server:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bundle <span class="nb">exec </span>jekyll build
</code></pre></div></div>

<p>The generated site will be available in the <code class="language-plaintext highlighter-rouge">_site/</code> folder.</p>

<h2 id="create-a-new-post-file">Create a new post file</h2>

<p>All blog posts must be placed inside the <code class="language-plaintext highlighter-rouge">_posts/</code> folder.</p>

<p>Create a new file using this naming format:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>YYYY-MM-DD-title.markdown
</code></pre></div></div>

<p>For example:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>2026-07-05-introducing-fenn.markdown
</code></pre></div></div>

<p>The date in the filename is important because Jekyll uses it to identify the post date.</p>

<h2 id="add-the-post-front-matter">Add the post front matter</h2>

<p>Every post starts with a YAML front matter block.</p>

<p>Use this template:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">layout</span><span class="pi">:</span> <span class="s">post</span>
<span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Your</span><span class="nv"> </span><span class="s">post</span><span class="nv"> </span><span class="s">title"</span>
<span class="na">date</span><span class="pi">:</span> <span class="s">2026-07-05 12:00:00 +0200</span>
<span class="na">categories</span><span class="pi">:</span> <span class="s">announcements</span>
<span class="na">author</span><span class="pi">:</span> <span class="s">blkdmr</span>
<span class="na">mathjax</span><span class="pi">:</span> <span class="kc">false</span>
<span class="nn">---</span>
</code></pre></div></div>

<p>Then write the post content below the front matter using Markdown.</p>

<p>Example:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">layout</span><span class="pi">:</span> <span class="s">post</span>
<span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Introducing</span><span class="nv"> </span><span class="s">fenn:</span><span class="nv"> </span><span class="s">a</span><span class="nv"> </span><span class="s">friendly</span><span class="nv"> </span><span class="s">environment</span><span class="nv"> </span><span class="s">for</span><span class="nv"> </span><span class="s">neural</span><span class="nv"> </span><span class="s">networks"</span>
<span class="na">date</span><span class="pi">:</span> <span class="s">2026-07-05 12:00:00 +0200</span>
<span class="na">categories</span><span class="pi">:</span> <span class="s">announcements</span>
<span class="na">author</span><span class="pi">:</span> <span class="s">blkdmr</span>
<span class="na">mathjax</span><span class="pi">:</span> <span class="kc">false</span>
<span class="nn">---</span>

Every deep learning project seems to reinvent the same wheel: a config
parser, a logger, a training loop, and a README explaining how to run it all.

<span class="gs">**fenn**</span> exists so you do not have to write that scaffolding again.
</code></pre></div></div>

<h2 id="understand-the-main-front-matter-fields">Understand the main front matter fields</h2>

<h3 id="layout"><code class="language-plaintext highlighter-rouge">layout</code></h3>

<p>Use:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">layout</span><span class="pi">:</span> <span class="s">post</span>
</code></pre></div></div>

<p>This tells Jekyll to render the page as a blog post.</p>

<h3 id="title"><code class="language-plaintext highlighter-rouge">title</code></h3>

<p>The title displayed on the blog page:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Introducing</span><span class="nv"> </span><span class="s">fenn"</span>
</code></pre></div></div>

<h3 id="date"><code class="language-plaintext highlighter-rouge">date</code></h3>

<p>The publication date and time:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">date</span><span class="pi">:</span> <span class="s">2026-07-05 12:00:00 +0200</span>
</code></pre></div></div>

<p>The date controls the sorting order of posts.</p>

<p>The blog uses this permalink style:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">permalink</span><span class="pi">:</span> <span class="s">/:title/</span>
</code></pre></div></div>

<p>This means the post URL is based on the title slug, not the date.</p>

<p>For example, a post titled:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Introducing</span><span class="nv"> </span><span class="s">fenn"</span>
</code></pre></div></div>

<p>will become something like:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/introducing-fenn/
</code></pre></div></div>

<h3 id="categories"><code class="language-plaintext highlighter-rouge">categories</code></h3>

<p>Categories help group posts:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">categories</span><span class="pi">:</span> <span class="s">announcements</span>
</code></pre></div></div>

<p>Examples:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">categories</span><span class="pi">:</span> <span class="s">tutorials</span>
<span class="na">categories</span><span class="pi">:</span> <span class="s">releases</span>
<span class="na">categories</span><span class="pi">:</span> <span class="s">announcements</span>
</code></pre></div></div>

<h3 id="author"><code class="language-plaintext highlighter-rouge">author</code></h3>

<p>The author field is optional:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">author</span><span class="pi">:</span> <span class="s">blkdmr</span>
</code></pre></div></div>

<p>The value must match an author slug from the <code class="language-plaintext highlighter-rouge">_authors/</code> folder.</p>

<h3 id="mathjax"><code class="language-plaintext highlighter-rouge">mathjax</code></h3>

<p>Use this only if the post contains math:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">mathjax</span><span class="pi">:</span> <span class="kc">true</span>
</code></pre></div></div>

<p>This enables math rendering for the page.</p>

<h2 id="write-the-post-content">Write the post content</h2>

<p>After the front matter, write your post in Markdown.</p>

<p>You can use headings:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gu">## What fenn gives you</span>
</code></pre></div></div>

<p>Lists:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">-</span> Auto-configuration
<span class="p">-</span> Unified logging
<span class="p">-</span> Trainers
<span class="p">-</span> Templates
</code></pre></div></div>

<p>Code blocks:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">```</span><span class="nl">bash
</span>pip <span class="nb">install </span>fenn
fenn list
fenn pull empty
<span class="p">```</span>
</code></pre></div></div>

<p>Inline code:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Use the <span class="sb">`fenn`</span> CLI to pull templates.
</code></pre></div></div>

<p>Links:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Visit the <span class="p">[</span><span class="nv">fenn GitHub repository</span><span class="p">](</span><span class="sx">https://github.com/pyfenn/fenn</span><span class="p">)</span>.
</code></pre></div></div>

<h2 id="add-an-excerpt">Add an excerpt</h2>

<p>The home page can show an excerpt for each post.</p>

<p>In <code class="language-plaintext highlighter-rouge">_config.yml</code>, the blog uses this setting:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">excerpt_separator</span><span class="pi">:</span> <span class="s2">"</span><span class="se">\n\n\n</span><span class="s">"</span>
</code></pre></div></div>

<p>This means the excerpt is everything before the first triple-blank-line.</p>

<p>Example:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">layout</span><span class="pi">:</span> <span class="s">post</span>
<span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Introducing</span><span class="nv"> </span><span class="s">fenn"</span>
<span class="na">date</span><span class="pi">:</span> <span class="s">2026-07-05 12:00:00 +0200</span>
<span class="na">categories</span><span class="pi">:</span> <span class="s">announcements</span>
<span class="na">author</span><span class="pi">:</span> <span class="s">blkdmr</span>
<span class="nn">---</span>

This short introduction will appear as the post excerpt on the home page.<span class="sb">



</span>The rest of the post starts here.
</code></pre></div></div>

<p>Make sure there are three blank lines between the excerpt and the rest of the article.</p>

<h2 id="add-an-author">Add an author</h2>

<p>Authors are stored in the <code class="language-plaintext highlighter-rouge">_authors/</code> folder.</p>

<p>To add a new author, create a file like this:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>_authors/blkdmr.markdown
</code></pre></div></div>

<p>The filename becomes the author slug.</p>

<p>Inside the file, use this structure:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">layout</span><span class="pi">:</span> <span class="s">author</span>
<span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Display</span><span class="nv"> </span><span class="s">Name"</span>
<span class="na">role</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Optional</span><span class="nv"> </span><span class="s">role</span><span class="nv"> </span><span class="s">or</span><span class="nv"> </span><span class="s">title"</span>
<span class="na">github</span><span class="pi">:</span> <span class="s2">"</span><span class="s">https://github.com/handle"</span>
<span class="nn">---</span>

A short bio written in Markdown.
</code></pre></div></div>

<p>Then reference the author in a post:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">author</span><span class="pi">:</span> <span class="s">blkdmr</span>
</code></pre></div></div>

<p>The post footer will automatically link to:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/authors/blkdmr/
</code></pre></div></div>

<p>The author page will also automatically list the author’s posts.</p>

<h2 id="add-math-to-a-post">Add math to a post</h2>

<p>To use math, enable math rendering in the post front matter:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">mathjax</span><span class="pi">:</span> <span class="kc">true</span>
</code></pre></div></div>

<p>Supported inline math formats:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$E = mc^2$
</code></pre></div></div>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="se">\(</span>E = mc^2<span class="se">\)</span>
</code></pre></div></div>

<p>Supported display math formats:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$$
E = mc^2
$$
</code></pre></div></div>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="se">\[</span>
E = mc^2
<span class="se">\]</span>
</code></pre></div></div>

<p>Jekyll’s Markdown engine, Kramdown, automatically converts <code class="language-plaintext highlighter-rouge">$$...$$</code> blocks to <code class="language-plaintext highlighter-rouge">\[...\]</code>, so both styles work.</p>

<h2 id="preview-the-post-locally">Preview the post locally</h2>

<p>Run:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bundle <span class="nb">exec </span>jekyll serve
</code></pre></div></div>

<p>Then open:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>http://localhost:4000
</code></pre></div></div>

<p>Check that:</p>

<ul>
  <li>the post appears on the home page;</li>
  <li>the title is correct;</li>
  <li>the author link works;</li>
  <li>code blocks render properly;</li>
  <li>math renders correctly, if used;</li>
  <li>the excerpt stops in the right place.</li>
</ul>

<h2 id="build-the-site">Build the site</h2>

<p>Before publishing, run:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bundle <span class="nb">exec </span>jekyll build
</code></pre></div></div>

<p>If the build completes without errors, the post is ready to publish.</p>

<h2 id="complete-post-template">Complete post template</h2>

<p>You can copy this template when creating a new article:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">layout</span><span class="pi">:</span> <span class="s">post</span>
<span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Your</span><span class="nv"> </span><span class="s">post</span><span class="nv"> </span><span class="s">title"</span>
<span class="na">date</span><span class="pi">:</span> <span class="s">2026-07-05 12:00:00 +0200</span>
<span class="na">categories</span><span class="pi">:</span> <span class="s">announcements</span>
<span class="na">author</span><span class="pi">:</span> <span class="s">blkdmr</span>
<span class="na">mathjax</span><span class="pi">:</span> <span class="kc">false</span>
<span class="nn">---</span>

Write a short introduction here. This can be used as the excerpt on the home page.<span class="sb">



</span><span class="gu">## Section title</span>

Write your post content here.

<span class="gu">## Another section</span>

Add explanations, lists, images, code snippets, or math.

<span class="p">```</span><span class="nl">bash
</span>pip <span class="nb">install </span>fenn
<span class="p">```</span>

<span class="gu">## Conclusion</span>

Close the post with a short summary or call to action.
</code></pre></div></div>

<h2 id="commit-push-and-open-a-pull-request">Commit, push, and open a pull request</h2>

<p>After checking that the site builds correctly, add and commit your changes:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add _posts/YYYY-MM-DD-title.markdown
git commit <span class="nt">-m</span> <span class="s2">"post: add YYYY-MM-DD-title.markdown"</span>
</code></pre></div></div>

<p>For example:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add _posts/2026-07-05-introducing-fenn.markdown
git commit <span class="nt">-m</span> <span class="s2">"post: add 2026-07-05-introducing-fenn.markdown"</span>
</code></pre></div></div>

<p>If you also added a new author file, include it in the same commit:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add _posts/YYYY-MM-DD-title.markdown _authors/author-slug.markdown
git commit <span class="nt">-m</span> <span class="s2">"post: add YYYY-MM-DD-title.markdown"</span>
</code></pre></div></div>

<p>Push the changes to your fork:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git push
</code></pre></div></div>

<p>Then open a pull request against the main <code class="language-plaintext highlighter-rouge">pyfenn/blog</code> repository.</p>

<p>Before opening the PR, make sure that:</p>

<ul>
  <li>the post builds correctly with <code class="language-plaintext highlighter-rouge">bundle exec jekyll build</code>;</li>
  <li>the post is in the <code class="language-plaintext highlighter-rouge">_posts/</code> folder;</li>
  <li>the filename follows <code class="language-plaintext highlighter-rouge">YYYY-MM-DD-title.markdown</code>;</li>
  <li>the front matter is valid;</li>
  <li>any new author file is placed in <code class="language-plaintext highlighter-rouge">_authors/</code>;</li>
  <li>the commit message follows the format <code class="language-plaintext highlighter-rouge">post: add YYYY-MM-DD-title.markdown</code>.</li>
</ul>]]></content><author><name>blkdmr</name></author><category term="tutorial" /><summary type="html"><![CDATA[This page explains how to create and publish a new post on the fenn blog. Clone the blog repository Fork the blog repository on GitHub, then clone your fork: git clone https://github.com/&lt;your-username&gt;/blog.git cd blog The blog is built with Jekyll. Its Ruby dependencies are listed in the Gemfile, and bundle install installs them locally. Set up the blog locally Before writing or previewing posts, install the required Ruby gems: bundle install To start the local development server with live rebuild: bundle exec jekyll serve Then open: http://localhost:4000 To generate the static site once without running the server: bundle exec jekyll build The generated site will be available in the _site/ folder. Create a new post file All blog posts must be placed inside the _posts/ folder. Create a new file using this naming format: YYYY-MM-DD-title.markdown For example: 2026-07-05-introducing-fenn.markdown The date in the filename is important because Jekyll uses it to identify the post date. Add the post front matter Every post starts with a YAML front matter block. Use this template: --- layout: post title: "Your post title" date: 2026-07-05 12:00:00 +0200 categories: announcements author: blkdmr mathjax: false --- Then write the post content below the front matter using Markdown. Example: --- layout: post title: "Introducing fenn: a friendly environment for neural networks" date: 2026-07-05 12:00:00 +0200 categories: announcements author: blkdmr mathjax: false --- Every deep learning project seems to reinvent the same wheel: a config parser, a logger, a training loop, and a README explaining how to run it all. **fenn** exists so you do not have to write that scaffolding again. Understand the main front matter fields layout Use: layout: post This tells Jekyll to render the page as a blog post. title The title displayed on the blog page: title: "Introducing fenn" date The publication date and time: date: 2026-07-05 12:00:00 +0200 The date controls the sorting order of posts. The blog uses this permalink style: permalink: /:title/ This means the post URL is based on the title slug, not the date. For example, a post titled: title: "Introducing fenn" will become something like: /introducing-fenn/ categories Categories help group posts: categories: announcements Examples: categories: tutorials categories: releases categories: announcements author The author field is optional: author: blkdmr The value must match an author slug from the _authors/ folder. mathjax Use this only if the post contains math: mathjax: true This enables math rendering for the page. Write the post content After the front matter, write your post in Markdown. You can use headings: ## What fenn gives you Lists: - Auto-configuration - Unified logging - Trainers - Templates Code blocks: ```bash pip install fenn fenn list fenn pull empty ``` Inline code: Use the `fenn` CLI to pull templates. Links: Visit the [fenn GitHub repository](https://github.com/pyfenn/fenn). Add an excerpt The home page can show an excerpt for each post. In _config.yml, the blog uses this setting: excerpt_separator: "\n\n\n" This means the excerpt is everything before the first triple-blank-line. Example: ```markdown layout: post title: “Introducing fenn” date: 2026-07-05 12:00:00 +0200 categories: announcements author: blkdmr — This short introduction will appear as the post excerpt on the home page.]]></summary></entry></feed>