aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.build.yml21
-rw-r--r--LICENSE22
-rw-r--r--Makefile2
-rw-r--r--README.md8
-rw-r--r--build/about/index.html50
-rw-r--r--build/index.atom206
-rw-r--r--build/index.html52
-rw-r--r--build/posts/markdown-examples/index.html227
-rw-r--r--footer.html19
-rw-r--r--header.html21
-rw-r--r--index.md9
-rw-r--r--pages/about.md10
-rw-r--r--posts/markdown-examples.md139
-rw-r--r--public/images/cat.jpgbin0 -> 19054 bytes
14 files changed, 784 insertions, 2 deletions
diff --git a/.build.yml b/.build.yml
new file mode 100644
index 0000000..8cdd780
--- /dev/null
+++ b/.build.yml
@@ -0,0 +1,21 @@
+image: alpine/latest
+oauth: pages.sr.ht/PAGES:RW
+packages:
+- ruby
+- go
+- hut
+environment:
+site: wruby.btxx.org
+sources:
+- https://git.sr.ht/~bt/wruby
+tasks:
+- install-gems: |
+ sudo gem install kramdown rss
+- build: |
+ cd wruby
+ make build
+- package: |
+ cd wruby/build
+ tar -cvz . > ../../site.tar.gz
+- upload: |
+ hut pages publish -d wruby.btxx.org site.tar.gz
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..17c9842
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2024 Bradley Taunt
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/Makefile b/Makefile
index b4d62f6..9d7e5a1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
build:
rm -rf build && mkdir build
- ruby blog.rb
+ ruby wruby.rb
clean:
rm -rf build/*
diff --git a/README.md b/README.md
index 9c6e1ff..43bda2f 100644
--- a/README.md
+++ b/README.md
@@ -14,10 +14,16 @@ Install required gems:
gem install kramdown rss
```
+## Getting Started
+
+Make your changes in the top of the main `wruby.rb` file (site URL, your name,
+etc.). Remove the `.build.yml` unless you plan to host with sourcehut pages,
+otherwise edit this file with your own details.
+
## Running
1. Create markdown blog posts under root `posts/` directory
2. Create markdown pages under root `/pages` directory
3. Store media (images, videos etc) inside the root `/public` directory
4. Run `make build` in root
-5. Upload `build` folder to your server \ No newline at end of file
+5. Upload `build` folder to your server
diff --git a/build/about/index.html b/build/about/index.html
new file mode 100644
index 0000000..ef79ef3
--- /dev/null
+++ b/build/about/index.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="color-scheme" content="dark light">
+ <link rel="icon" href="data:,">
+ <title>About</title>
+ <link href="/atom.xml" type="application/atom+xml" rel="alternate" title="Atom feed for blog posts" />
+ <link href="/rss.xml" type="application/rss+xml" rel="alternate" title="RSS feed for blog posts" />
+<style>*{box-sizing:border-box;}body{font-family:sans-serif;line-height:1.33;margin:0
+auto;max-width:650px;padding:1rem;}blockquote{background:#eee;border-left:4px
+ solid;color:black;padding-left:5px;}img{max-width:100%;}pre{border:1px solid;overflow:auto;padding:5px;}table{text-align:left;width:100%;}.posts,#menu{list-style:none;padding:0;}.posts li{margin-bottom:8px;}.posts li span{display:block;font-size:90%;}#menu li{display:inline-block;margin-right:8px;}.footnotes{font-size:90%;}</style>
+</head>
+
+<nav>
+ <a href="/">Home</a><span>&nbsp;|&nbsp;</span><a href="#menu">Menu &darr;</a>
+</nav>
+
+<main>
+
+<h1 id="about">About</h1>
+
+<p>wruby is a minimal blog generator written in Ruby.</p>
+
+<h2 id="why">Why?</h2>
+
+<p>This project was created by me, <a href="btxx.org">Bradley Taunt</a>, out of frustration with overly complex and bloated blogging options. I tried so many “minimal” generators but each one ended up having some glaring issue or heavy reliance on dependencies. Originally, I solved this problem by creating <a href="https://barf.btxx.org">barf</a> - a blog generator pieced together with basic sheel scripting. While this project works well, I prefer to write with Ruby since it is such a beautiful language.</p>
+
+<p>So, wruby was born. There isn’t much else to say. I hope you enjoy using it and
+be sure to report any issues if you come arcoss any bugs!</p>
+</main>
+<hr/>
+<footer role="contentinfo">
+ <h2>Menu Navigation</h2>
+ <ul id="menu">
+ <li><a href="/">Home</a></li>
+ <li><a href="/about">About</a></li>
+ <li><a href="/index.atom">RSS</a></li>
+ <li><a href="#top">&uarr; Top of the page</a></li>
+ </ul>
+ <small>
+ Built with <a href="https://wruby.btxx.org">wruby</a>. <br>
+ Maintained with ♥ for the web. <br>
+ The content for this site is <a
+ href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>.<br>
+ The <a href="https://git.sr.ht/~bt/wruby">code for this project</a>
+ is <a href="https://git.sr.ht/~bt/wruby/tree/master/item/LICENSE">MIT</a>.
+ </small>
+</footer>
diff --git a/build/index.atom b/build/index.atom
new file mode 100644
index 0000000..177677e
--- /dev/null
+++ b/build/index.atom
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <author>
+ <name>Bradley Taunt</name>
+ </author>
+ <id>wruby</id>
+ <title>wruby RSS Feed</title>
+ <updated>2024-07-21T11:59:55-04:00</updated>
+ <entry>
+ <content type="html">&lt;h1 id=&quot;markdown-examples-in-wruby&quot;&gt;Markdown Examples in wruby&lt;/h1&gt;
+
+&lt;p&gt;2024-07-20&lt;/p&gt;
+
+&lt;h2 id=&quot;an-h2-header&quot;&gt;An h2 header&lt;/h2&gt;
+
+&lt;p&gt;Paragraphs are separated by a blank line.&lt;/p&gt;
+
+&lt;p&gt;2nd paragraph. &lt;em&gt;Italic&lt;/em&gt;, &lt;strong&gt;bold&lt;/strong&gt;, and &lt;code&gt;monospace&lt;/code&gt;. Itemized lists
+look like:&lt;/p&gt;
+
+&lt;ul&gt;
+ &lt;li&gt;this one&lt;/li&gt;
+ &lt;li&gt;that one&lt;/li&gt;
+ &lt;li&gt;the other one&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;p&gt;Note that — not considering the asterisk — the actual text
+content starts at 4-columns in.&lt;/p&gt;
+
+&lt;blockquote&gt;
+ &lt;p&gt;Block quotes are
+written like so.&lt;/p&gt;
+
+ &lt;p&gt;They can span multiple paragraphs,
+if you like.&lt;/p&gt;
+&lt;/blockquote&gt;
+
+&lt;p&gt;Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., “it’s all
+in chapters 12–14”). Three dots … will be converted to an ellipsis.
+Unicode is supported. ☺&lt;/p&gt;
+
+&lt;h3 id=&quot;an-h3-header&quot;&gt;An h3 header&lt;/h3&gt;
+
+&lt;p&gt;Here’s a numbered list:&lt;/p&gt;
+
+&lt;ol&gt;
+ &lt;li&gt;first item&lt;/li&gt;
+ &lt;li&gt;second item&lt;/li&gt;
+ &lt;li&gt;third item&lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;p&gt;Note again how the actual text starts at 4 columns in (4 characters
+from the left side). Here’s a code sample:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;# Let me re-iterate ...
+for i in 1 .. 10 { do-something(i) }
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;As you probably guessed, indented 4 spaces. By the way, instead of
+indenting the block, you can use delimited blocks, if you like:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code&gt;define foobar() {
+ print &quot;Welcome to flavor country!&quot;;
+}
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;p&gt;(which makes copying &amp;amp; pasting easier). You can optionally mark the
+delimited block for Pandoc to syntax highlight it:&lt;/p&gt;
+
+&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import time
+# Quick, count to ten!
+for i in range(10):
+ # (but not *too* quick)
+ time.sleep(0.5)
+ print i
+&lt;/code&gt;&lt;/pre&gt;
+
+&lt;h4 id=&quot;an-h4-header&quot;&gt;An h4 header&lt;/h4&gt;
+
+&lt;p&gt;Now a nested list:&lt;/p&gt;
+
+&lt;ol&gt;
+ &lt;li&gt;
+ &lt;p&gt;First, get these ingredients:&lt;/p&gt;
+
+ &lt;ul&gt;
+ &lt;li&gt;carrots&lt;/li&gt;
+ &lt;li&gt;celery&lt;/li&gt;
+ &lt;li&gt;lentils&lt;/li&gt;
+ &lt;/ul&gt;
+ &lt;/li&gt;
+ &lt;li&gt;
+ &lt;p&gt;Boil some water.&lt;/p&gt;
+ &lt;/li&gt;
+ &lt;li&gt;
+ &lt;p&gt;Dump everything in the pot and follow
+this algorithm:&lt;/p&gt;
+
+ &lt;pre&gt;&lt;code&gt;find wooden spoon
+uncover pot
+stir
+cover pot
+balance wooden spoon precariously on pot handle
+wait 10 minutes
+goto first step (or shut off burner when done)
+&lt;/code&gt;&lt;/pre&gt;
+
+ &lt;p&gt;Do not bump wooden spoon or it will fall.&lt;/p&gt;
+ &lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;p&gt;Notice again how text always lines up on 4-space indents (including
+that last line which continues item 3 above).&lt;/p&gt;
+
+&lt;p&gt;Here’s a link to &lt;a href=&quot;http://foo.bar&quot;&gt;a website&lt;/a&gt;, to a &lt;a href=&quot;local-doc.html&quot;&gt;local
+doc&lt;/a&gt;, and to a &lt;a href=&quot;#an-h2-header&quot;&gt;section heading in the current
+doc&lt;/a&gt;. Here’s a footnote &lt;sup id=&quot;fnref:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
+
+&lt;p&gt;Tables can look like this:&lt;/p&gt;
+
+&lt;table&gt;
+ &lt;thead&gt;
+ &lt;tr&gt;
+ &lt;th&gt;size&lt;/th&gt;
+ &lt;th&gt;material&lt;/th&gt;
+ &lt;th&gt;color&lt;/th&gt;
+ &lt;/tr&gt;
+ &lt;/thead&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;9&lt;/td&gt;
+ &lt;td&gt;leather&lt;/td&gt;
+ &lt;td&gt;brown&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;10&lt;/td&gt;
+ &lt;td&gt;hemp&lt;/td&gt;
+ &lt;td&gt;natural&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;11&lt;/td&gt;
+ &lt;td&gt;glass&lt;/td&gt;
+ &lt;td&gt;transparent&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+&lt;/table&gt;
+
+&lt;p&gt;Table: Shoes, their sizes, and what they’re made of.&lt;/p&gt;
+
+&lt;p&gt;A horizontal rule follows.&lt;/p&gt;
+
+&lt;hr /&gt;
+
+&lt;p&gt;Here’s a definition list:&lt;/p&gt;
+
+&lt;dl&gt;
+ &lt;dt&gt;apples&lt;/dt&gt;
+ &lt;dd&gt;Good for making applesauce.
+oranges&lt;/dd&gt;
+ &lt;dd&gt;Citrus!
+tomatoes&lt;/dd&gt;
+ &lt;dd&gt;There’s no “e” in tomatoe.&lt;/dd&gt;
+&lt;/dl&gt;
+
+&lt;p&gt;Again, text is indented 4 spaces. (Put a blank line between each
+term/definition pair to spread things out more.)&lt;/p&gt;
+
+&lt;p&gt;Here’s a “line block”:&lt;/p&gt;
+
+&lt;table&gt;
+ &lt;tbody&gt;
+ &lt;tr&gt;
+ &lt;td&gt;Line one&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;Line too&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;tr&gt;
+ &lt;td&gt;Line tree&lt;/td&gt;
+ &lt;/tr&gt;
+ &lt;/tbody&gt;
+&lt;/table&gt;
+
+&lt;p&gt;and images can be specified like so:&lt;/p&gt;
+
+&lt;p&gt;&lt;img src=&quot;https://placekitten.com/480/480&quot; alt=&quot;example image&quot; title=&quot;An exemplary image&quot; /&gt;&lt;/p&gt;
+
+&lt;p&gt;And note that you can backslash-escape any punctuation characters
+which you wish to be displayed literally, ex.: `foo`, *bar*, etc.&lt;/p&gt;
+&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
+ &lt;ol&gt;
+ &lt;li id=&quot;fn:1&quot; role=&quot;doc-endnote&quot;&gt;
+ &lt;p&gt;Footnote text goes here. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
+ &lt;/li&gt;
+ &lt;/ol&gt;
+&lt;/div&gt;
+</content>
+ <id>https://wruby.btxx.org/markdown-examples/</id>
+ <link href="https://wruby.btxx.org/markdown-examples/"/>
+ <title>Markdown Examples in wruby</title>
+ <updated>2024-07-20T00:00:00-04:00</updated>
+ <dc:date>2024-07-20T00:00:00-04:00</dc:date>
+ </entry>
+ <dc:date>2024-07-21T11:59:55-04:00</dc:date>
+</feed> \ No newline at end of file
diff --git a/build/index.html b/build/index.html
new file mode 100644
index 0000000..5f89c2f
--- /dev/null
+++ b/build/index.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="color-scheme" content="dark light">
+ <link rel="icon" href="data:,">
+ <title>wruby</title>
+ <link href="/atom.xml" type="application/atom+xml" rel="alternate" title="Atom feed for blog posts" />
+ <link href="/rss.xml" type="application/rss+xml" rel="alternate" title="RSS feed for blog posts" />
+<style>*{box-sizing:border-box;}body{font-family:sans-serif;line-height:1.33;margin:0
+auto;max-width:650px;padding:1rem;}blockquote{background:#eee;border-left:4px
+ solid;color:black;padding-left:5px;}img{max-width:100%;}pre{border:1px solid;overflow:auto;padding:5px;}table{text-align:left;width:100%;}.posts,#menu{list-style:none;padding:0;}.posts li{margin-bottom:8px;}.posts li span{display:block;font-size:90%;}#menu li{display:inline-block;margin-right:8px;}.footnotes{font-size:90%;}</style>
+</head>
+
+<nav>
+ <a href="/">Home</a><span>&nbsp;|&nbsp;</span><a href="#menu">Menu &darr;</a>
+</nav>
+
+<main>
+
+<h1 id="wruby">wruby</h1>
+
+<p><strong>wruby is a single file, minimal blog generator written in Ruby.</strong></p>
+
+<p>The “w” is silent…</p>
+
+<p>You can learn more by reading <a href="https://git.sr.ht/~bt/wruby">the official README</a>.</p>
+
+<h2 id="articles">Articles</h2>
+<ul class="posts">
+<li><span>2024-07-20</span><a href='/posts/markdown-examples/'>Markdown Examples in wruby</a></li>
+</ul>
+</main>
+<hr/>
+<footer role="contentinfo">
+ <h2>Menu Navigation</h2>
+ <ul id="menu">
+ <li><a href="/">Home</a></li>
+ <li><a href="/about">About</a></li>
+ <li><a href="/index.atom">RSS</a></li>
+ <li><a href="#top">&uarr; Top of the page</a></li>
+ </ul>
+ <small>
+ Built with <a href="https://wruby.btxx.org">wruby</a>. <br>
+ Maintained with ♥ for the web. <br>
+ The content for this site is <a
+ href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>.<br>
+ The <a href="https://git.sr.ht/~bt/wruby">code for this project</a>
+ is <a href="https://git.sr.ht/~bt/wruby/tree/master/item/LICENSE">MIT</a>.
+ </small>
+</footer>
diff --git a/build/posts/markdown-examples/index.html b/build/posts/markdown-examples/index.html
new file mode 100644
index 0000000..f6c0a03
--- /dev/null
+++ b/build/posts/markdown-examples/index.html
@@ -0,0 +1,227 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="color-scheme" content="dark light">
+ <link rel="icon" href="data:,">
+ <title>Markdown Examples in wruby</title>
+ <link href="/atom.xml" type="application/atom+xml" rel="alternate" title="Atom feed for blog posts" />
+ <link href="/rss.xml" type="application/rss+xml" rel="alternate" title="RSS feed for blog posts" />
+<style>*{box-sizing:border-box;}body{font-family:sans-serif;line-height:1.33;margin:0
+auto;max-width:650px;padding:1rem;}blockquote{background:#eee;border-left:4px
+ solid;color:black;padding-left:5px;}img{max-width:100%;}pre{border:1px solid;overflow:auto;padding:5px;}table{text-align:left;width:100%;}.posts,#menu{list-style:none;padding:0;}.posts li{margin-bottom:8px;}.posts li span{display:block;font-size:90%;}#menu li{display:inline-block;margin-right:8px;}.footnotes{font-size:90%;}</style>
+</head>
+
+<nav>
+ <a href="/">Home</a><span>&nbsp;|&nbsp;</span><a href="#menu">Menu &darr;</a>
+</nav>
+
+<main>
+
+<h1 id="markdown-examples-in-wruby">Markdown Examples in wruby</h1>
+
+<p>2024-07-20</p>
+
+<h2 id="an-h2-header">An h2 header</h2>
+
+<p>Paragraphs are separated by a blank line.</p>
+
+<p>2nd paragraph. <em>Italic</em>, <strong>bold</strong>, and <code>monospace</code>. Itemized lists
+look like:</p>
+
+<ul>
+ <li>this one</li>
+ <li>that one</li>
+ <li>the other one</li>
+</ul>
+
+<p>Note that — not considering the asterisk — the actual text
+content starts at 4-columns in.</p>
+
+<blockquote>
+ <p>Block quotes are
+written like so.</p>
+
+ <p>They can span multiple paragraphs,
+if you like.</p>
+</blockquote>
+
+<p>Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., “it’s all
+in chapters 12–14”). Three dots … will be converted to an ellipsis.
+Unicode is supported. ☺</p>
+
+<h3 id="an-h3-header">An h3 header</h3>
+
+<p>Here’s a numbered list:</p>
+
+<ol>
+ <li>first item</li>
+ <li>second item</li>
+ <li>third item</li>
+</ol>
+
+<p>Note again how the actual text starts at 4 columns in (4 characters
+from the left side). Here’s a code sample:</p>
+
+<pre><code># Let me re-iterate ...
+for i in 1 .. 10 { do-something(i) }
+</code></pre>
+
+<p>As you probably guessed, indented 4 spaces. By the way, instead of
+indenting the block, you can use delimited blocks, if you like:</p>
+
+<pre><code>define foobar() {
+ print "Welcome to flavor country!";
+}
+</code></pre>
+
+<p>(which makes copying &amp; pasting easier). You can optionally mark the
+delimited block for Pandoc to syntax highlight it:</p>
+
+<pre><code class="language-python">import time
+# Quick, count to ten!
+for i in range(10):
+ # (but not *too* quick)
+ time.sleep(0.5)
+ print i
+</code></pre>
+
+<h4 id="an-h4-header">An h4 header</h4>
+
+<p>Now a nested list:</p>
+
+<ol>
+ <li>
+ <p>First, get these ingredients:</p>
+
+ <ul>
+ <li>carrots</li>
+ <li>celery</li>
+ <li>lentils</li>
+ </ul>
+ </li>
+ <li>
+ <p>Boil some water.</p>
+ </li>
+ <li>
+ <p>Dump everything in the pot and follow
+this algorithm:</p>
+
+ <pre><code>find wooden spoon
+uncover pot
+stir
+cover pot
+balance wooden spoon precariously on pot handle
+wait 10 minutes
+goto first step (or shut off burner when done)
+</code></pre>
+
+ <p>Do not bump wooden spoon or it will fall.</p>
+ </li>
+</ol>
+
+<p>Notice again how text always lines up on 4-space indents (including
+that last line which continues item 3 above).</p>
+
+<p>Here’s a link to <a href="http://foo.bar">a website</a>, to a <a href="local-doc.html">local
+doc</a>, and to a <a href="#an-h2-header">section heading in the current
+doc</a>. Here’s a footnote <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.</p>
+
+<p>Tables can look like this:</p>
+
+<table>
+ <thead>
+ <tr>
+ <th>size</th>
+ <th>material</th>
+ <th>color</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>9</td>
+ <td>leather</td>
+ <td>brown</td>
+ </tr>
+ <tr>
+ <td>10</td>
+ <td>hemp</td>
+ <td>natural</td>
+ </tr>
+ <tr>
+ <td>11</td>
+ <td>glass</td>
+ <td>transparent</td>
+ </tr>
+ </tbody>
+</table>
+
+<p>Table: Shoes, their sizes, and what they’re made of.</p>
+
+<p>A horizontal rule follows.</p>
+
+<hr />
+
+<p>Here’s a definition list:</p>
+
+<dl>
+ <dt>apples</dt>
+ <dd>Good for making applesauce.
+oranges</dd>
+ <dd>Citrus!
+tomatoes</dd>
+ <dd>There’s no “e” in tomatoe.</dd>
+</dl>
+
+<p>Again, text is indented 4 spaces. (Put a blank line between each
+term/definition pair to spread things out more.)</p>
+
+<p>Here’s a “line block”:</p>
+
+<table>
+ <tbody>
+ <tr>
+ <td>Line one</td>
+ </tr>
+ <tr>
+ <td>Line too</td>
+ </tr>
+ <tr>
+ <td>Line tree</td>
+ </tr>
+ </tbody>
+</table>
+
+<p>and images can be specified like so:</p>
+
+<p><img src="https://placekitten.com/480/480" alt="example image" title="An exemplary image" /></p>
+
+<p>And note that you can backslash-escape any punctuation characters
+which you wish to be displayed literally, ex.: `foo`, *bar*, etc.</p>
+<div class="footnotes" role="doc-endnotes">
+ <ol>
+ <li id="fn:1" role="doc-endnote">
+ <p>Footnote text goes here. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
+ </li>
+ </ol>
+</div>
+</main>
+<hr/>
+<footer role="contentinfo">
+ <h2>Menu Navigation</h2>
+ <ul id="menu">
+ <li><a href="/">Home</a></li>
+ <li><a href="/about">About</a></li>
+ <li><a href="/index.atom">RSS</a></li>
+ <li><a href="#top">&uarr; Top of the page</a></li>
+ </ul>
+ <small>
+ Built with <a href="https://wruby.btxx.org">wruby</a>. <br>
+ Maintained with ♥ for the web. <br>
+ The content for this site is <a
+ href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>.<br>
+ The <a href="https://git.sr.ht/~bt/wruby">code for this project</a>
+ is <a href="https://git.sr.ht/~bt/wruby/tree/master/item/LICENSE">MIT</a>.
+ </small>
+</footer>
diff --git a/footer.html b/footer.html
new file mode 100644
index 0000000..7575af9
--- /dev/null
+++ b/footer.html
@@ -0,0 +1,19 @@
+</main>
+<hr/>
+<footer role="contentinfo">
+ <h2>Menu Navigation</h2>
+ <ul id="menu">
+ <li><a href="/">Home</a></li>
+ <li><a href="/about">About</a></li>
+ <li><a href="/index.atom">RSS</a></li>
+ <li><a href="#top">&uarr; Top of the page</a></li>
+ </ul>
+ <small>
+ Built with <a href="https://wruby.btxx.org">wruby</a>. <br>
+ Maintained with ♥ for the web. <br>
+ The content for this site is <a
+ href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>.<br>
+ The <a href="https://git.sr.ht/~bt/wruby">code for this project</a>
+ is <a href="https://git.sr.ht/~bt/wruby/tree/master/item/LICENSE">MIT</a>.
+ </small>
+</footer>
diff --git a/header.html b/header.html
new file mode 100644
index 0000000..edb98c7
--- /dev/null
+++ b/header.html
@@ -0,0 +1,21 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="color-scheme" content="dark light">
+ <link rel="icon" href="data:,">
+ <title>{{TITLE}}</title>
+ <link href="/atom.xml" type="application/atom+xml" rel="alternate" title="Atom feed for blog posts" />
+ <link href="/rss.xml" type="application/rss+xml" rel="alternate" title="RSS feed for blog posts" />
+<style>*{box-sizing:border-box;}body{font-family:sans-serif;line-height:1.33;margin:0
+auto;max-width:650px;padding:1rem;}blockquote{background:#eee;border-left:4px
+ solid;color:black;padding-left:5px;}img{max-width:100%;}pre{border:1px solid;overflow:auto;padding:5px;}table{text-align:left;width:100%;}.posts,#menu{list-style:none;padding:0;}.posts li{margin-bottom:8px;}.posts li span{display:block;font-size:90%;}#menu li{display:inline-block;margin-right:8px;}.footnotes{font-size:90%;}</style>
+</head>
+
+<nav>
+ <a href="/">Home</a><span>&nbsp;|&nbsp;</span><a href="#menu">Menu &darr;</a>
+</nav>
+
+<main>
+
diff --git a/index.md b/index.md
new file mode 100644
index 0000000..acb5628
--- /dev/null
+++ b/index.md
@@ -0,0 +1,9 @@
+# wruby
+
+**wruby is a single file, minimal blog generator written in Ruby.**
+
+The "w" is silent...
+
+You can learn more by reading [the official README](https://git.sr.ht/~bt/wruby).
+
+## Articles
diff --git a/pages/about.md b/pages/about.md
new file mode 100644
index 0000000..18dafa6
--- /dev/null
+++ b/pages/about.md
@@ -0,0 +1,10 @@
+# About
+
+wruby is a minimal blog generator written in Ruby.
+
+## Why?
+
+This project was created by me, [Bradley Taunt](btxx.org), out of frustration with overly complex and bloated blogging options. I tried so many "minimal" generators but each one ended up having some glaring issue or heavy reliance on dependencies. Originally, I solved this problem by creating [barf](https://barf.btxx.org) - a blog generator pieced together with basic sheel scripting. While this project works well, I prefer to write with Ruby since it is such a beautiful language.
+
+So, wruby was born. There isn't much else to say. I hope you enjoy using it and
+be sure to report any issues if you come arcoss any bugs!
diff --git a/posts/markdown-examples.md b/posts/markdown-examples.md
new file mode 100644
index 0000000..5df1b91
--- /dev/null
+++ b/posts/markdown-examples.md
@@ -0,0 +1,139 @@
+# Markdown Examples in wruby
+
+2024-07-20
+
+## An h2 header
+
+Paragraphs are separated by a blank line.
+
+2nd paragraph. *Italic*, **bold**, and `monospace`. Itemized lists
+look like:
+
+ * this one
+ * that one
+ * the other one
+
+Note that --- not considering the asterisk --- the actual text
+content starts at 4-columns in.
+
+> Block quotes are
+> written like so.
+>
+> They can span multiple paragraphs,
+> if you like.
+
+Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., "it's all
+in chapters 12--14"). Three dots ... will be converted to an ellipsis.
+Unicode is supported. ☺
+
+
+
+### An h3 header
+
+Here's a numbered list:
+
+ 1. first item
+ 2. second item
+ 3. third item
+
+Note again how the actual text starts at 4 columns in (4 characters
+from the left side). Here's a code sample:
+
+ # Let me re-iterate ...
+ for i in 1 .. 10 { do-something(i) }
+
+As you probably guessed, indented 4 spaces. By the way, instead of
+indenting the block, you can use delimited blocks, if you like:
+
+~~~
+define foobar() {
+ print "Welcome to flavor country!";
+}
+~~~
+
+(which makes copying & pasting easier). You can optionally mark the
+delimited block for Pandoc to syntax highlight it:
+
+~~~python
+import time
+# Quick, count to ten!
+for i in range(10):
+ # (but not *too* quick)
+ time.sleep(0.5)
+ print i
+~~~
+
+
+
+#### An h4 header
+
+Now a nested list:
+
+ 1. First, get these ingredients:
+
+ * carrots
+ * celery
+ * lentils
+
+ 2. Boil some water.
+
+ 3. Dump everything in the pot and follow
+ this algorithm:
+
+ find wooden spoon
+ uncover pot
+ stir
+ cover pot
+ balance wooden spoon precariously on pot handle
+ wait 10 minutes
+ goto first step (or shut off burner when done)
+
+ Do not bump wooden spoon or it will fall.
+
+Notice again how text always lines up on 4-space indents (including
+that last line which continues item 3 above).
+
+Here's a link to [a website](http://foo.bar), to a [local
+doc](local-doc.html), and to a [section heading in the current
+doc](#an-h2-header). Here's a footnote [^1].
+
+[^1]: Footnote text goes here.
+
+Tables can look like this:
+
+|size|material|color|
+|----|--------|-----|
+|9 |leather |brown|
+|10 |hemp |natural|
+|11 |glass |transparent|
+
+Table: Shoes, their sizes, and what they're made of.
+
+A horizontal rule follows.
+
+***
+
+Here's a definition list:
+
+apples
+ : Good for making applesauce.
+oranges
+ : Citrus!
+tomatoes
+ : There's no "e" in tomatoe.
+
+Again, text is indented 4 spaces. (Put a blank line between each
+term/definition pair to spread things out more.)
+
+Here's a "line block":
+
+| Line one
+| Line too
+| Line tree
+
+and images can be specified like so:
+
+![example image](/public/images/cat.jpg "An exemplary image")
+
+And note that you can backslash-escape any punctuation characters
+which you wish to be displayed literally, ex.: \`foo\`, \*bar\*, etc.
diff --git a/public/images/cat.jpg b/public/images/cat.jpg
new file mode 100644
index 0000000..29b054d
--- /dev/null
+++ b/public/images/cat.jpg
Binary files differ