<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cassidy Williams</title>
    <description>The latest articles on DEV Community by Cassidy Williams (@cassidoo).</description>
    <link>https://dev.to/cassidoo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F6401%2F6d75ebdc-706f-4d3b-8c26-47bf7946ece5.png</url>
      <title>DEV Community: Cassidy Williams</title>
      <link>https://dev.to/cassidoo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cassidoo"/>
    <language>en</language>
    <item>
      <title>Shipping todometer, version 3!</title>
      <dc:creator>Cassidy Williams</dc:creator>
      <pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/cassidoo/shipping-todometer-version-3-3ega</link>
      <guid>https://dev.to/cassidoo/shipping-todometer-version-3-3ega</guid>
      <description>&lt;p&gt;If you haven’t seen it yet, one of my open source projects that I’ve been “maintaining” for a while is called &lt;a href="https://cassidoo.github.io/todometer/" rel="noopener noreferrer"&gt;todometer&lt;/a&gt;. It’s a glorified to-do app with a progress bar, in a desktop app. It’s built with Electron and React, and I first shipped it in early 2017!&lt;/p&gt;

&lt;p&gt;todometer has served me well over the years, and so that’s why I put “maintaining” in quotes in that intro there. I admit I don’t often update it, because it does exactly what I want it to do: you check off a task, it fills a progress bar with green. You pause a task for later, and it fills the progress bar with yellow. At midnight, the bar resets, the paused tasks are unpaused, and the completed tasks are deleted.&lt;/p&gt;

&lt;p&gt;At it’s core… the app probably looks exactly like it did 3, 5, and 9 years ago. BUT I made a bunch of changes that folks have been asking for for several years, and I openly admit now that the users were right, and this latest version is so much better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependency updates
&lt;/h2&gt;

&lt;p&gt;So firstly, dependency updates. The final bundle size is a bit smaller, at less than 100MB on Windows and 118MB on Mac. Electron and React &lt;em&gt;are&lt;/em&gt; a bit heavy, but with every new update, they do get smaller! I’ve considered switching to Tauri at some point, but… honestly the Electron ecosystem keeps me here. It’s really good.&lt;/p&gt;

&lt;p&gt;I also recently talked about how &lt;a href="https://dev.to/cassidoo/a-history-of-styling-choices-leading-to-native-css-56bh-temp-slug-209524"&gt;I moved all styling to native CSS&lt;/a&gt;, thanks to the latest web technologies allowing me to do so, and was able to update &lt;a href="https://www.youtube.com/watch?v=lPp4uL6RXSc" rel="noopener noreferrer"&gt;how notifications worked under the hood&lt;/a&gt; with the help of some good ol’ AI tools.&lt;/p&gt;

&lt;p&gt;Getting everything modernized was important for literally every other feature to happen. The last release of this app was in 2020, and though I had done some minor changes here and there since then, this was the first time I put some real effort into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Editing to-dos and rearranging them
&lt;/h2&gt;

&lt;p&gt;Being able to edit and organize tasks has been the #1 feature request of the entire app since it came out. I admit I dragged my feet on this one, mainly because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I never really edited any tasks, and if I did I would just delete it and recreate it&lt;/li&gt;
&lt;li&gt;I didn’t know what I wanted the editing feature to look like&lt;/li&gt;
&lt;li&gt;State management across buckets for dragging and dropping sounded like a slog&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For #1… I had to get over myself. Took some time. People were right.&lt;/p&gt;

&lt;p&gt;For #2, that took some design ideation. I mocked up so many ideas on paper and just on CodePen for ideas on what I could do to make editing look smooth. I didn’t like the idea of adding more icons to the screen (which is what some other pull requests did in earlier versions of the app, when folks lovingly tried to contribute during my feet-dragging era), and I didn’t want to rely on just a color change to show that something was being edited. Eventually, I was pretty happy with the result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnq7verluv2wbbxbosyg9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnq7verluv2wbbxbosyg9.png" alt="Editing interface in todometer" width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can click the actual task words to go into editing mode (or navigate to a task via keyboard), edit, and then hit enter or click away to make the edits work. It feels clean, and I am really glad I did it like this!&lt;/p&gt;

&lt;p&gt;Now, for dragging and dropping… ugh that was a lot. I did probably too much research on which libraries I wanted to use for it (I ultimately used &lt;a href="https://dndkit.com/" rel="noopener noreferrer"&gt;dnd kit&lt;/a&gt;), and spent an absurd amount of time on the timing of the animations for opening different collapsed categories, and how items would look moving across categories. Luckily I was able to reduce some of the state management slog that I expected with some handy dandy AI tooling (shoutout GitHub Copilot), and here’s what it looks like now!&lt;/p&gt;

&lt;h2&gt;
  
  
  Look and feel updates
&lt;/h2&gt;

&lt;p&gt;Okay if you saw &lt;a href="https://github.com/cassidoo/todometer/commit/43effd06a945c78352aa11dde3267c302510f395" rel="noopener noreferrer"&gt;the diff of the icon updates to this app&lt;/a&gt; you would probably laugh at me because they’re SO minor, BUT I’ve been wanting to round the corners of all the icons for a while, and finally got off my butt and did it. That’s right: all of the icons in the whole app are lovingly hand-crafted SVGs. I regret that decision. But here we are.&lt;/p&gt;

&lt;p&gt;I ended up &lt;a href="https://github.com/cassidoo/todometer/commit/da365815a0661d63108eec8ccbed4dd4919bc5fe" rel="noopener noreferrer"&gt;changing the logo of the app&lt;/a&gt;, too! I rounded the corners, and made the checkmark have a bit of yellow in it, to match the progress bar in the app itself. Feels more unique than just the green checkmark, &lt;em&gt;and&lt;/em&gt; now the the actual icons across platforms have better sizing in general.&lt;/p&gt;

&lt;p&gt;Outside of images, again, most of the app looks exactly the same, but now there’s a menu button at the bottom of the app where the “reset progress” button used to be. What could that be?&lt;/p&gt;

&lt;p&gt;(it’s a settings menu)&lt;/p&gt;

&lt;h2&gt;
  
  
  The settings menu and its &lt;em&gt;implications&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;The new settings menu pulls things out from the native Electron menu (which I want to tweak more, but felt scope-creep-y), and has a few specific configurations that pull in some larger feature changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Notifications
&lt;/h3&gt;

&lt;p&gt;These are the same as before, but now moved into this menu. Users can toggle on/off reminder notifications of tasks, their timing, and see an example notification.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data vault
&lt;/h3&gt;

&lt;p&gt;This might be one of the largest changes of the entire app: your data is now in an SQLite database, rather than using local storage! This is something I’ve wanted to do for &lt;em&gt;years&lt;/em&gt; but truly just hadn’t put in the effort, because it would touch several more delicate parts of the app.&lt;/p&gt;

&lt;p&gt;For implementing this, I admit because I was intimidated by all that I knew I had to write, I made a particularly detailed spec document and handed it off to GitHub Copilot + Claude Opus 4.6 to build most of the foundations. In retrospect… that doc probably took as much time as it would take to just write the code myself, but c’est la vie.&lt;/p&gt;

&lt;p&gt;Now that it’s done, in this menu, users can put their “data vault” file anywhere on their computer, which means they can put it in a cloud folder (like Dropbox or something) and sync tasks across devices!&lt;/p&gt;

&lt;p&gt;Later, I do think I want to set up some kind of syncing service so that folks don’t have to think about where their vault lives. I tried to set things up in a way to make room for that, we’ll see how that shakes out in time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local API + MCP server + &lt;code&gt;todometer://&lt;/code&gt; protocol
&lt;/h3&gt;

&lt;p&gt;Because Electron runs Node, a thing I’ve always thought would be neat is to have the ability to spawn some kind of local API with the app for other local apps to use, and some kind of local protocol. And, now that AI tools are more of a thing, I thought I could expand that to an MCP server as well!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cassidoo/todometer/blob/main/docs/api-and-mcp-setup.md" rel="noopener noreferrer"&gt;Documentation for these features is here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Turns out that part wasn’t too bad to implement (again with some handy dandy AI tools), and I already was able to use the MCP server in a VS Code chat window, which was pretty cool to see. I might make a browser extension as well to help enhance the app experience.&lt;/p&gt;

&lt;p&gt;This should also hopefully make a little app ecosystem work well with todometer, which is something I’ve always wanted to figure out, and now I’m excited that it’s a real possibility now!&lt;/p&gt;

&lt;h3&gt;
  
  
  Menu button configuration
&lt;/h3&gt;

&lt;p&gt;In addition to the menu button that opens up all of these things, you can now also enable or disable the “reset progress” button (which treats the app like a new day, where completed tasks are deleted and paused ones are moved up), and also toggle a “copy list” button that copies your tasks to your clipboard. That copy one is a button I’ve wanted to add for a while purely because I copy and paste my finished task list for standup at work pretty regularly, and this makes that process just a liiiiittle bit faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build process, releases, and updates
&lt;/h2&gt;

&lt;p&gt;And finally, the last thing that users don’t really “see” but it makes a difference, is the updates to the build process for the app.&lt;/p&gt;

&lt;p&gt;Before, I literally just built all the versions of the app on my local machines, tested them locally, and then uploaded them to a tagged release. It was annoying and dumb. Now, that building process is done when a new tag is created &lt;a href="https://github.com/cassidoo/todometer/blob/main/.github/workflows/release.yml" rel="noopener noreferrer"&gt;via GitHub Actions&lt;/a&gt;, and creates a draft release! I also have proper code signing finished for Mac, and hopefully will have Windows done soon, too.&lt;/p&gt;

&lt;p&gt;Alongside the build process being updated, I added in the ability to automatically check for the latest updates and builds from the app itself. &lt;em&gt;That&lt;/em&gt; is a huge game-changer too, being able to just click a button and the app works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it, use it, share it, star it, etc.
&lt;/h2&gt;

&lt;p&gt;Allllll of this being said, todometer v3 is here and I’m really excited about it! If you want to look through it more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cassidoo/todometer" rel="noopener noreferrer"&gt;Here is the repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cassidoo/todometer/releases/tag/v3.0.0" rel="noopener noreferrer"&gt;Here is the latest release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cassidoo.github.io/todometer/" rel="noopener noreferrer"&gt;Here is the website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please make &lt;a href="https://github.com/cassidoo/todometer/issues" rel="noopener noreferrer"&gt;Issues&lt;/a&gt; if you run into problems, share it with your buddies, smash that star button, and thanks for reading this far!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>electron</category>
      <category>todometer</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Codemotion Madrid 2026 recap</title>
      <dc:creator>Cassidy Williams</dc:creator>
      <pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/cassidoo/codemotion-madrid-2026-recap-599e</link>
      <guid>https://dev.to/cassidoo/codemotion-madrid-2026-recap-599e</guid>
      <description>&lt;p&gt;Last week, I had the pleasure of speaking at &lt;a href="https://conferences.codemotion.com/madrid/" rel="noopener noreferrer"&gt;Codemotion Madrid&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;The event was really cool. I think I heard the organizers say that there were at least a couple thousand developers there, and there were multiple talk tracks throughout. I got to meet some internet friends in real life for the first time, and see some old friends I hadn’t seen in years.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffg8i5oxcdsphx4jt5x67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffg8i5oxcdsphx4jt5x67.png" alt="Cassidy on the keynote stage at Codemotion" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I delivered the keynote talk, which I titled, “Our Brains in the AI Era” (&lt;a href="https://github.com/cassidoo/talks/tree/main/Our%20Brains%20in%20the%20AI%20Era" rel="noopener noreferrer"&gt;slides here&lt;/a&gt;). The video should be online soon, and I’ll update this post when it is!&lt;/p&gt;

&lt;p&gt;Luckily, the talk seemed to go well. I appreciated this feedback and summary from an attendee:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A few takeaways I’m still reflecting on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forward-thinking hiring practices. Especially investing in junior talent&lt;/li&gt;
&lt;li&gt;The importance of guardrails when working with AI&lt;/li&gt;
&lt;li&gt;Learning in public now matters more than ever&lt;/li&gt;
&lt;li&gt;If your tools go down, what remains? Your knowledge, your team, your documentation&lt;/li&gt;
&lt;li&gt;And perhaps most importantly: juniors being “mentored” by AI can be both a blessing and a risk, we still need human mentorship more than ever.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’re clearly at an inflection point. The tools are evolving fast, but how we design systems, share knowledge, and support each other will define what comes next.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/cleyrauzcategui/" rel="noopener noreferrer"&gt;Cleyra Uzcategui&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Talking about AI these days feels both touchy, and like the elephant in the room. I’ve been trying to approach it (now that I’ve spoken at &lt;em&gt;three&lt;/em&gt; events this month about it &lt;a href="https://dev.to/cassidoo/speaking-at-techcamp-korea-2026-5fi4-temp-slug-6893154"&gt;in Korea&lt;/a&gt;, &lt;a href="https://dev.to/cassidoo/deep-dish-swift-2026-recap-2n0i-temp-slug-6228839"&gt;in Chicago&lt;/a&gt;, and now here, ha) in a balanced way to show that… it’s not all black and white. It’s easy to be very AI-pilled and very anti-AI, and that gray in between is an interesting space where we, as tech workers, can be stewards of this technology and how the workforce changes.&lt;/p&gt;

</description>
      <category>conferences</category>
    </item>
    <item>
      <title>Connecting the Logitech MX Creative Console to Elgato Lights</title>
      <dc:creator>Cassidy Williams</dc:creator>
      <pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/cassidoo/connecting-the-logitech-mx-creative-console-to-elgato-lights-23el</link>
      <guid>https://dev.to/cassidoo/connecting-the-logitech-mx-creative-console-to-elgato-lights-23el</guid>
      <description>&lt;p&gt;I’ve been using an Elgato Stream Deck to control my lights in my office for the past several years. The one I have (with 15 buttons) has worked great for me, but I noticed that I only really use 8 of the buttons. The rest work perfectly fine, but I always forget the macros I have saved there, and really just go back to defaulting to lighting control.&lt;/p&gt;

&lt;p&gt;Now, lately because I’m editing videos a lot more (both for work and &lt;a href="https://www.youtube.com/@cassidoo" rel="noopener noreferrer"&gt;personally&lt;/a&gt;), I’ve been looking to get some kind of knob or dial for my desk to be able to scrub through footage faster.&lt;/p&gt;

&lt;p&gt;These scenarios combined, I ended up finding the Logitech MX Creative Console! The buttons look exactly like the Stream Deck ones (only there’s 9 of them, with options to switch between pages and apps), and it comes with a Bluetooth rotary dial with buttons.&lt;/p&gt;

&lt;h2&gt;
  
  
  General review
&lt;/h2&gt;

&lt;p&gt;These things get the job done. I do wish that the dial could plug in instead of just relying on Bluetooth, but besides that, programming the buttons was fairly straight forward, and everything connected pretty seamlessly. Because I already have a Logitech mouse and a backup webcam, I didn’t have to install any extra software, which was also nice.&lt;/p&gt;

&lt;p&gt;(also… this is not a sponsored post, I’m truly just using all these products for myself)&lt;/p&gt;

&lt;p&gt;That being said… Elgato and Logitech, being competitors, did not play as nicely out of the box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a custom solution
&lt;/h2&gt;

&lt;p&gt;Because I couldn’t control my Elgato Key Lights natively from my desk, I brought out the &lt;a href="https://github.com/features/copilot/cli" rel="noopener noreferrer"&gt;GitHub Copilot CLI&lt;/a&gt; to help change that (once again, not sponsored, &lt;em&gt;but&lt;/em&gt; I do work at GitHub, full disclosure). The Elgato lights have their own IP addresses and a REST API, so I figured I could use the tools I have to throw together a script!&lt;/p&gt;

&lt;p&gt;In the CLI, I opened up Plan Mode and prompted:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;want&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;able&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt; &lt;span class="n"&gt;Elgato&lt;/span&gt; &lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;Lights&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;buttons&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;MX&lt;/span&gt; &lt;span class="n"&gt;Creative&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Each&lt;/span&gt; &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="n"&gt;tap&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;trigger&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;controls&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;specific&lt;/span&gt; &lt;span class="n"&gt;light&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Write&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;generate&lt;/span&gt; &lt;span class="n"&gt;scripts&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;communicate&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;lights&lt;/span&gt; &lt;span class="n"&gt;via&lt;/span&gt; &lt;span class="n"&gt;their&lt;/span&gt; &lt;span class="n"&gt;REST&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;toggle&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not the best prompt in the world, &lt;em&gt;but&lt;/em&gt; Plan Mode asked me the necessary clarifying questions to put together a plan that the tool could run with.&lt;/p&gt;

&lt;p&gt;A couple meetings later when I checked back, my script wizard was done, and my lights now work!&lt;/p&gt;

&lt;p&gt;If you want to do something similar (or have a different tool toggle your lights), &lt;a href="https://github.com/cassidoo/elgato-lights-connection" rel="noopener noreferrer"&gt;here’s the repository with all the scripts you need&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>github</category>
      <category>githubcopilot</category>
      <category>ai</category>
      <category>battlestation</category>
    </item>
    <item>
      <title>Deep Dish Swift 2026 recap</title>
      <dc:creator>Cassidy Williams</dc:creator>
      <pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/cassidoo/deep-dish-swift-2026-recap-4bko</link>
      <guid>https://dev.to/cassidoo/deep-dish-swift-2026-recap-4bko</guid>
      <description>&lt;p&gt;I gave the opening keynote at &lt;a href="https://deepdishswift.com/" rel="noopener noreferrer"&gt;Deep Dish Swift 2026&lt;/a&gt; today! It was so fun. The event is very iOS-oriented and nearly 300 people in the Chicago area, and it was cool meeting so many folks who I hadn’t met in person before.&lt;/p&gt;

&lt;p&gt;Before the event, I actually spoke on the podcast for the event, called &lt;a href="https://slices-the-deep-dish-swift-pod.pinecast.co/episode/ee84f0e2/cassidy-williams" rel="noopener noreferrer"&gt;Slices&lt;/a&gt;! I love all of the pizza puns this event has so much. The vibe throughout the podcast and the conference was fun, indie, and just cool.&lt;/p&gt;

&lt;p&gt;My talk, speaking of pizza puns… started with a pizza pun, where I led with, “I thought this conference was about eating deep dish swiftly…” and my slides were literally just about pizza. The talk itself was actually about AI, the state of the industry, and how we need to share our knowledge and support others… but again the visuals were all pizza.&lt;/p&gt;

&lt;p&gt;This was honestly one of the hardest-to-write talks I’ve ever done. Doing the technical AI part of the talk &lt;em&gt;while&lt;/em&gt; making my slides plausibly like a real talk about pizza was far more challenging than I expected it to be. But, I’m happy with the outcome!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6dvvl1sm1cajo79kgtl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6dvvl1sm1cajo79kgtl.png" alt="Cassidy speaking at a podium, wearing a pizza shirt" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve never actually had so many people approach me just to ask me about my talk-writing process before, with one attendee saying, “I’ve never seen a metaphor so gracefully navigated,” which is the most flattering thing I’ve ever heard someone say to me while I’m wearing a shirt covered in pepperoni.&lt;/p&gt;

</description>
      <category>conferences</category>
    </item>
    <item>
      <title>Speaking at TechCamp Korea 2026</title>
      <dc:creator>Cassidy Williams</dc:creator>
      <pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/cassidoo/speaking-at-techcamp-korea-2026-20jb</link>
      <guid>https://dev.to/cassidoo/speaking-at-techcamp-korea-2026-20jb</guid>
      <description>&lt;p&gt;I just got home from South Korea, where I taught some workshops at an event hosted by the U.S. Embassy Seoul!&lt;/p&gt;

&lt;p&gt;The event is called TechCamp Korea 2026, and the participants were a cohort of young professionals, entrepreneurs, and researchers. It was one of the most unique events I’ve ever been to, where it was part hackathon, part learning event, and part international relations, all in one cool space at &lt;a href="https://en.wikipedia.org/wiki/Seoul_National_University" rel="noopener noreferrer"&gt;Seoul National University&lt;/a&gt;’s campus!&lt;/p&gt;

&lt;p&gt;My talks were some hefty ones, each 75 minutes long and cramming in workshop time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI-Native Development: Building for Developer Experience&lt;/li&gt;
&lt;li&gt;Turning Ideas into Software&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(I don’t have these talks online, but maybe I could record a video or something)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwx0vjny8zzttxze0v1ih.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwx0vjny8zzttxze0v1ih.jpg" alt="TechCamp talk about turning ideas into software" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The majority of participants were technical, but about a third of the cohort had non-technical backgrounds, so it made for some interesting questions and ideas around the content.&lt;/p&gt;

&lt;p&gt;Because of how the groups were split up so everyone would have good relationship-building time, each of the 5 American speakers delivered our talks 3 times each, and I tell ya, after giving 6 long talks in a short period of time… my throat is &lt;em&gt;feelin it&lt;/em&gt;. It was totally worth it though. The participants were so eager to learn about technologies like the &lt;a href="https://github.com/features/copilot/cli/" rel="noopener noreferrer"&gt;GitHub Copilot CLI&lt;/a&gt; and &lt;a href="https://docs.github.com/en/copilot/reference/ai-models/model-comparison" rel="noopener noreferrer"&gt;alllll the AI models&lt;/a&gt; to experiment with, and their excitement was so contagious, I had a blast.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F200ehgtvzwc554oe9y75.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F200ehgtvzwc554oe9y75.jpg" alt="TechCamp talk showing the GitHub AI clients" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because my in-laws are based on Korea, it was a fun opportunity too to bring the family along. While I was speaking at the event, they were able to visit our relatives, and having that short but sweet time was so nice. That being said, traveling 18+ hours each way with two babies (nearly 3 and nearly 1 year old)… I’ve made better decisions in my life.&lt;/p&gt;

&lt;p&gt;Anyway, meeting other speakers like &lt;a href="https://rolemodel.beehiiv.com/p/annyeong-haseyo-to-the-ai-prosperity-revolution" rel="noopener noreferrer"&gt;Bilva Chandra&lt;/a&gt; and &lt;a href="https://sabrinakoumoin.com/" rel="noopener noreferrer"&gt;Brina Koumoin&lt;/a&gt; was wonderful. There were Korean-language keynotes that we got to listen to with some translators, and we speakers had the titles of “American Experts”, but really, we were mentors and teachers and user test subjects at this event. We stayed up late after our talks helping the individual groups with their projects, and the results blew us away. Groups worked on everything from robotics to supporting postpartum mothers (which &lt;a href="https://dev.to/cassidoo/dear-cassidy-of-2-months-ago-3lk-temp-slug-2165194"&gt;I really care about&lt;/a&gt;) to innovative ideas around nuclear energy to educating individuals who are less abled. It was amazing!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8izuvbip8h5uccjzq72.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8izuvbip8h5uccjzq72.jpg" alt="TechCamp mentoring session" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The organizers of this event were so thoughtful, and every decision along the way was very intentional for everyone to build lasting connections with each other. Getting to know the participants was delightful (perhaps my favorite moment after I helped one of them was her responding to me with, “Thank you so much, would you please be my cousin?”) and I hope to stay in touch with them. I feel all warm and fuzzy after this one, and have already told the team that I would participate in this type of event again and again!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5uqjsi70xp8jgt1i1nt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5uqjsi70xp8jgt1i1nt.jpg" alt="TechCamp Korea 2026 group photo" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>conferences</category>
    </item>
    <item>
      <title>I got yet another digital typewriter: The BYOK</title>
      <dc:creator>Cassidy Williams</dc:creator>
      <pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/cassidoo/i-got-yet-another-digital-typewriter-the-byok-3peg</link>
      <guid>https://dev.to/cassidoo/i-got-yet-another-digital-typewriter-the-byok-3peg</guid>
      <description>&lt;p&gt;I talked about &lt;a href="https://dev.to/cassidoo/building-the-micro-journal-4d7a"&gt;building my Micro Journal&lt;/a&gt; in the past here, and how much I like having a distraction-free writing device for blogging, drafting things, and just getting ideas out.&lt;/p&gt;

&lt;p&gt;Well… I liked it so much that I got another one! This one is called the BYOK (the Bring Your Own Keyboard). I got it on Kickstarter and it’s cool! It’s more portable than the Micro Journal in that it’s the size of your phone (and has a magnet in the back for stands that are compatible with MagSafe stands), and you can connect most keyboards to it (via cable or Bluetooth). I may or may not be typing on it right now, heh.&lt;/p&gt;

&lt;p&gt;Here’s how it works!&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/hmjLA67UKzA"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;It’s been a cool little device. I like that it’s mostly toddler-proof so far, and I’ve had fun trying it out! I think I prefer the syncing I have set up on my Micro Journal more so far, but the portability of the BYOK is pretty nice, and I like how much the team has been updating the firmware.&lt;/p&gt;

&lt;p&gt;Here’s some resources for it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://byok.io" rel="noopener noreferrer"&gt;The BYOK website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/cassidoo/ea7e3b9d3ea768f3847aaf69faa74dbc" rel="noopener noreferrer"&gt;BYOK controls cheat sheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/TheBYOK/" rel="noopener noreferrer"&gt;The BYOK subreddit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/writerDeck/" rel="noopener noreferrer"&gt;The WriterDeck subreddit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>byok</category>
      <category>mechanicalkeyboards</category>
      <category>writerdeck</category>
    </item>
    <item>
      <title>A history of styling choices leading to native CSS</title>
      <dc:creator>Cassidy Williams</dc:creator>
      <pubDate>Wed, 25 Mar 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/cassidoo/a-history-of-styling-choices-leading-to-native-css-4mdj</link>
      <guid>https://dev.to/cassidoo/a-history-of-styling-choices-leading-to-native-css-4mdj</guid>
      <description>&lt;p&gt;I recently updated my app &lt;a href="https://github.com/cassidoo/todometer" rel="noopener noreferrer"&gt;todometer&lt;/a&gt; to be styled with pure, native CSS!&lt;/p&gt;

&lt;h2&gt;
  
  
  Styling todometer over time
&lt;/h2&gt;

&lt;p&gt;Changing the CSS libraries in todometer has been a real reflection of CSS styling history.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cassidoo.co/post/todometer-build-log/" rel="noopener noreferrer"&gt;When I first built it more than 9 years ago now&lt;/a&gt;, that first initial commit had React, Electron, and Less for CSS. &lt;a href="https://lesscss.org/" rel="noopener noreferrer"&gt;Less&lt;/a&gt; at the time was great for what I wanted (Node-based styling with nesting). It let me use variables (&lt;a href="https://github.com/cassidoo/todometer/blob/aeecb78feb0c68a7c6301e585ba85597dc55c024/styles/variables.less" rel="noopener noreferrer"&gt;like this&lt;/a&gt;) and nesting (&lt;a href="https://github.com/cassidoo/todometer/blob/aeecb78feb0c68a7c6301e585ba85597dc55c024/styles/global.less" rel="noopener noreferrer"&gt;like this&lt;/a&gt;), and got the job done with some global styles.&lt;/p&gt;

&lt;p&gt;Eventually in 2020, I wanted more encapsulated styles, thus I wanted to use CSS Modules. Also at the time, wanting to keep my variables and nesting where I could (but also modernize), I switched to &lt;a href="https://www.npmjs.com/package/node-sass" rel="noopener noreferrer"&gt;&lt;code&gt;node-sass&lt;/code&gt;&lt;/a&gt;. When you look at &lt;a href="https://github.com/cassidoo/todometer/commit/13220322ebec1cf9be742ca49bc6ce3b345a0cab" rel="noopener noreferrer"&gt;the commits here&lt;/a&gt; and &lt;a href="https://github.com/cassidoo/todometer/commit/c14ffa670a5d8fb09d376d0d4448410cb9a78832" rel="noopener noreferrer"&gt;here&lt;/a&gt;, you can see the variables switching from starting with &lt;code&gt;@&lt;/code&gt; to &lt;code&gt;$&lt;/code&gt;, and how I moved everything everything to their respective &lt;code&gt;*.module.scss&lt;/code&gt; component (ultimately only keeping variables at the global level). The behaviors all stayed the same, just was more modern under the hood!&lt;/p&gt;

&lt;p&gt;Yet another big refactor was due in 2023, when I got rid of all Sass and used plain ol’ CSS files, and &lt;a href="https://postcss.org/" rel="noopener noreferrer"&gt;&lt;code&gt;postcss&lt;/code&gt;&lt;/a&gt; for transformations. &lt;code&gt;node-sass&lt;/code&gt; had been deprecated, which really led me to reevaluating the styling stack, and CSS variables existed natively, so that was one less thing needed! That led me to where we were until earlier today, &lt;code&gt;postcss-nested&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;postcss-nested&lt;/code&gt; vs. &lt;code&gt;postcss-nesting&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;These libraries sound almost exactly the same, but act different, and &lt;a href="https://chriscoyier.net/2023/03/02/nesting-in-postcss-which-way-to-go/" rel="noopener noreferrer"&gt;Chris Coyier talks about it a bit here&lt;/a&gt;. To save you a click, &lt;code&gt;postcss-nested&lt;/code&gt; has syntax like Sass, and &lt;code&gt;postcss-nesting&lt;/code&gt; has syntax like the CSS spec!&lt;/p&gt;

&lt;p&gt;Given the history above, it makes sense how the transition happened here. Moving from Less to Sass to a more vanilla CSS approach, all while keeping the core of variables + nesting, is all I really wanted. The &lt;code&gt;nested&lt;/code&gt; library back in 2023 let me keep styling almost exactly the same when I transitioned away from Sass, with the exception of variables (&lt;a href="https://github.com/cassidoo/todometer/commit/8862250e1bf4fd9902d8695fef40a00a9a045496#diff-8078d120168e1c29a21932f543c1f21cfd1d7b3ecbf8b578749931efa651e7cb" rel="noopener noreferrer"&gt;see the commit&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;I switched in &lt;a href="https://github.com/cassidoo/todometer/commit/cf315ba33b18d4405621dcafbec1e985d85ee0a4" rel="noopener noreferrer"&gt;this commit today to &lt;code&gt;postcss-nesting&lt;/code&gt;&lt;/a&gt; mostly to make sure that everything transitioned smoothly. It involved a laughably small change list, to just add &lt;code&gt;&amp;amp;&lt;/code&gt; nesting selectors across some files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pure CSS, baby
&lt;/h2&gt;

&lt;p&gt;The transition to fully native CSS for the entire app is possible now because CSS nesting is &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Nesting" rel="noopener noreferrer"&gt;natively available&lt;/a&gt;! I probably didn’t actually need to do the “switch to &lt;code&gt;postcss-nesting&lt;/code&gt;” step, but it felt like a good iterative one.&lt;/p&gt;

&lt;p&gt;And since I did that iterative step, the only changes I did for a “fully pure” CSS solution was to simply delete the &lt;code&gt;postcss&lt;/code&gt; files!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cassidoo/todometer/commit/4008ac5d51c6e960e75d1caf11422ae78ddc509a" rel="noopener noreferrer"&gt;Look at that diff. So much red!! So nice!!&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  It’s about the journey, not the destination… but also the destination is cool
&lt;/h2&gt;

&lt;p&gt;It’s really amazing to see how far we’ve come in browsers to be able to do these things without any libraries at all. Yes, I don’t have the most complex styles in the world, and yes, I’m really “only” using variables and nesting, but it’s cool that a “quality of life, nice to have” thing that I enjoyed nearly a decade ago is now a standard. Look at us go!&lt;/p&gt;

&lt;p&gt;Anyway, you can &lt;a href="https://github.com/cassidoo/todometer" rel="noopener noreferrer"&gt;check out the repo for todometer here&lt;/a&gt;, with a new version being properly cut soon!&lt;/p&gt;

</description>
      <category>css</category>
      <category>todometer</category>
      <category>electron</category>
    </item>
    <item>
      <title>Making art with CSS gradients and corner-shape and skew, oh my</title>
      <dc:creator>Cassidy Williams</dc:creator>
      <pubDate>Fri, 06 Mar 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/cassidoo/making-art-with-css-gradients-and-corner-shape-and-skew-oh-my-33io</link>
      <guid>https://dev.to/cassidoo/making-art-with-css-gradients-and-corner-shape-and-skew-oh-my-33io</guid>
      <description>&lt;p&gt;I found this old article about &lt;a href="https://css-tricks.com/how-to-create-wavy-shapes-patterns-in-css/" rel="noopener noreferrer"&gt;making wavy lines with CSS&lt;/a&gt;, and decided to play around with it!&lt;/p&gt;

&lt;p&gt;Here’s the final result:&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/editor/cassidoo/embed/019cc11f-a06e-7752-8949-dd534f32416d?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;It’s not the most gorgeous art in the world, but it was interesting combining the wavy gradients with CSS skew and &lt;a href="https://dev.to/cassidoo/making-interesting-borders-with-css-corner-shape-3gpf"&gt;corner-shape&lt;/a&gt; for some diagonal lines. I admit I didn’t do this in the most efficient way, but it was fun!&lt;/p&gt;

&lt;p&gt;I recorded a video of myself going from sketch to Pen, check it out:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Oq-mac7LlPs"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;There was definitely a point where the skew transform totally had me spiraling, but besides that, it was a fun way to just force myself to sit down and code for a bit, with no AI in my way.&lt;/p&gt;

&lt;p&gt;Until next time!&lt;/p&gt;

</description>
      <category>css</category>
    </item>
    <item>
      <title>How passkeys work</title>
      <dc:creator>Cassidy Williams</dc:creator>
      <pubDate>Sat, 21 Feb 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/cassidoo/how-passkeys-work-285h</link>
      <guid>https://dev.to/cassidoo/how-passkeys-work-285h</guid>
      <description>&lt;p&gt;I’ve been asked a couple times just this week how passkeys work, here’s a little rundown!&lt;/p&gt;

&lt;h2&gt;
  
  
  What passkeys are and how they work
&lt;/h2&gt;

&lt;p&gt;The “sales pitch” for passkeys is that they’re like a password that you will never know, and can never leak.&lt;/p&gt;

&lt;p&gt;They’re fully attached to your device of choice (phone, computer, Yubikey, etc).&lt;/p&gt;

&lt;p&gt;When you’re about to log in to a website with a passkey for the first time, your device makes two keys: a public key for the website that’s safe to share, and a private key that never leaves your device.&lt;/p&gt;

&lt;p&gt;When you sign in later and it asks for a passkey, it is saying, “prove it that you have that private key!” Your device proves it with Face ID/Touch ID/PIN/however it does it. When that “handshake” happens, you’re logged in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passkeys vs. passwords
&lt;/h2&gt;

&lt;p&gt;Passwords are like “I know a secret I can type anywhere I want,” and passkeys are like “I have a device that can vouch for me anywhere.”&lt;/p&gt;

&lt;p&gt;You might realize now that you are &lt;em&gt;reliant&lt;/em&gt; on your phone or computer if you use passkeys. You need the device with the private key, so if the passkey is on your phone, you need your phone. If your phone with the key is dead, if your laptop with the key isn’t with you, you’re out of luck. Typically you can create more than one passkey per login (so you could have one on your laptop and on your phone for the same website), which is probably a good idea to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why would I use these?
&lt;/h2&gt;

&lt;p&gt;Eh, I personally don’t think you should &lt;em&gt;necessarily&lt;/em&gt;. The cryptographic angle makes it seem like a secure choice, but at the cost of needing a specific device.&lt;/p&gt;

&lt;p&gt;If you use a password manager… it’s a similar experience for you. Password managers are secure, and you rely on a device with the password manager on it.&lt;/p&gt;

&lt;p&gt;There &lt;em&gt;is&lt;/em&gt; a good security story for passkeys, in that your device only can use its private key on that website domain, it wouldn’t work on a fake version (so if someone tried a phishing attempt on you making you log into &lt;code&gt;g1thub.com&lt;/code&gt; or something, they wouldn’t get your login). Or, if a site gets hacked, attackers can steal the public key, but it’s useless without the private one. That’s pretty good.&lt;/p&gt;

&lt;p&gt;So, passkeys don’t really “solve” the user experience problem of needing your personal device to log in somewhere. It’s better than reusing your passwords across multiple places of course, but it’s not automatically better than other “secure” solutions out there (in my opinion).&lt;/p&gt;

&lt;p&gt;Go… put your passwords on a post-it or something.&lt;/p&gt;

</description>
      <category>security</category>
    </item>
    <item>
      <title>I am making videos again!</title>
      <dc:creator>Cassidy Williams</dc:creator>
      <pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/cassidoo/i-am-making-videos-again-4a43</link>
      <guid>https://dev.to/cassidoo/i-am-making-videos-again-4a43</guid>
      <description>&lt;p&gt;I’ve always loved making videos. Not because I love being on camera, but I really enjoy putting together jokes and stories and tutorials (etc) with video as a medium. The moment I had the ability to plug a camera into a computer back in the early 2000s, I was making videos.&lt;/p&gt;

&lt;p&gt;But, I’ve not really been consistent about it. I didn’t make many videos regularly in high school and college (outside of some lip sync videos I’ll let you find on your own, heh). The most consistent I’ve been was when I got really into &lt;a href="https://www.tiktok.com/@cassidoo" rel="noopener noreferrer"&gt;TikTok&lt;/a&gt; and weekly streaming on &lt;a href="https://www.twitch.tv/cassidoo" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt; in the height of the pandemic, which was fun. The accessibility of making videos with those mediums made me fall in love with it again.&lt;/p&gt;

&lt;p&gt;After having a kiddo, I admit I kind of lost the mental energy to make short-form videos regularly again, and lost my appetite for live-streaming on Twitch. Momentum is hard. After coming back from my second maternity leave though, I somehow found a spark again! I don’t really know what it was, but I’ve decided to try. I haven’t really leaned into making longer form (as in, longer than a minute) videos before outside of online courses, so I’m working on that muscle, and bringing back livestreaming!&lt;/p&gt;

&lt;p&gt;I’m streaming weekly on &lt;a href="https://www.twitch.tv/cassidoo" rel="noopener noreferrer"&gt;Twitch&lt;/a&gt; again, on Thursdays at 12:30 Pacific/2:30 Central, and (re?)starting up &lt;a href="https://www.youtube.com/@cassidoo" rel="noopener noreferrer"&gt;my YouTube channel&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;I’ve been doing it for a few weeks now, and I’m having a lot of fun. So, that being said… please like and subscribe? LOL.&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>sideprojects</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Making interesting borders with CSS corner-shape</title>
      <dc:creator>Cassidy Williams</dc:creator>
      <pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/cassidoo/making-interesting-borders-with-css-corner-shape-3gpf</link>
      <guid>https://dev.to/cassidoo/making-interesting-borders-with-css-corner-shape-3gpf</guid>
      <description>&lt;p&gt;I stumbled upon the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/corner-shape" rel="noopener noreferrer"&gt;CSS property &lt;code&gt;corner-shape&lt;/code&gt;&lt;/a&gt; recently and it’s pretty cool. It allows you to specify the shape of an element’s corners and works with &lt;code&gt;border-radius&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I threw together this demo to show it in action:&lt;/p&gt;

&lt;p&gt;

&lt;iframe height="600" src="https://codepen.io/cassidoo/embed/ZYOvvmE?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;I remember in the olden days (as in like… 10 years ago, as evidenced by &lt;a href="https://codepen.io/cassidoo/pen/eZPmMe" rel="noopener noreferrer"&gt;this old Pen of mine&lt;/a&gt;), making beveled corners involved a bunch of pseudo-elements and triangles to fake a bevel. It’s so so cool that you can “just” do this now with a couple lines of CSS!&lt;/p&gt;

&lt;p&gt;In addition to beveled corners, it also lets you do scoops, notches, and even squircles:&lt;/p&gt;

&lt;p&gt;

&lt;iframe height="600" src="https://codepen.io/cassidoo/embed/xbOpYpP?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;There’s also a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/superellipse" rel="noopener noreferrer"&gt;&lt;code&gt;superellipse&lt;/code&gt;&lt;/a&gt; function, which defines any of the values you can pass to &lt;code&gt;corner-shape&lt;/code&gt; numerically, which could make for some interesting animations and transitions.&lt;/p&gt;

&lt;p&gt;Definitely play with it if you get a chance! I think there’s some cool CSS “drawing” things you can do as you dabble with the different shapes. &lt;code&gt;corner-shape&lt;/code&gt; does have &lt;a href="https://caniuse.com/?search=corner-shape" rel="noopener noreferrer"&gt;fairly limited availability currently&lt;/a&gt; (Safari and Firefox don’t support it yet at the time of writing), but hopefully that’ll change soon!&lt;/p&gt;

</description>
      <category>css</category>
    </item>
    <item>
      <title>Remaking the Linux "touch" command in PowerShell</title>
      <dc:creator>Cassidy Williams</dc:creator>
      <pubDate>Tue, 20 Jan 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/cassidoo/remaking-the-linux-touch-command-in-powershell-27nn</link>
      <guid>https://dev.to/cassidoo/remaking-the-linux-touch-command-in-powershell-27nn</guid>
      <description>&lt;p&gt;I switch back and forth between Windows and Mac pretty regularly depending on what I’m working on (and sometimes between WSL and PowerShell on the same machine, what a time to be alive), and one thing that I &lt;em&gt;always&lt;/em&gt; mess up in PowerShell on Windows is making a new file.&lt;/p&gt;

&lt;p&gt;On Linux-based machines, you can run &lt;code&gt;touch filename&lt;/code&gt; to make a new file, and on Windows, you can do &lt;code&gt;ni filename&lt;/code&gt;, which works just as well.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But&lt;/em&gt; with all the context switching I do, I wanted to be able to do both to keep myself in the flow when running a bunch of things on the command line.&lt;/p&gt;

&lt;p&gt;I added this to my PowerShell profile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;touch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;CmdletBinding&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;Param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mandatory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ValueFromPipeline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;$true&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$Path&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Test-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LiteralPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LiteralPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LastWriteTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kr"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ItemType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$Path&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lets you run &lt;code&gt;touch&lt;/code&gt; as you normally would, and also lets you pipe file paths to it (like &lt;code&gt;"cake.txt", "fish.txt" | touch&lt;/code&gt;)!&lt;/p&gt;

&lt;p&gt;To add this to your PowerShell profile, run this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;notepad&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$PROFILE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste the function in, and then back in your shell, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$PROFILE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Blammo, one less brain cell needs to be wasted in the future. There’s definitely other functions out there that could also be added to make PowerShell feel more like a Linux-based shell, but this is the one I use the most!&lt;/p&gt;

&lt;p&gt;Toodles!&lt;/p&gt;

</description>
      <category>powershell</category>
    </item>
  </channel>
</rss>
