Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
3ee1268
Audit Fix
aarongustafson Dec 18, 2025
afc02d2
Remove 404 checker and dependencies
aarongustafson Dec 18, 2025
4cebce8
Remove netlify lambda
aarongustafson Dec 18, 2025
9f8a594
Move minification to Netlify
aarongustafson Dec 20, 2025
8b4cd6b
Format
aarongustafson Dec 20, 2025
6cce849
install
aarongustafson Dec 20, 2025
c012675
uninstall ansi2html (unused)
aarongustafson Dec 20, 2025
68c9c0d
Removing webmentions plugin as I installed through Netlify UI
aarongustafson Dec 20, 2025
cfebacc
Removing unused CSS
aarongustafson Dec 20, 2025
b0b4d54
Removing missing link
aarongustafson Dec 20, 2025
0fb78ed
Escape code block causing issues
aarongustafson Dec 20, 2025
6eefbf0
Escape square brackets too
aarongustafson Dec 20, 2025
bd58f0f
Handle missing hero files
aarongustafson Dec 20, 2025
c951b69
JS fix
aarongustafson Dec 20, 2025
be66bd6
Fx tank links
aarongustafson Dec 20, 2025
b4fe135
Remove fragment links from excerpts
aarongustafson Dec 20, 2025
c606238
Format
aarongustafson Dec 20, 2025
2c89fbc
Update netlify CLI
aarongustafson Dec 20, 2025
48dfc80
Removed webmentions plugin as it gets installed on Netlify’s side
aarongustafson Dec 20, 2025
795205f
NPM install
aarongustafson Dec 20, 2025
9efd73e
Optimized images
aarongustafson Dec 20, 2025
93b2c5b
Add files to ignore
aarongustafson Dec 20, 2025
72caa64
Formatting
aarongustafson Dec 20, 2025
403a015
Change to NJK from HTML to ensure Prettier formatting is better
aarongustafson Dec 20, 2025
0da2eb4
Change to NJK from HTML to ensure Prettier formatting is better
aarongustafson Dec 20, 2025
7a8f6cc
Format changes
aarongustafson Dec 20, 2025
68e62d3
Downgrade headings inbound from
aarongustafson Dec 20, 2025
bd4530b
Fix broken avatars
aarongustafson Dec 20, 2025
5e9f709
Demote headings in dynamic webmentions too
aarongustafson Dec 20, 2025
2c43baa
_ unused var
aarongustafson Dec 20, 2025
de564d7
Add console logs, setup minification
aarongustafson Dec 21, 2025
ed02a2f
Updating speaking engagements
aarongustafson Dec 21, 2025
2257c1f
Remove HTML minification from gulp
aarongustafson Dec 21, 2025
a70dafc
Remove netlify tooling
aarongustafson Dec 21, 2025
6488733
Remove cheerio — its a workflow dependency not a project dependency
aarongustafson Dec 22, 2025
22a8955
Removing other workflow dependencies
aarongustafson Dec 22, 2025
3683b50
Removing faunadb
aarongustafson Dec 22, 2025
a4c7b95
Updated install
aarongustafson Dec 22, 2025
20ae6a3
Remove unused dependencies
aarongustafson Dec 22, 2025
7785326
Clean up overrides
aarongustafson Dec 22, 2025
5d5978b
Fixing issues with ansi-regex
aarongustafson Dec 22, 2025
c259464
Upgrade octokit
aarongustafson Dec 22, 2025
fd3d998
Replace the deploy plugin for mine (upgraded)
aarongustafson Dec 22, 2025
c73b6ca
Upgrade Gulp stack
aarongustafson Dec 23, 2025
814bd79
Updated task to ignore audio & video files
aarongustafson Dec 23, 2025
6161147
Format
aarongustafson Dec 23, 2025
a725680
Updated styles.js so Sass is loaded with a namespace import
aarongustafson Dec 23, 2025
a49e7b8
Remove the gulp-pretty-data dependency
aarongustafson Dec 23, 2025
dbac3e2
Remove checklinks plugin
aarongustafson Dec 23, 2025
ab476f3
Added the missing siteName, deployPrimeUrl, and commit inputs to synd…
aarongustafson Dec 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 1 addition & 3 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
"name": "Node.js",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/javascript-node:1-22-bookworm",
"features": {
"ghcr.io/devcontainers-extra/features/netlify-cli:1": {}
}
"features": {}

// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},
Expand Down
95 changes: 40 additions & 55 deletions .eleventy.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { EleventyHtmlBasePlugin } from "@11ty/eleventy";
import pluginRss from "@11ty/eleventy-plugin-rss";
import syntaxHighlight from "@11ty/eleventy-plugin-syntaxhighlight";
import embedCodePen from "@manustays/eleventy-plugin-codepen-iframe";
import eleventyPluginFilesMinifier from "@sherby/eleventy-plugin-files-minifier";
import embedEverything from "eleventy-plugin-embed-everything";
import imagesResponsiver from "eleventy-plugin-images-responsiver";
import readingTime from "eleventy-plugin-reading-time";
Expand All @@ -28,15 +27,15 @@ import fs from "fs";

import { readFile } from "fs/promises";
const seo_conf = JSON.parse(
await readFile(new URL("./src/_data/seo.json", import.meta.url))
await readFile(new URL("./src/_data/seo.json", import.meta.url)),
);

import dotenv from "dotenv";
dotenv.config();
const PRODUCTION = process.env.NODE_ENV === "production";

const EVENTS = JSON.parse(
fs.readFileSync("./src/_data/speaking_engagements.json")
fs.readFileSync("./src/_data/speaking_engagements.json"),
);
function getEventDate(id) {
return EVENTS.filter((event) => event.id.toString() === id.toString())[0]
Expand Down Expand Up @@ -64,7 +63,7 @@ export default async (config) => {
'<ol class="footnotes-list">\n';
md.renderer.rules.footnote_caption = (
tokens,
idx /*, options, env, slf*/
idx /*, options, env, slf*/,
) => {
var n = Number(tokens[idx].meta.id + 1).toString();

Expand All @@ -77,26 +76,31 @@ export default async (config) => {
config.setLibrary("md", md);

// Layout aliases
config.addLayoutAlias("base", "layouts/base.html");
config.addLayoutAlias("blog", "layouts/blog.html");
config.addLayoutAlias("home", "layouts/home.html");
config.addLayoutAlias("link", "layouts/link.html");
config.addLayoutAlias("page", "layouts/page.html");
config.addLayoutAlias("post", "layouts/post.html");
config.addLayoutAlias("tag", "layouts/tag.html");
config.addLayoutAlias("talk", "layouts/talk.html");
config.addLayoutAlias("tank", "layouts/tank.html");
config.addLayoutAlias("base", "layouts/base.njk");
config.addLayoutAlias("blog", "layouts/blog.njk");
config.addLayoutAlias("home", "layouts/home.njk");
config.addLayoutAlias("link", "layouts/link.njk");
config.addLayoutAlias("page", "layouts/page.njk");
config.addLayoutAlias("post", "layouts/post.njk");
config.addLayoutAlias("tag", "layouts/tag.njk");
config.addLayoutAlias("talk", "layouts/talk.njk");
config.addLayoutAlias("tank", "layouts/tank.njk");

// Passthru
config.addPassthroughCopy({ "src/static": "/" });

// Plugins
config.addPlugin(pluginSEO, seo_conf);
// Load SVG plugin always (since templates depend on it) but optimize for production
config.addPlugin(svgContents, PRODUCTION ? {
// Cache SVG processing to improve performance in production
cache: true
} : {});
config.addPlugin(
svgContents,
PRODUCTION
? {
// Cache SVG processing to improve performance in production
cache: true,
}
: {},
);
config.addPlugin(EleventyHtmlBasePlugin, {
baseHref: PRODUCTION ? "https://www.aaron-gustafson.com" : "",
});
Expand Down Expand Up @@ -134,8 +138,8 @@ export default async (config) => {
resizedImageUrl: (src) => {
return PRODUCTION
? `https://res.cloudinary.com/aarongustafson/image/fetch/q_100,f_auto,w_100,h_100,c_fill/${encodeURIComponent(
src
)}`
src,
)}`
: src.replace(config.hostname, "");
},
attributes: {
Expand Down Expand Up @@ -170,31 +174,11 @@ export default async (config) => {
});
// Remove duplicate syntax highlight plugin
// config.addPlugin(syntaxHighlight); // This was duplicated
// Only minify files in production and with better performance settings
if (PRODUCTION) {
config.addPlugin(eleventyPluginFilesMinifier, {
// Optimize minification settings for better performance
throttle: true,
concurrency: 2, // Reduce concurrency to prevent memory spikes
preserveSymlinks: false,
// Only minify critical files
html: {
minifyCSS: false, // CSS is already minified by Gulp
minifyJS: false, // JS is already minified by Gulp
removeComments: true,
collapseWhitespace: true,
removeRedundantAttributes: true,
removeEmptyAttributes: true,
caseSensitive: true,
keepClosingSlash: true
}
});
}

// Filters
config.addFilter(
"getNewestCollectionItemDate",
pluginRss.getNewestCollectionItemDate
pluginRss.getNewestCollectionItemDate,
);
config.addFilter("absoluteUrl", pluginRss.absoluteUrl);
//config.addFilter("htmlToAbsoluteUrls", pluginRss.htmlToAbsoluteUrls);
Expand All @@ -209,7 +193,7 @@ export default async (config) => {
// Collections
// Optimize: Use a shared sorting function and reuse results where possible
const sortByDateDesc = (a, b) => b.date - a.date;

config.addCollection("posts", (collectionApi) => {
return collectionApi.getFilteredByGlob("**/posts/*.md").reverse();
});
Expand All @@ -222,7 +206,7 @@ export default async (config) => {
.getFilteredByGlob(["**/posts/*.md", "**/links/*.md"])
.sort(sortByDateDesc);
});

config.addCollection("talks", (collectionApi) => {
return collectionApi
.getFilteredByGlob("**/talks/*.md")
Expand Down Expand Up @@ -274,7 +258,7 @@ export default async (config) => {
});
function filterTagList(tags) {
return (tags || []).filter(
(tag) => ["all", "nav", "post", "posts"].indexOf(tag) === -1
(tag) => ["all", "nav", "post", "posts"].indexOf(tag) === -1,
);
}
config.addCollection("tags", function (collectionApi) {
Expand All @@ -293,7 +277,7 @@ export default async (config) => {
JSON.stringify(tagSet, false, 2),
(err) => {
if (err) throw err;
}
},
);
}
return tagSet;
Expand All @@ -309,7 +293,7 @@ export default async (config) => {
series[item.data.series.tag] = item.data.series.name;
}
});

// Only perform file operations in production
if (PRODUCTION) {
// Generate a series JSON
Expand All @@ -318,7 +302,7 @@ export default async (config) => {
JSON.stringify(series, false, 2),
(err) => {
if (err) throw err;
}
},
);
// Build series files
for (let tag in series) {
Expand Down Expand Up @@ -362,15 +346,16 @@ export default async (config) => {
output: "dist",
},
// Enable incremental builds for faster development
...(PRODUCTION ? {} : {
ignores: [
"src/**/*.draft.md",
"src/_cache/**/*"
]
}),
...(PRODUCTION
? {}
: {
ignores: ["src/**/*.draft.md", "src/_cache/**/*"],
}),
// Use faster template engines for development
...(PRODUCTION ? {} : {
pathPrefix: "/",
})
...(PRODUCTION
? {}
: {
pathPrefix: "/",
}),
};
};
6 changes: 4 additions & 2 deletions .github/INSTALL_DEPENDENCIES.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ npm install axios cheerio html-to-text dotenv
```

These dependencies provide:

- `axios` - HTTP client for API requests
- `cheerio` - Server-side jQuery for HTML parsing
- `cheerio` - Server-side jQuery for HTML parsing
- `html-to-text` - Convert HTML to plain text
- `dotenv` - Environment variable management (for local testing)

Expand All @@ -29,13 +30,14 @@ MASTODON_SERVER_URL=https://front-end.social
BUFFER_ACCESS_TOKEN=your_test_token
BUFFER_TWITTER_PROFILE_ID=your_profile_id
BUFFER_BLUESKY_PROFILE_ID=your_profile_id
PINTEREST_ACCESS_TOKEN=your_test_token
PINTEREST_ACCESS_TOKEN=your_test_token
PINTEREST_BOARD_ID=your_board_id
SCREENSHOT_API_KEY=your_api_key
IFTTT_WEBHOOK_KEY=your_webhook_key
```

Then test locally:

```bash
# Load environment variables and test
node -r dotenv/config .github/scripts/syndicate-posts.js
Expand Down
Loading