Steve Simkins

Now

What I'm up to recently

Last updated: April 20th, 2026

Updates

Attention is the beginning of devotion

Teach the children. We don’t matter so much, but the children do. Show them daisies and the pale hepatica. Teach them the taste of sassafras and wintergreen. The lives of the blue sailors, mallow, sunbursts, the moccasin flowers. And the frisky ones—inkberry, lamb’s quarters, blueberries. And the aromatic ones—rosemary, oregano. Give them peppermint to put in their pockets as they go to school. Give them the fields and the woods and the possibility of the world salvaged from the lords of profit. Stand them in the stream, head them upstream, rejoice as they learn to love this green space they live in, its sticks and leaves and then the silent, beautiful blossoms.

Attention is the beginning of devotion.

— Mary Oliver, Upstream

One of my favorite things to do with my personal website is hide little Easter eggs for people to find. Since you happen to be viewing this post, you get a direct link to the latest one:

/murmurations

Best enjoyed with sound

Just changed my /edc page to /uses which I’m pretty excited about! Added Hardware/Gear and Software sections in addition to the EDC pieces I had before.

Also updated the /about page to include “About This Site” that goes into some of the details of how my personal website is built and hosted. Check them both out if you’re interested!

Hello from Posts! Over the past day or so I’ve migrated my /now updates to this setup instead of using my PDS. Kinda a long story, but TLDR is simplifying my stack a bit and reducing friction. Will likely be treating this more like a micro blog with short posts. For more info check out posts here.

Anyway just watch The Lorax with my kids for the first time in forever and bawled my eyes out

Unless someone like you cares a whole awful lot, nothing is going to get better. It’s not.

Deep Green

image

It rained last night, after weeks of draught. Rained a bit this morning too, but it was mostly just cool, grey, and damp. During the Spring when all the trees and flowers bloom, it’s these kinds of days that are extra special. The deep green seen everywhere that is hard to describe. You can smell the faint sweetness of mountain flowers. Standing outside you feel a soft breeze and hear nothing but the rustle of trees. It’s these deep green moments that I hold onto dearly, and from time to time, share them.

Captains Log 1776383078

Updates from the bridge:

  • My best friend sent me this and I still can’t get over it intertapes.net

  • I might be getting into a Casio watch hobby/addiction so please send your thoughts and prayers

  • Been enjoying some of the best Spring weather here in Tennessee. Going to miss it in a few months when it turns into a sweltering hell hole.

  • Spending a lot of my spare time on building personal and self hosted software in Rust. More on that soon in a future blog post.

  • Ordered a Parker Jotter. They’ve never peaked my interest before, but after learning more about history and cultural references, I gotta try one.

  • I need more blogs to follow. If you’ve been following mine and haven’t said hi yet, please do!

Until next time 🫡

Machines

Once, men turned their thinking over to machines in the hope that this would set them free. But that only permitted other men with machines to enslave them. – Dune

Migrating from lazy.nvim to vim.pack

Like many others who are upgrading to Neovim 0.12.0, I decided to give vim.pack a try by following the excellent guide by Evgeni Chasnovski. I did encounter a few bumps that I figured I would document here just in case others find themselves stuck.

  • Symlinks - Bit more of a dummy move on my part, but I wasn’t paying attention to my symlink setup that maps my git controlled repo ~/dotfiles/nvim to ~/.config/nvim and ended up missing some new folders I created. Re-linking helped fixed this, so if you have this kind of setup keep in mind to do this!

  • Multiple Folder Organization - Something I wanted to do originally is replicate the setup I had with lazy where each plugin was in it’s own file. This is possible vim.pack, but it requires using a plugin directory that is adjacent to your init.lua file. I have a slightly different structure where this style didn’t quite fit in, so I stuck with a single file setup instead.

  • Lazy Loading - The guide linked at the beginning has some great tips for how you can lazy load plugins based on different events, so I would highly recommend looking at which plugins don’t need to be loaded immediately or only need to be loaded while in insert mode. I was able to shave an extra 10ms off my startup time!

Overall this resulted in a lean one file config for plugins that is only 117 lines long and has an average startup time of 35ms.

-- ============================================================================
-- Colorscheme (must load at startup)
-- ============================================================================
vim.pack.add({
	"https://github.com/stevedylandev/compline-nvim",
  'https://github.com/echasnovski/mini.nvim',
})
vim.cmd.colorscheme('compline')

-- ============================================================================
-- Mini.nvim — startup modules
-- ============================================================================

local win_config = function()
  local height = math.floor(0.618 * vim.o.lines)
  local width = math.floor(0.618 * vim.o.columns)
  return {
    anchor = 'NW',
    height = height,
    width = width,
    row = math.floor(0.5 * (vim.o.lines - height)),
    col = math.floor(0.5 * (vim.o.columns - width)),
  }
end

require("mini.pick").setup({
  mappings = {
    choose_marked = '<C-y>',
    move_down     = '<C-j>',
    move_up       = '<C-k>',
  },
  window = { config = win_config }
})

vim.api.nvim_set_hl(0, "MiniPickMatchCurrent",
  { bg = vim.g.terminal_color_8
  })

require('mini.icons').setup()
vim.api.nvim_set_hl(0, 'MiniIconsAzure', { fg = vim.g.terminal_color_12 })
vim.api.nvim_set_hl(0, 'MiniIconsBlue', { fg = vim.g.terminal_color_4 })
vim.api.nvim_set_hl(0, 'MiniIconsCyan', { fg = vim.g.terminal_color_6 })
vim.api.nvim_set_hl(0, 'MiniIconsGreen', { fg = vim.g.terminal_color_2 })
vim.api.nvim_set_hl(0, 'MiniIconsGrey', { fg = vim.g.terminal_color_8 })
vim.api.nvim_set_hl(0, 'MiniIconsOrange', { fg = vim.g.terminal_color_3 })
vim.api.nvim_set_hl(0, 'MiniIconsPurple', { fg = vim.g.terminal_color_5 })
vim.api.nvim_set_hl(0, 'MiniIconsRed', { fg = vim.g.terminal_color_1 })
vim.api.nvim_set_hl(0, 'MiniIconsYellow', { fg = vim.g.terminal_color_11 })

require('mini.diff').setup({
  view = {
    style = vim.go.number and 'sign' or 'number',

    signs = {
      add = "+",
      change = "~",
      delete = "-",
      topdelete = "",
      changedelete = "▎",
      untracked = "+"
    },

    priority = 199,
  },
})
require('mini.statusline').setup()
require('mini.extra').setup()

-- ============================================================================
-- Deferred — loads right after startup via vim.schedule()
-- ============================================================================
vim.schedule(function()
  vim.pack.add({
    "https://github.com/christoomey/vim-tmux-navigator",
  })

  require("mini.comment").setup({
    mappings = {
      comment = 'gb',
      comment_visual = 'gb',
      textobject = 'gb'
    }
  })

  require('mini.surround').setup({
    mappings = {
      replace = 'cs', -- Replace surrounding
    },
  })

  require('mini.files').setup({
    mappings = {
      close      = '<ESC>',
      go_in_plus = '<CR>'
    }
  })
end)

-- ============================================================================
-- Lazy — loads on InsertEnter
-- ============================================================================
vim.api.nvim_create_autocmd('InsertEnter', { once = true, callback = function()
  require("mini.completion").setup({
    mappings = {
      scroll_down = '<C-j>',
      scroll_up = '<C-k>',
    },
  })

  local gen_loader = require('mini.snippets').gen_loader
  require('mini.snippets').setup({
    snippets = {
      gen_loader.from_lang(),
    },
  })
  MiniSnippets.start_lsp_server()
end })

All of my dotfiles can be found at github.com/stevedylandev/dotfiles!

A Case for Birding

image

More people should get into bird watching (aka “birding”)

Why

The reasons are pretty simple:

  • Low effort
  • Being outside
  • Relaxing
  • Fun

If you don’t enjoy any of these benefits I’m not sure what to tell you, other than somehow birding isn’t for you.

Get Started

If those benefits did resonate with you, here’s how easy it is to get started:

  1. Go outside
  2. Look at birds

Ok ok, here’s a few more layers that make it more enjoyable.

Reference

Perhaps this should be a requirement, but a good reference helps you greater appreciate what exactly you’re looking at. This could be a classic bird field guide you can get at a bookstore, or the Merlin Bird ID app. Being able to identify birds and the calls or sounds they make is a huge part of bird watching, and necessary for the next step.

Paper and Pen

Get yourself a small notebook and a pen or pencil, then write down the birds you see. Keep the date you saw them, highlight when you saw a new bird for the first time, describe birds you couldn’t identify fully, document the weather and the mood that day, sketch birds you enjoy, the list goes on and on. Over time these become your small books of bird collections, and they’re fun to flip through in the future.

Bird Feeders

If you have the place for one, a bird feeder can be one of the best investments you can make. Placing them in easy to view locations lets you watch birds often, making it easier to get familiar with the different kinds, their migration patterns, etc. Definitely get a bird feeder if you can!

Optics

Saved for last due to how expensive they can be. Optics like binoculars are not required, but they sure do step up the game. As you start looking for harder to find birds, optics will help you catch some that stay way too high or distant for your eyes. Even at closer distances they’re fun to use as you get to enjoy birds more.

Small Things in Dark Times

It’s no secret that we’re going through a rough patch. Fear and anxiety are on the doorstep of many. We get sucked into endless news loops, people on platforms saying our jobs will be taken by AI in six months, all while bombs drop and the price of food and gas climb. Despite feeling hopeless, you know what you can do? Put down the phone, step outside, and look at a bird.

The horrible things of this world won’t disappear, your problems don’t go away, however I wouldn’t label this break as an escape either. Humans aren’t designed to bear the weight of everything happening outside of their control. You can only do so much, and at least in my opinion, you’re meant to bear some of it in the context of time in nature and with community.

You can’t solve every problem, but you can step outside, breath some fresh air, and cast your gaze upon a Yellow Rumped Warbler. When it flies away, you’re left feeling a bit lighter, ready to take another day standing tall.

Go look at a bird.

Captains Log 1774231082

Updates from the bridge:

  • Been meaning to take more photos as Spring has started, added some of them to steve.photo

  • Did a lot of experimenting with keystroke dynamics as a way to authenticate human written content, but unfortunately I don’t think it will work out in the end. There were too many practical holes, like someone could just type out by hand what an AI created. Originally I was thinking it could be helpful for areas like education, to help keep the discipline of writing alive. Now I’m coming to terms that there’s not a lot we can do to stop people from using AI in these applications. Rather, time is better spent showing people why writing is a discipline that should be respected.

  • Had a small hiatus from my progress in the Rust book but plan to get back into it this week. I will not give up this time lol

  • Wanted to track my tea shipments, so I built something I’ve wanted for a long time: a package tracker.

  • Tea I’ve been trying has been all over the place, but of course the pu’er has been probably some of my favorite. Second might be some oolong and black teas.

  • Will probably do a blog post on kagi.com soon; known about them forever but just now really seeing the value they bring to the ecosystem. Great stuff.

Until next time 🫡

Native Treesitter in Neovim

As fate would have it, I make a blog post about returning to Neovim, and for some reason an update to nvim-treesitter breaks my ability to see syntax highlighting for nushell. A very small annoyance, but enough for me to replace it. I remember seeing this awesome post by boltless so I knew it was possible. Turned out to be super simple!

First I needed something to install the parsers. I ended up following boltless’ recommendation of using luarocks and making a small script to automate installing necessary parsers:

def tsi [parser: string] {
  let tree = $"($env.HOME)/.local/share/nvim/site"
  luarocks --lua-version=5.1 $"--tree=($tree)" install $"tree-sitter-($parser)"
}

Installing them is simple as tsi rust or whichever language I need to grab. Next I needed to add these parsers to my packpath, so I added a new treesitter.lua to core with the following contents.

-- Native treesitter parsers installed via luarocks
local rocks_path = vim.fn.stdpath("data") .. "/site/lib/luarocks/rocks-5.1"
for _, parser_dir in ipairs(vim.fn.glob(rocks_path .. "/tree-sitter-*/*/", true, true)) do
  vim.opt.runtimepath:prepend(parser_dir)
end

One of the last steps is an autocmd to start up tree sitter with the open buffer.

vim.api.nvim_create_autocmd("FileType", {
    callback = function(ev)
        pcall(vim.treesitter.start, ev.buf)
    end
})

A nice small bonus: adding the following to treesitter.lua lets me use folds with za.

vim.o.foldenable = true
vim.o.foldlevel = 99
vim.o.foldmethod = "expr"
vim.o.foldexpr = "v:lua.vim.treesitter.foldexpr()"

Now everything works how I expect it to, and I’ve learned more about how treesitter works! Would also highly recommend this post that goes way deeper into the subject. Nothing beats the rush of solving a small problem to make my dev env faster and smoother!

Keystroke Dynamics: My New Rabbit Hole

Did a dangerous thing today and started thinking too much. Now I have an idea that I can’t get out of my head.

My friend @iammatthias shared theamdash.com with me today, and while it came out last year, this was my first time seeing it. It’s been hard to tell if the idea behind am- was a joke, an artistic expression, an attempt at a solution to a real problem, or perhaps all of the above. Regardless, it got me thinking about what a real solution to determining AI vs Human created content in a digital world.

A lot of the initial ideas that came to mind just weren’t good enough. There’s so much AI can do to imitate what a person creates, and we’ve all experienced it. Then I started to think less about the end product, and more about the process. AI will spit something out in a few seconds, while human writing takes much more time and thought. That’s when my sites turned to Keystroke Dynamics.

When a person writes, there are natural pauses, breaks, or rhythms on the keyboard. These patterns actually become a source of identification, or in the field of keystroke dynamics, authentication. What if this was applied to provenance? What if there was a standard + essential libraries that make it possible to prove someone’s identity through their content on any platform?

Down the rabbit hole we go

Captains Log 1772509466

Some long overdue updates from the bridge:

  • Just finished Piranesi by Susanna Clarke; would highly recommend.

  • Started getting into loose leaf tea, specifically Chinese tea varieties thanks to a new local tea shop and YouTube. Current favorite is a Lapsang that smells like a campfire 🔥

  • Lots of thoughts after publishing my last blog post on the topics of AI and programming. Might share more later.

  • Got to watch a pair of Pileated Woodpeckers for about 15 mins straight this weekend and it was delightful. Crazy lookin birds.

  • Displeased to see Zed’s TOC changes today, so much so I might be making a voyage back to Neovim. Feel like there’s some Zed features I could either replicate or rebuild if I need to.

  • Slowly making it further through the Rust book, made it further than I have before 😅 Determined to finish it and build some projects without AI assisted coding. Trying to find that balance and keep my mind/skills sharp. Will also likely write more about that later.

Until next time 🫡

Sipp

cover

I rewrote Sipp in Rust for the following reasons:

  • Memes
  • Learning
  • Fun

As the project went on, the rabbit hole became deeper and deeper. The result is a single binary around ~13MB that runs a web server / site, CLI, and TUI. It’s everything I’ve wanted in a code sharing tool, and perhaps more. Learned a bunch while working on this and I think I might be rust pilled now. The server only takes anywhere from 2MB to 10MB of ram to run, which is much more minimal than the previous Bun version that was around 60MB. The tooling and DX building this was insane, and I’m definitely interested to see what else I can build with it.

Check out the repo here, and after installing it you can try running the TUI with the hosted instance:

sipp -r https://sipp.so

Cryptography Focused

Over the past few months I’ve been toying with what I should spend my free time on. My family always comes first, and then my day job. After that I generally have some left over curiosity and a desire to solve problems, hence my numerous side projects. Lately I’ve felt the weight of needing to solve bigger issues that have larger impact. I think a lot of my work on blogs, rss, and publishing on ATProto have some small value towards maintaining free speech and becoming less chronically online, but my sights are now turning towards cryptography.

The right to privacy has come under attack more than ever these days, and I feel compelled to put up a fight. I’m certainly not qualified to be a researcher, but I do enjoy piecing together preexisting parts of a system. Even if I don’t end up contributing anything, I enjoy learning about it, and I’ve got nothing else to do ¯_(ツ)_/¯

Will of course write about anything I end up working on as time goes on.

Pencils

image

I’ve been really into stationary lately, and my latest exploration is pencils. Current battle is between the Palomino Blackwing 602 and the Musgrave Pencil Company Tennessee Red.

The Blackwings are pretty well known and you can find a bunch of stuff online about them, so I won’t linger on them too long. With my testing so far they definitely live up to the hype (at least in my opinion).

The Tennessee Reds on the other hand seem to fly under the radar. The company is based out of Shelbyville TN (not too far from where I live) and they’re made out of Tennessee Red Cedar. The result is a pretty sturdy pencil that smells amazing when you sharpen it. The graphite looks similar to the Blackwings but I’m not sure I would say they write as well.

There is something wonderful about the tactile feel of the graphite on some good paper, the sound, and the motion of sharpening it as it dulls. I can’t say it will replace my daily writing pens, but I do plan to use them at my desk for meetings and perhaps for sketching if I get back into it.

Thanks for coming to my pencil talk 🤓

The Strangers Case

Grant them removed, and grant that this your noise
Hath chid down all the majesty of England;
Imagine that you see the wretched strangers,
Their babies at their backs and their poor luggage,
Plodding to the ports and coasts for transportation,
And that you sit as kings in your desires,
Authority quite silent by your brawl,
And you in ruff of your opinions clothed;
What had you got? I’ll tell you: you had taught
How insolence and strong hand should prevail,
How order should be quelled; and by this pattern

Not one of you should live an agèd man,

For other ruffians, as their fancies wrought,

With self same hand, self reasons, and self right,

Would shark on you, and men like ravenous fishes Would feed on one another. […] Say now the king,
As he is clement if th’offender mourn,
Should so much come too short of your great trespass
As but to banish you, whither would you go?

What country, by the nature of your error,

Should give you harbor? Go you to France or Flanders,

To any German province, to Spain or Portugal,

Nay, anywhere that not adheres to England,

Why, you must needs be strangers: would you be pleased

To find a nation of such barbarous temper,
That, breaking out in hideous violence,

Would not afford you an abode on earth,

Whet their detested knives against your throats,

Spurn you like dogs, and like as if that God

Owed not nor made not you, nor that the elements

Were not all appropriate to your comforts,

But chartered unto them, what would you think

To be thus used? This is the strangers’ case;

And this your mountainish inhumanity.

– William Shakespeare, Sir Thomas More

Ian McKellen Recital

The Bar-tailed Godwit

Behold, the Bar-tailed Godwit

godwit

This may look like a funny bird, but in reality it stands on business. Every year, the Bar-tailed Godwit makes a migration from New Zealand to the northern coast of ALASKA.

Yes, that’s right

7000 miles

8-9 days

No

Stops

That just blows my mind. This bird just flies with no food or water for over a week to fly from one side of the planet to the other. It just knows how to do that. Instinct guides it, pure will and determination keeps it in flight, just to bring about another generation of insane Bar-tailed Godwits.

I think about the challenges I’ve faced in my own life, the temptation to give up when it gets really, really hard, yet I kept going. In those moments I thought I had it bad, but that was before I knew about this bird. Holy crap.

Perspective is a powerful teacher, and my new favorite bird is the Bar-tailed Godwit.

Experimenting with Svelte

I tried Svelte a long time ago and I always admired the story behind it, but I haven’t used it for a full project yet. Been seeing it more and more, and after re-watching the documentary, I decided to knock out a small weekend project. That ended up being a revamp of my personal photography website steve.photo.

screenshot

My previous version looked similar, but was nowhere near as efficient. I left the static site approach behind since it just was not efficient for the image sizes I wanted to use (1-2mb). I also wanted the ability to add/manage photos while on the go without needing to bust out my laptop. Started small, just getting the images and initial styles setup, then moved onto moving my photos to Cloudflare R2 and the metadata into D1. Then it was just a matter of adding some simple auth, uploads, exif extraction, and some other goodies like rss and progressive image loading (the thumbnails load first and then the full size, and then slowly loads more as you scroll).

Overall really happy with how it turned out, and I gotta say, I love Svelte. It truly is more enjoyable, easier to read, and just feels like messy compared to something like React. My next big project might be rewriting my personal site… we’ll see 👀

GitHub
Tangled

The Peace of Wild Things

“When despair for the world grows in me
and I wake in the night at the least sound
in fear of what my life and my children’s lives might be,
I go and lie down where the wood drake
rests in his beauty on the water, and the great heron feeds.
I come into the peace of wild things
who do not tax their lives with forethought
of grief. I come into the presence of still water.
And I feel above me the day-blind stars
waiting with their light. For a time
I rest in the grace of the world, and am free.”

– Wendell Berry

Captains Log 1768956564

Updates from the bridge:

  • Been insanely busy lately with work which has been great but has not given me much time to work on side projects or do any writing. Hoping to break that pattern soon and write up a post on ATProto and why I think it’s important.

  • Someone recently launched a new RSS reader on ATProto that stores subscriptions on your PDS; brilliant!

  • Prepping for a wicked winter storm this weekend. Apparently the mice are also prepping by getting into our house:

    • Sunday: found a dead mouse next to the couch. Cats 1 Mice 0.
    • Monday: mouse hid behind a kid play kitchen, was able to catch it in our mouse trap and release it a few miles up the mountain (you have to otherwise they’ll come back). Cats 1 Mice 1.
    • Today: mouse was hiding in a boot, cat was pretty close to getting it. Shook the boot and got the mouse into the trap, released up the mountain. Cats 1 Mice 2. Hoping we don’t have to keep playing literal cat and mouse for the rest of the week lol.

Until next time 🫡

Juno Mission

Around July 4th 2016, the Juno spacecraft started it’s orbit around Jupiter. Its still there, gathering data, including images.

jupiter

They’re absolutely insane. You should check them out and get your mind blown by the universe.

Good Days

Yesterday was a really good day

image

  • Work was steady but learned a lot and it felt productive

  • Had a great bird list, even got to see another Yellow Bellied Sapsucker

  • Got some awesome Jazz records, especially this one (pictured above)

  • Visited our local wine shop to pick up a bottle for cooking, had a great conversation with the owner Matt (I usually do, great dude)

  • My wife used the wine to make a pumpkin bolognese which was out of this world (especially with the extra wine and jazz music to go with it)

  • Played legos with my kids until it was bedtime

I love good days, but I can also appreciate days like today that were “meh.” James Hoffman, known coffee expert, once did a great video about learning to taste coffee. A point he makes is that its ok to have “bad coffee” or “ok coffee.” If you do nothing but pursue the highest grade coffee that always tastes amazing, the definition of amazing changes.

Our measure of good is based on the contrast of bad; they must coexist in order for each to exist at all. That’s always been a beautiful truth to me, and so I take note of the good, and the bad as I experience them. It’s important to me that I remember both, maintain contrast, and appreciate both in tandem.

I made a standard.site aggregator

Found the domain docs.surf for $2.48 and couldn’t pass it up. I was already experimenting with Tap and how to index all Standard.site documents and publications, so it was just icing on the cake. Will do a bigger blog post on the whole process and architecture later this week but thoroughly enjoyed the data challenges and how the site turned out.

In other news/small updates:

  • My partner got two massive plants and the house has never felt better. Do not underestimate a lörge plant.

  • Got to take the telescope out this evening with my sons since it was slightly warmer than it has/will be. Great time looking at Jupiter, Saturn, and even the Orion Nebula 🪐🔭

Until next time 🫡

Domain Steal

I’ve been messing around with the idea of building a feed of all standard.site documents and evolving it into an aggregator, and omg, it’s going great. Already have the infra down, and I just found the perfect domain for $2.48.

Stay tuned 🤫

Bird Lists

Today’s bird list was excellent, particularly excited I got to see a yellow bellied sapsucker (what a name lol)

bird list

If you haven’t given bird watching a shot I can’t recommend it enough. Ideally get a bird feeder so it’s easy to see birds come to your residence, but you can also go to just about any park. Bring a notebook, and if you can a pair of binoculars. Lastly be sure to download an app like Merlin Bird ID that can help you identify birds you see. While I may sound like an old geezer, there truly are few things more exciting than seeing a new bird or something that’s uncommon or rare. Zen hobby 10/10 no notes.

Tape Collection

My tape collection as of today 📼

tapes

Once you go down this path you find yourself rarely using a streaming service. The thrill of finding something good, listening with intent; Apple Music/Spotify could never.