diff --git a/.cache/eleventy-fetch-c0a85dcc594cc0b9fa9c7be065ad5e b/.cache/eleventy-fetch-c0a85dcc594cc0b9fa9c7be065ad5e new file mode 100644 index 0000000..8d33666 --- /dev/null +++ b/.cache/eleventy-fetch-c0a85dcc594cc0b9fa9c7be065ad5e @@ -0,0 +1 @@ +{"cachedAt":1751050127345,"type":"text","metadata":{"response":{"url":"https://links.apps.seigler.net/feed/atom?&searchtags=%24webroll","status":200,"headers":{"cache-control":"no-store, no-cache, must-revalidate, post-check=0, pre-check=0","connection":"keep-alive","content-length":"8674","content-security-policy":"upgrade-insecure-requests","content-type":"application/atom+xml; charset=utf-8","date":"Fri, 27 Jun 2025 18:48:47 GMT","expires":"Thu, 19 Nov 1981 08:52:00 GMT","last-modified":"Fri, 27 Jun 2025 18:48:47 GMT","permissions-policy":"interest-cohort=()","pragma":"no-cache","server":"nginx","set-cookie":"shaarli=b2oq0nmgum43e298gdeb06g661; domain=links.apps.seigler.net","strict-transport-security":"max-age=63072000; includeSubDomains; preload","x-content-type-options":"nosniff","x-download-options":"noopen","x-frame-options":"SAMEORIGIN","x-permitted-cross-domain-policies":"none","x-sso-wat":"You've just been SSOed","x-xss-protection":"1; mode=block"}}}} \ No newline at end of file diff --git a/.cache/eleventy-fetch-c0a85dcc594cc0b9fa9c7be065ad5e.text b/.cache/eleventy-fetch-c0a85dcc594cc0b9fa9c7be065ad5e.text new file mode 100644 index 0000000..bef3340 --- /dev/null +++ b/.cache/eleventy-fetch-c0a85dcc594cc0b9fa9c7be065ad5e.text @@ -0,0 +1,183 @@ + + + Shaarli + Shaared links + + 2025-06-27T14:41:37-04:00 + + + + + + Shaarli + https://links.apps.seigler.net/ + + https://links.apps.seigler.net/ + Shaarli + + + Comic Helvetic Font | dafont.com + + + + https://links.apps.seigler.net/shaare/WUenqw + + 2025-06-26T10:29:51-04:00 + 2025-06-27T14:41:37-04:00 + +

I don't understand why this feels ok but Comic Sans makes my skin crawl.

+ +
Permalink]]>
+ + + + + + + + + + + + +
+ + + NIKA:\git-revise\> + + + + https://links.apps.seigler.net/shaare/-cyjHA + + 2025-06-18T12:18:36-04:00 + 2025-06-27T13:10:02-04:00 + +

git-revise is a history editing tool designed for the patch-stack workflow. It's fast, non-destructive, and aims to provide a familiar, powerful, and easy to use re-imagining of the patch stack workflow.

+ +
Permalink]]>
+ + + + + + + + + + + + +
+ + + Markdown Code Blocks With a Title / Filename - Lusitos Tech Blog + + + + https://links.apps.seigler.net/shaare/iRIOLg + + 2025-06-14T22:28:23-04:00 + 2025-06-27T13:10:02-04:00 + +

Smart alternative to immediately using some kind of markdown extension or plugin. Good perspective.

+ +
Permalink]]>
+ + + + + + + + + + + + +
+ + + MidWord! The world's favorite word guessing game + + + + https://links.apps.seigler.net/shaare/fS7Wtg + + 2025-06-14T04:28:49+00:00 + 2025-06-27T13:10:02-04:00 + +

Just found my new favorite long-car-ride verbal game!

+ +
Permalink]]>
+ + + + + + + + + + + + +
+ + + Verissimo Monthly - May 2025 - by Binyamin Grobman + + + + https://links.apps.seigler.net/shaare/NWhCQg + + 2025-06-03T17:39:50+00:00 + 2025-06-27T13:10:02-04:00 + +

The Unreliability of LLMs & What Lies Ahead

+ +
Permalink]]>
+ + + + + + + + + + + + +
+ + + Keeping up appearances | deadSimpleTech + + + + https://links.apps.seigler.net/shaare/3e_KhA + + 2025-05-31T04:02:35+00:00 + 2025-06-27T13:10:02-04:00 + +

The only reason that LLMs took root in the first place was because our societies in the anglosphere have already developed cultures solely devoted to gaining status and keeping up the appearance of doing things rather than actually doing them. All other values, increasingly including even the accumulation of wealth (while this is still very much a thing that people pursue, wealth is increasingly becoming a proxy for status more than something desired in itself) are becoming subordinated to symbolic status games completely detached from anything real.

+ +
Permalink]]>
+ + + + + + + + + + + + + + +
+ +
diff --git a/configHelpers/collectionFromAtomFeed.ts b/configHelpers/collectionFromAtomFeed.ts new file mode 100644 index 0000000..3bb2a9a --- /dev/null +++ b/configHelpers/collectionFromAtomFeed.ts @@ -0,0 +1,20 @@ +import fetch from "@11ty/eleventy-fetch"; +import { XMLValidator, XMLParser } from "fast-xml-parser"; + +const webrollSource = "https://links.apps.seigler.net/feed/atom?&searchtags=%24webroll" +const webrollText = await fetch(webrollSource, { duration: "0s", type: "text" }); +const webrollValid = XMLValidator.validate(webrollText); +let webrollFeed; +if (webrollValid === true) { + webrollFeed = new XMLParser({ + ignoreAttributes: false, + }).parse(webrollText).feed.entry; +} else { + throw new Error(`Invalid XML from webroll feed. Reason: ${webrollValid.err.msg}`); +} +console.log(webrollFeed); +const webrollPosts = webrollFeed.map(bookmark => { + return { + date: new Date(bookmark.published), + } +}); diff --git a/eleventy.config.js b/eleventy.config.js index 67f34a3..adbdb2f 100644 --- a/eleventy.config.js +++ b/eleventy.config.js @@ -15,10 +15,12 @@ import { feedPlugin } from "@11ty/eleventy-plugin-rss"; import { execSync } from "child_process"; import eleventyAutoCacheBuster from "eleventy-auto-cache-buster"; import mdPrism from "markdown-it-prism"; +import fetch from "@11ty/eleventy-fetch"; +import { XMLValidator, XMLParser } from "fast-xml-parser"; dayjs.extend(utc); -export default (config) => { +export default async (config) => { const slugify = config.getFilter("slugify"); const url = config.getFilter("url"); const mdLib = md({ @@ -112,6 +114,8 @@ export default (config) => { ); }); + config.addCollection("webroll", fetchShaarliWebroll); + config.addTransform("prettier", (content, outputPath) => { if (typeof outputPath !== "string") { return content; @@ -184,3 +188,29 @@ export default (config) => { }, }; }; + +async function fetchShaarliWebroll() { + const url = "https://links.apps.seigler.net/feed/atom?&searchtags=%24webroll"; + const urlTextContent = await fetch(url, { duration: "30s", type: "text" }); + const validation = XMLValidator.validate(urlTextContent); + let feedContent; + if (validation === true) { + feedContent = new XMLParser({ + ignoreAttributes: false, + }).parse(urlTextContent).feed.entry; + } else { + throw new Error(`Invalid XML from webroll feed. Reason: ${validation.err.msg}`); + } + const entries = feedContent.map(entry => { + return { + url: entry.link['@_href'], + data: { + title: entry.title, + date: new Date(entry.published), + description: entry.content['#text'].split('\n
=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, "node_modules/@11ty/eleventy-plugin-bundle": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-bundle/-/eleventy-plugin-bundle-3.0.6.tgz", @@ -644,6 +667,15 @@ "node": ">=14" } }, + "node_modules/@rgrove/parse-xml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rgrove/parse-xml/-/parse-xml-4.2.0.tgz", + "integrity": "sha512-UuBOt7BOsKVOkFXRe4Ypd/lADuNIfqJXv8GvHqtXaTYXPPKkj2nS2zPllVsrtRjcomDhIJVBnZwfmlI222WH8g==", + "license": "ISC", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@sindresorhus/slugify": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", @@ -697,6 +729,15 @@ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "license": "MIT" }, + "node_modules/@types/node": { + "version": "24.0.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.5.tgz", + "integrity": "sha512-CXEG9E7GCTOZIre0WdDznmnhvF7xi7AmnP/zF496trmLiqlfdtxp9nPRgLVqfmJ8jgtcKcs0EcvOu2yDZSuvTg==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.8.0" + } + }, "node_modules/a-sync-waterfall": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", @@ -1491,6 +1532,12 @@ "node": ">= 8" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -1520,6 +1567,24 @@ "node": ">=8.6.0" } }, + "node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -1644,6 +1709,12 @@ "node": ">=8" } }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC" + }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -2585,6 +2656,15 @@ "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==", "license": "MIT" }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -2614,6 +2694,34 @@ "node": ">=8" } }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -3278,6 +3386,18 @@ "node": ">=0.8.0" } }, + "node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", @@ -3379,6 +3499,12 @@ "node": ">=20.18.1" } }, + "node_modules/undici-types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "license": "MIT" + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", diff --git a/package.json b/package.json index 6f36b32..c67faf6 100644 --- a/package.json +++ b/package.json @@ -14,13 +14,16 @@ "license": "ISC", "dependencies": { "@11ty/eleventy": "^3.1.0", + "@11ty/eleventy-fetch": "^5.1.0", "@11ty/eleventy-plugin-rss": "^2.0.4", "@mdit/plugin-footnote": "^0.22.0", "@mdit/plugin-spoiler": "^0.21.0", + "@types/node": "^24.0.5", "dayjs": "^1.11.11", "eleventy-auto-cache-buster": "^0.8.1", "eleventy-plugin-clean": "^2.0.1", "eleventy-plugin-toc": "^1.1.5", + "fast-xml-parser": "^5.2.5", "markdown-it-anchor": "^9.0.1", "markdown-it-link-attributes": "^4.0.1", "markdown-it-prism": "^3.0.0", diff --git a/site/_includes/-header.njk b/site/_includes/-header.njk index a2fc169..fb1b03e 100644 --- a/site/_includes/-header.njk +++ b/site/_includes/-header.njk @@ -12,6 +12,7 @@ /recipes /music /books + /links /search diff --git a/site/pages/links.njk b/site/pages/links.njk new file mode 100644 index 0000000..03caa7b --- /dev/null +++ b/site/pages/links.njk @@ -0,0 +1,22 @@ +--- +layout: "base.njk" +title: "Links" +permalink: /links/ +useTitle: true +--- +
+
+ +
+
diff --git a/types.d.ts b/types.d.ts new file mode 100644 index 0000000..5c4b81b --- /dev/null +++ b/types.d.ts @@ -0,0 +1,31 @@ +declare module "@11ty/eleventy-fetch" { + + type FetchType = + | "json" + | "buffer" + | "text"; + + type EleventyFetchOptionsBase = { + type: TType; + directory?: string; + concurrency?: number; + fetchOptions?: RequestInit; + dryRun?: boolean; + removeUrlQueryParams?: boolean; + verbose?: boolean; + hashLength?: number; + duration?: string; + formatUrlForDisplay?: (url: string) => string; + } + + type EleventyFetch = (url: string, options: EleventyFetchOptionsBase) => + Promise< + TType extends "json" ? TReturn : + TType extends "buffer" ? Buffer : + TType extends "text" ? string : + never + >; + + const fetch: EleventyFetch; + export default fetch; +}