Reworked blog section, some visual tweaks, and a directory rework.

~ changed desktop icons to match if directory or not
~ projects section now works like the blog/ section
~ reworked repo tree to be less insane.
~ changes to projects/ and blog/ that move a lot of the functionality to
the posts
~ Fixed a lot of layout issues with the "boring" set of pages
This commit is contained in:
Jake Holtham 2026-03-24 13:29:44 -04:00
parent 61ba9a12d4
commit b0aaae309f
13 changed files with 188 additions and 139 deletions

View file

@ -6,6 +6,19 @@ module.exports = function (eleventyConfig) {
.sort((a, b) => b.date - a.date); .sort((a, b) => b.date - a.date);
}); });
// Collection: about window content
eleventyConfig.addCollection("aboutContent", (api) =>
api.getFilteredByGlob("src/about.md")
);
// Collection: projects, sorted alphabetically by title
eleventyConfig.addCollection("projects", (api) =>
api
.getFilteredByGlob("src/projects/**/*.md")
.filter((p) => !p.fileSlug.startsWith("_"))
.sort((a, b) => a.data.title.localeCompare(b.data.title))
);
// Filter: human-readable date, e.g. "March 24, 2026" // Filter: human-readable date, e.g. "March 24, 2026"
eleventyConfig.addFilter("readableDate", function (date) { eleventyConfig.addFilter("readableDate", function (date) {
return new Date(date).toLocaleDateString("en-US", { return new Date(date).toLocaleDateString("en-US", {
@ -31,7 +44,7 @@ module.exports = function (eleventyConfig) {
}); });
// Pass through static assets // Pass through static assets
eleventyConfig.addPassthroughCopy("assets"); eleventyConfig.addPassthroughCopy("src/assets");
return { return {
dir: { dir: {

View file

@ -1,3 +1,13 @@
# www-lordnet-sh # www-lordnet-sh
Least creative name award ## About
Repo with the least creative name award.
This is my website. It exists as a fun way to present my projects and work I really care about. Unfortunately, this repo doesn't really fit that bill, and it will probably accumulate a fair amount of rot and dust. But if it displays my work, so be it!
## Aesthetics
The design is a love-letter to retro machines of the 80s. It's a fun mix of an interface inspired by AT&Ts unix PC (the 3b1), but with a phosphor screen, and some higher quality interface buttons. I had thought about making it more faithful, but that interface is dreadful to actually use.
## Functionality
The window manager works and properly embeds markdown files as they're needed. Each "program" on the desktop is a display-able markdown file. They're really just glorified page sections with a frame.

View file

@ -2,29 +2,17 @@
permalink: false permalink: false
--- ---
## $ ./about.sh ## $whoami
Hi, I'm **{{ site.author }}**. Hi, I'm **lordtet**.
{{ site.bio }} I pick apart systems for vulnerabilities, and collect old ones for fun. I have a particular affinity for UNIX and derivatives.
Reach out if you want to chat about exploit dev, vulnerability research, or retro machines.
## Skills ## Skills
- Systems & low-level programming - Anything \*NIX. Practically, mostly Linux. Ask me about old UNIX or BSD.
- Web development (front + back) - Systems programming, reverse engineering, exploitation
- Open source / UNIX tooling - Network services and architecture
- Whatever interesting problem is in front of me - Rather familiar with Windows internals as well
## Setup
```
OS: Gentoo Linux
Shell: zsh
Editor: neovim
WM: dwm
```
## Contact
- **GitHub:** [{{ site.github }}]({{ site.github }})
- **Email:** [{{ site.email }}](mailto:{{ site.email }})

View file

@ -447,7 +447,8 @@ body { animation: flicker 12s infinite; }
margin-bottom: 14px; margin-bottom: 14px;
} }
.blog-tag { .blog-tag,
.project-tag {
appearance: none; appearance: none;
-webkit-appearance: none; -webkit-appearance: none;
border: 1px solid var(--p-dim); border: 1px solid var(--p-dim);
@ -460,8 +461,10 @@ body { animation: flicker 12s infinite; }
cursor: pointer; cursor: pointer;
transition: all 0.06s; transition: all 0.06s;
} }
.blog-tag:hover { border-color: var(--p); color: var(--p); } .blog-tag:hover,
.blog-tag.active { background: var(--p); border-color: var(--p); color: #000; } .project-tag:hover { border-color: var(--p); color: var(--p); }
.blog-tag.active,
.project-tag.active { background: var(--p); border-color: var(--p); color: #000; }
.tag-count { opacity: 0.65; font-size: 10px; } .tag-count { opacity: 0.65; font-size: 10px; }
/* Back button inside post view */ /* Back button inside post view */

View file

@ -38,3 +38,47 @@
}); });
}); });
}()); }());
// ── Projects panel ─────────────────────────────
(function () {
var listing = document.getElementById('projects-listing');
var content = document.getElementById('projects-window-content');
var panels = document.querySelectorAll('.project-detail-panel');
var tagBtns = document.querySelectorAll('.project-tag');
var items = document.querySelectorAll('.project-list-item');
if (!listing) return;
// ── Tag filtering ────────────────────────────
tagBtns.forEach(function (btn) {
btn.addEventListener('click', function () {
tagBtns.forEach(function (b) { b.classList.remove('active'); });
btn.classList.add('active');
var tag = btn.dataset.tag;
items.forEach(function (li) {
var tags = li.dataset.tags ? li.dataset.tags.split(' ') : [];
li.style.display = (tag === '*' || tags.indexOf(tag) !== -1) ? '' : 'none';
});
});
});
// ── Open a project ───────────────────────────
document.querySelectorAll('.project-open-item').forEach(function (link) {
link.addEventListener('click', function (e) {
e.preventDefault();
listing.classList.add('hidden');
panels.forEach(function (p) { p.classList.add('hidden'); });
var panel = document.getElementById('project-item-' + link.dataset.projectIdx);
if (panel) { panel.classList.remove('hidden'); content.scrollTop = 0; }
});
});
// ── Back to listing ──────────────────────────
document.querySelectorAll('.project-back').forEach(function (btn) {
btn.addEventListener('click', function () {
panels.forEach(function (p) { p.classList.add('hidden'); });
listing.classList.remove('hidden');
content.scrollTop = 0;
});
});
}());

View file

@ -4,9 +4,9 @@ title: "plain index"
permalink: /boring/ permalink: /boring/
--- ---
# {{ site.author }} # Jake "lordtet" Holtham
{{ site.tagline }} Unix Philosopher, Disassembly Miner, Computing Historian
--- ---

View file

@ -6,35 +6,18 @@ permalink: /boring/projects/
# Projects # Projects
A selection of things I've built or am currently building. {% if collections.projects.length %}
{% for project in collections.projects %}
### {{ project.data.title }}
{% if project.data.tags %}`{{ project.data.tags | join('` `') }}`{% endif %}
{{ project.templateContent | safe }}
--- ---
### project-alpha {% endfor %}
{% else %}
A CLI tool for doing X. Written in Rust. *(no projects yet)*
{% endif %}
**Tags:** `rust` `cli`
**Links:** [github](#) · [docs](#)
---
### project-beta
A web app for Y. TypeScript front-to-back.
**Tags:** `typescript` `web`
**Links:** [github](#) · [live](#)
---
### project-gamma
Open source tooling. Because the world needs more of it.
**Tags:** `python` `oss`
**Links:** [github](#)
---
[← back](/boring/) [← back](/boring/)

View file

@ -8,19 +8,19 @@ permalink: /
<div class="desktop-icons" aria-label="Desktop icons"> <div class="desktop-icons" aria-label="Desktop icons">
<div class="desktop-icon" data-opens="win-about" role="button" tabindex="0" aria-label="Open about"> <div class="desktop-icon" data-opens="win-about" role="button" tabindex="0" aria-label="Open about">
<div class="icon-art">[i]</div> <div class="icon-art">[i]</div>
<div class="icon-label">about</div> <div class="icon-label">about_me.txt</div>
</div> </div>
<div class="desktop-icon" data-opens="win-blog" role="button" tabindex="0" aria-label="Open blog"> <div class="desktop-icon" data-opens="win-blog" role="button" tabindex="0" aria-label="Open blog">
<div class="icon-art">[/]</div> <div class="icon-art">[/]</div>
<div class="icon-label">blog/</div> <div class="icon-label">blog/</div>
</div> </div>
<div class="desktop-icon" data-opens="win-projects" role="button" tabindex="0" aria-label="Open projects"> <div class="desktop-icon" data-opens="win-projects" role="button" tabindex="0" aria-label="Open projects">
<div class="icon-art">[*]</div> <div class="icon-art">[/]</div>
<div class="icon-label">projects</div> <div class="icon-label">projects/</div>
</div> </div>
<div class="desktop-icon" data-opens="win-contact" role="button" tabindex="0" aria-label="Open contact"> <div class="desktop-icon" data-opens="win-contact" role="button" tabindex="0" aria-label="Open contact">
<div class="icon-art">[@]</div> <div class="icon-art">[@]</div>
<div class="icon-label">contact</div> <div class="icon-label">contact.vcf</div>
</div> </div>
</div> </div>
@ -30,26 +30,11 @@ permalink: /
<div class="window hidden" <div class="window hidden"
id="win-about" id="win-about"
data-wid="win-about" data-wid="win-about"
data-title="about.sh" data-title="$whoami"
style="top:50px; left:120px; width:440px;"> style="top:50px; left:120px; width:540px;">
<div class="window-content"> <div class="window-content">
<h1>$ ./about.sh</h1> {{ collections.aboutContent[0].templateContent | safe }}
<p>Hi, I'm <strong>{{ site.author }}</strong>.</p>
<p>{{ site.bio }}</p>
<h2>Skills</h2>
<ul>
<li>Systems &amp; low-level programming</li>
<li>Web development (front + back)</li>
<li>Open source / UNIX tooling</li>
</ul>
<h2>Contact</h2>
<p>
<a href="{{ site.github }}" target="_blank" rel="noopener">github</a> ·
<a href="mailto:{{ site.email }}">email</a>
</p>
<p><a href="/boring/about/">→ plaintext version</a></p> <p><a href="/boring/about/">→ plaintext version</a></p>
</div> </div>
@ -126,38 +111,59 @@ permalink: /
<div class="window hidden" <div class="window hidden"
id="win-projects" id="win-projects"
data-wid="win-projects" data-wid="win-projects"
data-title="projects.sh" data-title="projects/"
style="top:140px; left:120px; width:560px; height:380px;"> style="top:140px; left:120px; width:560px; height:380px;">
<div class="window-content"> <div class="window-content" id="projects-window-content">
<h2>Projects</h2>
<div class="project-grid"> {# ── Listing view ─────────────────────────── #}
<div class="project-card"> <div id="projects-listing">
<h3>project-alpha</h3>
<p>Sample project. Replace with your actual work.</p> {# Tag filters #}
<div class="tags"> {% set projectTagCounts = collections.projects | tagCounts %}
<span class="tag">rust</span> {% if projectTagCounts.length %}
<span class="tag">cli</span> <div class="blog-tags">
<button class="project-tag active" data-tag="*">all <span class="tag-count">{{ collections.projects.length }}</span></button>
{% for tc in projectTagCounts %}
<button class="project-tag" data-tag="{{ tc.tag }}">{{ tc.tag }} <span class="tag-count">{{ tc.count }}</span></button>
{% endfor %}
</div> </div>
{% endif %}
{# Project list #}
{% if collections.projects.length %}
<ul class="post-list" id="projects-list">
{% for project in collections.projects %}
<li class="project-list-item"
data-tags="{{ project.data.tags | join(' ') if project.data.tags else '' }}">
<a href="#"
class="project-open-item"
data-project-idx="{{ loop.index0 }}">{{ project.data.title }}</a>
</li>
{% endfor %}
</ul>
{% else %}
<p style="color:var(--p-dim);">No projects yet.</p>
{% endif %}
<p style="margin-top:14px; border-top:1px solid var(--p-dim); padding-top:10px;">
<a href="/boring/projects/">→ plaintext version</a>
</p>
</div> </div>
<div class="project-card">
<h3>project-beta</h3> {# ── Per-project detail panels (built at compile time, hidden by default) ── #}
<p>Another interesting thing you built.</p> {% for project in collections.projects %}
<div class="tags"> <div class="project-detail-panel hidden" id="project-item-{{ loop.index0 }}">
<span class="tag">typescript</span> <button class="project-back">← back</button>
<span class="tag">web</span> <h2 style="margin-top:10px;">{{ project.data.title }}</h2>
{% if project.data.tags %}
<p class="post-meta">{{ project.data.tags | join(' · ') }}</p>
{% endif %}
<hr class="post-rule">
{{ project.templateContent | safe }}
</div> </div>
</div> {% endfor %}
<div class="project-card">
<h3>project-gamma</h3>
<p>Open source tooling for fun and profit.</p>
<div class="tags">
<span class="tag">python</span>
<span class="tag">oss</span>
</div>
</div>
</div>
<p style="margin-top:14px"><a href="/boring/projects/">→ plaintext version</a></p>
</div> </div>
</div> </div>

View file

@ -1,34 +0,0 @@
---
permalink: false
---
## $ ./projects.sh
A selection of things I've built or am currently building.
---
### project-alpha
A CLI tool for doing X. Written in Rust.
**Tags:** `rust` `cli`
**Links:** [github](#) · [docs](#)
---
### project-beta
A web app for Y. TypeScript front-to-back.
**Tags:** `typescript` `web`
**Links:** [github](#) · [live](#)
---
### project-gamma
Open source tooling. Because the world needs more of it.
**Tags:** `python` `oss`
**Links:** [github](#)

11
src/projects/_template.md Normal file
View file

@ -0,0 +1,11 @@
---
permalink: false
title: "Project Title"
tags:
- tag1
- tag2
---
Project description goes here.
**Links:** [git](#)

View file

@ -0,0 +1,3 @@
{
"permalink": false
}

11
src/projects/testproj.md Normal file
View file

@ -0,0 +1,11 @@
---
permalink: false
title: "Test Project 1"
tags:
- x86
- cli
---
This is the first project description.
**Links:** [git](#)

11
src/projects/testproj2.md Normal file
View file

@ -0,0 +1,11 @@
---
permalink: false
title: "Test Project 2"
tags:
- arm
- gui
---
This is the second project description.
**Links:** [git](#)