7 Commits

Author SHA1 Message Date
eggy
3c13e385a2 chore: fix dollar sign rendering 2025-10-19 15:49:56 +08:00
eggy
d4cdfb6bcc chore: fix build 2025-10-19 15:34:51 +08:00
eggy
4c1c8ae3af chore: upgrade to nuxt 4 2025-10-19 15:33:02 +08:00
eggy
21c717ed79 chore: upgrade to nuxt 4 2025-10-19 15:32:55 +08:00
eggy
e814c77333 content: republish albatross 2025-10-19 14:07:03 +08:00
eggy
f0554121be content: add the dark side 2025-04-09 02:19:12 -04:00
eggy
d03d268e8e about: add hwaboon 2025-01-26 15:09:14 -05:00
65 changed files with 3476 additions and 3771 deletions

View File

@@ -1,7 +1,7 @@
@import "base.scss";
@use "base.scss";
.prose article {
@include headings {
@include base.headings {
& > a:hover,
& > a:active {
text-decoration: underline;

View File

Before

Width:  |  Height:  |  Size: 490 B

After

Width:  |  Height:  |  Size: 490 B

View File

Before

Width:  |  Height:  |  Size: 339 B

After

Width:  |  Height:  |  Size: 339 B

View File

Before

Width:  |  Height:  |  Size: 712 B

After

Width:  |  Height:  |  Size: 712 B

View File

@@ -1,20 +1,30 @@
<script setup lang="ts">
import type { GithubPushEvent } from "@/shared/github";
import type { Ref } from "vue";
const FEED_URL = "https://api.github.com/users/potatoeggy/events";
const imgUrl = ref("");
const href = ref("");
onMounted(async () => {
const results = (await useFetch(FEED_URL)).data as Ref<GithubPushEvent[]>;
const latestEvent = results.value.find(
(event) => event.type === "PushEvent"
) as GithubPushEvent;
const latestCommit = latestEvent.payload.commits[0];
imgUrl.value = `https://opengraph.githubassets.com/hash/${latestEvent.repo.name}/commit/${latestCommit.sha}`;
href.value = `https://github.com/${latestEvent.repo.name}/commit/${latestCommit.sha}`;
const { data: results } = await useFetch<GithubPushEvent[]>(FEED_URL, {
onResponse(res) {
res.response.json;
},
});
const latestEvent = results.value?.find(
(event: GithubPushEvent) => event.type === "PushEvent"
);
const latestCommitSha = latestEvent.payload.head;
const imgUrl = computed(() =>
results.value
? `https://opengraph.githubassets.com/hash/${latestEvent.repo.name}/commit/${latestCommitSha}`
: ""
);
const href = computed(() =>
results.value
? `https://github.com/${latestEvent.repo.name}/commit/${latestCommitSha}`
: ""
);
</script>
<template>

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import { getPrettyDate, getUtcDate } from "~~/shared/metadata";
import type { AnyParsedContent } from "~~/shared/types";
import { getPrettyDate, getUtcDate } from "@/shared/metadata";
import type { AnyParsedContent } from "@/shared/types";
const { doc } = defineProps<{ doc: AnyParsedContent }>();

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import ColourPicker from "./ColourPicker.vue";
import { navItems } from "@/data/navItems";
import { navItems } from "~/data/navItems";
</script>
<template>

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import type { Project } from "@/data/projects";
import { unref as _unref } from "vue";
const { project } = defineProps<{
project: Project;
reverse?: boolean;

View File

@@ -27,27 +27,33 @@ import { projects } from "@/data/projects";
</p>
<ul>
<li>competitive programming on DMOJ</li>
<li>GUI toolkits very very briefly in GTK, Qt, and Swing</li>
<li>Linux and server administration</li>
<li>web development in the form of a Chrome extension and my sites</li>
<li>web development</li>
<li>hackathons</li>
<li>Godot Engine Cat Simulator DX</li>
<li>ski instruction</li>
<li>writing of literature</li>
<li>emulation</li>
<li>video game console emulation</li>
</ul>
<p>and other things that I'm forgetting right now.</p>
<p>
I have two server machines at home a Dell OptiPlex 780 and a Dell
Latitude E5520. One of them is a laptop and
I have three server machines at home a Dell OptiPlex 780, a Dell
Latitude E5520, and a custom-built PC. One of them is a laptop and
<s>I'm surprised it hasn't burnt up yet </s>
<span class="redphasis">it has burnt up.</span>
</p>
<h3>Custom PC ("hwaboon")</h3>
<ul>
<li><strong>CPU:</strong> AMD Ryzen 7700X (8c/16t)</li>
<li><strong>GPU:</strong> Integrated</li>
<li><strong>RAM:</strong> 2× 16 GB DDR5</li>
<li><strong>Storage:</strong> Crucial P3 1 TB SSD</li>
<li><strong>OS:</strong> Arch Linux</li>
</ul>
<h3>OptiPlex 780 ("asvyn")</h3>
<ul>
<li><strong>CPU:</strong> Intel Core 2 Duo E8400 (2c/2t)</li>
<li><strong>GPU:</strong> AMD ATI Radeon HD 3450</li>
<li><strong>RAM:</strong> 2× 1 GB DDR + 1× 2 GB DDR2</li>
<li><strong>RAM:</strong> 2× 2 GB DDR3</li>
<li><strong>Storage:</strong> Western Digital 150 GB hard drive</li>
<li><strong>OS:</strong> Arch Linux</li>
</ul>

View File

@@ -13,40 +13,44 @@
</p>
<!-- i could make this a list but god i'm so tired with nuxt -->
<div class="flex justify-around flex-wrap gap-8 items-center">
<ServiceCard name="Gitea" href="https://git.eggworld.me" img="gitea.svg">
<ServiceCard
name="Gitea"
href="https://git.eggipelago.com"
img="gitea.svg"
>
Self-hosted GitHub
</ServiceCard>
<ServiceCard
name="Eifueo"
href="https://eifueo.eggworld.me"
href="https://eifueo.eggipelago.com"
img="eifueo.svg"
>
Note collection
</ServiceCard>
<ServiceCard
name="Primoprod"
href="https://primoprod.eggworld.me"
href="https://primoprod.vercel.app"
img="primogem.webp"
>
Wish simulator
</ServiceCard>
<ServiceCard
name="Calibre"
href="https://calibre.eggworld.me"
href="https://calibre.eggipelago.com"
img="calibre-web.webp"
>
Kobo Cloud
</ServiceCard>
<ServiceCard
name="Jellyfin"
href="https://jellyfin.eggworld.me"
href="https://jellyfin.eggipelago.com"
img="jellyfin.svg"
>
FOSS media server
</ServiceCard>
<ServiceCard
name="Minecraft"
href="minecraft.eggworld.me"
href="minecraft.eggipelago.com"
img="minecraft.svg"
unclickable
broken

13
app/data/siteRevisions.ts Normal file
View File

@@ -0,0 +1,13 @@
interface SiteRevision {
title: string;
url: string;
}
export const revisions: SiteRevision[] = [
{
title: "Nuxt 3 (2022)",
url: "https://eggipelago.com",
},
{ title: "Eleventy (2021)", url: "https://2021.eggipelago.com" },
{ title: "Vanilla (2019-2020)", url: "https://2020.eggipelago.com" },
];

View File

@@ -34,7 +34,7 @@ useHead({ title: "Oeufs?" });
GitHub</a
>
and
<a class="underline" href="https://git.eggworld.me/eggy/public">
<a class="underline" href="https://git.eggipelago.com/eggy/public">
Gitea
</a>
</p>

View File

@@ -78,7 +78,6 @@ export interface GithubCommitEventPayload {
ref: string;
head: string;
before: string;
commits: GithubCommit[];
}
export interface GithubPullRequestEventPayload {

View File

@@ -7,7 +7,7 @@ tags:
- featured
---
Welcome to the very first [Primoprod](https://primoprod.eggworld.me) progress report! In a similar vein to quite a few open source emulation projects (such as those I follow myself using [emufeed](https://github.com/potatoeggy/emufeed/blob/master/sources.py)), I'll be releasing these tidbits in lieu of daily Unstagnation shorts sometimes.
Welcome to the very first [Primoprod](https://primoprod.vercel.app) progress report! In a similar vein to quite a few open source emulation projects (such as those I follow myself using [emufeed](https://github.com/potatoeggy/emufeed/blob/master/sources.py)), I'll be releasing these tidbits in lieu of daily Unstagnation shorts sometimes.
In this hopefully small series of development notes, I'll be laying out my experiences learning web development as an absolute amateur.

View File

@@ -1,7 +1,7 @@
---
title: "Stay Anonymous Online With These 4 Browser Extensions"
date: "2022-08-06"
_draft: true
_draft: false
tags:
- tech
- albatross

View File

@@ -1,7 +1,7 @@
---
title: "AV1 — The FOSS Video Codec"
date: 2022-11-13
_draft: true
_draft: false
tags:
- tech
- albatross

View File

@@ -1,7 +1,7 @@
---
title: "Choosing a License — Politics in FOSS"
date: "2022-09-02"
_draft: true
_draft: false
tags:
- tech
- albatross

View File

@@ -1,7 +1,7 @@
---
title: "Git is a Blockchain"
date: "2022-10-02"
_draft: true
_draft: false
tags:
- tech
- albatross

View File

@@ -1,7 +1,7 @@
---
title: "GitHub for Dummies"
date: "2022-06-17"
_draft: true
_draft: false
tags:
- tech
- albatross

View File

@@ -1,10 +1,11 @@
---
title: "Google's Guide to Taking Over the Web"
date: "2022-07-16"
_draft: true
_draft: false
tags:
- tech
- albatross
- featured
---
This article is [also published in *The FOSS Albatross.*](https://medium.com/the-foss-albatross/googles-guide-to-taking-over-the-web-26847a389ac5)
@@ -15,7 +16,7 @@ Do you have a dream? A dream where you call the shots for billions of other peop
## 1. Bribe your competitors.
This first step is the most important. Without getting your name out there, you don't have the influence needed for web domination. Take out a small loan if you have to. We've bought out Mozilla for $450 million and Apple for $15 billion so that we're the default search engine in Firefox and Safari. Why would our users ever bother to change the default — to something like *Bing*, no less — when ours is good enough?
This first step is the most important. Without getting your name out there, you don't have the influence needed for web domination. Take out a small loan if you have to. We've bought out Mozilla for &#36;450 million and Apple for &#36;15 billion so that we're the default search engine in Firefox and Safari. Why would our users ever bother to change the default — to something like *Bing*, no less — when ours is good enough?
You gotta get your customers to associate you with the web, and you know you've got that when your company name is added to the English dictionary. What's the first thing you do whenever you want to look something up? You Google it. And the simplest, easiest, lowest-effort way to do this is by bribing your competitors.

View File

@@ -1,7 +1,7 @@
---
title: "13 Tricks to Write Nicer Python"
date: "2022-08-21"
_draft: true
_draft: false
tags:
- tech
- albatross

View File

@@ -1,7 +1,7 @@
---
title: "Reviving Older Games Through Emulation"
date: "2022-05-22"
_draft: true
_draft: false
tags:
- tech
- albatross

View File

@@ -1,7 +1,7 @@
---
title: "Appreciate Your Browser!"
date: "2022-09-18"
_draft: true
_draft: false
tags:
- tech
- albatross

View File

@@ -1,7 +1,7 @@
---
title: "Rust Changes How You Think And Code"
date: 2022-11-27
_draft: true
_draft: false
tags:
- tech
- rust

View File

@@ -1,7 +1,7 @@
---
title: "What's Wayland? Linux's \"New\" Display Server"
date: 2022-12-11
_draft: true
_draft: false
tags:
- tech
- albatross

View File

@@ -1,7 +1,7 @@
---
title: "Why Use Web Frameworks?"
date: 2022-10-30
_draft: true
_draft: false
tags:
- tech
- albatross

View File

@@ -1,7 +1,7 @@
---
title: "Running Windows Apps on Mac and Linux"
date: "2022-10-16"
_draft: true
_draft: false
tags:
- tech
- albatross

View File

@@ -6,7 +6,7 @@ tags:
- retrospective
---
For three and a half years, the [Eifueo project](https://eifueo.eggworld.me) has dutifully carried out its task of collecting and organising notes in a way that would be quick and easy to review. Although this worked out wonderfully in high school, the method is both inefficient and insufficient for the pace of higher education.
For three and a half years, the [Eifueo project](https://eifueo.eggipelago.com) has dutifully carried out its task of collecting and organising notes in a way that would be quick and easy to review. Although this worked out wonderfully in high school, the method is both inefficient and insufficient for the pace of higher education.
So how can we make it better?
@@ -14,7 +14,7 @@ So how can we make it better?
We can't.
At their core, engineering courses in university are about problem-solving. Instead of blindly memorising rules to be applied once to get you the answer, you blindly memorise rules to be applied *two or more times* to get you the answer.
At their core, engineering courses in university are about problem-solving. Instead of blindly memorising rules to be applied once to get you the answer, you blindly memorise rules to be applied _two or more times_ to get you the answer.
If we have to do that, it's much easier to write plenty of practice problems instead of rewriting plenty of notes.
@@ -26,7 +26,7 @@ Reformatting notes is not an easy endeavour. We have to re-examine our old notes
Me? A writer? Imagine.
This one isn't actually too bad, and doing practice problems instead isn't going to help much, but think of all the other fun things I could be doing instead. I already *have* the notes. If I need them, I'll just look back at them.
This one isn't actually too bad, and doing practice problems instead isn't going to help much, but think of all the other fun things I could be doing instead. I already _have_ the notes. If I need them, I'll just look back at them.
Anyway, by the end of Eifueo's lifespan, most of the content was regurgitated onto the site.
@@ -40,7 +40,7 @@ High school had many courses that were "expression"-focused, and those were the
Unfortunately, the physics courses are antithetical to everything Eifueo stands for. They have a rigid structure that you can't bullshit your way out of but are also flexible enough that you can't simply apply a formula. The best way to get good is simply to do more problems.
You'll have to understand that this greatly saddened me as a person who tries his hardest to do *less* problems. The cost-benefit ratio isn't worth it anymore.
You'll have to understand that this greatly saddened me as a person who tries his hardest to do _less_ problems. The cost-benefit ratio isn't worth it anymore.
## Retrospective
@@ -48,6 +48,4 @@ With a heavy heart, I must bid farewell to one of the first services I ever depl
o7 It has served me well.
![At this rate, I'm going to be an expert in perspective art!](assessment-art.webp)

View File

@@ -0,0 +1,81 @@
---
title: The Dark Side
date: 2022-11-30
tags:
- nanowrimo
- u of t
---
**Content warning: Depictions of public bathrooms & potty humour.**
"They ran out of tofu!"
"What?" Yanfei whirls around in her chair, miserable dumpling forgotten. "But there was such a big tray out earlier!"
"People must have taken it all." Hu Tao shrugs. "That was fast. Maybe they'll have more later." A stomach gurgles, and she chuckles. "I guess I'll have to get something else — wait. That wasn't me."
"Bath…room…" Xingqiu's face is pale as he queasily stands, clutching his stomach. Without another word, he dashes off in the direction of the nearest restroom.
<!-- more -->
"Huh. He always had a sensitive stomach. I guess the fish did him dirty. Wait," Hu Tao pales, "*I* also had the fish…" Another stomach gurgles, and she bolts after Xingqiu.
"The chef must not have properly cooked it," Shinobu says. "Well, I'm pretty sure it's impossible to make rice give you food poisoning, and the fish was the only thing both of them ate."
Yanfei's stomach gurgles and she reflexively looks in the direction Hu Tao and Xingqiu hurried off to. She pales.
Shinobu snaps her fingers. "Oh, right. Also the tofu." She pats Yanfei's shoulder sympathetically. "Maybe you should catch up before it's too late. It'll come rushing out all at once."
------
Shinobu is a liar. It does not come rushing out all at once. Yanfei buries her face in her hands, butt planted firmly on the toilet seat as fluids intermittently fall into the toilet bowl. The yellow kind stopped falling long ago.
"Yanfei," Hu Tao croaks from the stall next to her. "The tofu got you too?" She flushes the toilet, but Yanfei knows that she won't be getting up anytime soon.
Yanfei empties her own bowl. It soon fills up again to accommodate the recent group of refugees from her body. "It's not the tofu," she insists weakly, squeezing her eyes shut. "It's *never* the tofu." Tofu wouldn't cause her physical pain to stand up. Tofu would embrace her and tell her everything's okay, that her stomach isn't the one cramping out and vomiting in the wrong direction, that the mouth on her other end isn't retching gravy and spitting all over the bowl of chocolate soup.
"I thought plants couldn't give you food poisoning!"
*It doesn't stop.* A river is flowing through her body. She imagines all of the microbes going whitewater rafting to exit her system. Only the water is neither white nor water. And the raft has spikes on the outside, as if designed to cause her the most suffering possible. She grits her teeth. "Hu Tao."
"Yeah?"
"Shut up."
"Gotcha."
Yanfei supposes she might be an avatar of sorts. Earth. Water. Air. The three elements lived together in harmony, expelling themselves one by one, until the Fire Nation attacked. Now there is nothing but pain and chaos. She wills it to stop.
Evidently she's still an avatar-in-training, because the elements don't obey her and continue to push past each other in a race to the finish line. Earth makes it first, but Air shoves right past it in a terrific blast of sound as Water tries to catch up.
The bathroom door opens. "Oh, *god* —" someone curses, and the bathroom door closes. She can't blame them.
Yanfei loses track of time. Has it been five minutes? Twenty? An hour? The occasional sound of ripping toilet paper and toilet flushes breaks the monotony of collective discharge. She's ascended to a higher plane, she feels. It's freeing — until her stomach brings her back to reality with a cheerful *mrrgle* as if taunting her.
"Yanfei?" Yanfei doesn't respond. "Do you have more toilet paper?"
There's a second roll inside the compartment, but she's already used up half of her current roll. "Yeah."
"Can you…pass it over?"
Struggling to concentrate in her fevered state, Yanfei manages to unclasp the toilet paper roll holder with some effort. "I…can't. Do you think you can —" she gasps as more of her temporary tenants evict themselves, "— get one from the next stall?" Where do they all come from? There never was this much space in the housing market in the first place.
"I can try." Hu Tao doesn't sound terribly enthused. "It…" she grunts, "it just doesn't stop…" A beat later, the stall door beside Yanfei's bursts open and she sees Hu Tao's shoes shuffle over awkwardly to the opposite stall. Her heart fills with dread when she hears a *drrbl* in the midst of Hu Tao fiddling with the toilet paper mechanism. "No, no, no —"
The stall door beside Yanfei *slams* shut and Hu Tao gasps with relief when she throws herself back in the stall. She can't even spare several seconds, Yanfei despairs. She's going to be trapped here forever. Here, in this dungeon, against a dragon inside of her that constantly feels the urge to breathe fire.
She hangs her head, resigning herself to her fate.
------
Hu Tao supports Yanfei after they wash their hands — thoroughly — and pulls them out of the women's bathroom. As they exit the bathroom together, Xingqiu stumbles out from the opposite door, eyes haunted. "I am never eating here ever again."
"Xingqiu," Hu Tao's eyes well up with tears as she embraces him. "*I understand*. You've been through *so much* alone."

View File

@@ -1,13 +0,0 @@
interface SiteRevision {
title: string;
url: string;
}
export const revisions: SiteRevision[] = [
{
title: "Nuxt 3 (2022)",
url: "https://eggworld.me",
},
{ title: "Eleventy (2021)", url: "https://2021.eggworld.me" },
{ title: "Vanilla (2019-2020)", url: "https://2020.eggworld.me" },
];

View File

@@ -1,8 +1,9 @@
import { defineNuxtConfig } from "nuxt/config";
import svgLoader from "vite-svg-loader";
// https://v3.nuxtjs.org/api/configuration/nuxt.config
export default defineNuxtConfig({
compatibilityDate: "2024-10-16",
compatibilityDate: "2025-10-19",
app: {
head: {
htmlAttrs: {
@@ -23,7 +24,6 @@ export default defineNuxtConfig({
{
defer: true,
src: "/script.js",
hid: "stupidEmergencyScript",
type: "module",
},
],
@@ -45,7 +45,7 @@ export default defineNuxtConfig({
shim: false,
},
site: {
url: process.env.BASE_URL || "https://eggworld.me",
url: process.env.BASE_URL || "https://eggipelago.com",
},
sitemap: {
strictNuxtContentPaths: true,

View File

@@ -1,5 +1,6 @@
{
"private": true,
"type": "module",
"scripts": {
"build": "nuxt build",
"dev": "nuxt dev",
@@ -8,19 +9,19 @@
},
"devDependencies": {
"@nuxt/content": "^2.13.4",
"@nuxtjs/color-mode": "^3.5.1",
"@nuxtjs/sitemap": "^6.1.2",
"@nuxtjs/tailwindcss": "^6.12.1",
"@tailwindcss/typography": "^0.5.15",
"@nuxtjs/color-mode": "^3.5.2",
"@nuxtjs/sitemap": "^7.4.7",
"@nuxtjs/tailwindcss": "^6.14.0",
"@tailwindcss/typography": "^0.5.19",
"@types/node": "^22.7.5",
"dayjs": "^1.11.13",
"nuxt": "3.13.2",
"prettier": "^3.3.3",
"dayjs": "^1.11.18",
"nuxt": "^4.1.3",
"prettier": "^3.6.2",
"reading-time": "^2.0.0-1",
"rehype-katex": "^7.0.1",
"remark-math": "^6.0.0",
"sass": "^1.79.5",
"typescript": "^5.6.3",
"sass": "^1.93.2",
"typescript": "^5.9.3",
"vite-svg-loader": "^5.1.0"
}
}

View File

@@ -1,3 +1,3 @@
Sitemap: https://eggworld.me/sitemap.xml
Sitemap: https://eggipelago.com/sitemap.xml
User-agent: *
Disallow:

View File

@@ -23,13 +23,13 @@ if (darkToggle) {
const FEED_URL = "https://api.github.com/users/potatoeggy/events";
const results = (await (await fetch(FEED_URL)).json());
const latestEvent = results.find((e) => e.type === "PushEvent");
const latestCommit = latestEvent.payload.commits[0];
const latestCommit = latestEvent.payload.head;
const commitImg = document.getElementById("github-commit-img");
const commitAnchor = document.getElementById("github-commit-a");
if (commitImg) {
commitImg.src = `https://opengraph.githubassets.com/hash/${latestEvent.repo.name}/commit/${latestCommit.sha}`;
commitImg.src = `https://opengraph.githubassets.com/hash/${latestEvent.repo.name}/commit/${latestCommitSha}`;
}
if (commitAnchor) {
commitAnchor.href = `https://github.com/${latestEvent.repo.name}/commit/${latestCommit.sha}`;
commitAnchor.href = `https://github.com/${latestEvent.repo.name}/commit/${latestCommitSha}`;
}
export {};

View File

@@ -2,7 +2,7 @@
// of all the nuxt bs while we wait for static generation
// to actually become a thing in nuxt 3
import type { GithubPushEvent } from "../shared/github";
import type { GithubPushEvent } from "../app/shared/github";
const html = document.getElementsByTagName("html")[0];
html.className = localStorage.theme ?? "light";
@@ -36,7 +36,7 @@ const results = (await (await fetch(FEED_URL)).json()) as GithubPushEvent[];
const latestEvent = results.find(
(e) => e.type === "PushEvent"
) as GithubPushEvent;
const latestCommit = latestEvent.payload.commits[0];
const latestCommitSha = latestEvent.payload.head;
const commitImg = document.getElementById(
"github-commit-img"
@@ -46,11 +46,11 @@ const commitAnchor = document.getElementById(
) as HTMLAnchorElement;
if (commitImg) {
commitImg.src = `https://opengraph.githubassets.com/hash/${latestEvent.repo.name}/commit/${latestCommit.sha}`;
commitImg.src = `https://opengraph.githubassets.com/hash/${latestEvent.repo.name}/commit/${latestCommitSha}`;
}
if (commitAnchor) {
commitAnchor.href = `https://github.com/${latestEvent.repo.name}/commit/${latestCommit.sha}`;
commitAnchor.href = `https://github.com/${latestEvent.repo.name}/commit/${latestCommitSha}`;
}
// to make this an esm module for top-level await

View File

@@ -18,6 +18,6 @@
"noImplicitAny": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"alwaysStrict": true
"alwaysStrict": true,
}
}

6965
yarn.lock

File diff suppressed because it is too large Load Diff