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);
|
||||
});
|
||||
|
||||
// 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"
|
||||
eleventyConfig.addFilter("readableDate", function (date) {
|
||||
return new Date(date).toLocaleDateString("en-US", {
|
||||
|
|
@ -31,7 +44,7 @@ module.exports = function (eleventyConfig) {
|
|||
});
|
||||
|
||||
// Pass through static assets
|
||||
eleventyConfig.addPassthroughCopy("assets");
|
||||
eleventyConfig.addPassthroughCopy("src/assets");
|
||||
|
||||
return {
|
||||
dir: {
|
||||
|
|
|
|||
12
README.md
12
README.md
|
|
@ -1,3 +1,13 @@
|
|||
# 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
|
||||
---
|
||||
|
||||
## $ ./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
|
||||
|
||||
- Systems & low-level programming
|
||||
- Web development (front + back)
|
||||
- Open source / UNIX tooling
|
||||
- Whatever interesting problem is in front of me
|
||||
|
||||
## Setup
|
||||
|
||||
```
|
||||
OS: Gentoo Linux
|
||||
Shell: zsh
|
||||
Editor: neovim
|
||||
WM: dwm
|
||||
```
|
||||
|
||||
## Contact
|
||||
|
||||
- **GitHub:** [{{ site.github }}]({{ site.github }})
|
||||
- **Email:** [{{ site.email }}](mailto:{{ site.email }})
|
||||
- Anything \*NIX. Practically, mostly Linux. Ask me about old UNIX or BSD.
|
||||
- Systems programming, reverse engineering, exploitation
|
||||
- Network services and architecture
|
||||
- Rather familiar with Windows internals as well
|
||||
|
|
@ -447,7 +447,8 @@ body { animation: flicker 12s infinite; }
|
|||
margin-bottom: 14px;
|
||||
}
|
||||
|
||||
.blog-tag {
|
||||
.blog-tag,
|
||||
.project-tag {
|
||||
appearance: none;
|
||||
-webkit-appearance: none;
|
||||
border: 1px solid var(--p-dim);
|
||||
|
|
@ -460,8 +461,10 @@ body { animation: flicker 12s infinite; }
|
|||
cursor: pointer;
|
||||
transition: all 0.06s;
|
||||
}
|
||||
.blog-tag:hover { border-color: var(--p); color: var(--p); }
|
||||
.blog-tag.active { background: var(--p); border-color: var(--p); color: #000; }
|
||||
.blog-tag:hover,
|
||||
.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; }
|
||||
|
||||
/* 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/
|
||||
---
|
||||
|
||||
# {{ site.author }}
|
||||
# Jake "lordtet" Holtham
|
||||
|
||||
{{ site.tagline }}
|
||||
Unix Philosopher, Disassembly Miner, Computing Historian
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -6,35 +6,18 @@ permalink: /boring/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
|
||||
|
||||
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](#)
|
||||
|
||||
---
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
*(no projects yet)*
|
||||
{% endif %}
|
||||
|
||||
[← 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-icon" data-opens="win-about" role="button" tabindex="0" aria-label="Open about">
|
||||
<div class="icon-art">[i]</div>
|
||||
<div class="icon-label">about</div>
|
||||
<div class="icon-label">about_me.txt</div>
|
||||
</div>
|
||||
<div class="desktop-icon" data-opens="win-blog" role="button" tabindex="0" aria-label="Open blog">
|
||||
<div class="icon-art">[/]</div>
|
||||
<div class="icon-label">blog/</div>
|
||||
</div>
|
||||
<div class="desktop-icon" data-opens="win-projects" role="button" tabindex="0" aria-label="Open projects">
|
||||
<div class="icon-art">[*]</div>
|
||||
<div class="icon-label">projects</div>
|
||||
<div class="icon-art">[/]</div>
|
||||
<div class="icon-label">projects/</div>
|
||||
</div>
|
||||
<div class="desktop-icon" data-opens="win-contact" role="button" tabindex="0" aria-label="Open contact">
|
||||
<div class="icon-art">[@]</div>
|
||||
<div class="icon-label">contact</div>
|
||||
<div class="icon-label">contact.vcf</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -30,26 +30,11 @@ permalink: /
|
|||
<div class="window hidden"
|
||||
id="win-about"
|
||||
data-wid="win-about"
|
||||
data-title="about.sh"
|
||||
style="top:50px; left:120px; width:440px;">
|
||||
data-title="$whoami"
|
||||
style="top:50px; left:120px; width:540px;">
|
||||
|
||||
<div class="window-content">
|
||||
<h1>$ ./about.sh</h1>
|
||||
<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>
|
||||
{{ collections.aboutContent[0].templateContent | safe }}
|
||||
<p><a href="/boring/about/">→ plaintext version</a></p>
|
||||
</div>
|
||||
|
||||
|
|
@ -126,38 +111,59 @@ permalink: /
|
|||
<div class="window hidden"
|
||||
id="win-projects"
|
||||
data-wid="win-projects"
|
||||
data-title="projects.sh"
|
||||
data-title="projects/"
|
||||
style="top:140px; left:120px; width:560px; height:380px;">
|
||||
|
||||
<div class="window-content">
|
||||
<h2>Projects</h2>
|
||||
<div class="project-grid">
|
||||
<div class="project-card">
|
||||
<h3>project-alpha</h3>
|
||||
<p>Sample project. Replace with your actual work.</p>
|
||||
<div class="tags">
|
||||
<span class="tag">rust</span>
|
||||
<span class="tag">cli</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="project-card">
|
||||
<h3>project-beta</h3>
|
||||
<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 class="window-content" id="projects-window-content">
|
||||
|
||||
{# ── Listing view ─────────────────────────── #}
|
||||
<div id="projects-listing">
|
||||
|
||||
{# Tag filters #}
|
||||
{% set projectTagCounts = collections.projects | tagCounts %}
|
||||
{% if projectTagCounts.length %}
|
||||
<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>
|
||||
{% 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>
|
||||
<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>
|
||||
|
|
|
|||
|
|
@ -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