summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorToby Vincent <tobyv13@gmail.com>2023-05-18 00:54:27 -0500
committerToby Vincent <tobyv13@gmail.com>2023-05-18 00:54:27 -0500
commitb3a68d6838bfa3560b4718cf8437ffb4b1fa3eea (patch)
tree8675c9956d3d6c190df7705422aedfdb5f8e8937
parente2cd16b211dbd88772ee8a6cbe3ca724fe2014bd (diff)
feat: create templates and basic content pages
-rw-r--r--.gitignore1
-rw-r--r--config.toml8
-rw-r--r--content/_index.md12
-rw-r--r--content/about.md8
-rw-r--r--content/posts/_index.md5
-rw-r--r--content/posts/bees.md10
-rw-r--r--content/posts/yubikey.md116
-rw-r--r--content/projects.md5
-rw-r--r--sass/style.scss166
-rw-r--r--static/publickey.asc157
-rw-r--r--templates/index.html61
-rw-r--r--templates/macros.html71
-rw-r--r--templates/page.html9
-rw-r--r--templates/post.html14
-rw-r--r--templates/section.html23
15 files changed, 664 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a48cf0d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+public
diff --git a/config.toml b/config.toml
index 79660f7..8608327 100644
--- a/config.toml
+++ b/config.toml
@@ -11,10 +11,14 @@ highlight_code = true
highlight_theme = "gruvbox-dark"
[extra]
+repository = "https://git.sr.ht/~tobyvin/tobyvin.dev"
+license = "MIT"
author = "Toby Vincent"
-email = "tobyv13@gmail.com"
+email = "contact@tobyvin.dev"
+pgp = "C8F6E06F5C8E2634"
github = "tobyvin"
-twitter = "toby_wan94"
sourcehut = "~tobyvin"
+linkedin = "tobyvin"
+twitter = "toby_wan94"
favicon = ""
headerImage = ""
diff --git a/content/_index.md b/content/_index.md
new file mode 100644
index 0000000..bf4a2dd
--- /dev/null
+++ b/content/_index.md
@@ -0,0 +1,12 @@
++++
+title = "Toby Vincent"
+description = "Software Engineer - Tinker - Problem ~~creator~~ solver"
++++
+
+## Meta
+
+- email: [contact@tobyvin.dev]("mailto:contact@tobyvin.dev")
+- github: [tobyvin]("https://github.com/tobyvin")
+- sourcehut: [~tobyvin]("https://sr.ht/~tobyvin")
+- linkedin: [tobyvin](https://linkedin.com/in/tobyvin)
+- pgp: [C8F6E06F5C8E2634](/publickey.asc)
diff --git a/content/about.md b/content/about.md
new file mode 100644
index 0000000..65d0adb
--- /dev/null
+++ b/content/about.md
@@ -0,0 +1,8 @@
++++
+title = "About"
+date = 2023-05-17
++++
+
+## Toby Vincent
+
+I am me.
diff --git a/content/posts/_index.md b/content/posts/_index.md
new file mode 100644
index 0000000..21e938a
--- /dev/null
+++ b/content/posts/_index.md
@@ -0,0 +1,5 @@
++++
+title = "Posts"
+sort_by = "date"
+page_template = "post.html"
++++
diff --git a/content/posts/bees.md b/content/posts/bees.md
new file mode 100644
index 0000000..329318d
--- /dev/null
+++ b/content/posts/bees.md
@@ -0,0 +1,10 @@
++++
+title = "Bees"
+date = 2023-05-17
++++
+
+## Bees, what are they even about
+
+What makes a bee a bee. Is it the yellow parts? Are there any non yellow bees? I
+bet there are, we just probably don't recognize them because they are not
+yellow.
diff --git a/content/posts/yubikey.md b/content/posts/yubikey.md
new file mode 100644
index 0000000..b06adc2
--- /dev/null
+++ b/content/posts/yubikey.md
@@ -0,0 +1,116 @@
++++
+title = "WSL2, Yubikey, and You! 🫵"
+description = "A WSL2 YubiKey setup guide."
+date = 2022-08-04T18:57:50Z
++++
+
+## UPDATE 2022-8-24
+
+This is no longer necessary due to
+[usbipd-win](https://github.com/dorssel/usbipd-win)
+
+I am now using [usbipd-win](https://github.com/dorssel/usbipd-win) to mount the
+yubikey directly into WSL2, and using
+[distod](https://github.com/nullpo-head/wsl-distrod) (adds bottled systemd to
+wsl) to start services as I normally would in linux
+
+Regardless, I am posting this here for posterity.
+
+## Intro
+
+The following two sections are the result of a painstaking amount of google
+searches and GitHub issues followed by troubleshooting, tears, and tea breaks.
+Well, more accurately, the 20% came from the aforementioned alliteration. The
+80% came from the following two guides.
+
+- [drduh/YubiKey-Guide](https://github.com/drduh/YubiKey-Guide)
+- [The ultimate guide to YubiKey on WSL2](https://dev.to/dzerycz/series/11353)
+- [Forwarding gpg-agent to a remote system over SSH](https://wiki.gnupg.org/AgentForwarding)
+
+The former is an incredibly detailed guide to setting up GPG keys using YubiKey
+as a smart card. The amount of information drduh has organized in that
+repository in immense, so I urge you to go star it if you find anything in this
+section helpful, as he deserves at least that much.
+
+The second guide was used more as a reference/verification source for the first
+guide but none-the-less I found it to be helpful, so I figured I would include
+it here.
+
+While I went down this rock filled rabbit hole for the purpose of getting my
+YubiKey working (seamlessly) in WSL2, the majority of this should be helpful
+even if you don't use a security key, as its specificity deals with getting the
+respective agents/sockets communicating between WSL2 and Windows.
+
+<!-- TODO ssh/git config to use gpnupg -->
+<!-- TODO setting up remote gpg/ssh forwarding -->
+
+## Windows
+
+### SSH Agent
+
+Install [gpg-bridge](https://github.com/BusyJay/gpg-bridge) using cargo
+
+```powershell
+# Powershell
+cargo install -f --git https://github.com/busyjay/gpg-bridge
+```
+
+Set gpg-bridge to run on startup
+
+```powershell
+# Powershell
+$cmd_path = "$HOME\.cargo\bin\gpg-bridge.exe"
+$pipe = "\\.\pipe\gpg-bridge-ssh"
+$cmdl = "$cmd_path gpg-bridge-ssh --extra 127.0.0.1:4321 --ssh $pipe --detach"
+$key = New-Item -Path 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' -Force
+New-ItemProperty -Path $key.PSPath -Name "gpg-bridge" -Value "$cmdl"
+```
+
+Set SSH_AUTH_SOCK to have ssh use the translated pipe
+
+```powershell
+# Powershell
+[System.Environment]::SetEnvironmentVariable('SSH_AUTH_SOCK',"\\.\pipe\gpg-bridge-ssh")
+```
+
+One-off to run gpg-bridge.exe without restarting
+
+```powershell
+# Powershell
+Invoke-Expression "& $cmdl"
+```
+
+### GPG Agent
+
+On the windows side the YubiKey is fully accessible, the GPG agent should just
+work.
+
+## In WSL2
+
+### SSH Agent
+
+```sh
+# Bash
+
+# Install depends
+sudo apt install socat iproute2
+
+# Install wsl2-ssh-pageant
+destination="$HOME/.ssh/wsl2-ssh-pageant.exe"
+url="https://github.com/BlackReloaded/wsl2-ssh-pageant/releases/latest/download/wsl2-ssh-pageant.exe"
+curl -sL "$url" -o "$destination"
+# wget -O "$destination" "https://github.com/BlackReloaded/wsl2-ssh-pageant/releases/latest/download/wsl2-ssh-pageant.exe"
+# Set the executable bit.
+chmod +x "$destination"
+```
+
+### GPG Agent
+
+The only setup needed for getting the YubiKey working in WSL2 is to
+source/copy-paste [gpg.sh](wsl/gpg.sh) in your shell profile.
+
+Along with the initialization code, I wrote a small function the resets all the
+related agents/sockets. If you do not attempt to access the YubiKey while it is
+not inserted, in my experience, GPG works great has no issues once reinserting
+the YubiKey. It is only (inconsistently) when you try to access a YubiKey that
+you have removed that puts it in a failed state.
diff --git a/content/projects.md b/content/projects.md
new file mode 100644
index 0000000..6a1d392
--- /dev/null
+++ b/content/projects.md
@@ -0,0 +1,5 @@
++++
+title = "Projects"
++++
+
+## Projectr
diff --git a/sass/style.scss b/sass/style.scss
new file mode 100644
index 0000000..833d2c7
--- /dev/null
+++ b/sass/style.scss
@@ -0,0 +1,166 @@
+// gruvbox colors
+@media (prefers-color-scheme: dark) {
+ :root {
+ // --bg: #1d2021; // hard
+ // --bg: #32302f; // soft
+ --bg: #282828;
+ --bg1: #3c3836;
+ --bg2: #504945;
+ --bg3: #665c54;
+ --bg4: #7c6f64;
+
+ --fg: #fbf1c7;
+ --fg1: #ebdbb2;
+ --fg2: #d5c4a1;
+ --fg3: #bdae93;
+ --fg4: #a89984;
+
+ --red: #fb4934;
+ --green: #b8bb26;
+ --yellow: #fabd2f;
+ --blue: #83a598;
+ --purple: #d3869b;
+ --aqua: #8ec07c;
+ --gray: #928374;
+ --orange: #fe8019;
+
+ --red-dim: #cc2412;
+ --green-dim: #98971a;
+ --yellow-dim: #d79921;
+ --blue-dim: #458588;
+ --purple-dim: #b16286;
+ --aqua-dim: #689d6a;
+ --gray-dim: #a89984;
+ --orange-dim: #d65d0e;
+ }
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ // --bg: #f9f5d7; // hard
+ // --bg: #f2e5bc; // soft
+ --bg: #fbf1c7;
+ --bg1: #ebdbb2;
+ --bg2: #d5c4a1;
+ --bg3: #bdae93;
+ --bg4: #a89984;
+
+ --fg: #282828;
+ --fg1: #3c3836;
+ --fg2: #504945;
+ --fg3: #665c54;
+ --fg4: #7c6f64;
+
+ --red: #9d0006;
+ --green: #79740e;
+ --yellow: #b57614;
+ --blue: #076678;
+ --purple: #8f3f71;
+ --aqua: #427b58;
+ --orange: #af3a03;
+ --gray: #928374;
+
+ --red-dim: #cc2412;
+ --green-dim: #98971a;
+ --yellow-dim: #d79921;
+ --blue-dim: #458598;
+ --purple-dim: #b16286;
+ --aqua-dim: #689d6a;
+ --orange-dim: #d65d0e;
+ --gray-dim: #7c6f64;
+ }
+}
+
+html {
+ background: var(--bg);
+ color: var(--fg);
+ font-size: 14pt;
+ font-family: monospace;
+}
+
+::selection {
+ color: var(--bg);
+ background-color: var(--fg);
+}
+
+body {
+ line-height: 1.4;
+ max-width: 900px;
+ margin: 0 auto;
+}
+
+a {
+ color: var(--blue);
+}
+
+a:visited {
+ color: var(--blue-dim);
+}
+
+a:hover {
+ text-decoration: none;
+}
+
+a:active {
+ background: var(--fg1);
+}
+
+header > h2:has(+ p) {
+ margin-bottom: 0;
+}
+
+header > h2 + p {
+ margin-top: 0;
+}
+
+nav a {
+ color: var(--aqua);
+ font-weight: bold;
+ text-decoration: none;
+}
+
+nav a.active {
+ color: var(--orange-dim);
+}
+
+nav a:hover {
+ text-decoration: underline;
+}
+
+nav a:active {
+ background: var(--fg);
+}
+
+nav.toc {
+ text-align: left;
+ font-size: 0.9rem;
+ margin-bottom: 2rem;
+}
+
+header.banner > nav {
+ display: flex;
+ justify-content: space-between;
+}
+
+header.banner > nav h1 {
+ display: flex;
+}
+
+header.banner > nav ul {
+ display: flex;
+ list-style: none;
+}
+
+header.banner > nav li + li {
+ margin-inline-start: 1em;
+}
+
+header.banner > nav a {
+ font-size: 1.2rem;
+}
+
+footer {
+ margin-top: 2rem;
+ text-align: center;
+ font-size: 0.8rem;
+}
diff --git a/static/publickey.asc b/static/publickey.asc
new file mode 100644
index 0000000..c747b3b
--- /dev/null
+++ b/static/publickey.asc
@@ -0,0 +1,157 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+DZS5eYsKnJ4SGj1y0p8cvp2S8+gnUQs=
+=mCbv
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/templates/index.html b/templates/index.html
new file mode 100644
index 0000000..94fe80f
--- /dev/null
+++ b/templates/index.html
@@ -0,0 +1,61 @@
+{% import "macros.html" as macros -%}
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <meta name="robots" content="noindex" />
+ <title>
+ {% if this.title %}{{ this.title }} -{% endif %}
+ {{ config.title }}
+ </title>
+ <link rel="icon" type="image/png" href="/avatar.png" />
+ <meta name="description"
+ content="{{ section.description | default(value=config.description) }}" />
+ <meta name="keywords" content="blog" />
+ <link rel="alternate"
+ type="application/rss+xml"
+ title="RSS"
+ href="{{ get_url(path="rss.xml") | safe }}" />
+ <link rel="stylesheet" type="text/css" href="/style.css" />
+ <link rel="stylesheet"
+ type="text/css"
+ href="/syntax-theme-dark.css"
+ media="(prefers-color-scheme: dark)" />
+ <link rel="stylesheet"
+ type="text/css"
+ href="/syntax-theme-light.css"
+ media="(prefers-color-scheme: light)" />
+ </head>
+ <body>
+ <header class="banner">
+ <nav>
+ <h1>{{ macros::nav_item(name=config.title, url=config.base_url) }}</h1>
+ <ul>
+ {%- set root = get_section(path="_index.md") %}
+ {%- for p in root.pages -%}
+ <li>{{ macros::nav_item(name=p.title,url=p.permalink) }}</li>
+ {%- endfor -%}
+ {% for p in root.subsections %}
+ {%- set s = get_section(path=p) %}
+ <li>{{ macros::nav_item(name=s.title,url=s.permalink) }}</li>
+ {% endfor %}
+ </ul>
+ </nav>
+ </header>
+ <main>
+ {% block content %}
+ <header>
+ <h1>{{ section.title | safe }}</h1>
+ <h3>{{ section.description | markdown(inline=true) | safe }}</h3>
+ </header>
+ {{ section.content | safe }}
+ {% endblock content %}
+ </main>
+ <footer>
+ This site was was built using <a href="https://www.getzola.org/">Zola</a>.
+ The <a href="{{ config.extra.repository }}">code</a> is licensed under
+ <a href="https://opensource.org/licenses/{{ config.extra.license }}">{{ config.extra.license }}</a>.
+ </footer>
+ </body>
+</html>
diff --git a/templates/macros.html b/templates/macros.html
new file mode 100644
index 0000000..6c6020a
--- /dev/null
+++ b/templates/macros.html
@@ -0,0 +1,71 @@
+{% macro tags(tags) %}
+ {% for tag in tags -%}
+ <a href="{{ get_taxonomy_url(kind="tags", name=tag ) }}">#{{ tag }}</a>
+ {% endfor -%}
+{% endmacro tags %}
+{% macro nav_item(name, url) %}
+ {%- if page %}
+ {%- set this = page %}
+ {%- elif section %}
+ {%- set this = section %}
+ {%- endif %}
+ <a {% if this.permalink == url %}class="active"{%- endif %} href={{ url }}>{{ name }}</a>
+{% endmacro nav %}
+{% macro toc(page) %}
+ {% if page.toc %}
+ <nav class="toc">
+ <ul>
+ {% for h1 in page.toc %}
+ <li>
+ <a href="{{ h1.permalink | safe }}">{{ h1.title }}</a>
+ {% if h1.children %}
+ <ul>
+ {% for h2 in h1.children %}
+ <li>
+ <a href="{{ h2.permalink | safe }}">{{ h2.title }}</a>
+ </li>
+ {% if h2.children %}
+ <ul>
+ {% for h3 in h2.children %}
+ <li>
+ <a href="{{ h3.permalink | safe }}">{{ h3.title }}</a>
+ {% if h3.children %}
+ <ul>
+ {% for h4 in h3.children %}
+ <li>
+ <a href="{{ h4.permalink | safe }}">{{ h4.title }}</a>
+ </li>
+ {% if h4.children %}
+ <ul>
+ {% for h5 in h4.children %}
+ <li>
+ <a href="{{ h5.permalink | safe }}">{{ h5.title }}</a>
+ {% if h5.children %}
+ <ul>
+ {% for h6 in h5.children %}
+ <li>
+ <a href="{{ h5.permalink | safe }}">{{ h6.title }}</a>
+ </li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+ </li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+ {% endfor %}
+ </ul>
+ {% endif %}
+ </li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+ {% endfor %}
+ </ul>
+ {% endif %}
+ </li>
+ {% endfor %}
+ </ul>
+ </nav>
+ {% endif %}
+{% endmacro %}
diff --git a/templates/page.html b/templates/page.html
new file mode 100644
index 0000000..350652a
--- /dev/null
+++ b/templates/page.html
@@ -0,0 +1,9 @@
+{% import "macros.html" as macros %}
+{% extends "index.html" %}
+{% block content %}
+ <header>
+ <h1>{{ page.title | safe }}</h1>
+ <h3>{{ page.description | default(value="") | markdown(inline=true) | safe }}</h3>
+ </header>
+ {{ page.content | safe }}
+{% endblock content %}
diff --git a/templates/post.html b/templates/post.html
new file mode 100644
index 0000000..0dd3bbb
--- /dev/null
+++ b/templates/post.html
@@ -0,0 +1,14 @@
+{% import "macros.html" as macros -%}
+{% extends "index.html" %}
+{% block content %}
+ <header>
+ <h1 id="title">{{ page.title }}</h1>
+ {% if page.date %}
+ <time datetime="{{ page.date | date(format="%Y-%m-%d") }}">
+ {{ page.date | date(format="%d %b %Y") }}
+ </time>
+ {% endif %}
+ </header>
+ {{ macros::toc(page=page) }}
+ {{ page.content | safe }}
+{% endblock content %}
diff --git a/templates/section.html b/templates/section.html
new file mode 100644
index 0000000..4d390aa
--- /dev/null
+++ b/templates/section.html
@@ -0,0 +1,23 @@
+{% extends "index.html" %}
+{% block content %}
+ <h1>{{ section.title }}</h1>
+ <div>
+ {% for page in section.pages %}
+ <article>
+ <div>
+ <h2>
+ <a href="{{ page.permalink }}">{{ page.title }}</a>
+ -
+ <time datetime="{{ page.date | date(format="%Y-%m-%d") }}">
+ {{ page.date | date(format="%d %b %Y") }}
+ </time>
+ </h2>
+ </div>
+ {% if page.summary %}
+ <p>{{ page.summary | safe }}</p>
+ <a href="{{ page.permalink }}#continue-reading">...</a>
+ {% endif %}
+ </article>
+ {% endfor %}
+ </div>
+{% endblock content %}