<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>notroot (Posts about nikola)</title><link>https://blog.notroot.online/</link><description></description><atom:link href="https://blog.notroot.online/categories/nikola.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2024 &lt;a href="mailto:notroot@notroot.online"&gt;Notroot&lt;/a&gt; </copyright><lastBuildDate>Sat, 18 May 2024 00:57:41 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Adding a Fediverse Share Button to my Emacs Nikola Blog</title><link>https://blog.notroot.online/posts/adding-a-fediverse-share-button-to-my-emacs-nikola-blog/</link><dc:creator>Notroot</dc:creator><description>&lt;p&gt;
I was browsing the Fediverse, as is my wont, and I came across a fella named Stefan Bohacek announcing the release of his new Fediverse Share Button. I tried it with my Sharkey instance and it worked! So I decided to add it to this blog. Even working with Nikola and Emacs, it was pretty frickin' easy.
&lt;/p&gt;

&lt;iframe src="https://stefanbohacek.online/@stefan/112456716124668605/embed" class="mastodon-embed" style="max-width: 100%; border: 0" width="400" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;script src="https://stefanbohacek.online/embed.js" async="async"&gt;&lt;/script&gt;

&lt;p&gt;
To continue my very meta habit of writing about blogging on my blog, here's how I added the share button at the bottom of this page.
&lt;/p&gt;

&lt;div id="outline-container-org6d755c7" class="outline-2"&gt;
&lt;h2 id="org6d755c7"&gt;Install Fediverse Share Button&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org6d755c7"&gt;
&lt;p&gt;
First, we simply need to clone the &lt;a href="https://github.com/stefanbohacek/fediverse-share-button/"&gt;fediverse-share-button&lt;/a&gt; repo. I cloned it next to my blog directory to make it a little simpler to move files into place, like this:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;cp -r ./fediverse-share-button/fediverse-share-button ./notroot-blog/files
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
That's it for now! Next, I'll show you how to incorporate those files into your Nikola builds.
&lt;/p&gt;

&lt;p&gt;
I referred to &lt;a href="https://randomgeekery.org/post/2020/01/tweaking-a-nikola-theme/"&gt;this "Random Geekery" blog post&lt;/a&gt; to figure out how to tweak Nikola themes and templates to include my fancy new share button.
&lt;/p&gt;

&lt;p&gt;
Boiling down my "learnings" (barf) for the reader, here's what I did.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org8a66f55" class="outline-2"&gt;
&lt;h2 id="org8a66f55"&gt;Create a New Theme to Tweak&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org8a66f55"&gt;
&lt;p&gt;
Rather than tweaking the installed theme – in my case, the &lt;code&gt;hack&lt;/code&gt; theme – we want to inherit from it, and make the changes to our own theme templates.
&lt;/p&gt;

&lt;p&gt;
First, I created a new theme called &lt;code&gt;notroot&lt;/code&gt;, based on &lt;code&gt;hack&lt;/code&gt;, like this:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;nikola theme --new notroot --parent hack
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Then, I changed my theme and disabled bundling in Nikola's &lt;code&gt;conf.py&lt;/code&gt;, like this:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;THEME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"notroot"&lt;/span&gt;
&lt;span class="n"&gt;USE_BUNDLES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Then, I copied the post template into my new &lt;code&gt;notroot&lt;/code&gt; theme, like this:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;nikola theme --copy-template post.tmpl
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
To make sure my new &lt;code&gt;notroot&lt;/code&gt; theme was exactly the same as &lt;code&gt;hack&lt;/code&gt;, I did a quick built and served it locally, like this:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;nikola build
nikola serve
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Perfect! Nothing changed… yet.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgcd8e9be" class="outline-2"&gt;
&lt;h2 id="orgcd8e9be"&gt;Add Fediverse Share Button&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgcd8e9be"&gt;
&lt;p&gt;
Next, I opened the aforementioned &lt;code&gt;post.tmpl&lt;/code&gt; file in Emacs, and more or less followed Stefan's instructions. However, because we're working with a Nikola template (Mako), there was a little more to it.
&lt;/p&gt;

&lt;p&gt;
My &lt;code&gt;post.tmpl&lt;/code&gt; has a block called &lt;code&gt;extra_head&lt;/code&gt;, so that's where I added the CSS link. It should look sorta like this afterwards:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&amp;lt;%block name="extra_head"&amp;gt;
&amp;lt;!-- ... the rest of 'extra_head' ... --&amp;gt;
&amp;lt;link rel="stylesheet" href="/fediverse-share-button/styles.min.css"&amp;gt;
&amp;lt;/%block&amp;gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Note that, unlike Stefan's instructions, we use an absolute path here &lt;code&gt;/&lt;/code&gt;, not a relative path &lt;code&gt;./&lt;/code&gt;, to the &lt;code&gt;fediverse-share-button/&lt;/code&gt; directory. That's because Nikola will move things around when it builds, and because we just plopped &lt;code&gt;fediverse-share-button&lt;/code&gt; into the &lt;code&gt;files/&lt;/code&gt; directory, it will be at the top level, next to &lt;code&gt;assets/&lt;/code&gt; and &lt;code&gt;images/&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
To include the &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag pointing to the Javascript for our share button, I had to add an &lt;code&gt;extra_js&lt;/code&gt; block to the bottom of &lt;code&gt;post.tmpl&lt;/code&gt;. It also uses absolute paths, like this:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&amp;lt;%block name="extra_js"&amp;gt;
&amp;lt;script src="/fediverse-share-button/script.min.js" defer class="fsb-script"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/%block&amp;gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Then, finally, I was able to include the actual button &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; element. I chose the bottom of the post, above the navigation. The whole &lt;code&gt;content&lt;/code&gt; block, after my changes, looks like this (comments added for emphasis):
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&amp;lt;%block name="content"&amp;gt;
&amp;lt;article class="post-${post.meta('type')} h-entry hentry postpage" itemscope="itemscope" itemtype="http://schema.org/Article"&amp;gt;
    ${pheader.html_post_header()}
    &amp;lt;div class="e-content entry-content" itemprop="articleBody text"&amp;gt;
    ${post.text()}
    &amp;lt;/div&amp;gt;
    &amp;lt;aside class="postpromonav"&amp;gt;

	&amp;lt;!-- START fediverse-share-button form --&amp;gt;

	&amp;lt;form class="fsb-prompt"&amp;gt;
	    &amp;lt;label&amp;gt;Share with the fediverse&amp;lt;/label&amp;gt;
	    &amp;lt;div class="fsb-input-group mb-3"&amp;gt;
		&amp;lt;span class="fsb-input-group-text"&amp;gt;https://&amp;lt;/span&amp;gt;
		&amp;lt;input required
		       type="text"
		       name="fediverse-domain"
		       placeholder="mastodon.social"
		       class="fsb-input fsb-domain"
		       aria-label="Amount (to the nearest dollar)"&amp;gt;
		&amp;lt;button class="fsb-button"
			type="submit"&amp;gt;&amp;lt;img src="/fediverse-share-button/icons/mastodon.svg"
					   class="fsb-icon"&amp;gt;&amp;lt;/span&amp;gt;Share&amp;lt;/button&amp;gt;
	    &amp;lt;/div&amp;gt;
	    &amp;lt;p class="fsb-support-note fsb-d-none"&amp;gt;
		This server does not support sharing. Please visit &amp;lt;a class="fsb-support-note-link"
								      target="_blank"
								      href=""&amp;gt;&amp;lt;/a&amp;gt;.
	    &amp;lt;/p&amp;gt;
	&amp;lt;/form&amp;gt;

	&amp;lt;!-- END form --&amp;gt;

    &amp;lt;nav&amp;gt;
    ${helper.html_tags(post)}
    ${helper.html_pager(post)}
    &amp;lt;/nav&amp;gt;
    &amp;lt;/aside&amp;gt;
    % if not post.meta('nocomments') and site_has_comments:
	&amp;lt;section id="comment-section" class="comments hidden-print"&amp;gt;
	&amp;lt;h2&amp;gt;${messages("Comments")}&amp;lt;/h2&amp;gt;
	${comments.comment_form(post.permalink(absolute=True), post.title(), post._base_path)}
	&amp;lt;/section&amp;gt;
    % endif
    ${math.math_scripts_ifpost(post)}
&amp;lt;/article&amp;gt;
${comments.comment_link_script()}
&amp;lt;/%block&amp;gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Then, once again, I built it and served it locally to check my work.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org97a6e42" class="outline-2"&gt;
&lt;h2 id="org97a6e42"&gt;Style the Fediverse Share Button&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org97a6e42"&gt;
&lt;p&gt;
Success! Except…
&lt;/p&gt;

&lt;p&gt;
Except the CSS was all screwy. The share button itself was enormous, due to how &lt;code&gt;hack&lt;/code&gt; CSS treats all &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags, and it was all left-justified, when my tags right below are centered.
&lt;/p&gt;

&lt;p&gt;
Let's fix that!
&lt;/p&gt;

&lt;p&gt;
It turned out to be dead simple. I inspected the classes in the browser, fixed it so it looked right, then copied those styles out of &lt;code&gt;files/fediverse-share-button/styles.css&lt;/code&gt; and into my own &lt;code&gt;files/assets/css/custom.css&lt;/code&gt; file. Then I added the attributes needed to fix things.
&lt;/p&gt;

&lt;p&gt;
To fix the enormous button, I just added &lt;code&gt;!important&lt;/code&gt; to &lt;code&gt;max-width&lt;/code&gt;:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;fsb-icon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="kt"&gt;rem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;margin-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="kt"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;vertical-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
To get the whole shebang centered, I modified &lt;code&gt;.fsb-prompt&lt;/code&gt; to add &lt;code&gt;auto&lt;/code&gt; margins on the right and left, which effectively centered the &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; itself. I also had the form center text. It looks like this, now:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;fsb-prompt&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;margin-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
And voila! Beautiful!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org373783d" class="outline-2"&gt;
&lt;h2 id="org373783d"&gt;Build and Deploy&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org373783d"&gt;
&lt;p&gt;
Once I was satisfied with the look and functionality, I was ready for the final build and deployment.
&lt;/p&gt;

&lt;p&gt;
First, though, I needed to minify the CSS changes that I had made. Stefan describes this, as well – for both JS and CSS – but here's exactly what I did:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;npm install minify -g
minify files/fediverse-share-button/styles.css &amp;gt; files/fediverse-share-button/styles.min.css
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Finally I was ready to build and deploy, as usual, from within Emacs.
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;code&gt;M-x nikola-build&lt;/code&gt; to build.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M-! nikola deploy&lt;/code&gt; to deploy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgbe71453" class="outline-2"&gt;
&lt;h2 id="orgbe71453"&gt;Next Steps&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgbe71453"&gt;
&lt;p&gt;
Next steps are three-fold:
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;Publish &lt;b&gt;this blog post&lt;/b&gt; to my blog.&lt;/li&gt;

&lt;li&gt;Once published, I will click the Fediverse Share Button and share to my Fediverse account.&lt;/li&gt;

&lt;li&gt;Then I will get the article ID of that Fediverse note, and add it to the meta for this post. Then I'll rebuild and redeploy. This will enable the "Comments" section, and replies to my Fediverse note will appear as comments on this blog post!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
It's like frickin' magic, baby!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>blog</category><category>emacs</category><category>fediverse</category><category>nikola</category><category>social</category><guid>https://blog.notroot.online/posts/adding-a-fediverse-share-button-to-my-emacs-nikola-blog/</guid><pubDate>Fri, 17 May 2024 19:46:34 GMT</pubDate></item><item><title>How I Made This Site (This Time)</title><link>https://blog.notroot.online/posts/how-i-made-this-site-%28this-time%29/</link><dc:creator>Notroot</dc:creator><description>&lt;p&gt;
Someone on the Fediverse was curious how I made this site, since I mentioned using Emacs org-mode, and their own site is built using org-roam and Hugo.
&lt;/p&gt;

&lt;iframe src="https://floss.social/@jgoerzen/112231865910334670/embed" class="mastodon-embed" style="max-width: 100%; border: 0" width="400" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;script src="https://floss.social/embed.js" async="async"&gt;&lt;/script&gt;

&lt;p&gt;
It's not that much different from the more complicated process I was using before, on GitHub Pages. This one is simpler in one respect: I'm deploying directly to my own host, so I don't have to use the more complicated &lt;code&gt;nikola deploy_github&lt;/code&gt; configuration, which requires separate source and deployment Git branches.
&lt;/p&gt;

&lt;p&gt;
For reference, here's my original post on how to get Nikola and &lt;code&gt;nikola.el&lt;/code&gt; working with GitHub Pages:
&lt;/p&gt;

&lt;a href="https://blog.notroot.online/posts/publishing-with-nikola-in-emacs/"&gt;Publishing with Nikola in Emacs&lt;/a&gt;

&lt;p&gt;
This time, I'm going to take the reader through the setup, step-by-step.
&lt;/p&gt;

&lt;div id="outline-container-org3890537" class="outline-2"&gt;
&lt;h2 id="org3890537"&gt;Requirements&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org3890537"&gt;
&lt;p&gt;
Here are the things you'll need for this tutorial. I'll show you some steps.
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;b&gt;Emacs&lt;/b&gt;: Obviously. With Org Mode.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Git&lt;/b&gt;: Git and a private Git repository.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Nikola&lt;/b&gt;: &lt;a href="https://getnikola.com/"&gt;Nikola&lt;/a&gt; is a static site generator, with an &lt;code&gt;orgmode&lt;/code&gt; plugin.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;nikola.el&lt;/b&gt;: &lt;a href="https://gitlab.com/drymerisnothere/nikola-el"&gt;nikola.el&lt;/a&gt; is an Emacs package that wraps Nikola functions.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Webserver&lt;/b&gt;: This setup assumes you have your own private webserver for deployment, but Nikola has a test server.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org5771357" class="outline-2"&gt;
&lt;h2 id="org5771357"&gt;Install and Configure Nikola&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org5771357"&gt;
&lt;p&gt;
From Nikola's &lt;a href="https://getnikola.com/getting-started.html"&gt;installation instructions&lt;/a&gt;, slightly tweaked to use v8.2.4:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;python3 -m venv nikola-env
cd nikola-env
bin/python -m pip install -U pip setuptools wheel
bin/python -m pip install 'Nikola[extras]==8.2.4'
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
You can now use Nikola by launching the script directly:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;bin/nikola
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Or you can activate the environment before working with Nikola and use the nikola command:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;source bin/activate
nikola
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org3744ea6" class="outline-3"&gt;
&lt;h3 id="org3744ea6"&gt;Install Nikola add-ons&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org3744ea6"&gt;
&lt;p&gt;
Now you need the Nikola &lt;code&gt;orgmode&lt;/code&gt; plugin.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;nikola plugin -i orgmode
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
And you need to install a Nikola theme. I chose the &lt;a href="https://themes.getnikola.com/v8/hack/"&gt;hack&lt;/a&gt; theme, but you can pick another.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;nikola theme -i hack
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org3d48511" class="outline-3"&gt;
&lt;h3 id="org3d48511"&gt;Init Local Blog&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org3d48511"&gt;
&lt;p&gt;
Nikola sites require a particular directory and file structure, and it has a command to create that for us. Let's use that method, rather than more complicated options.
&lt;/p&gt;

&lt;p&gt;
See &lt;a href="https://getnikola.com/getting-started.html#init"&gt;Nikola's instructions, here&lt;/a&gt;. Here's what I recommend:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;nikola init --demo &amp;lt;directory_name&amp;gt;
cd &amp;lt;directory_name&amp;gt;
git init
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
This creates the Blog structure, and also initializes the directory as a Git repository. You should continue and connect it to your Git repository, and push an initial commit.
&lt;/p&gt;

&lt;p&gt;
The &lt;code&gt;--demo&lt;/code&gt; option will fill in some blanks in your configuration file, and is recommended the first time.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org1c5a269" class="outline-3"&gt;
&lt;h3 id="org1c5a269"&gt;Configure Nikola&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org1c5a269"&gt;
&lt;p&gt;
Nikola settings live in the &lt;code&gt;conf.py&lt;/code&gt; file that was created when you initialized your blog.
&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://getnikola.com/conf.html"&gt;You can view the demo conf.py online, here.&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Most of the settings are self-explanatory, and many of them have defaults. However, we do need to change a few things for our theme and the &lt;code&gt;orgmode&lt;/code&gt; plugin.
&lt;/p&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgc88becf" class="outline-4"&gt;
&lt;h4 id="orgc88becf"&gt;Configure orgmode&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-orgc88becf"&gt;
&lt;p&gt;
At the bottom of &lt;code&gt;conf.py&lt;/code&gt;, add the following:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Add orgmode to compilers dict&lt;/span&gt;
&lt;span class="n"&gt;COMPILERS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"orgmode"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;".org"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Add org files to posts and pages&lt;/span&gt;
&lt;span class="n"&gt;POSTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;POSTS&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;"posts/*.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"posts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"post.tmpl"&lt;/span&gt;&lt;span class="p"&gt;),)&lt;/span&gt;
&lt;span class="n"&gt;PAGES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PAGES&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;"stories/*.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"stories"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"story.tmpl"&lt;/span&gt;&lt;span class="p"&gt;),)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
This will allow you to write posts and pages for your blog in org-mode, with everything that comes with that.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org87227bf" class="outline-4"&gt;
&lt;h4 id="org87227bf"&gt;Configure theme&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-org87227bf"&gt;
&lt;p&gt;
Each theme may have particular settings to configure, but here are the ones for the "hack" theme.
&lt;/p&gt;

&lt;p&gt;
Uncomment &lt;code&gt;GLOBAL_CONTEXT&lt;/code&gt;, and set:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;THEME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hack"&lt;/span&gt;
&lt;span class="c1"&gt;# ...snip...&lt;/span&gt;
&lt;span class="n"&gt;GLOBAL_CONTEXT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="n"&gt;GLOBAL_CONTEXT&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'HACK_VARIANT'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'dark'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
I also have these additional settings:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;DATE_FANCINESS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="c1"&gt;# For Hack theme&lt;/span&gt;
&lt;span class="n"&gt;NAVIGATION_LINKS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;DEFAULT_LANG&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
	&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/index.html'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Home'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
	&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/archive.html'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Archives'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
	&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/categories/index.html'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Tags'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
	&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/stories/about-me'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'About Me'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
	&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/rss.xml'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'RSS'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgbbe9b59" class="outline-4"&gt;
&lt;h4 id="orgbbe9b59"&gt;Configure deployment&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-orgbbe9b59"&gt;
&lt;p&gt;
You will probably want to configure this &lt;b&gt;after&lt;/b&gt; you've successfully built and deployed manually by your usual methods, so that you get the command right, but here's what mine looks like:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;DEPLOY_COMMANDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'default'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
	&lt;span class="s2"&gt;"rsync -rav --delete output/ root@notroot:/var/www/blog.notroot.online"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
I have my host &lt;code&gt;notroot&lt;/code&gt; configured in my &lt;code&gt;.ssh/config&lt;/code&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org67bffa5" class="outline-3"&gt;
&lt;h3 id="org67bffa5"&gt;Install and Configure &lt;code&gt;nikola.el&lt;/code&gt;&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-org67bffa5"&gt;
&lt;p&gt;
It's a bit outdated, and I can't get &lt;code&gt;M-x nikola-deploy&lt;/code&gt; to work, but otherwise we want this.
&lt;/p&gt;

&lt;p&gt;
Simplest thing is to use &lt;code&gt;use-package&lt;/code&gt;. Here's my config:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;;; Nikola.el config&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;nikola&lt;/span&gt;
  &lt;span class="nv"&gt;:config&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;nikola-output-root-directory&lt;/span&gt; &lt;span class="s"&gt;"~/Dev/mine/notroot-blog/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;nikola-verbose&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;nikola-webserver-auto&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;nikola-new-post-extension&lt;/span&gt; &lt;span class="s"&gt;"org"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;nikola-new-page-extension&lt;/span&gt; &lt;span class="s"&gt;"org"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Then from inside your &lt;code&gt;init.el&lt;/code&gt; buffer, do &lt;code&gt;M-x load-file RET RET&lt;/code&gt; to install and configure &lt;code&gt;nikola.el&lt;/code&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org9a3ab03" class="outline-2"&gt;
&lt;h2 id="org9a3ab03"&gt;Write a Blog Post in Emacs&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org9a3ab03"&gt;
&lt;p&gt;
Now we can write a blog post, like this one, in Emacs org-mode. Super easy!
&lt;/p&gt;

&lt;p&gt;
Just do &lt;code&gt;M-x nikola-new-post&lt;/code&gt; to create a new posts, or &lt;code&gt;M-x nikola-new-page&lt;/code&gt; to create a new page, like my "About Us" page.
&lt;/p&gt;

&lt;p&gt;
Emacs will give you an &lt;code&gt;*.org&lt;/code&gt; file, but will &lt;b&gt;also&lt;/b&gt; create a &lt;code&gt;*.meta&lt;/code&gt; file. Most things will be preset, but you will probably want to add tags. Here's the meta file for this blog post:
&lt;/p&gt;

&lt;pre class="example" id="orgd385add"&gt;
.. title: How I Made This Site (This Time)
.. slug: how-i-made-this-site-(this-time)
.. date: 2024-04-07 18:29:06
.. tags: nikola,emacs,org-mode,blogging,tutorial
&lt;/pre&gt;

&lt;p&gt;
And here's a screenshot of me writing this post! Talk about "meta" heheh:
&lt;/p&gt;


&lt;div id="org30f9a84" class="figure"&gt;
&lt;p&gt;&lt;img src="https://blog.notroot.online/images/how-i-made-this-1.png" alt="nil"&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orga518d03" class="outline-3"&gt;
&lt;h3 id="orga518d03"&gt;Preview and Build&lt;/h3&gt;
&lt;div class="outline-text-3" id="text-orga518d03"&gt;
&lt;p&gt;
You can also preview your work.
&lt;/p&gt;

&lt;p&gt;
Do &lt;code&gt;M-x nikola-webserver-start&lt;/code&gt; and navigate to the URL shown in the mini-buffer.
&lt;/p&gt;

&lt;p&gt;
To see changes in the blog post, you will need to stop it with &lt;code&gt;M-x nikola-webserver-stop&lt;/code&gt;, and restart it. Nikola does not rebuild on save.
&lt;/p&gt;

&lt;p&gt;
Run &lt;code&gt;M-x nikola-build&lt;/code&gt;. You can watch the progress in the &lt;code&gt;*Nikola*&lt;/code&gt; buffer.
&lt;/p&gt;
&lt;/div&gt;

&lt;div id="outline-container-orge1fb165" class="outline-4"&gt;
&lt;h4 id="orge1fb165"&gt;How Nikola Builds&lt;/h4&gt;
&lt;div class="outline-text-4" id="text-orge1fb165"&gt;
&lt;p&gt;
One of the nice things about Nikola is that it builds using Emacs org-mode export to HTML directly, rather than translating to another markdown format, first. No &lt;code&gt;pandoc&lt;/code&gt; is involved. No intermediary &lt;code&gt;*.md&lt;/code&gt; files.
&lt;/p&gt;

&lt;p&gt;
The benefit is obvious: the HTML will exported from your org files pretty much how you expect.
&lt;/p&gt;

&lt;p&gt;
The one exception I've found is that inter-org file links like &lt;code&gt;[[file:another-blog-post.org]]&lt;/code&gt; will be turned into &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags, not &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tags, which is too bad. That's because the slugs Nikola uses don't match org-mode's own. I'm sure there's an elisp workaround, but I haven't played with it, yet.
&lt;/p&gt;

&lt;p&gt;
Fortunately, this is org-mode! If you need to link from one blog post to another, just do something like:
&lt;/p&gt;

&lt;pre class="example" id="org0aa61ff"&gt;
#+begin_export html
&amp;lt;a href="/posts/publishing-with-nikola-in-emacs/"&amp;gt;Publishing with Nikola in Emacs&amp;lt;/a&amp;gt;
#+end_export
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgf886bf5" class="outline-2"&gt;
&lt;h2 id="orgf886bf5"&gt;Deploy Your Blog&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgf886bf5"&gt;
&lt;p&gt;
The &lt;code&gt;nikola-deploy&lt;/code&gt; command is, unfortunately, not working for me. I have forked this old project, and at some point I'll try to fix it, but for now, I just use the shell command in Emacs.
&lt;/p&gt;

&lt;p&gt;
Do &lt;code&gt;M-! nikola deploy&lt;/code&gt; to upload your site to your webserver.
&lt;/p&gt;

&lt;p&gt;
Then browse to your new blog. If everything is working, you should be live!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org0b6b9a1" class="outline-2"&gt;
&lt;h2 id="org0b6b9a1"&gt;Conclusion&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org0b6b9a1"&gt;
&lt;p&gt;
Once you get Nikola and &lt;code&gt;nikola.el&lt;/code&gt; working, this is a very easy way to blog, if you're an Emacs person. It's intuitive and highly configurable.
&lt;/p&gt;

&lt;p&gt;
For example, Nikola does it's own syntax highlighting, but I'll be adding something like &lt;code&gt;highlight.js&lt;/code&gt; down the road. I can add comments sections, and I've barely touched the possible Nikola add-ons.
&lt;/p&gt;

&lt;p&gt;
If you're an Emacs person, I think this is one of the more flexible, but robust, SSG integrations out there. I, too, love the idea of publishing natively using only Emacs, but one of the great features of Emacs is also its ability to compose cleanly with other commandline tools.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>blogging</category><category>emacs</category><category>nikola</category><category>org-mode</category><category>tutorial</category><guid>https://blog.notroot.online/posts/how-i-made-this-site-%28this-time%29/</guid><pubDate>Sun, 07 Apr 2024 22:29:06 GMT</pubDate></item><item><title>Blog Upgrade</title><link>https://blog.notroot.online/posts/blog-upgrade/</link><dc:creator>Notroot</dc:creator><description>&lt;p&gt;
I'm an engineer, and I'm an Emacs nut, so yes: I tinker a lot.
&lt;/p&gt;

&lt;p&gt;
My latest tinkering was to move my Nikola- and Emacs-based blog out of GitHub, when I abandoned that service entirely, and moved all my code to GitLab.
&lt;/p&gt;

&lt;p&gt;
My reasons for moving are pretty straightforward: I think the "AI" hype is bullshit, and I won't have anything to do with it. I certainly don't want Micro$oft training their "AI" LLMs on my code. Fuck our robot overlords. They can meet me in the street and we can fight it out.
&lt;/p&gt;

&lt;p&gt;
GitLab also has "AI" features, but nothing like GitHub. What's more, I can host my own GitLab and eschew their "AI" fuckstickery, entirely. Can't do that with GitHub, so it was an easy calculus to perform.
&lt;/p&gt;

&lt;p&gt;
I did try to use GitLab Pages, which is really part of GitLab CI, which is to say, "Pipelines".
&lt;/p&gt;

&lt;p&gt;
Overkill, yo. Too much configuration-over-convention for my taste. I don't like Python Django, either, for the same reason. If I'm doing web work, gimme Flask any day of the week.
&lt;/p&gt;

&lt;p&gt;
Anyhow, while I was moving my blog, I thought I'd give it a new look. No more white background, and no more left-aligned container &lt;code&gt;div&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
Still not much here on this pathetic blog, but maybe now that I can write and easily deploy to my own host, I'll actually blog a little more.
&lt;/p&gt;

&lt;p&gt;
I might even write about something besides Emacs!
&lt;/p&gt;

&lt;p&gt;
Ya never know…
&lt;/p&gt;</description><category>blog</category><category>emacs</category><category>github</category><category>gitlab</category><category>nikola</category><category>org-mode</category><guid>https://blog.notroot.online/posts/blog-upgrade/</guid><pubDate>Sat, 06 Apr 2024 21:38:32 GMT</pubDate></item><item><title>Publishing with Nikola in Emacs</title><link>https://blog.notroot.online/posts/publishing-with-nikola-in-emacs/</link><dc:creator>Notroot</dc:creator><description>&lt;p&gt;
Publishing Emacs Org Mode files to &lt;a href="https://pages.github.com/"&gt;GitHub Pages&lt;/a&gt; with &lt;a href="https://getnikola.com/"&gt;Nikola&lt;/a&gt; is fairly straight-forward. But if you want, as I did, to write and publish from within Emacs using org-mode, then there's more setup involved. It's still not terribly difficult, however. I did this all today.
&lt;/p&gt;

&lt;p&gt;
The final blog is going to be very vanilla, so I've included some additional resources to play with, as much for my own reference as for you, the reader's.
&lt;/p&gt;

&lt;div id="outline-container-orgefe0b00" class="outline-2"&gt;
&lt;h2 id="orgefe0b00"&gt;UPDATES!&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgefe0b00"&gt;
&lt;p&gt;
&lt;span class="timestamp-wrapper"&gt;&lt;span class="timestamp"&gt;&amp;lt;2022-01-29 Sat&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="timestamp-wrapper"&gt;&lt;span class="timestamp"&gt;&amp;lt;2024-04-07 Sun&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;

&lt;p&gt;
The really nice tutorial linked to above and below is 404. Since this tutorial picks up where that one left off, I've added a few other links. Some of these are old. Some don't talk about Org Mode. But the objective is this:
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Before continuing this tutorial, get Nikola to publish Org files from the command-line to your GitHub Pages.&lt;/b&gt; Here's some resources that describe how to do that:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;a href="https://streakycobra.github.io/posts/blogging-in-org-mode-with-nikola/"&gt;https://streakycobra.github.io/posts/blogging-in-org-mode-with-nikola/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://meshlogic.github.io/posts/web-design/starting-a-personal-blog-with-nikola/"&gt;https://meshlogic.github.io/posts/web-design/starting-a-personal-blog-with-nikola/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://randlow.github.io/posts/python/create-nikola-coding-blog/"&gt;https://randlow.github.io/posts/python/create-nikola-coding-blog/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://knowsuchagency.github.io/pyhi/posts/make-your-own-blog-with-github-pages-and-nikola/"&gt;http://knowsuchagency.github.io/pyhi/posts/make-your-own-blog-with-github-pages-and-nikola/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shankarmsy.github.io/posts/blogging-with-the-awesome-nikola-ipython-and-github.html"&gt;https://shankarmsy.github.io/posts/blogging-with-the-awesome-nikola-ipython-and-github.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
I will try to come back and write my own command-line tutorial later as a prequel to this post.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orge1cd598" class="outline-2"&gt;
&lt;h2 id="orge1cd598"&gt;Get Nikola Working&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orge1cd598"&gt;
&lt;p&gt;
Before we start, save yourself a headache and &lt;b&gt;don't&lt;/b&gt; install Nikola in a Python virtual environment. Or if you're using &lt;a href="https://github.com/pyenv/pyenv"&gt;pyenv&lt;/a&gt;, install it in the &lt;code&gt;global&lt;/code&gt; environment. This works fine in the terminal, but we're going to be writing some extra elisp for the &lt;code&gt;nikola.el&lt;/code&gt; package. I have no doubt there's a way to get this package working with virtual environments, but as of this writing, I haven't figured it out.
&lt;/p&gt;

&lt;p&gt;
Next, follow the instructions in &lt;a href="https://mindtoilet.github.io/posts/how-to-write-a-blog-using-nikola/"&gt;this excellent tutorial&lt;/a&gt; to get all the pieces working together, and to learn the command-line way of doing things as a fallback.
&lt;/p&gt;

&lt;p&gt;
The end result will be your first blog post on your GitHub Page. Now that you know it works, let's move on to setting up Emacs so you never have to leave it to write and publish.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org472f3f5" class="outline-2"&gt;
&lt;h2 id="org472f3f5"&gt;Install and Configure &lt;code&gt;nikola.el&lt;/code&gt;&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org472f3f5"&gt;
&lt;p&gt;
We're going to use the "simple wrapper" &lt;code&gt;nikola.el&lt;/code&gt; package as a base. Follow &lt;a href="https://gitlab.com/drymerisnothere/nikola-el"&gt;these instructions&lt;/a&gt; to install and configure it.
&lt;/p&gt;

&lt;p&gt;
We want to default to Org files, instead of HTML, so here's the &lt;code&gt;use-package&lt;/code&gt; config I have in my &lt;code&gt;init.el&lt;/code&gt;. Note that I've turned on &lt;code&gt;nikola-verbose&lt;/code&gt; and &lt;code&gt;nikola-webserver-auto&lt;/code&gt; as well as setting the default extension to &lt;code&gt;"org"&lt;/code&gt;:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;;; Nikola.el config&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;nikola&lt;/span&gt;
  &lt;span class="nv"&gt;:config&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;nikola-output-root-directory&lt;/span&gt; &lt;span class="s"&gt;"~/Dev/mine/blog.notroot.online/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;nikola-verbose&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;nikola-webserver-auto&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;nikola-new-post-extension&lt;/span&gt; &lt;span class="s"&gt;"org"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;nikola-new-page-extension&lt;/span&gt; &lt;span class="s"&gt;"org"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-orgc0746ec" class="outline-2"&gt;
&lt;h2 id="orgc0746ec"&gt;Add Wrapper for &lt;code&gt;github_deploy&lt;/code&gt;&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-orgc0746ec"&gt;
&lt;p&gt;
At this point, we &lt;b&gt;could&lt;/b&gt; just start writing by using the &lt;code&gt;nikola-new-post&lt;/code&gt; command. It will open an Org file and you can start typing, as I am right now.
&lt;/p&gt;

&lt;p&gt;
The problem comes when we run &lt;code&gt;nikola-deploy&lt;/code&gt;. That command basically runs &lt;code&gt;nikola deploy&lt;/code&gt; in a shell, &lt;b&gt;but that's not the command we want to run&lt;/b&gt;. We want to run &lt;code&gt;nikola github_deploy&lt;/code&gt;, as we did on the command-line.
&lt;/p&gt;

&lt;p&gt;
So you'll also need to add the following &lt;code&gt;nikola-github-deploy&lt;/code&gt; function to your &lt;code&gt;init.el&lt;/code&gt;, which I simply whittled down from the &lt;code&gt;nikola-deploy&lt;/code&gt;:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;;; Custom nikola-github-deploy function&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;nikola-github-deploy&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="s"&gt;"Deploys the site to GitHub using github_deploy subcommand."&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt; &lt;span class="s"&gt;"Deploying the site to GitHub pages..."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;async-start&lt;/span&gt;
   &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;async-inject-variables&lt;/span&gt; &lt;span class="s"&gt;"\\(nikola-\\)"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;output&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;default-directory&lt;/span&gt; &lt;span class="nv"&gt;nikola-output-root-directory&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
	&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;run-hook-with-args&lt;/span&gt; &lt;span class="ss"&gt;'nikola-deploy-before-hook&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
	&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;not &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt; &lt;span class="nv"&gt;nikola-deploy-before-hook-script&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
	    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;output&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;shell-command-to-string&lt;/span&gt;
			  &lt;span class="nv"&gt;nikola-deploy-before-hook-script&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
	&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;output&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;shell-command-to-string&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt; &lt;span class="nv"&gt;nikola-command&lt;/span&gt; &lt;span class="s"&gt;" github_deploy"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
	&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;not &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt; &lt;span class="nv"&gt;nikola-deploy-after-hook-script&lt;/span&gt; &lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
	    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;output&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;shell-command-to-string&lt;/span&gt;
			  &lt;span class="nv"&gt;nikola-deploy-after-hook-script&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
	&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;run-hook-with-args&lt;/span&gt; &lt;span class="ss"&gt;'nikola-deploy-before-hook&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="nv"&gt;output&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cl-search&lt;/span&gt; &lt;span class="s"&gt;"This command needs to run inside an existing Nikola site."&lt;/span&gt;
		    &lt;span class="nv"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
	 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt; &lt;span class="nv"&gt;nikola-verbose&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
	     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt; &lt;span class="s"&gt;"Something went wrong. You may want to set nikola-verbo\&lt;/span&gt;
&lt;span class="s"&gt;se to t and retry it."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
	   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt; &lt;span class="s"&gt;"Something went wrong. You may want to check the *Nikola*\&lt;/span&gt;
&lt;span class="s"&gt;buffer."&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
       &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt; &lt;span class="s"&gt;"Site deployed correctly."&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt; &lt;span class="nv"&gt;nikola-verbose&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
	 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;save-window-excursion&lt;/span&gt;
	   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;switch-to-buffer&lt;/span&gt; &lt;span class="s"&gt;"*Nikola*"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
	   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;inhibit-read-only&lt;/span&gt; &lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
	     &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt; &lt;span class="nv"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)))))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org440038c" class="outline-2"&gt;
&lt;h2 id="org440038c"&gt;Write and Publish from Emacs&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org440038c"&gt;
&lt;p&gt;
Now you can evaluate the &lt;code&gt;init.el&lt;/code&gt; buffer, or restart Emacs, and do &lt;code&gt;nikola-new-post&lt;/code&gt;. Emacs will ask for the title, and create the post files, and open a buffer to write a new post.
&lt;/p&gt;

&lt;p&gt;
You'll immediately notice that, unlike the command-line experience you had earlier, the meta is not included at the top of the new buffer that opens. If your new post is named &lt;code&gt;publishing-with-nikola-in-emacs.org&lt;/code&gt;, then the meta will be in the same directory, and named &lt;code&gt;publishing-with-nikola-in-emacs.meta&lt;/code&gt;. You will have to edit it separately.
&lt;/p&gt;

&lt;pre class="example" id="org250e9a9"&gt;
.. title: Publishing with Nikola in Emacs
.. slug: publishing-with-nikola-in-emacs
.. date: 2020-11-12 17:25:34
.. tags: emacs,nikola,blogging
&lt;/pre&gt;

&lt;p&gt;
When you're done writing your amazing blog post, just save it.
&lt;/p&gt;

&lt;p&gt;
Now try previewing your new post by running &lt;code&gt;nikola-webserver-start&lt;/code&gt;. Notice that that this is a &lt;b&gt;live preview&lt;/b&gt;, and if you make changes and save again, you will see them when you refresh your browser.
&lt;/p&gt;

&lt;p&gt;
Next, run &lt;code&gt;nikola-build&lt;/code&gt; to make sure everything is rebuilt and updated.
&lt;/p&gt;

&lt;p&gt;
When you're happy with the final result, then just publish it with &lt;code&gt;nikola-github-deploy&lt;/code&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id="outline-container-org1bfc8bd" class="outline-2"&gt;
&lt;h2 id="org1bfc8bd"&gt;Additional Resources&lt;/h2&gt;
&lt;div class="outline-text-2" id="text-org1bfc8bd"&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;b&gt;Syntax Highlighting&lt;/b&gt;: If you included source blocks in your Org file, you probably noticed that syntax highlighting isn't supported. I'm going to look at &lt;a href="https://github.com/redguardtoo/org2nikola"&gt;org2nikola&lt;/a&gt; package to add &lt;code&gt;highlight.js&lt;/code&gt; support at some point.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Themes and Templates&lt;/b&gt;: Since I'm almost as new at this as you, the reader, are, I've got jack. I'm going to look into &lt;a href="https://getnikola.com/creating-a-theme.html"&gt;Nikola theme creation&lt;/a&gt; at some point in the future, and if suddenly this blog looks better, it's because I learned something. I'll probably blog about it!&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>blogging</category><category>emacs</category><category>nikola</category><guid>https://blog.notroot.online/posts/publishing-with-nikola-in-emacs/</guid><pubDate>Thu, 12 Nov 2020 22:25:34 GMT</pubDate></item></channel></rss>