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:
parent
61ba9a12d4
commit
b0aaae309f
13 changed files with 188 additions and 139 deletions
15
.eleventy.js
15
.eleventy.js
|
|
@ -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: {
|
||||||
|
|
|
||||||
12
README.md
12
README.md
|
|
@ -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.
|
||||||
30
src/about.md
30
src/about.md
|
|
@ -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 }})
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}());
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,9 @@ title: "plain index"
|
||||||
permalink: /boring/
|
permalink: /boring/
|
||||||
---
|
---
|
||||||
|
|
||||||
# {{ site.author }}
|
# Jake "lordtet" Holtham
|
||||||
|
|
||||||
{{ site.tagline }}
|
Unix Philosopher, Disassembly Miner, Computing Historian
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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/)
|
||||||
|
|
|
||||||
106
src/index.njk
106
src/index.njk
|
|
@ -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 & 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">
|
||||||
</div>
|
<button class="project-tag active" data-tag="*">all <span class="tag-count">{{ collections.projects.length }}</span></button>
|
||||||
</div>
|
{% for tc in projectTagCounts %}
|
||||||
<div class="project-card">
|
<button class="project-tag" data-tag="{{ tc.tag }}">{{ tc.tag }} <span class="tag-count">{{ tc.count }}</span></button>
|
||||||
<h3>project-beta</h3>
|
{% endfor %}
|
||||||
<p>Another interesting thing you built.</p>
|
|
||||||
<div class="tags">
|
|
||||||
<span class="tag">typescript</span>
|
|
||||||
<span class="tag">web</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<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>
|
||||||
|
{% 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>
|
||||||
<p style="margin-top:14px"><a href="/boring/projects/">→ plaintext version</a></p>
|
|
||||||
|
{# ── Per-project detail panels (built at compile time, hidden by default) ── #}
|
||||||
|
{% for project in collections.projects %}
|
||||||
|
<div class="project-detail-panel hidden" id="project-item-{{ loop.index0 }}">
|
||||||
|
<button class="project-back">← back</button>
|
||||||
|
<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>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -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
11
src/projects/_template.md
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
---
|
||||||
|
permalink: false
|
||||||
|
title: "Project Title"
|
||||||
|
tags:
|
||||||
|
- tag1
|
||||||
|
- tag2
|
||||||
|
---
|
||||||
|
|
||||||
|
Project description goes here.
|
||||||
|
|
||||||
|
**Links:** [git](#)
|
||||||
3
src/projects/projects.11tydata.json
Normal file
3
src/projects/projects.11tydata.json
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"permalink": false
|
||||||
|
}
|
||||||
11
src/projects/testproj.md
Normal file
11
src/projects/testproj.md
Normal 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
11
src/projects/testproj2.md
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
---
|
||||||
|
permalink: false
|
||||||
|
title: "Test Project 2"
|
||||||
|
tags:
|
||||||
|
- arm
|
||||||
|
- gui
|
||||||
|
---
|
||||||
|
|
||||||
|
This is the second project description.
|
||||||
|
|
||||||
|
**Links:** [git](#)
|
||||||
Loading…
Reference in a new issue