-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
148 lines (120 loc) · 11.6 KB
/
Copy pathindex.html
File metadata and controls
148 lines (120 loc) · 11.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>RyanNickel.com</title>
<link rel="stylesheet" href="//unpkg.com/sanitize.css">
<link rel="stylesheet" href="/css/typography.css">
<link rel="stylesheet" href="/css/vars.css">
<link rel="stylesheet" href="/css/styles.css">
<link rel="stylesheet" href="/css/index.css">
</head>
<body>
<header>
<h1>Hello, my name is <span class="name">Ryan Nickel</span></h1>
<p>A personal blog focused on (primarily) software.</p>
</header>
<main>
<article class="h-entry">
<h1 style="view-transition-name: title-06cc7a9e-d451-4d31-8480-825ac0572dcd"><a href="html/friction_and_quality.html" class="u-url p-name">Friction and Quality</a></h1>
<span class="p-summary" style="view-transition-name: content-06cc7a9e-d451-4d31-8480-825ac0572dcd"><p>My threshold for friction is low. That’s not a complaint – it’s one of my most useful signals of quality.</p>
</span>
<time class="dt-published" datetime="2026-04-05T20:20:11-04:00">Apr 05, 2026</time>
<a rel="author" href="https://RyanNickel.com">Ryan Nickel</a>
</article>
<article class="h-entry">
<h1 style="view-transition-name: title-5042167c-b06f-453e-92e8-f2f146f91d95"><a href="html/how_ai_amplifies_npm_supply-chain_risk.html" class="u-url p-name">How AI Amplifies NPM Supply-Chain Risk</a></h1>
<span class="p-summary" style="view-transition-name: content-5042167c-b06f-453e-92e8-f2f146f91d95"><p>Further to my previous post about the <a href="/html/axios_comprimised_the_case_for_pinning.html">compromised axios npm package supply-chain attack</a> — and my view that <a href="/html/how_npm39s_defaults_set_you_up_for_failure.html">npm’s defaults can set projects up for failure</a> — I wanted to jot down how AI can exacerbate the risk.</p>
</span>
<time class="dt-published" datetime="2026-04-01T22:31:32-04:00">Apr 01, 2026</time>
<a rel="author" href="https://RyanNickel.com">Ryan Nickel</a>
</article>
<article class="h-entry">
<h1 style="view-transition-name: title-8c6f9d6b-6c3f-4d17-84e1-51bcb2a5a9d3"><a href="html/axios_comprimised_the_case_for_pinning.html" class="u-url p-name">Axios Comprimised: The Case for Pinning</a></h1>
<span class="p-summary" style="view-transition-name: content-8c6f9d6b-6c3f-4d17-84e1-51bcb2a5a9d3"><p>This morning I woke up, opened my usual tech news feed, and the first thing staring back at me was an axios supply-chain compromise. For details, see <a href="https://thehackernews.com/2026/03/axios-supply-chain-attack-pushes-cross.html">Axios supply-chain attack pushes cross-platform malware via npm</a>. It is also a reminder that supply-chain risk is not theoretical. Your build is only as safe as the newest version you allow in.</p>
</span>
<time class="dt-published" datetime="2026-03-31T23:06:05-04:00">Mar 31, 2026</time>
<a rel="author" href="https://RyanNickel.com">Ryan Nickel</a>
</article>
<article class="h-entry">
<h1 style="view-transition-name: title-6fa8d8e0-8e6c-4794-8f86-05f61a69fdc2"><a href="html/mole_the_utility_i_didnt_know_my_mac_needed.html" class="u-url p-name">Mole: The Utility I Didn’t Know My Mac Needed</a></h1>
<span class="p-summary" style="view-transition-name: content-6fa8d8e0-8e6c-4794-8f86-05f61a69fdc2"><p>I recently discovered a small macOS utility called <a href="https://github.com/tw93/Mole">Mole</a>, and it very quickly earned a permanent place in my setup.</p>
</span>
<time class="dt-published" datetime="2026-01-18T12:48:46-05:00">Jan 18, 2026</time>
<a rel="author" href="https://RyanNickel.com">Ryan Nickel</a>
</article>
<article class="h-entry">
<h1 style="view-transition-name: title-b4a4b0a1-6c7d-42f1-96b0-64961fcf4e09"><a href="html/functional_programming_meets_dependency_injection_in_express.js.html" class="u-url p-name">Functional Programming Meets Dependency Injection in Express.js</a></h1>
<span class="p-summary" style="view-transition-name: content-b4a4b0a1-6c7d-42f1-96b0-64961fcf4e09"><p>Recently, I’ve been exploring some core functional programming (FP) principles and experimenting with how to incorporate them into my daily development workflow. One area where FP really shines is in how it pairs with Express.js—especially when it comes to structuring dependency injection (DI).</p>
</span>
<time class="dt-published" datetime="2025-03-26T12:45:14-04:00">Mar 26, 2025</time>
<a rel="author" href="https://RyanNickel.com">Ryan Nickel</a>
</article>
<article class="h-entry">
<h1 style="view-transition-name: title-3ee863f8-97e1-4c78-861c-b21210b61371"><a href="html/the_one_true_code_value_-_why_maintainability_is_the_unsung_hero_of_programming.html" class="u-url p-name">The One True Code Value - Why Maintainability is the Unsung Hero of Programming</a></h1>
<span class="p-summary" style="view-transition-name: content-3ee863f8-97e1-4c78-861c-b21210b61371"><p>There are two kinds of programmers in this world: those who love writing brand-new code (fresh, shiny, and untouched by mortal hands), and those who have gazed into the horrifying abyss of code maintenance – and survived. You know where I stand. Give me maintainability any day. Because nothing says “programming value” quite like writing code you can still understand a year later.</p>
</span>
<time class="dt-published" datetime="2024-11-03T08:51:50-05:00">Nov 03, 2024</time>
<a rel="author" href="https://RyanNickel.com">Ryan Nickel</a>
</article>
<article class="h-entry">
<h1 style="view-transition-name: title-b6340dbf-75b9-4c05-9986-afa6700d6460"><a href="html/how_npm39s_defaults_set_you_up_for_failure.html" class="u-url p-name">How NPM's Defaults Set You Up for Failure</a></h1>
<span class="p-summary" style="view-transition-name: content-b6340dbf-75b9-4c05-9986-afa6700d6460"><p>In software development, consistency and stability are critical — especially when managing dependencies. However, NPM’s default behavior when installing packages—using the caret (<code>^</code>) in <code>package.json</code> — creates a fragile environment that often leads to frustrating issues for developers. Idempotent and reproducible dependency management should be the standard experience by default, but NPM’s use of <code>^</code> undermines this goal.</p>
</span>
<time class="dt-published" datetime="2024-10-22T19:06:32-04:00">Oct 22, 2024</time>
<a rel="author" href="https://RyanNickel.com">Ryan Nickel</a>
</article>
<article class="h-entry">
<h1 style="view-transition-name: title-7f5ef3d1-ccc8-4688-9abd-8de2a6c8e25e"><a href="html/my_workflow_for_managing_documents_with_paperless_ngx.html" class="u-url p-name">My workflow for managing documents with Paperless NGX</a></h1>
<span class="p-summary" style="view-transition-name: content-7f5ef3d1-ccc8-4688-9abd-8de2a6c8e25e"><p>Managing a pile of documents can be a real headache, can’t it? I used to have all these papers stuffed into folders, always mixing things up. Was my business tax return in the “Tax Returns” folder or jammed in the “Business” one? And good luck finding anything in that mess!</p>
</span>
<time class="dt-published" datetime="2024-04-06T11:03:50-04:00">Apr 06, 2024</time>
<a rel="author" href="https://RyanNickel.com">Ryan Nickel</a>
</article>
<article class="h-entry">
<h1 style="view-transition-name: title-b73ca6c8-75d5-4195-8b09-0c6c9552445b"><a href="html/fall_or_dodge_in_hell_-_a_promising_start_that_got_lost_in_the_digital_abyss.html" class="u-url p-name">Fall Or Dodge in Hell - A Promising Start That Got Lost in the Digital Abyss</a></h1>
<span class="p-summary" style="view-transition-name: content-b73ca6c8-75d5-4195-8b09-0c6c9552445b"><p>So, I recently dove into Neal Stephenson’s “Fall; Or, Dodge in Hell,” expecting an epic adventure. Well, let me tell you, it didn’t quite deliver. Clocking in at a whopping 900 pages, you’d think there’d be enough room for some serious action. But nope, not much happens for the most part. I mean, we get bombarded with pages upon pages of philosophical musings, theological ramblings, and political banter. Some of it relates to the story, but a lot of it feels like it’s just there to fill up space. It’s like Stephenson took a philosophy/theology textbook and tried to disguise it as a novel.</p>
</span>
<time class="dt-published" datetime="2023-05-31T12:34:00-04:00">May 31, 2023</time>
<a rel="author" href="https://RyanNickel.com">Ryan Nickel</a>
</article>
<article class="h-entry">
<h1 style="view-transition-name: title-d53d28e0-30d5-4256-86c1-752a6c26948b"><a href="html/setting_up_my_own_ryannickel.com_domain_for_mastadon.html" class="u-url p-name">Setting up my own @ryannickel.com domain for Mastadon</a></h1>
<span class="p-summary" style="view-transition-name: content-d53d28e0-30d5-4256-86c1-752a6c26948b"><p>If you’re using Mastodon or other decentralized social networks, you might be looking for ways to improve your discoverability. One technique that’s gained popularity is using the webfinger protocol to create a discoverable profile for your domain.</p>
</span>
<time class="dt-published" datetime="2023-04-18T15:51:13-04:00">Apr 18, 2023</time>
<a rel="author" href="https://RyanNickel.com">Ryan Nickel</a>
</article>
</main>
<nav>
<a href="/index-2.html">Next >></a>
</nav>
<footer class="h-card">
<img class="u-photo" src="/img/headshot.png" alt="headshot">
<span class="p-name">Ryan Nickel</span>
<a class="hidden u-url" rel="me" href="https://RyanNickel.com">https://RyanNickel.com</a>
<ul>
<li><a rel="me" href="https://twitter.com/rnickel" class="u-url">Twitter</a></li>
<li><a rel="me" href="https://github.com/mrnickel" class="u-url">GitHub</a></li>
<li><a href="/about.html">About</a></li>
<li><a rel="me" href="https://indieweb.social/@mrnickel" class="u-url">Mastodon</a></li>
<li><a href="/rss.xml">RSS</a></li>
</ul>
<p>Made with ♥ by <span class="p-given-name">Ryan</span> <span class="p-family-name">Nickel</span> in <span class="p-locality">Toronto</span>, <span>Canada</span></p>
<img src="/img/toronto-icon-sm.png" alt="Toronto Icon" class="cityicon">
<p>Generated with my super awesome <a href="https://github.com/mrnickel/StaticSiteGenerator">StaticSiteGenerator</a></p>
</footer>
<script>
(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date(); a = s.createElement(o),
m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-35684132-1', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>