diff --git a/content/bases.tsx b/content/bases.tsx
index 0a70bf2..26ac39c 100644
--- a/content/bases.tsx
+++ b/content/bases.tsx
@@ -18,6 +18,7 @@ export function BasePage(props: BaseProps) {
Updates
Words
Projects
+ Links
{props.children}
diff --git a/content/links.jsonc b/content/links.jsonc
new file mode 100644
index 0000000..a442264
--- /dev/null
+++ b/content/links.jsonc
@@ -0,0 +1,277 @@
+{
+ "links": [
+ {
+ "title": "Type",
+ "url": "https://exple.tive.org/blarg/2024/11/12/type/",
+ "description": "A scathing critique of The Elements of Typographic Style",
+ "tags": ["review", "typography"],
+ "read": "2025-01-05",
+ },
+ {
+ "title": "A Webring List",
+ "tags": ["webrings", "collections"],
+ "description": "A comprehensive collection of Webrings collected by Ray Thomas",
+ "url": "https://brisray.com/web/webring-list.htm",
+ "author": "Ray Thomas",
+ },
+ {
+ "title": "Webring History",
+ "tags": ["webrings", "history"],
+ "description": "A brief history of Webrings",
+ "url": "https://brisray.com/web/webring-history.htm",
+ "author": "Ray Thomas",
+ },
+ {
+ "title": "The Only Way to Beat Algorithms is to Retrain Your Audience",
+ "url": "https://kiriska.com/blog/2019/the-only-way-to-beat-algorithms-is-to-retrain-your-audience/",
+ "tags": ["articles", "distributed web"],
+ "read": "2025-01-06",
+ "author": "Kiri",
+ },
+ {
+ "title": "Power shifts in a multiple system",
+ "url": "https://sarahkreece.com/2013/12/23/power-shifts-in-a-multiple-system/",
+ "tags": ["articles", "multiplicity"],
+ "read": "2025-01-06",
+ "author": "Sarah K Reece",
+ },
+ {
+ "title": "What’s Wrong With … Exceptions",
+ "url": "https://blog.pdark.de/2007/06/29/whats-wrong-with-exceptions/",
+ "tags": ["articles", "programming", "exceptions"],
+ "read": "2025-01-06",
+ "author": "Philmann Dark",
+ },
+ {
+ "title": "Never Rewrite From Scratch",
+ "url": "https://blog.pdark.de/2024/04/24/never-rewrite-from-scratch/",
+ "tags": ["articles", "programming", "refactoring"],
+ "read": "2025-01-06",
+ "author": "Philmann Dark",
+ },
+ {
+ "title": "A Dragon's Tale",
+ "url": "https://www.philmann-dark.de/dragon.html",
+ "tags": ["short story", "dragons"],
+ "read": "2025-01-05",
+ "author": "Philmann Dark",
+ },
+ {
+ "title": "How I Learned to Stop Worrying and Love GC",
+ "url": "https://world-playground-deceit.net/blog/2024/11/how-i-learned-to-stop-worrying-and-love-gc.html",
+ "tags": ["articles", "programming", "garbage collection"],
+ "read": "2025-01-06",
+ },
+ {
+ "title": "Memory Management Reference",
+ "url": "https://www.memorymanagement.org/",
+ "tags": ["links", "programming", "memory management"],
+ },
+ {
+ "title": "In-group and out-group",
+ "url": "https://en.wikipedia.org/wiki/In-group_and_out-group",
+ "description": "Psychological phenomena describing people's strong bias towards their group and against people outside it.",
+ "tags": ["articles", "psychology", "moderation"],
+ "read": "2025-01-09",
+ },
+ {
+ "title": "User Expertise Stagnates at Low Levels",
+ "url": "https://www.nngroup.com/articles/stagnating-expertise/",
+ "tags": ["design", "ux"],
+ "read": "2025-01-10",
+ "author": "Jakob Nielsen",
+ },
+ {
+ "title": "The New Internet",
+ "url": "https://tailscale.com/blog/new-internet",
+ "tags": ["articles", "tailscale", "connectivity"],
+ "read": "2025-01-10",
+ "author": "Avery Pennarun",
+ },
+ {
+ "title": "The Free Web",
+ "url": "https://thehistoryoftheweb.com/the-free-web/",
+ "tags": ["articles", "internet", "culture"],
+ "read": "2025-01-10",
+ "author": "Jay Hoffmann",
+ },
+ {
+ "title": "Bad Shape",
+ "url": "https://www.wrecka.ge/bad-shape/",
+ "tags": ["articles", "big social media", "moderation"],
+ "read": "2025-01-10",
+ "author": "Erin Kissane",
+ },
+ {
+ "title": "An Abridged History of Safari Showstoppers",
+ "url": "https://webventures.rejh.nl/blog/2024/history-of-safari-show-stoppers/",
+ "tags": ["articles", "webdev", "safari"],
+ },
+ {
+ "title": "The Really Dark Truth About Bots",
+ "url": "https://www.youtube.com/watch?v=GZ5XN_mJE8Y",
+ "tags": ["video", "social media bots", "political discourse", "disinformation"],
+ "description": "A dive into the troll farms and systematic disinformation campaigns targeting political discourse.",
+ "read": "2025-01-12",
+ },
+ {
+ "title": "From Gongkai to Open Source",
+ "url": "https://www.bunniestudios.com/blog/2014/from-gongkai-to-open-source/",
+ "tags": ["article", "hardware", "chinese culture", "reverse engineering"],
+ "description": "Writeup on the reverse engineering efforts that went into making Fernvalue, an open source development platform for the Mediatek MT6260",
+ "read": "2025-01-12",
+ },
+ {
+ "title": "On \"Safe\" C++",
+ "url": "https://izzys.casa/2024/11/on-safe-cxx/",
+ "tags": ["article", "programming", "c++", "programming community"],
+ "description": "Unhinged rant on the C++ committee and community at large.",
+ "read": "2025-01-19",
+ "author": "Izzy Muerte",
+ },
+ {
+ "title": "The seven programming ur-languages",
+ "url": "https://madhadron.com/programming/seven_ur_languages.html",
+ "tags": ["article", "programming", "learning programming", "language design"],
+ "description": "A description of 7 root languages in programming that inspired most of the structure in all programming languages",
+ "read": "2025-01-20",
+ "author": "madhadron",
+ },
+ {
+ "title": "Our conventions are not inevitable",
+ "url": "https://madhadron.com/programming/conventions.html",
+ "tags": ["article", "programming", "conventions"],
+ "description": "Thoughts on programming conventions being largely inertia rather than fundamental.",
+ "read": "2025-01-20",
+ "author": "madhadron",
+ },
+ {
+ "title": "Proof of Thought",
+ "url": "https://erik.wiffin.com/posts/proof-of-thought/",
+ "tags": ["article", "organisations", "reporting"],
+ "description": "An interesting take on reports not meant to be read by anyone still being useful.",
+ "read": "2025-01-20",
+ "author": "Erik Wiffin",
+ },
+ {
+ "title": "On short URLs",
+ "url": "https://qntm.org/urls",
+ "tags": ["article", "websites", "short urls"],
+ "description": "qntm's reasoning for why use short URLs.",
+ "read": "2025-01-20",
+ "author": "qntm",
+ },
+ {
+ "title": "Short URLs: why and how",
+ "url": "https://sive.rs/su",
+ "tags": ["article", "websites", "short urls"],
+ "description": "Derek Sivers' reasoning for why use short URLs.",
+ "read": "2025-01-20",
+ "author": "Derke Sivers",
+ },
+ {
+ "title": "The Tyranny of the Marginal User",
+ "url": "https://nothinghuman.substack.com/p/the-tyranny-of-the-marginal-user",
+ "tags": ["article", "online services", "enshittification", "online dating"],
+ "description": "How focusing on the marginal user caused OKCupid to go downhill",
+ "read": "2025-01-21",
+ "author": "Ivan Vendrov",
+ },
+ {
+ "title": "The Website Obesity Crisis",
+ "url": "https://idlewords.com/talks/website_obesity.htm",
+ "tags": ["article", "webdev", "bloat"],
+ "description": "Observations on bloat of websites and the future of the web.",
+ "read": "2025-01-23",
+ "author": "Maciej Cegłowski",
+ },
+ {
+ "title": "The Small Website Discoverability Crisis",
+ "url": "https://www.marginalia.nu/log/19-website-discoverability-crisis/",
+ "tags": ["article", "small web", "discoverability", "bookmarks", "links"],
+ "description": "Victor argues a solution to the small web discoverability problem lies in sharing bookmarks.",
+ "read": "2025-01-24",
+ "author": "Viktor Lofgren",
+ },
+ {
+ "title": "Fan is A Tool-Using Animal",
+ "url": "https://idlewords.com/talks/fan_is_a_tool_using_animal.htm",
+ "tags": ["article", "fandom", "collaboration"],
+ "description": "Talk about spontaneous collaboration and culture in the fandom.",
+ "read": "2025-01-24",
+ "author": "Maciej Cegłowski",
+ },
+ {
+ "title": "Every site needs a Links Page / Why linking matters",
+ "url": "https://thoughts.melonking.net/thoughts/every-site-needs-a-links-page-why-linking-matters",
+ "tags": ["article", "small web", "links"],
+ "description": "Why websites should link to other websites.",
+ "read": "2025-01-24",
+ "author": "Melon",
+ },
+ {
+ "title": "",
+ "url": "",
+ "tags": ["article", "", ""],
+ "description": "",
+ "read": "",
+ "author": "",
+ },
+ ],
+ "to_read": [
+ "https://bitbashing.io/gc-for-systems-programmers.html",
+ ],
+ "authors": {
+ "Ray Thomas": {
+ "urls": ["https://brisray.com/"],
+ },
+ "Kiri": {
+ "urls": ["https://kiriska.com/"],
+ },
+ "Sarah K Reece": {
+ "urls": ["https://sarahkreece.com/"],
+ },
+ "Philmann Dark": {
+ "urls": ["https://blog.pdark.de/about/"],
+ },
+ "Jakob Nielsen": {
+ "urls": ["https://www.nngroup.com/articles/author/jakob-nielsen/"],
+ },
+ "Jay Hoffmann": {
+ "urls": ["https://x.com/jay_hoffmann"],
+ },
+ "Erin Kissane": {
+ "urls": ["https://www.wrecka.ge/author/erin/"],
+ },
+ "Izzy Muerte": {
+ "urls": ["https://izzy.casa/"],
+ },
+ "madhadron": {
+ "urls": ["https://madhadron.com/"],
+ },
+ "Erik Wiffin": {
+ "urls": ["https://erik.wiffin.com/"],
+ },
+ "qntm": {
+ "urls": ["https://qntm.org/"],
+ },
+ "Derke Sivers": {
+ "urls": ["https://sive.rs/"],
+ },
+ "Ivan Vendrov": {
+ "urls": ["https://substack.com/@ivanvendrov"],
+ },
+ "Maciej Cegłowski": {
+ "urls": ["https://idlewords.com/"],
+ },
+ "Viktor Lofgren": {
+ "urls": ["https://www.marginalia.nu/"],
+ },
+ "Melon": {
+ "urls": ["https://melonland.net/", "https://melonking.net/"],
+ },
+ "": {
+ "urls": [""],
+ },
+ }
+}
diff --git a/content/links.tsx b/content/links.tsx
new file mode 100644
index 0000000..db5e53d
--- /dev/null
+++ b/content/links.tsx
@@ -0,0 +1,42 @@
+import { readFileSync } from "node:fs";
+import { BasePage } from "./bases.js";
+import type { Page } from "./types.js";
+
+interface LinkData {
+ title: string,
+ url: string,
+ tags: string[],
+ description?: string,
+ read?: string,
+ author?: string,
+}
+interface Data {
+ links: LinkData[];
+ to_read: string[],
+ authors: Record;
+}
+function Link(props: { link: LinkData }) {
+ const link = props.link;
+ return <>
+ {link.title}
+ {" "}
+ {link.tags.join(", ")}
+ >
+}
+const data: Data = eval(`(${readFileSync("content/links.jsonc", "utf8")})`);
+data.links.pop(); // Remove template at the end
+const title = "Links!";
+export const links: Page = {
+ title,
+ ref: "/links.html",
+ content:
+
+ {title}
+
+ { data.links.map(link => )}
+
+
+
+}
diff --git a/content/pages.tsx b/content/pages.tsx
index 53b0b83..15a1d80 100644
--- a/content/pages.tsx
+++ b/content/pages.tsx
@@ -3,6 +3,7 @@ import { index } from "./index.js";
import { updates, updatesIndex } from "./updates.js";
import { words, wordsIndex } from "./words.js";
import { projects, projectsIndex } from "./projects.js";
+import { links } from "./links.js";
export const pages: Page[] = [
index,
@@ -12,4 +13,5 @@ export const pages: Page[] = [
...words,
projectsIndex,
...projects,
+ links,
];