A lot of clean up
9
archetypes/updates.md
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
title: "{{ replace .File.ContentBaseName "-" " " | title }}"
|
||||
date: {{ .Date }}
|
||||
tags: []
|
||||
description: ""
|
||||
build:
|
||||
render: never
|
||||
---
|
||||
|
||||
|
|
@ -7,9 +7,11 @@ if (window.terminal) {
|
|||
|
||||
const commands = Object.keys(window.terminal.commands).sort();
|
||||
commands.forEach((cmd) => {
|
||||
const desc =
|
||||
window.terminal.commands[cmd].description || "No description";
|
||||
const desc = window.terminal.commands[cmd].description;
|
||||
// Skip commands with no description (hidden commands)
|
||||
if (desc) {
|
||||
window.terminal.print(` ${cmd.padEnd(15)} - ${desc}`);
|
||||
}
|
||||
});
|
||||
window.terminal.print("");
|
||||
});
|
||||
|
|
@ -20,13 +22,13 @@ if (window.terminal) {
|
|||
});
|
||||
|
||||
// Echo command
|
||||
window.terminal.registerCommand(
|
||||
"echo",
|
||||
"Echo text to the terminal",
|
||||
(args) => {
|
||||
window.terminal.print(args.join(" "));
|
||||
},
|
||||
);
|
||||
// window.terminal.registerCommand(
|
||||
// "echo",
|
||||
// "Echo text to the terminal",
|
||||
// (args) => {
|
||||
// window.terminal.print(args.join(" "));
|
||||
// },
|
||||
// );
|
||||
|
||||
// History command
|
||||
window.terminal.registerCommand("history", "Show command history", () => {
|
||||
|
|
|
|||
|
|
@ -83,6 +83,37 @@ if (window.terminal) {
|
|||
// ADD YOUR OWN COMMANDS BELOW THIS LINE
|
||||
// ========================================
|
||||
|
||||
// Hidden WOW command (no description = won't show in help)
|
||||
window.terminal.registerCommand("wow", "", () => {
|
||||
const audio = new Audio("/audio/wow.mp3");
|
||||
audio.play().catch((error) => {
|
||||
window.terminal.printError("Failed to play audio: " + error.message);
|
||||
});
|
||||
const art = `
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣷⢸⣿⣿⡜⢯⣷⡌⡻⣿⣿⣿⣆⢈⠻⠿⢿⣿⣿⣿⣿⣿⣿⣷⣦⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡁⢳⣿⣿⣿⣿⣿⣿⡜⣿⣿⣧⢀⢻⣷⠰⠈⢿⣿⣿⣧⢣⠉⠑⠪⢙⠿⠿⠿⠿⠿⠿⠿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣱⡇⡞⣿⣿⣿⣿⣿⣿⡇⣿⣿⡏⡄⣧⠹⡇⠧⠈⢻⣿⣿⡇⢧⢢⠀⠀⠑⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣇⢃⢿⣿⣿⣿⣿⣿⣷⣿⣿⠇⢃⣡⣤⡹⠐⣿⣀⢻⣿⣿⢸⡎⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣾⣿⣿⠘⡸⣿⣿⣿⣿⣿⣿⣿⡿⣰⣿⣿⢟⡷⠈⠋⠃⠎⢿⣿⡏⣿⠀⠘⢆⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⡐⢹⣿⣿⡐⢡⢹⣿⣿⣿⣿⡏⣿⢣⣿⣿⡑⠁⠔⠀⠉⠉⠢⡘⣿⡇⣿⡇⠀⡀⠡⡀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠘⣿⣿⣇⠇⢣⢻⣿⣿⣿⡇⢇⣾⣿⣿⡆⢸⣤⡀⠚⢂⠀⢡⢿⡇⣿⡇⠀⢿⠀⠀⠄⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠠⠹⣿⣿⡘⣆⢣⠻⣿⣿⢈⣾⣿⣿⣿⣶⣸⣏⢀⣬⣋⡼⣠⢸⢹⣿⡇⢠⣼⠙⡄⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡇⠁⠹⣿⣇⠹⡃⠃⠙⡇⠘⢿⣿⣿⣿⣿⣿⣏⣓⣉⣭⣴⣿⠘⢸⣿⠁⠘⠋⠀⠹⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢷⠀⠀⠈⢿⣇⠂⣷⠄⠐⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢠⢸⡏⠀⢀⣠⣴⣾⣿⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢆⠀⠀⠀⠙⠆⠈⠢⠲⠥⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡞⣸⠁⠀⢸⣿⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠄⠃⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣿⡏⠹⣿⣿⡿⠫⠊⠀⠀⠀⣶⠀⢻⣿⣿⣿⣿⡿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠛⠻⠿⠿⠿⢋⠀⠀⠀⠀⢀⣼⣿⡆⠈⣿⣿⣿⡟⣱⡷⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢁⣁⡀⠨⣛⠿⠶⠄⢀⣠⣾⣿⣿⣷⠀⢹⣿⡟⣴⠈⢃⣶⠔⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⡄⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠈⣿⣿⡿⠀⡀⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢙⠻⣿⣿⢀⠙⠻⠿⣿⣿⣿⣿⣿⣿⡇⠁⣿⠟⡀⠈⣧⢰⣿⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠿⠴⠮⣥⠻⢧⣤⣄⣀⡉⢩⣭⣍⣃⣀⣩⠎⢀⣼⠉⣼⡯⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠑⠁⣛⠓⢒⣒⣢⡭⢁⡈⠿⠿⠟⠹⠛⠁⠀⠀⠀⠰⠃⠂⠀⠀⠀
|
||||
|
||||
`;
|
||||
window.terminal.print(art, "success");
|
||||
});
|
||||
|
||||
// Template for new command:
|
||||
/*
|
||||
window.terminal.registerCommand('commandname', 'Command description', (args) => {
|
||||
|
|
|
|||
|
|
@ -1,47 +1,47 @@
|
|||
// Navigation Commands Module
|
||||
if (window.terminal) {
|
||||
// Navigate to URL command
|
||||
window.terminal.registerCommand("goto", "Navigate to a URL", (args) => {
|
||||
if (args.length === 0) {
|
||||
window.terminal.printError("Usage: goto <url>");
|
||||
window.terminal.print("Examples:");
|
||||
window.terminal.print(" goto google.com");
|
||||
window.terminal.print(" goto https://github.com");
|
||||
return;
|
||||
}
|
||||
// window.terminal.registerCommand("goto", "Navigate to a URL", (args) => {
|
||||
// if (args.length === 0) {
|
||||
// window.terminal.printError("Usage: goto <url>");
|
||||
// window.terminal.print("Examples:");
|
||||
// window.terminal.print(" goto google.com");
|
||||
// window.terminal.print(" goto https://github.com");
|
||||
// return;
|
||||
// }
|
||||
|
||||
const url = args[0];
|
||||
window.terminal.printInfo(`Navigating to ${url}...`);
|
||||
// const url = args[0];
|
||||
// window.terminal.printInfo(`Navigating to ${url}...`);
|
||||
|
||||
setTimeout(() => {
|
||||
window.location.href = url.startsWith("http") ? url : `https://${url}`;
|
||||
}, 500);
|
||||
});
|
||||
// setTimeout(() => {
|
||||
// window.location.href = url.startsWith("http") ? url : `https://${url}`;
|
||||
// }, 500);
|
||||
// });
|
||||
|
||||
// Open in new tab command
|
||||
window.terminal.registerCommand("open", "Open URL in new tab", (args) => {
|
||||
if (args.length === 0) {
|
||||
window.terminal.printError("Usage: open <url>");
|
||||
window.terminal.print("Examples:");
|
||||
window.terminal.print(" open google.com");
|
||||
window.terminal.print(" open https://github.com");
|
||||
return;
|
||||
}
|
||||
// window.terminal.registerCommand("open", "Open URL in new tab", (args) => {
|
||||
// if (args.length === 0) {
|
||||
// window.terminal.printError("Usage: open <url>");
|
||||
// window.terminal.print("Examples:");
|
||||
// window.terminal.print(" open google.com");
|
||||
// window.terminal.print(" open https://github.com");
|
||||
// return;
|
||||
// }
|
||||
|
||||
const url = args[0];
|
||||
window.terminal.printInfo(`Opening ${url} in new tab...`);
|
||||
// const url = args[0];
|
||||
// window.terminal.printInfo(`Opening ${url} in new tab...`);
|
||||
|
||||
const fullUrl = url.startsWith("http") ? url : `https://${url}`;
|
||||
window.open(fullUrl, "_blank");
|
||||
});
|
||||
// const fullUrl = url.startsWith("http") ? url : `https://${url}`;
|
||||
// window.open(fullUrl, "_blank");
|
||||
// });
|
||||
|
||||
// Reload page command
|
||||
window.terminal.registerCommand("reload", "Reload the current page", () => {
|
||||
window.terminal.printInfo("Reloading page...");
|
||||
setTimeout(() => {
|
||||
window.location.reload();
|
||||
}, 500);
|
||||
});
|
||||
// window.terminal.registerCommand("reload", "Reload the current page", () => {
|
||||
// window.terminal.printInfo("Reloading page...");
|
||||
// setTimeout(() => {
|
||||
// window.location.reload();
|
||||
// }, 500);
|
||||
// });
|
||||
|
||||
// PAGE NAVIGATION
|
||||
|
||||
|
|
@ -57,4 +57,16 @@ if (window.terminal) {
|
|||
window.location.href = "/audio/";
|
||||
},
|
||||
);
|
||||
|
||||
window.terminal.registerCommand("blog", "Read my blog posts", () => {
|
||||
window.location.href = "/blog/";
|
||||
});
|
||||
|
||||
window.terminal.registerCommand(
|
||||
"now",
|
||||
"What I'm doing now and tools I use",
|
||||
() => {
|
||||
window.location.href = "/now/";
|
||||
},
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -92,8 +92,8 @@ if (window.terminal) {
|
|||
});
|
||||
|
||||
// Greet command
|
||||
window.terminal.registerCommand("greet", "Greet the user", (args) => {
|
||||
const name = args.length > 0 ? args.join(" ") : "User";
|
||||
window.terminal.printSuccess(`Hello, ${name}! Welcome to the terminal.`);
|
||||
});
|
||||
// window.terminal.registerCommand("greet", "Greet the user", (args) => {
|
||||
// const name = args.length > 0 ? args.join(" ") : "User";
|
||||
// window.terminal.printSuccess(`Hello, ${name}! Welcome to the terminal.`);
|
||||
// });
|
||||
}
|
||||
|
|
|
|||
42
assets/js/konami.js
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
// Konami Code Easter Egg
|
||||
(function () {
|
||||
const konamiCode = [
|
||||
"ArrowUp",
|
||||
"ArrowUp",
|
||||
"ArrowDown",
|
||||
"ArrowDown",
|
||||
"ArrowLeft",
|
||||
"ArrowRight",
|
||||
"ArrowLeft",
|
||||
"ArrowRight",
|
||||
"KeyB",
|
||||
"KeyA",
|
||||
];
|
||||
let konamiIndex = 0;
|
||||
|
||||
// Create audio element
|
||||
const audio = new Audio("/audio/wow.mp3"); // You'll need to add this audio file
|
||||
|
||||
document.addEventListener("keydown", function (e) {
|
||||
// Check if the pressed key matches the next key in the sequence
|
||||
if (e.code === konamiCode[konamiIndex]) {
|
||||
konamiIndex++;
|
||||
|
||||
// If we've completed the sequence
|
||||
if (konamiIndex === konamiCode.length) {
|
||||
// Play the WOW sound
|
||||
audio.currentTime = 0; // Reset to start
|
||||
audio.play();
|
||||
|
||||
// Optional: Add some visual feedback
|
||||
console.log("🎮 Konami Code activated!");
|
||||
|
||||
// Reset the sequence
|
||||
konamiIndex = 0;
|
||||
}
|
||||
} else {
|
||||
// Wrong key, reset the sequence
|
||||
konamiIndex = 0;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
|
@ -16,6 +16,16 @@ class TerminalShell {
|
|||
|
||||
// Boot sequence
|
||||
async boot() {
|
||||
let skipBoot = false;
|
||||
|
||||
// Add listener to skip boot sequence on Enter key
|
||||
const skipBootListener = (e) => {
|
||||
if (e.key === "Enter") {
|
||||
skipBoot = true;
|
||||
}
|
||||
};
|
||||
document.addEventListener("keydown", skipBootListener);
|
||||
|
||||
const bootMessages = [
|
||||
" _ _ _____ ______ __",
|
||||
" | \\ | | ____| _ \\ \\ / /",
|
||||
|
|
@ -39,8 +49,11 @@ class TerminalShell {
|
|||
"",
|
||||
"",
|
||||
];
|
||||
|
||||
for (let i = 0; i < bootMessages.length; i++) {
|
||||
if (!skipBoot) {
|
||||
await this.sleep(100);
|
||||
}
|
||||
const line = document.createElement("div");
|
||||
line.className = "output-line boot-line";
|
||||
line.textContent = bootMessages[i];
|
||||
|
|
@ -49,6 +62,9 @@ class TerminalShell {
|
|||
this.scrollToBottom();
|
||||
}
|
||||
|
||||
// Remove the skip boot listener
|
||||
document.removeEventListener("keydown", skipBootListener);
|
||||
|
||||
this.printHTML(" ");
|
||||
|
||||
// Get latest post info
|
||||
|
|
@ -71,7 +87,7 @@ class TerminalShell {
|
|||
);
|
||||
|
||||
this.printHTML(
|
||||
'<span class="warning">This site is under construction. There\'s not much of interest here yet.</span>',
|
||||
'<span class="warning">This site is under construction. Feel free to look around...</span>',
|
||||
);
|
||||
|
||||
this.inputContainer.classList.remove("hidden");
|
||||
|
|
|
|||
|
|
@ -25,6 +25,11 @@
|
|||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.blog-header {
|
||||
text-align: center;
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
|
||||
// Brand on bezel
|
||||
&::before {
|
||||
content: "BLOG TERMINAL";
|
||||
|
|
@ -63,6 +68,40 @@
|
|||
height: 6px;
|
||||
}
|
||||
}
|
||||
|
||||
> .window {
|
||||
z-index: -1;
|
||||
position: fixed;
|
||||
top: 0px;
|
||||
left: 50%;
|
||||
transform: translateX(250px);
|
||||
width: 600px;
|
||||
}
|
||||
|
||||
> .blogs-lavalamp {
|
||||
position: fixed;
|
||||
bottom: 0px;
|
||||
left: 50%;
|
||||
transform: translateX(-550px);
|
||||
z-index: -1;
|
||||
|
||||
.lava-lamp-container {
|
||||
height: 400px;
|
||||
width: 180px;
|
||||
pointer-events: none;
|
||||
|
||||
&::before {
|
||||
opacity: 0.7;
|
||||
filter: blur(30px);
|
||||
animation: rotate-beams 7s linear infinite;
|
||||
}
|
||||
|
||||
.lamp-text-shadow,
|
||||
.lamp-text {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// CRT screen content area
|
||||
|
|
@ -98,7 +137,11 @@
|
|||
rgba(255, 255, 255, 0.15) 0%,
|
||||
transparent 40%
|
||||
),
|
||||
radial-gradient(ellipse at center, transparent 0%, rgba(0, 0, 0, 0.3) 100%);
|
||||
radial-gradient(
|
||||
ellipse at center,
|
||||
transparent 0%,
|
||||
rgba(0, 0, 0, 0.3) 100%
|
||||
);
|
||||
pointer-events: none;
|
||||
z-index: 3;
|
||||
border-radius: 8px;
|
||||
|
|
@ -152,6 +195,7 @@
|
|||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: 1rem;
|
||||
|
|
@ -159,7 +203,6 @@
|
|||
margin-bottom: 1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Blog posts listing
|
||||
.blog-posts {
|
||||
|
|
@ -225,6 +268,7 @@
|
|||
background: rgba(255, 153, 0, 0.2);
|
||||
border-color: rgba(255, 153, 0, 0.5);
|
||||
color: #ff9900;
|
||||
text-shadow: 0 0 5px rgba(255, 153, 0, 0.5);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -252,16 +296,6 @@
|
|||
text-shadow: 0 0 5px rgba(0, 255, 0, 0.5);
|
||||
white-space: nowrap;
|
||||
|
||||
&::before {
|
||||
content: "[";
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
&::after {
|
||||
content: "]";
|
||||
margin-left: 2px;
|
||||
}
|
||||
|
||||
@include media-down(lg) {
|
||||
font-size: 0.7rem;
|
||||
}
|
||||
|
|
@ -306,12 +340,7 @@
|
|||
font-size: 0.75rem;
|
||||
color: #0f0;
|
||||
font-family: monospace;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
|
||||
&::before {
|
||||
content: "#";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -345,7 +374,11 @@
|
|||
}
|
||||
|
||||
// Headings in content
|
||||
h2, h3, h4, h5, h6 {
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
margin-top: 1.5em;
|
||||
margin-bottom: 0.75em;
|
||||
color: greenyellow;
|
||||
|
|
@ -406,7 +439,8 @@
|
|||
}
|
||||
|
||||
// Lists
|
||||
ul, ol {
|
||||
ul,
|
||||
ol {
|
||||
margin: 1em 0;
|
||||
padding-left: 2em;
|
||||
|
||||
|
|
@ -586,7 +620,8 @@
|
|||
flex-wrap: wrap;
|
||||
|
||||
li {
|
||||
a, span {
|
||||
a,
|
||||
span {
|
||||
display: block;
|
||||
padding: 6px 12px;
|
||||
background: transparent;
|
||||
|
|
@ -631,7 +666,8 @@
|
|||
|
||||
// Disabled state
|
||||
&.disabled {
|
||||
a, span {
|
||||
a,
|
||||
span {
|
||||
opacity: 0.3;
|
||||
cursor: not-allowed;
|
||||
|
||||
|
|
|
|||
8
build.sh
|
|
@ -34,6 +34,14 @@ if [ $? -ne 0 ]; then
|
|||
fi
|
||||
|
||||
echo -e "${GREEN}✓ Hugo build successful!${NC}"
|
||||
|
||||
# Remove the updates section list page (we only want individual update pages)
|
||||
if [ -d "public/updates" ]; then
|
||||
echo -e "${BLUE}Removing updates section list page...${NC}"
|
||||
rm -rf public/updates
|
||||
echo -e "${GREEN}✓ Updates folder removed!${NC}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# Count total files
|
||||
|
|
|
|||
|
|
@ -1,29 +0,0 @@
|
|||
---
|
||||
title: Getting Started with Hugo
|
||||
date: 2025-01-15T10:00:00+00:00
|
||||
url: /blog/getting-started-with-hugo/
|
||||
tags:
|
||||
- hugo
|
||||
- web development
|
||||
- static sites
|
||||
draft: false
|
||||
---
|
||||
|
||||
Hugo is an incredibly fast static site generator that makes building websites a breeze. In this post, we'll explore why Hugo has become such a popular choice for developers and content creators alike.
|
||||
|
||||
## Why Choose Hugo?
|
||||
|
||||
There are several compelling reasons to choose Hugo for your next project:
|
||||
|
||||
- **Speed**: Hugo is blazingly fast, building most sites in milliseconds
|
||||
- **Simplicity**: Clean folder structure and intuitive templating
|
||||
- **Flexibility**: Extensive theme support and customization options
|
||||
- **No Dependencies**: Single binary with no need for complex toolchains
|
||||
|
||||
## Getting Started
|
||||
|
||||
The basics of getting started with Hugo are straightforward. Install the binary, create a new site, and you're ready to start creating content.
|
||||
|
||||
## Conclusion
|
||||
|
||||
Hugo provides an excellent foundation for building modern static websites. Whether you're creating a blog, portfolio, or documentation site, Hugo has the tools you need.
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
---
|
||||
title: Customizing Your Development Environment
|
||||
date: 2025-01-20T14:30:00+00:00
|
||||
url: /blog/customizing-your-development-environment/
|
||||
tags:
|
||||
- productivity
|
||||
- tools
|
||||
- development
|
||||
- workflow
|
||||
draft: false
|
||||
---
|
||||
|
||||
Your development environment is where you spend most of your time as a developer. Making it work efficiently for you can dramatically improve your productivity and enjoyment of coding.
|
||||
|
||||
## The Power of Personalization
|
||||
|
||||
Every developer has unique preferences and workflows. What works perfectly for one person might feel clunky to another. That's why customizing your environment is so important.
|
||||
|
||||
## Essential Customizations
|
||||
|
||||
Here are some areas worth investing time in:
|
||||
|
||||
### Terminal Setup
|
||||
|
||||
A well-configured terminal can make command-line work much more pleasant. Consider customizing your shell prompt, aliases, and color scheme.
|
||||
|
||||
### Editor Configuration
|
||||
|
||||
Whether you prefer VS Code, Vim, or another editor, take time to learn its features and customize it to your needs. Install relevant extensions, set up keybindings, and configure linting and formatting tools.
|
||||
|
||||
### Version Control
|
||||
|
||||
Set up Git aliases for common operations and customize your diff and merge tools to make version control smoother.
|
||||
|
||||
## Finding Your Flow
|
||||
|
||||
The goal isn't to have the most plugins or the flashiest setup. It's about removing friction from your daily work and creating an environment where you can focus on solving problems.
|
||||
|
||||
## Continuous Improvement
|
||||
|
||||
Your needs will evolve over time. Regularly revisit your setup and adjust as you discover new tools or your workflow changes.
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
---
|
||||
title: Building Resilient Systems
|
||||
date: 2025-01-25T09:15:00+00:00
|
||||
url: /blog/building-resilient-systems/
|
||||
tags:
|
||||
- architecture
|
||||
- reliability
|
||||
- best practices
|
||||
- systems design
|
||||
draft: true
|
||||
---
|
||||
|
||||
Building systems that can withstand failures and continue operating is one of the most important aspects of software engineering. Resilience isn't just about preventing failures—it's about designing systems that can recover gracefully when things go wrong.
|
||||
|
||||
## Understanding Resilience
|
||||
|
||||
Resilience in software systems means the ability to:
|
||||
|
||||
- Detect failures quickly
|
||||
- Isolate problems to prevent cascading failures
|
||||
- Recover automatically when possible
|
||||
- Degrade gracefully when full functionality isn't available
|
||||
|
||||
## Key Principles
|
||||
|
||||
### Redundancy
|
||||
|
||||
Don't rely on single points of failure. Build redundancy into critical components.
|
||||
|
||||
### Circuit Breakers
|
||||
|
||||
Implement circuit breakers to prevent cascading failures when downstream services are unavailable.
|
||||
|
||||
### Timeouts and Retries
|
||||
|
||||
Set appropriate timeouts and implement retry logic with exponential backoff to handle transient failures.
|
||||
|
||||
### Monitoring and Observability
|
||||
|
||||
You can't fix what you can't see. Comprehensive monitoring and logging are essential for understanding system behavior and diagnosing issues.
|
||||
|
||||
## Testing for Failure
|
||||
|
||||
Chaos engineering and failure injection testing help validate that your resilience mechanisms actually work when needed.
|
||||
|
||||
## Conclusion
|
||||
|
||||
Building resilient systems requires thinking beyond the happy path. By anticipating failures and designing for recovery, you create systems that users can rely on even when things go wrong.
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
---
|
||||
title: Understanding Async Programming
|
||||
date: 2025-02-01T11:00:00+00:00
|
||||
url: /blog/understanding-async-programming/
|
||||
tags:
|
||||
- programming
|
||||
- javascript
|
||||
- async
|
||||
draft: false
|
||||
---
|
||||
|
||||
Asynchronous programming is a fundamental concept in modern software development, particularly in JavaScript and web development. Understanding how to work with async operations can dramatically improve your application's performance and user experience.
|
||||
|
||||
## What is Async Programming?
|
||||
|
||||
Async programming allows your code to handle operations that take time without blocking the main execution thread. Instead of waiting for an operation to complete, your program can continue executing other code.
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### Callbacks
|
||||
|
||||
The original async pattern in JavaScript, callbacks are functions passed as arguments to be executed when an operation completes.
|
||||
|
||||
### Promises
|
||||
|
||||
Promises provide a cleaner way to handle async operations, allowing you to chain operations and handle errors more elegantly.
|
||||
|
||||
### Async/Await
|
||||
|
||||
Built on top of promises, async/await syntax makes asynchronous code look and behave more like synchronous code, improving readability.
|
||||
|
||||
## Best Practices
|
||||
|
||||
- Always handle errors in async operations
|
||||
- Avoid deeply nested callbacks (callback hell)
|
||||
- Use Promise.all() for parallel operations
|
||||
- Understand the event loop and how it processes async operations
|
||||
|
||||
## Conclusion
|
||||
|
||||
Mastering async programming is essential for modern development. Take time to understand these patterns and practice implementing them in your projects.
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
---
|
||||
title: "Weekly Update: February 5"
|
||||
date: 2025-02-05T09:00:00+00:00
|
||||
url: /blog/weekly-update-february-5/
|
||||
tags:
|
||||
- weekly
|
||||
- updates
|
||||
draft: false
|
||||
---
|
||||
|
||||
## What I've Been Working On
|
||||
|
||||
This week has been all about refining the blog system and adding some quality-of-life improvements to various projects.
|
||||
|
||||
### Blog System Overhaul
|
||||
|
||||
Finally got around to implementing the new blog content type with proper CRT terminal styling. The green phosphor aesthetic really brings that retro computing vibe I've been going for.
|
||||
|
||||
### Reading
|
||||
|
||||
Started "The Phoenix Project" - fascinating look at DevOps principles told through a narrative. Already applying some of the concepts to my personal workflow.
|
||||
|
||||
### Side Projects
|
||||
|
||||
- Cleaned up the home server rack cabling (again)
|
||||
- Experimented with some new audio processing techniques
|
||||
- Set up automated backups for all the important stuff
|
||||
|
||||
## Links I Found Interesting
|
||||
|
||||
- [Some Cool Article](#) - Fascinating deep dive into terminal emulation
|
||||
- [Another Resource](#) - Great tips on managing dotfiles
|
||||
|
||||
## Next Week's Goals
|
||||
|
||||
Planning to dive deeper into Hugo's taxonomy system and maybe set up some automated deployment workflows. Also need to finally organize that cable mess behind the desk.
|
||||
|
||||
Until next week!
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
---
|
||||
title: Exploring Terminal Emulators
|
||||
date: 2025-02-10T14:20:00+00:00
|
||||
url: /blog/exploring-terminal-emulators/
|
||||
tags:
|
||||
- terminal
|
||||
- tools
|
||||
- unix
|
||||
draft: false
|
||||
---
|
||||
|
||||
The terminal emulator is one of the most important tools in a developer's toolkit. Choosing the right one can significantly impact your daily workflow and productivity.
|
||||
|
||||
## Why Terminal Emulators Matter
|
||||
|
||||
While the basic functionality is similar across all terminal emulators, the differences in performance, features, and customization can make a huge difference in your daily experience.
|
||||
|
||||
## Popular Options
|
||||
|
||||
### Alacritty
|
||||
|
||||
A GPU-accelerated terminal emulator written in Rust. Known for its blazing speed and minimal configuration file approach.
|
||||
|
||||
### Kitty
|
||||
|
||||
Feature-rich with excellent performance, supports images, tabs, splits, and has a powerful extension system.
|
||||
|
||||
### iTerm2
|
||||
|
||||
macOS-only but packed with features. Split panes, search, autocomplete, and extensive customization options.
|
||||
|
||||
### Warp
|
||||
|
||||
A modern terminal with AI assistance, command palette, and collaborative features.
|
||||
|
||||
## Key Features to Consider
|
||||
|
||||
- Performance and rendering speed
|
||||
- GPU acceleration support
|
||||
- Unicode and emoji support
|
||||
- Customization options
|
||||
- Split panes and tab support
|
||||
- Ligature support for programming fonts
|
||||
|
||||
## My Setup
|
||||
|
||||
Currently using Alacritty for its speed and simplicity. Configuration is minimal but powerful, and the GPU acceleration makes scrolling through long outputs a breeze.
|
||||
|
||||
## Conclusion
|
||||
|
||||
The best terminal emulator is the one that fits your workflow. Try a few and see what feels right for your needs.
|
||||
|
|
@ -1,45 +0,0 @@
|
|||
---
|
||||
title: "Weekly Update: February 12"
|
||||
date: 2025-02-12T08:30:00+00:00
|
||||
url: /blog/weekly-update-february-12/
|
||||
tags:
|
||||
- weekly
|
||||
- updates
|
||||
- music
|
||||
draft: false
|
||||
---
|
||||
|
||||
## This Week's Highlights
|
||||
|
||||
Another productive week! Got a lot done across various projects and discovered some great new music.
|
||||
|
||||
### Music Discovery
|
||||
|
||||
Found an incredible new album that's been on repeat all week. The production quality is phenomenal and it's perfect for late-night coding sessions. Added it to the rotation on the now playing section.
|
||||
|
||||
### Tech Experiments
|
||||
|
||||
Spent some time diving into terminal emulators (wrote a full post about it). Currently test-driving Alacritty and loving the performance boost from GPU acceleration.
|
||||
|
||||
### Home Lab Updates
|
||||
|
||||
- Upgraded the network switch firmware
|
||||
- Reorganized the equipment rack (for the third time this month)
|
||||
- Set up monitoring for all critical services
|
||||
- Finally labeled all the cables
|
||||
|
||||
## Currently Reading
|
||||
|
||||
Still working through "The Phoenix Project" - the parallels to real-world IT operations are uncanny. Taking notes on bottlenecks and constraint theory.
|
||||
|
||||
## Random Thoughts
|
||||
|
||||
Why is cable management so satisfying yet so temporary? As soon as you get everything perfect, you need to add one more device and it all falls apart.
|
||||
|
||||
## For Next Week
|
||||
|
||||
- Write about my home server setup
|
||||
- Explore some new static site generators
|
||||
- Maybe finally tackle that Raspberry Pi cluster project I've been planning
|
||||
|
||||
That's all for this week. Stay curious!
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
---
|
||||
title: Version Control Best Practices
|
||||
date: 2025-02-15T16:45:00+00:00
|
||||
url: /blog/version-control-best-practices/
|
||||
tags:
|
||||
- git
|
||||
- workflow
|
||||
- best practices
|
||||
draft: false
|
||||
---
|
||||
|
||||
Version control is the backbone of modern software development. While most developers know how to use git, following best practices can make collaboration smoother and your project history more useful.
|
||||
|
||||
## Commit Messages Matter
|
||||
|
||||
Good commit messages are crucial for understanding project history. Follow these guidelines:
|
||||
|
||||
- Use the imperative mood ("Add feature" not "Added feature")
|
||||
- Keep the first line under 50 characters
|
||||
- Provide context in the body if needed
|
||||
- Reference issue numbers when applicable
|
||||
|
||||
## Branching Strategy
|
||||
|
||||
Choose a branching strategy that fits your team and stick to it. Popular options include:
|
||||
|
||||
- **Git Flow**: Feature branches, develop, and main branches
|
||||
- **GitHub Flow**: Simple feature branches off main
|
||||
- **Trunk-Based Development**: Short-lived feature branches
|
||||
|
||||
## Atomic Commits
|
||||
|
||||
Each commit should represent a single logical change. This makes it easier to:
|
||||
|
||||
- Understand what changed and why
|
||||
- Revert specific changes if needed
|
||||
- Cherry-pick commits to other branches
|
||||
- Review code changes
|
||||
|
||||
## Code Review Culture
|
||||
|
||||
Make pull requests manageable:
|
||||
|
||||
- Keep PRs small and focused
|
||||
- Write descriptive PR descriptions
|
||||
- Respond to feedback constructively
|
||||
- Use draft PRs for work-in-progress
|
||||
|
||||
## Tags and Releases
|
||||
|
||||
Use semantic versioning and tag releases properly. Your future self (and team) will thank you.
|
||||
|
||||
## Conclusion
|
||||
|
||||
These practices aren't just about following rules - they're about making your life and your team's lives easier. Start implementing them one at a time until they become second nature.
|
||||
18
content/blog/2025-12-27-welcome/index.md
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
title: Welcome to my Bloggish
|
||||
date: 2025-12-27T14:30:00+00:00
|
||||
url: /blog/welcome-to-my-bloggish/
|
||||
tags:
|
||||
- meta
|
||||
draft: false
|
||||
---
|
||||
|
||||
Welcome to my Bloggish! Here I am going to post weekly updates in the way of shortform notes, but without any strict rules on what I can and cannot include in them. There may be links, videos, photos etc.
|
||||
|
||||
There may well be other, non-weekly, updates and posts with larger topics covered. A few of the ideas I have for posts so far that I want to add:
|
||||
|
||||
- My hugo build and deploy script for Neocities
|
||||
- Making random art things using HTML and CSS (see my lavalamp)
|
||||
- How I synchronise my music library between many (many) devices
|
||||
|
||||
They'll come eventually.. Please look forward to it.
|
||||
34
content/blog/2025-12-28-weekly-1/index.md
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
---
|
||||
title: "Week 1 - Linux Adventures"
|
||||
date: 2025-12-28T09:00:00+00:00
|
||||
tags:
|
||||
- weeknote
|
||||
- weekly update
|
||||
- linux
|
||||
draft: false
|
||||
---
|
||||
|
||||
- 🎄 The family had a good Christmas, the kids enjoyed it and that's the main thing! We went to my parents for lunch, but the littlest one was without a nap so we were home by 3ish and he had an early night.
|
||||
- 🎁 I got a Wiim Ultra for my bedroom headphone setup, I'll post more about it at some point.
|
||||
- 🧑💻 I've been running Bazzite on my main desktop for a few weeks now and it's been a real joy to use. I haven't found anything I couldn't do on my windows machine.
|
||||
- 🎮 We've been playing modded Minecraft again recently, on the Meatballcraft modpack. It's extremely complicated and we're barely a quarter of the way through it...
|
||||
|
||||
## Sneaky Sneaky
|
||||
|
||||
I've backdated this post a week to give myself a kick start. This post was actually written on 31/12/2025 thinking back to the previous week.
|
||||
|
||||
## Links I Found Interesting
|
||||
|
||||
- [Spotify Scraped](https://therecord.media/spotify-disables-scraping-annas) - I am all for digital preservation, but namechecking Spotify was probably a mistake.
|
||||
|
||||
## Music
|
||||
|
||||
iPod Touch by Ninajirachi has been going round and round in my head. Middlest child also loves it.
|
||||
|
||||
{{< youtube MxekyGtqcNE >}}
|
||||
|
||||
## Next Week
|
||||
|
||||
I've ordered a Thinkpad T480s to do some development on the go. So that'll be the next bit of excitement... I'm planning on installing some variation of Linux on it, but that might need its own post.
|
||||
|
||||
Until next week!
|
||||
|
|
@ -2,4 +2,4 @@
|
|||
title: "Blog"
|
||||
---
|
||||
|
||||
Welcome to the blog. Here you'll find my thoughts and writings on various topics.
|
||||
The home of my weekly updates and occasional other thoughts.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
title: "CVJ Vivian"
|
||||
date: 2025-12-11
|
||||
tags: ["audio", "headphones"]
|
||||
gearType: ["audio", "headphones"]
|
||||
category: ["iem"]
|
||||
description: ""
|
||||
icon: 🎧
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
title: "Fiio FT-1"
|
||||
date: 2025-12-08
|
||||
tags: ["audio", "headphones"]
|
||||
gearType: ["audio", "headphones"]
|
||||
category: ["headphones"]
|
||||
description: ""
|
||||
icon: 🎧
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
title: "Hiby R4 x EVA"
|
||||
date: 2025-12-10
|
||||
tags: ["audio", "dap"]
|
||||
gearType: ["audio", "dap"]
|
||||
category: ["dap"]
|
||||
description: ""
|
||||
icon: 🎵
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
title: "iPod Video 5th Generation - Upgraded"
|
||||
date: 2025-12-11
|
||||
tags: ["audio", "dap"]
|
||||
gearType: ["audio", "dap"]
|
||||
category: ["dap"]
|
||||
description: ""
|
||||
icon: 🎵
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 365 KiB |
|
Before Width: | Height: | Size: 126 KiB |
|
|
@ -1,59 +0,0 @@
|
|||
---
|
||||
title: Moving all my stuff into a server rack – Part 1, The Rack
|
||||
date: 2023-07-27T12:11:17Z
|
||||
url: /posts/moving-all-my-stuff-into-a-server-rack-part-1-the-rack/
|
||||
tags:
|
||||
- homelab
|
||||
- rack
|
||||
draft: true
|
||||
---
|
||||
|
||||
My den, where I keep all my tech and hobby related safely away from children's mitts and wife's eyes was becoming quite chaotic. Between 2 full sized PCs, a NUC, my PS5, 3 monitors and all the associated networking and wiring it was becoming quite the rats nest.
|
||||
|
||||
It was time to do something about it, and I decided to move build a server rack containing all my stuff.
|
||||
|
||||
A full sized 42U rack wasn't going to fit in a room that already had slightly low ceilings, so I needed something that would give me room for all my things - with a bit of room to grow - but not take up as much space as a conventional server rack.
|
||||
|
||||
I found quite a few options out there for mid-height racks and also reduced depth. I did keep an eye on facebook marketplace and eBay for a while for bargains, but nothing came up that wasn't going to be at least a 6 hour round trip. I eventually found a (new) 27U rack that was 600mm x 600mm on eBay.
|
||||
|
||||
I won't be linking to the specific one as the seller tried to scam me for postage after the sale:
|
||||
|
||||
{{< figure src="email-from-ebay-twats.png" title="An email trying to con me out of money" >}}
|
||||
|
||||
Unfortunately for them I wasn't born yesterday so they ended up posting it out on a pallet at their own cost, as it should have been. Fuckers.
|
||||
|
||||
Anyway...
|
||||
|
||||
### The Rack
|
||||
|
||||
The rack arrived and was relatively easy to put together without any assistance. I don't think the same could have been said for a full 42U rack - so maybe keep that in mind when deciding what to get.
|
||||
|
||||
{{< figure src="IMG_6156-1536x2048.webp" title="Excuse the mess - it is not normally this bad." >}}
|
||||
|
||||
Overall the quality is good, it feels sturdy. My only gripe is that the front glass isn't great - there are tiny abrasions on it if you get really close. From more than 30cm away though it looks great.
|
||||
|
||||
I added an LED strip around the inside without a diffuser for now, I quite like the harsh look. Everyone knows that LEDs make things go faster.
|
||||
|
||||
The next step is going to be decanting all my existing machines into server chassis that fit this particular rack and sort out my networking.
|
||||
|
||||
My advise for looking at server racks is:
|
||||
|
||||
### Know your space
|
||||
|
||||
Don't get a 42U full depth rack if you don't need it, and definitely don't get one if you don't have a spot for such a beast.
|
||||
|
||||
Consider the size of the server chassis you want to contain, how many U you actually need, and the depth.
|
||||
|
||||
Most of all, plan for the space you have. You might not even need a full size rack, StarTech do some [cool little cabinets](https://amzn.to/3HfiAz6).
|
||||
|
||||
### Keep an eye out for bargains
|
||||
|
||||
There were loads of bargains on facebook marketplace and eBay, but none of them were the right size for me. If you live in a city there are almost certainly going to be some in your area.
|
||||
|
||||
If you're patient you can get a deal.
|
||||
|
||||
### Consider future expansion
|
||||
|
||||
I planned for about 50% future expansion over what I needed in terms of height. You might not need that, but it's always good to have space for more projects. Also you can fill the spaces with blanks and stickers until then. Win/win.
|
||||
|
||||
That's it! Good luck...
|
||||
|
Before Width: | Height: | Size: 521 KiB |
|
Before Width: | Height: | Size: 854 KiB |
|
|
@ -1,57 +0,0 @@
|
|||
---
|
||||
title: Moving all my stuff into a server rack – Part 2, Server Chassis Shopping
|
||||
date: 2023-08-02T12:38:53+00:00
|
||||
url: /posts/moving-my-stuff-into-a-server-rack-part-2-server-chassis-shopping/
|
||||
tags:
|
||||
- homelab
|
||||
- rack
|
||||
- tech
|
||||
draft: true
|
||||
---
|
||||
|
||||
Server Chassis Shopping, say that three times fast.
|
||||
|
||||
If you haven't alreay [seen Part 1 of this series][1] you might be interested in catching up on that first. In that post I go over picking the rack I did, and now it's time to look at decanting my existing machines into chassis that will fit that server rack.
|
||||
|
||||
### Moving my gaming PC into a server chassis
|
||||
|
||||
The main issue with this was always going to be height, there was a chance I could fit the machine into a 3U chassis, but after a fair bit of poking it looked like my best bet was going to be a 4U chassis of some variety.
|
||||
|
||||
My gaming PC is currently water cooled, and while the chassis I found did technically support a water cooler, my cooler didn't actually fit it. Which was quite annoying.
|
||||
|
||||
The chassis in question is the [Logic Case 4U Short][2]. Everything fit in pretty well with a lot of breathing room, but having to replace the CPU cooler was a bit of a pain. I needed to replace it with something not to tall, not too expensive, and available with next day delivery.
|
||||
|
||||
I found the [be quiet! PURE ROCK SLIM 2 9.2cm](https://amzn.to/41Tgdf5) fit all my requirements and it did indeed arrive the next day so I was able to fit it and crack on.
|
||||
|
||||
{{< figure src="IMG_6163.jpg" title="" >}}
|
||||
|
||||
The height was actually a bit tighter than I would have liked, but it does fit kind of perfectly given the height.
|
||||
|
||||
I've not noticed any performance difference between using the water cooler and this fan based cooler, so happy days.
|
||||
|
||||
I replaced the fans on the front with the LED ones that used to live in my NAS case, because everyone knows LEDs make things go faster.
|
||||
|
||||
Wait for the end of the post to see a photo of everything in place in the rack…
|
||||
|
||||
### Moving my NAS into a server chassis
|
||||
|
||||
The NAS relocation was always going to be easier for me, my build has a small motherboard and low profile fans already.
|
||||
|
||||
I did, however, have another concern and that was future expandability. At the moment I only have 3 drives in it, but in the future I wanted to be able to expand this without having to think too hard. Unraid is JBOD (Just a Bunch of Disks) so my only real limit was SATA connections, and those are expandable.
|
||||
|
||||
I found another [pretty generic 4U Chassis that supports up to 15 3.5" disks](https://www.servercase.co.uk/shop/server-cases/rackmount/4u-chassis/4u-standard-chassis-15-x-35-hdd---480mm-short-depth-sc-h4-480/) - sorted!
|
||||
|
||||
Moving the NAS into this chassis was completely uneventful. I did like the feature of the case that allows the disk drive section to flip upwards for easier access, it's certainly going to make life easier when I get to adding more drives.
|
||||
|
||||
{{< figure src="IMG_6176.jpg" title="" >}}
|
||||
|
||||
One thing that I did want to do when moving all my stuff into a server rack was getting a UPS. While our power supply is good and pretty consistent, we do get the odd blip and I wanted to protect the system from being taken offline when they occurred.
|
||||
|
||||
I looked at various refurbished options and there were a lot of good deals to be had with batteries replaced. While I was looking there was a discount campaign going on on eBay so I had a look on there and found the Powercool 2U. I hadn't heard of the brand but it had a 2 year warranty and a few reviews online said they were decent. It worked out quite cheap so I decided to risk it.
|
||||
|
||||
I've been using that Powercool UPS for a few months now and can confirm it's been solid, even keeping the system online when we were away on holiday and the power blipped offline - which was a lifesaver as Plex being offline would have been a right pain!
|
||||
|
||||
In Part 3 I am planning on covering the PS5 being in the rack, and decoration… See you then.
|
||||
|
||||
[1]: /posts/moving-all-my-stuff-into-a-server-rack-part-1-the-rack/
|
||||
[2]: https://www.scan.co.uk/products/logic-case-4u-short-depth-server-chassis-4x-35-hdd-450mm-depth-high-airflow-with-water-cooling-mount
|
||||
|
Before Width: | Height: | Size: 495 KiB |
|
Before Width: | Height: | Size: 326 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 237 KiB |
|
Before Width: | Height: | Size: 88 KiB |
|
|
@ -1,61 +0,0 @@
|
|||
---
|
||||
title: Adding a double mini-monitor panel to my 19″ server cabinet
|
||||
date: 2023-08-10T08:52:36+00:00
|
||||
url: /posts/adding-a-double-mini-monitor-panel-to-my-19-server-cabinet/
|
||||
cover:
|
||||
image: "IMG_6358-edited.webp"
|
||||
alt: "A mounting panel in a server rack containing two small display panels"
|
||||
relative: false
|
||||
tags:
|
||||
- homelab
|
||||
- rack
|
||||
- tech
|
||||
draft: true
|
||||
---
|
||||
|
||||
When I started the project to move all my computers into a single rack to save some space, and to look cool, I knew I wanted some kind of monitor in it.
|
||||
|
||||
There were a bunch of options for big and ugly KVM panels that pull out, but that wasn't what I was looking for.
|
||||
|
||||
In the AV world there are often small screen monitors in racks for keeping an eye on the broadcast outputs, but they are often quite expensive, and the monitor qualities also aren't great unless you spend a _lot_.
|
||||
|
||||
## Display Panels
|
||||
|
||||
I decided the best thing to do would be to DIY something, there are [loads of small panels available][1] on Amazon, and if you [order from China](https://s.click.aliexpress.com/e/_DELKqBL) you can shave a few quid off as well.
|
||||
|
||||
After doing a bit of research it seemed Waveshare was going to be a reliable brand, so I opted to spend a little more and get something with a reputation, and some decent online documentation. I ordered two of the [Waveshare 7inch displays][2].
|
||||
|
||||
The panels arrived and I plugged them both into the Intel NUC I was planning on driving them with. All looked good.
|
||||
|
||||
{{< figure src="IMG_6352.jpg" title="" >}}
|
||||
|
||||
I planned to use one screen to display my Grafana dashboard (more on that in the future…) - and another to display video content, so I tested it out with Lord of the Rings.
|
||||
|
||||
With the monitors sorted, I got back to thinking about how to mount the things in the rack. I had two main options, either get someone to fabricate something, or DIY something myself.
|
||||
|
||||
## Monitor Mount Panel
|
||||
|
||||
I can get access to a CO2 laser cutter with a decent sized bed that could cut something, but that would involve designing something to size, acquiring something to cut - metal? plastic? - and then actually doing it.
|
||||
|
||||
Getting someone to fabricate me something was also an option, but obviously more expensive.
|
||||
|
||||
I was about to pull the trigger on making my own when I came across a company setting mounts designed to fit some of their own monitors - [Lilliput Direct][3]. They make a [19″ 4U dual panel bracket][4] which looked to be exactly what I was after.
|
||||
|
||||
After getting hold of the technical documentation from Keith at Lilliput, who was extremely helpful, I measured up and decided there would be enough of the surround of the monitor to attach to the panel without needing to use the standard mount points. I'd sort out the exact details later.
|
||||
|
||||
{{< figure src="Schematic.jpg" title="" >}}
|
||||
|
||||
The panel arrived and I was able to simply hot glue the mounting nuts provided with the screens to the mounting panel. Make sure you attach them to the screens first so you can get the spacing and positioning accurate.
|
||||
|
||||
{{< figure src="IMG_6361-edited.webp" title="" align=center >}}
|
||||
|
||||
You can just about make out the hot glued mounts on the rear in the above photo.
|
||||
|
||||
The only downside to this method is the original mounting holes on the panel remain, I am planning on either filling and painting these - or sticking something over it. Maybe more stickers.
|
||||
|
||||
{{< figure src="IMG_6367-jpg.webp" title="" align=center >}}
|
||||
|
||||
[1]: https://amzn.to/3TUjw3I
|
||||
[2]: https://amzn.to/3NURgtH
|
||||
[3]: https://lilliputdirect.com/
|
||||
[4]: https://lilliputdirect.com/19-inch-4U-rackmount-bracket
|
||||
|
Before Width: | Height: | Size: 344 KiB |
|
Before Width: | Height: | Size: 463 KiB |
|
Before Width: | Height: | Size: 417 KiB |
|
Before Width: | Height: | Size: 258 KiB |
|
|
@ -1,48 +0,0 @@
|
|||
---
|
||||
title: Moving all my stuff into a server rack – Part 3, Housing the PS5 and some decor
|
||||
date: 2023-08-15T12:06:15+00:00
|
||||
url: /posts/moving-stuff-into-a-server-rackhousing-the-ps5-and-some-decor/
|
||||
tags:
|
||||
- homelab
|
||||
- ps5
|
||||
- rack
|
||||
- tech
|
||||
draft: true
|
||||
---
|
||||
|
||||
At this stage in the build I was about ready to find a way to house my PS5 in my rack, and do some general decor. If you haven't checked out [Part 1][1] and [part 2][2] yet, check them out first!
|
||||
|
||||
One of the main reasons for moving things into a rack in the first place was to clear _all_ my tech - or as much as possible. Housing the PS5 would clear a fair bit of room from the surfaces in my den, they are not small things.
|
||||
|
||||
Hunting around I found that there was one commercially available PS5 shelf for AV racks but it was ridiculously over priced, so ultimately I decided that just putting it on a shelf in the rack was going to be the best bet.
|
||||
|
||||
I found a few rack shelves, but the one I went for was a [simple 1U shelf](https://amzn.to/3U2wc8O) with a depth of 250mm - enough for the PS5 to sit on.
|
||||
|
||||
{{< figure src="IMG_6360.jpg" title="" >}}
|
||||
|
||||
It would certainly look a bit better with a proper fronting panel on it, but for my purposes this works just fine.
|
||||
|
||||
{{< figure src="IMG_6361.jpg" title="" >}}
|
||||
|
||||
As you can see from the rear, it sits on the shelf nicely. Don't worry about the cable management… I'll deal with that later…
|
||||
|
||||
### Decoration!
|
||||
|
||||
As you've probably seen from previous posts, I have some blanking panels installed to fill in the gaps that I have covered in stickers. Obviously this won't be to everyones taste, but I love it.
|
||||
|
||||
Blanking panels are available all over the place in a variety of U heights, [mine are all 1U](https://amzn.to/3SkVzBq) so I can move things about without having to think about it too much. If you didn't want to get stickers to decorate it, you could get vented blanking planels to switch up your air flow.
|
||||
|
||||
Packs of 50-100 stickers are available from your favourite online retailer in whatever themes you can imagine.
|
||||
|
||||
I also added a chocobo standing in the bottom of the rack as there was a very handy spot for it.
|
||||
|
||||
{{< figure src="IMG_6619.jpg" title="" >}}
|
||||
|
||||
And with that, the rack is almost complete. I'll cover networking in a completely separate post as that covers my whole house.
|
||||
|
||||
{{< figure src="IMG_6367.jpg" title="" >}}
|
||||
|
||||
Please let me know if this has inspired you to move your own stuff into a server rack, and send me pictures if you go wild with the decoration!
|
||||
|
||||
[1]: /posts/moving-all-my-stuff-into-a-server-rack-part-1-the-rack/
|
||||
[2]: /posts/moving-my-stuff-into-a-server-rack-part-2-server-chassis-shopping/
|
||||
|
Before Width: | Height: | Size: 2.2 MiB |
|
Before Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 1.6 MiB |
|
|
@ -1,61 +0,0 @@
|
|||
---
|
||||
title: Upgrading our coffee experience – a review of Rave Coffee
|
||||
date: 2023-10-31T11:45:21+00:00
|
||||
url: /posts/upgrading-our-coffee-experience-a-review-of-rave-coffee/
|
||||
tags:
|
||||
- "food & drink"
|
||||
- coffee
|
||||
|
||||
cover:
|
||||
image: "DSCF3116.jpg"
|
||||
alt: "A bag of Rave coffee next to a mug and jar of coffee beans"
|
||||
relative: false
|
||||
|
||||
draft: true
|
||||
---
|
||||
|
||||
One of the first presents we bought ourselves after we got married was a proper bean-to-cup coffee machine. For the longest time we just picked up whichever beans were cheap enough and easily available, be it from large online retailers or the local supermarket. We really needed to upgrade our coffee experience - here is my review of Rave Coffee.
|
||||
|
||||
More recently we decided we should be focusing on quality over quantity. Moreso we had become concerned over the [environmental impact](https://www.theworldcounts.com/challenges/consumption/foods-and-beverages/environmental-effects-of-coffee-production) our coffee habits were having.
|
||||
|
||||
Deciding we could do better, we needed to find a local coffee supplier. They needed to also be environmentally minded.
|
||||
|
||||
A friend suggested we try Cirencester based [Rave Coffee](https://i.refs.cc/m9Xi83Rv?smile_ref=eyJzbWlsZV9zb3VyY2UiOiJzbWlsZV91aSIsInNtaWxlX21lZGl1bSI6IiIsInNtaWxlX2NhbXBhaWduIjoicmVmZXJyYWxfcHJvZ3JhbSIsInNtaWxlX2N1c3RvbWVyX2lkIjoxOTk0ODg5ODk5fQ%3D%3D). This is a brief review of the experience so far.
|
||||
|
||||
{{< figure src="DSCF3114.jpg" title="" >}}
|
||||
|
||||
### The Coffee
|
||||
|
||||
Despite the photos in this post being of The Italian Job Blend, which is very nice in itself I am going to be talking about their _Now That's What I Call Coffee Nº 2023_ blend that is currently in our machine.
|
||||
|
||||
This coffee truly lives up to its name, offering a symphony of flavors that left us singing its praises.
|
||||
|
||||
First and foremost, the aroma of this coffee is amazing. As soon as you open the bag, you're greeted with a rich and inviting fragrance that hints at the magic within. The beans are beautifully roasted to a 4/5 level, hitting that perfect balance between depth and brightness.
|
||||
|
||||
Rave describe this coffee as tasting of milk chocolate, blackberry and toffee. Whilst I am not amazing at detecting these subtle tastes in anything I did get the sense of the milk chocolate, creating a velvety and indulgent experience. It's a delightful taste that perfectly complements the robust coffee base.
|
||||
|
||||
One of my favourite things about this coffee is its ability to cater to a variety of tastes - my wife enjoys her coffee black, I have mine with milk or cream. All three have proved a great success with us. This blend is versatile enough to accommodate various brewing methods and preferences.
|
||||
|
||||
_Now That's What I Call Coffee Nº 2023_ is a must-try for anyone seeking a coffee that goes beyond the ordinary. With its captivating blend of milk chocolate, blackberry, and toffee, this coffee earns a well-deserved spot among our favorites.
|
||||
|
||||
### The Company
|
||||
|
||||
As I mentioned at the start, the coffee alone wasn't all we were looking for. We also wanted a coffee supplier that was in some alignment with our values.
|
||||
|
||||
Good news is, Rave Coffee seem quite environmentally minded. They are a member of [1% For The Planet](https://ravecoffee.co.uk/pages/1-for-the-planet)</a> - which donates 1% of sales (not profits) to environmental causes.
|
||||
|
||||
They're also not that far away from us geographically, so hopefully that cuts down on the carbon footprint a little bit.
|
||||
|
||||
Their website is really usable too. Sounds like a weird thing to say, but it's obscene how often a companies website seems to be actively trying to stop the user actually using it.
|
||||
|
||||
The price is probably 50% more than we were paying for coffee previously, but with our _quality not quantity_ mindset it's working out about the same on our monthly expenditure. They aren't cheap, but they are really good.
|
||||
|
||||
I don't have much more to say, the coffee we've had so far has been fantastic. Give it a go.
|
||||
|
||||
Before I sign off, can we just take a moment to appreciate how cool this pumpkin mug is?
|
||||
|
||||
{{< figure src="DSCF3121.jpg" title="" >}}
|
||||
|
||||
Enjoy your coffee, feel free to send me any other coffee producers in the UK that we could try out.
|
||||
|
||||
If you want to try Rave Coffee, [use this link to get £5 off](https://i.refs.cc/m9Xi83Rv?smile_ref=eyJzbWlsZV9zb3VyY2UiOiJzbWlsZV91aSIsInNtaWxlX21lZGl1bSI6IiIsInNtaWxlX2NhbXBhaWduIjoicmVmZXJyYWxfcHJvZ3JhbSIsInNtaWxlX2N1c3RvbWVyX2lkIjoxOTk0ODg5ODk5fQ%3D%3D), sorted!
|
||||
|
Before Width: | Height: | Size: 16 KiB |
|
|
@ -1,42 +0,0 @@
|
|||
---
|
||||
title: Increasing upload size for WordPress docker on Unraid
|
||||
date: 2024-01-09T13:09:17+00:00
|
||||
url: /posts/increasing-upload-size-for-wordpress-docker-on-unraid/
|
||||
tags:
|
||||
- unraid
|
||||
- wordpress
|
||||
draft: true
|
||||
---
|
||||
|
||||
If you're using unraid and want to use the docker engine to run your wordpress site, you're likely going to want to increase the maximum upload size.
|
||||
|
||||
This is the simplest way I found of doing it, though I am sure there are other methods.
|
||||
|
||||
First locate the `.htaccess` file in your webroot. If you don't know where to find the appdata path you can just edit the container and look for the following option:
|
||||
|
||||
{{< figure src="Screenshot-2024-01-09-125819.png" title="" >}}
|
||||
|
||||
Depending on your setup you may need to edit the file permissions so it can be edited, so open the terminal on your server and navigate to the above path:
|
||||
|
||||
{{< highlight bash >}}
|
||||
cd /mnt/user/appdata/rest_of_path_you_found_above && chmod 777 .htaccess
|
||||
{{< / highlight >}}
|
||||
|
||||
This will make the file writable by every group. If you've got security concerns you should probably not be following instructions found on someones blog without understanding them.
|
||||
|
||||
Now edit the file however you wish, either using a terminal based editor like `nano` or opening the file in something on your local machine.
|
||||
|
||||
Add the following two lines to the bottom of the file:
|
||||
|
||||
{{< highlight bash >}}
|
||||
php_value upload_max_filesize 500M
|
||||
php_value post_max_size 500M
|
||||
{{< / highlight >}}
|
||||
|
||||
Adjust the values as you see fit.
|
||||
|
||||
In the latest version of WordPress this didn't seem to do the trick for me, I also had to edit the value stored somewhere in WordPress' gubbins… To make this simpler I just used the plugin [Increase Maximum Upload File Size][1]. Navigating to the plugins page in your install and change the drop down. Hit Apply. Done.
|
||||
|
||||
That's it! Let me know if there's a way to do this without the plugin.
|
||||
|
||||
[1]: https://wordpress.org/plugins/upload-max-file-size/
|
||||
|
Before Width: | Height: | Size: 1.7 MiB |
|
|
@ -1,40 +0,0 @@
|
|||
---
|
||||
title: Cutting off from Compulsive Connectivity
|
||||
date: 2024-01-24T15:11:51+00:00
|
||||
url: /posts/cutting-off-from-compulsive-connectivity/
|
||||
tags:
|
||||
- "digital minimalism"
|
||||
- tech
|
||||
|
||||
draft: true
|
||||
---
|
||||
|
||||
Towards the end of 2023, a growing unease prompted me to seriously evaluate my device and app usage. I found myself habitually reaching for my phone, ostensibly to "just check". Recognizing that I wasn't alone in this sentiment, I delved into the realm of digital minimalism and connected with various communities centered around this philosophy.
|
||||
|
||||
The main issue that surfaced was my persistent need to stay connected— whether through Discord, iMessage, Reddit, or email. I found myself compulsively checking these apps, only to discover that I was missing out on nothing substantial. Even with the majority of notifications disabled, allowing people instant access to my time and attention started to feel very wrong.
|
||||
|
||||
I wanted to cut people off, and cut myself off.
|
||||
|
||||
I found the book [Digital Minimalism: Choosing a Focused Life in a Noisy World](https://amzn.to/3UaFteI) by Cal Newport, which I can highly recommend. As with all books like this, all the methods won't work for everyone. I am choosing to implement some of the suggestions, and then going far more extreme and deciding to put my iPhone in a box outside of work hours.
|
||||
|
||||
There are multiple issues which will need overcoming and I want to address them all in individual posts as I come up with proper solutions, here is the rough list so far:
|
||||
|
||||
- **Watch** - I currently use an Apple Watch
|
||||
- **Phone** - Yes, the obvious iPhone replacement quest looms. But not just any replacement — a humble dumb phone dedicated to emergency calls and texts. A bold move towards essential communication without the smartphone overwhelm.
|
||||
- **Camera** - With the iPhone out of the picture, my portable camera dilemma surfaces..
|
||||
- **Music** - No iPhone, no portable music player. The silence is about to be shattered by a new rhythm, a device solely devoted to delivering musical bliss.
|
||||
- **Gaming** - Portable gaming system enthusiasts, fear not! The absence of an iPhone won't hinder the gaming experience. A new, dedicated device is on the horizon.
|
||||
- **Notes** - Joining the league of paper aficionados, I'm set to conquer the world of note-taking without the digital distractions.
|
||||
- **Reading** - I'm finally going to get a kindle I think.
|
||||
|
||||
Those are the main areas to address if I want to cut my smart phone usage in the evenings and weekends.
|
||||
|
||||
The first one, the watch, was actually pretty easy to address. I've always admired the retro styling of the old-school Casio watches so I picked up one of those for around £10 and have been wearing it for a week already. I haven't missed the notifications on my wrist and I really don't care how many steps I haven't taken in the day so it's really not been much of a transition.
|
||||
|
||||
{{< figure src="DSCF3156.jpg" title="" >}}
|
||||
|
||||
I do really enjoy wearing this strangely, it's lighter and smaller than the Apple Watch so is quite a bit more comfortable over long periods.
|
||||
|
||||
Yet, a peculiar phenomenon has emerged—the phantom notifications. It's as if my wrist still expects the familiar buzz of alerts, a reflex ingrained by the smartphone era. A quirky reminder of the digital transition underway. Here's hoping that this sensation fades into the background as I fully embrace the simplicity of my new wrist companion.
|
||||
|
||||
Join me on my journey as I quest for the perfect dumb phone, a reliable portable camera, a dedicated music player, and a gaming partner—all already in progress. Stay tuned for updates.
|
||||
|
Before Width: | Height: | Size: 146 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
|
@ -1,53 +0,0 @@
|
|||
---
|
||||
title: "Turning my smart phone into a dumb phone"
|
||||
url: "/posts/turning-my-smartphone-into-a-dumb-phone"
|
||||
date: 2024-02-05T13:55:21+00:00
|
||||
tags:
|
||||
- "digital minimalism"
|
||||
- "dumbphone"
|
||||
- "tech"
|
||||
|
||||
cover:
|
||||
image: "DSCF3198-Enhanced-NR-jpg.webp"
|
||||
alt: "<alt text>"
|
||||
caption: "<text>"
|
||||
relative: false
|
||||
|
||||
draft: true
|
||||
---
|
||||
|
||||
One of the first things I wanted to explore in my [mission to cut myself off from compulsive connectivity][1] was to find the options for turning my smart phone into a dumb phone.
|
||||
|
||||
The main aim was to make my phone as uninteresting as possible. One of the main tips thrown around for this is to turn your phone greyscale. Luckily on the iPhone that is quite simple, and you can also setup a toggle button. I found this feature to be quite useful as accessibility on the internet is really quite terrible - you don't know annoyance until you try and submit a form and it tells you there's an error but there's no obvious indiciation as to what that error is unless you're viewing the page in colour.
|
||||
|
||||
### Enable Greyscale Mode
|
||||
|
||||
1. Go to iOS **Settings** > **Accessibility**
|
||||
2. Tap on **Display & Text Size**
|
||||
3. Under the **Vision** section, tap on **Color Filters**
|
||||
4. Toggle the switch to turn on **Color Filters**
|
||||
5. Tap on **Grayscale** to select it.
|
||||
|
||||
### Setup a Toggle Shortcut
|
||||
|
||||
1. Go to iOS **Settings** > **Accessibility**
|
||||
2. Scroll down to **Accessibility Shortcut** > select **Color Filter**
|
||||
3. Triple-click the side button to turn the Grayscale filter on and off.
|
||||
|
||||
Okay, so with my phone able to toggle between colour and greyscale it did make it significantly less interesting, but I wanted to take it further.
|
||||
|
||||
A bit more research led me to an app named [Blank Spaces](https://www.blankspaces.app/). This is a paid app, but in my opinion is well worth it. It allows you to add two widgets to your home screen that act as shortcuts, letting to remove easy access to any other apps you want to restrict yourself with.
|
||||
|
||||
Setting it up is quite easy, the app has a great walk through. This is how my homescreen looks now:
|
||||
|
||||
{{< figure src="IMG_7455.jpg" title="My dumb iPhone homescreen" >}}
|
||||
|
||||
If I want to access any other apps I have to go into the library and manually search for them.
|
||||
|
||||
So far it has really restricted my use of these apps. The added few steps whenever I pull my phone out has really helped.
|
||||
|
||||
### Turning my smart phone into a dumb phone
|
||||
|
||||
I've been using this system for a couple of weeks now, and while it works, I still want to be able to turn off my iPhone completely in the evenings and weekends. Due to needing banking apps to approve payments, and various functions required for my day-to-day job, I need to keep the iPhone. I am going to be looking for alternatives so I can walk away from it.
|
||||
|
||||
[1]: https://danbaker.dev/post/cutting-off-from-compulsive-connectivity/
|
||||
10
content/updates/2025-12-31-bloggish.md
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
title: "2025 12 31 Bloggish"
|
||||
date: 2025-12-31T11:57:05Z
|
||||
tags: []
|
||||
description: ""
|
||||
build:
|
||||
render: never
|
||||
---
|
||||
|
||||
Added a blog section and a little easter egg - see if you can find it!
|
||||
4
content/updates/_index.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: "Updates"
|
||||
outputs: []
|
||||
---
|
||||
|
|
@ -88,9 +88,10 @@
|
|||
<div class="neon-text purple">gear <span>-></span></div>
|
||||
</div>
|
||||
<div class="gear-grid">
|
||||
{{ $posts := where site.RegularPages "Type" "gear" }} {{ $posts = where
|
||||
$posts "Params.tags" "intersect" (slice "audio") }} {{ range first 5
|
||||
$posts }}
|
||||
<!-- prettier-ignore -->
|
||||
{{ $posts := where site.RegularPages "Type" "gear" }}
|
||||
{{ $posts = where $posts "Params.gearType" "intersect" (slice "audio") }}
|
||||
{{ range first 5 $posts }}
|
||||
<div class="gear-item">
|
||||
{{ with .Params.icon }}
|
||||
<div class="gear-icon">{{ . }}</div>
|
||||
|
|
|
|||
|
|
@ -3,39 +3,45 @@
|
|||
<div class="blogs-container">
|
||||
<div class="blogs-screen">
|
||||
<div class="blogs-content">
|
||||
<section>
|
||||
{{ .Content }}
|
||||
</section>
|
||||
<div class="blog-header">
|
||||
<pre>
|
||||
|
||||
{{ $tags := slice }}
|
||||
{{ range .Site.RegularPages }}
|
||||
{{ if eq .Section "blog" }}
|
||||
{{ range .Params.tags }}
|
||||
{{ $tags = $tags | append . }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ $tags = $tags | uniq }}
|
||||
▄▄
|
||||
█▄ ██ █▄
|
||||
██ ██ ▄▄ ▄▄ ▀▀ ██
|
||||
████▄ ██ ▄███▄ ▄████ ▄████ ██ ▄██▀█ ████▄
|
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ▀███▄ ██ ██
|
||||
▄████▀▄██▄▀███▀ ▀████▄▀████▄███▄▄██▀▄██ ██
|
||||
██ ██
|
||||
▀▀▀ ▀▀▀
|
||||
</pre
|
||||
>
|
||||
|
||||
<section>{{ .Content }}</section>
|
||||
</div>
|
||||
|
||||
{{ $tags := slice }} {{ range .Site.RegularPages }} {{ if eq .Section
|
||||
"blog" }} {{ range .Params.tags }} {{ $tags = $tags | append . }} {{ end
|
||||
}} {{ end }} {{ end }} {{ $tags = $tags | uniq }}
|
||||
|
||||
<nav class="blog-tags-filter">
|
||||
<span class="filter-label">Filter by tag: (found {{ len $tags }} tags)</span>
|
||||
<span class="filter-label">Tags:</span>
|
||||
<div class="tag-links">
|
||||
<a href="/blog/" class="tag-filter-link active">All</a>
|
||||
{{ range $tags }}
|
||||
{{ $tagURL := printf "/tags/%s/" (. | urlize) }}
|
||||
<a href="/blog/" class="tag-filter-link active">all</a>
|
||||
{{ range $tags }} {{ $tagURL := printf "/tags/%s/" (. | urlize) }}
|
||||
<a href="{{ $tagURL }}" class="tag-filter-link">{{ . }}</a>
|
||||
{{ end }}
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<aside class="blog-posts">
|
||||
{{ range .Paginator.Pages }}
|
||||
{{ .Render "summary" }}
|
||||
{{ end }}
|
||||
{{ range .Paginator.Pages }} {{ .Render "summary" }} {{ end }}
|
||||
</aside>
|
||||
{{ partial "pagination.html" .Paginator }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="window">{{ partial "elements/window.html" . }}</div>
|
||||
<div class="blogs-lavalamp">{{ partial "elements/lavalamp.html" . }}</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
|
|
|||
|
|
@ -9,9 +9,8 @@
|
|||
|
||||
<article class="blog-post-card">
|
||||
<h1 class="blog-title">
|
||||
{{ .Title }}
|
||||
{{ if .Date }}
|
||||
<span class="blog-date">{{ .Date.Format "02/01/2006" }}</span>
|
||||
{{ .Title }} {{ if .Date }}
|
||||
<span class="blog-date">{{ .Date.Format "02-01-2006" }}</span>
|
||||
{{ end }}
|
||||
</h1>
|
||||
{{ if .Params.tags }}
|
||||
|
|
@ -21,21 +20,21 @@
|
|||
{{ end }}
|
||||
</div>
|
||||
{{ end }}
|
||||
<div class="blog-summary">
|
||||
{{ .Content }}
|
||||
</div>
|
||||
<div class="blog-summary">{{ .Content }}</div>
|
||||
</article>
|
||||
|
||||
<nav class="blog-post-navigation">
|
||||
<div class="post-nav-links">
|
||||
{{ with .PrevInSection }}
|
||||
<a href="{{ .Permalink }}" class="nav-link prev-post">← {{ .Title }}</a>
|
||||
<a href="{{ .Permalink }}" class="nav-link prev-post"
|
||||
>← {{ .Title }}</a
|
||||
>
|
||||
{{ else }}
|
||||
<span class="nav-link disabled">← Previous</span>
|
||||
{{ end }}
|
||||
|
||||
{{ with .NextInSection }}
|
||||
<a href="{{ .Permalink }}" class="nav-link next-post">{{ .Title }} →</a>
|
||||
{{ end }} {{ with .NextInSection }}
|
||||
<a href="{{ .Permalink }}" class="nav-link next-post"
|
||||
>{{ .Title }} →</a
|
||||
>
|
||||
{{ else }}
|
||||
<span class="nav-link disabled">Next →</span>
|
||||
{{ end }}
|
||||
|
|
@ -43,6 +42,8 @@
|
|||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
<div class="window">{{ partial "elements/window.html" . }}</div>
|
||||
<div class="blogs-lavalamp">{{ partial "elements/lavalamp.html" . }}</div>
|
||||
</div>
|
||||
</div>
|
||||
{{ end }}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<div class="blog-post-card{{ if not (in .Params.tags "weekly") }} non-weekly{{ end }}">
|
||||
<div class="blog-post-card{{ if not (in .Params.tags "weeknote") }} non-weekly{{ end }}">
|
||||
<h1 class="blog-title">
|
||||
{{ if in .Params.tags "weekly" }}
|
||||
{{ if in .Params.tags "weeknote" }}
|
||||
{{ .Title }}
|
||||
{{ else }}
|
||||
<a href="{{ .Permalink }}">
|
||||
|
|
@ -8,7 +8,7 @@
|
|||
</a>
|
||||
{{ end }}
|
||||
{{ if .Date }}
|
||||
<span class="blog-date">{{ .Date.Format "02/01/2006" }}</span>
|
||||
<span class="blog-date">{{ .Date.Format "02-01-2006" }}</span>
|
||||
{{ end }}
|
||||
</h1>
|
||||
{{ if .Params.tags }}
|
||||
|
|
@ -18,7 +18,7 @@
|
|||
{{ end }}
|
||||
</div>
|
||||
{{ end }}
|
||||
{{ if in .Params.tags "weekly" }}
|
||||
{{ if in .Params.tags "weeknote" }}
|
||||
<div class="blog-summary">
|
||||
{{ .Content }}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -68,32 +68,6 @@
|
|||
<!-- Desk -->
|
||||
<div class="desk"></div>
|
||||
|
||||
<!-- Desk monitor -->
|
||||
{{/*
|
||||
<div class="secondary-screen desk-monitor">
|
||||
<div class="screen-display large crt">
|
||||
<span class="cursor-blink">_</span>
|
||||
</div>
|
||||
<div class="monitor-stand-small"></div>
|
||||
</div>
|
||||
*/}}
|
||||
|
||||
<!-- Desk clutter -->
|
||||
{{/*
|
||||
<div class="desk-item keyboard"></div>
|
||||
<div class="desk-item mouse"></div>
|
||||
|
||||
*/}}
|
||||
|
||||
<!-- MUSICAL STUFF -->
|
||||
|
||||
<!-- Widgets and gadgets -->
|
||||
{{/*
|
||||
<div class="widget router"></div>
|
||||
<div class="widget hard-drive"></div>
|
||||
*/}}
|
||||
|
||||
<!-- CRT Monitor -->
|
||||
<div class="crt-container">
|
||||
<div class="crt-monitor">
|
||||
<div class="crt-screen">
|
||||
|
|
@ -125,7 +99,7 @@
|
|||
> updates -lah<br />
|
||||
{{ range first 10 (where .Site.RegularPages "Type"
|
||||
"updates").ByDate.Reverse }} [<time
|
||||
>{{ .Lastmod.Format "2006-01-02" }}</time
|
||||
>{{ .Lastmod.Format "02-01-2006" }}</time
|
||||
>]<br />
|
||||
{{ .Plain }}<br />
|
||||
---<br />
|
||||
|
|
@ -218,15 +192,32 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="secondary-screen wall-monitor-3 hidden-xl-down">
|
||||
<div class="screen-display crt">
|
||||
PING 8.8.8.8<br />
|
||||
64 bytes: 12ms<br />
|
||||
64 bytes: 11ms<br />
|
||||
64 bytes: 13ms<br />
|
||||
<span class="cursor-blink">_</span>
|
||||
</div>
|
||||
<a
|
||||
href="/blog/"
|
||||
class="secondary-screen wall-monitor-3 hidden-xl-down"
|
||||
style="text-decoration: none !important"
|
||||
>
|
||||
<div
|
||||
class="screen-display crt"
|
||||
style="
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
"
|
||||
>
|
||||
<pre>
|
||||
▄▄
|
||||
█▄ ██
|
||||
██ ██ ▄▄
|
||||
████▄ ██ ▄███▄ ▄████
|
||||
██ ██ ██ ██ ██ ██ ██
|
||||
▄████▀▄██▄▀███▀ ▀████
|
||||
██
|
||||
██ NEW! ██▶▶▶ ▀▀▀</pre
|
||||
>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<div class="secondary-screen wall-monitor-4 hidden-xl-down">
|
||||
<div class="screen-display tiny amber crt">
|
||||
|
|
|
|||
|
|
@ -11,19 +11,21 @@
|
|||
<nav class="blog-tags-filter">
|
||||
<span class="filter-label">Filter by tag:</span>
|
||||
<div class="tag-links">
|
||||
<a href="/blog/" class="tag-filter-link">All</a>
|
||||
{{ range $name, $taxonomy := .Site.Taxonomies.tags }}
|
||||
{{ $tagURL := printf "/tags/%s/" ($name | urlize) }}
|
||||
<a href="{{ $tagURL }}" class="tag-filter-link{{ if eq $name $.Title }} active{{ end }}">{{ $name }}</a>
|
||||
<a href="/blog/" class="tag-filter-link">all</a>
|
||||
{{ range $name, $taxonomy := .Site.Taxonomies.tags }} {{ $tagURL :=
|
||||
printf "/tags/%s/" ($name | urlize) }}
|
||||
<a
|
||||
href="{{ $tagURL }}"
|
||||
class="tag-filter-link{{ if eq $name $.Title }} active{{ end }}"
|
||||
>{{ $name }}</a
|
||||
>
|
||||
{{ end }}
|
||||
</div>
|
||||
</nav>
|
||||
{{ end }}
|
||||
|
||||
<aside class="blog-posts">
|
||||
{{ range .Pages }}
|
||||
{{ .Render "summary" }}
|
||||
{{ end }}
|
||||
{{ range .Pages }} {{ .Render "summary" }} {{ end }}
|
||||
</aside>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 1,023 B |