All Posts

An unpaginated list of every published post

2440 posts latest post 2026-04-19
Publishing rhythm
Apr 2026 | 40 posts

Ping 54

I'm regressing back to boomer ai for more plan mode style prompting at home... It does a decent job at ingesting a repo and coming up with plans before I start spending precious tokens.
View

Tokens Just don't go as far as they used to

Not sure if this is simply the flavor of the month, or a shift in gpt5.4 being super subsidized on release and now that we have gpt5.4-mini-fast out they have shifted, but I'm burning through half of my $20 gippity sub in a day with hobby level use. Second week in a row its burning so fast.
View

Stow comes with a local and global ignore list that you can use to ignore certain files or directories.

If you put Perl regular expressions, one per line, in a .stow-local-ignore file within any top level package directory, in which case any file or directory within that package matching any of these regular expressions will be ignored. In the absence of this package-specific ignore list, Stow will instead use the contents of ~/.stow-global-ignore, if it exists. If neither the package-local or global ignore list exist, Stow will use its own built-in default ignore list, which serves as a useful example of the format of these ignore list files:

Example given from the docs

RCS .+,v CVS \.\#.+ # CVS conflict files / emacs lock files \.cvsignore \.svn _darcs \.hg \.git \.gitignore \.gitmodules .+~ # emacs backup files \#.*\# # emacs autosave files ^/README.* ^/LICENSE.* ^/COPYING

Reference #

Ping 52

Is it just me or are the agents not behaving today?
View

Casey had an interesting point here. I think demitri came back with some sense of sanity that its just not how corporations look at employee cost, but I still thought it was a head scratcher.

Roughly translated not quoted

If the sellers of ai are telling you that your developers are going to be 10x productive, why are they only spending half their salary in tokens? Why not 9x?

Ping 50 A

I wrote code by hand today... I was out of tokens
View

I hate how he called out terminal user interfaces as shit… then proved web interfaces to be superior. Damn him. I love working from my terminal, but having ai prove itself through html reports including video, image, metrics, charts, and text is goated. Rethinking yourself has the bottleneck not the orchestrator feels real. Validating the work is hard, theres a shift right now and everyone is trying to figure it out. Lucas’s technique is a little bit of be lazy and tell it to prove itself to you, so as you juggle your 15 agents you have a nice report to read.

This is a really good guide, with quite a few good nuggets. I need to try deleting my AGENTS.md and rebuilding it from scratch more often. I liked how he talked about having agents prove their work and tell them up front how they will be judged. What I didn’t care for so much was the feeling that a lot of the rules go in markdown, thats not a rule, thats a suggestion. Rules should be deterministic. They should be tests and linters that ensure they are followed. Suggestions are good, but dont trust the agents to always follow them. And don’t trust that they wont change your rules, keep them honest.

Interesting take by Kenneth Reitz. Not quite sure how I feel about it anymore. It kinda hurts, but I’m not sure if code aesthetics matter as much as the product anymore. I cared when I was the one editing, but at this point I’m not doing a lot of edits by hand. Do these aesthetics affect the final products that users use, Not sure. AI makes me sad.

Prove Yourself Agent

Ask your agents to prove their work. Include it in the initial prompt, not later.
View

I’ve gotta agree with bob on this one, the first thing I did to my biggest brownfield project I wanted to use agents on BEFORE they did work was a hardened pre-commit.yaml, ci, hardened type checking and linting. SECOND get rid of bad inconsistent patterns, let them replicate consistency, force them to pass checks. Agents will follow all of your markdown suggestions most of the time, enough for you to become complacent if you let it. They are goal seeking, if you put them to a task you thought was possible that is not given your constraints, they will try to find a way given enough tokens. I dont see this ever changing, its one thing that makes them great, it just needs to be kept in check.

behind, yet positioned to completely dominate this race by hitting it with some sense. Making trends in what looks like longevity in the race that is not subsidising to simply get users, but to get by until they figure out how to 100x reduce the cost to a reasonable level. They feel like the guy sitting in the back with nothing big or flashy to say that is going to drop the hammer on their competition that overstretched itself taking on too much debt because it was necessary to change the game. There might be something to having a mix of hipsters, boomers, and luddites all trying to balance each other out.

An ai model created by Anthropic was announced as a closed preview on April 7, 2026 for critical security research and evaluation with its close partners with critical software such as operating systems and browsers. Anthropic claims that mythos is able to reason through so much more context that any model ever before. This enables it to find bugs that are 25 years old in the BSD, considered one of the most secure operating systems we have. Once it finds these zero day bugs never discovered before its able to use them together in malicious ways never expected. In ways the world is not ready for. At the time of writing these are claims without proof. It remains scary to know the potential this has and that there is only a few companies with this potential that will gatekeep who gets access.

What happens when the 0 days are exposed?

What's going to happen to all of our software when Anthropic Mythos finds all of the 0 day vulnerabilities? Will everything depending on the bugs break? Will it be possible to fix them cleanly? Will we all get pwnd when the bad actors get access to them before everything is patched? Will LTS Operating Systems Die?
View

5 star video, if you are going to watch one video to understand how harnesses and agents work, this is it. This really had my gears spinning on what tools do for agents and how big of a difference they make in their ability to manage context efficiently and accurately create changes. It’s crazy how good bash works, and that gives the agents the ability to do just about everything, but it could be better.

Clearing out Creige's Cellar for the Vintage Nectar.
Fighting the second Savage Beastfly in Far Fields

One of the biggest scientific achievement of our lifetime happened this week. I will forever remember sitting in a Culvers in between theater builds looking through these photos as they came live, looking at them in awe.

One of the most famous images from the shoot “Setting Earth”

A really interesting long form interview with @simonwillison.net. If you follow him closely most of it is probably not new, but I found some interesting nuggets.

Simon is writing most of his code from his phone these days using anthropic hosted platform. He mentioned that a lot of security risks go away when you don’t put secrets on the platform and you let them take the risk of running ai written code with ai chosen supply chain.

He talked about the Pelican Riding a Bike benchmark for quite awhile. He was surprised at how well of a proxy it is for how capable a model is at just about everything. He also said that when he runs the benchmark he also runs half a dozen others that he’s never talked about so that He could see if they were to train a model specific to his benchmark he could catch them, but it seems they had caught on and if they were they seem that they would already be doing it on all of his others anyways.

TDD is incredibly boring for humans, it strips so much creativity and joy from the process. Who cares if agents are bored they do better when doing TDD.

Absolutely sick texture app from cnc kitchen. Like him I’ve spent a bunch of time attempting and failing to learn blender, I’m so glad someone else vibe coded out such a good app that can just add texture to stls with basic masks and is the very basics of what you would want to add to 3d prints to make them interesting, I’m excited to use this for some real projects.

Wonka Letters
Wonka letters all cut out ready to get some stiffeners and go off for paint.

What is this job anymore

The job of writing code is dying, models are getting better, the average person will have their average features implemented in average ways with no effort by agents, the writing is on the wall. We are still trying to review most of the critical code, this is slowing us down, is it really stopping any bugs or giving us any more familiarity with the product, marginally. The time is now to grease up your UAT, testing, deployment pipelines. Dont let agents delete entire regions. Review your backup and restore strategy, you do have a DR plan right? Things are changing fast, the best of us are still better than the clankers. Most of us have more context than the clankers. Most of us have more intuition of what and where to implement fixes. Context windows and memory will be solved problems. Your DR plan, UAT, testinng and QA environments will not come for free, you need to make them, and deeply integrate them into your processes.
View
Hair Whittling Sharp
Hair whittling sharp, Do I get my redneck nerd card yet?
Llama In Pi Thinks Its Claude
I just launched ollama picked pi as it asked what harness I wanted to run, and it responded telling me it was claude.
Ty 0.0.26
ty 0.0.26 was released on 3/26/26, nice work planning.
What a banger of a tui, fantastic job cloning monkeytype. Looks so good. The toast messages are a tell tale built with textual.
Sparklines On The Feeds Header
View of the new markata-go feeds header with the banger of a sparkline.
Getting Excited For This New Feeds Page
This sparklines on this new feeds page are chefs kiss.

The year of the supply chain attacks

I think I'm starting to understand my role as a platform developer in 2026. * least priveleged access * default deny + explicit allow * understand your blast radius * **GREASED** creds rotate process * PIN EVERYTHING * keep packages up to date * but not too up to date, use dependency cooldowns
View

smassh is the coolest monkeytype tui clone, its impressively accurate. Easy to install and run, all the same themes appear to be there and everything. maybe a good way to get a few reps in while agents are running these days.

I need to go back and brush up on my skills I’m down a good 20wpm from what I should be doing.

The final nail for Windows?

Easy anticheat for linux is out. !!! tip look at the date If this were real what would you play first? For me it's `skate .` is really the only thing I care about and I'm fine without it.
View

I’ve been thinking about this for awhile and Daniel makes some great arguments here. Interestingly keeping inference cheap removes the incentives to make our tools better, help us choose the right model, lean on local models, open weight models. The frontier models are so affordable through subsidized subscription models why would you deal with anything less intelligent at this point. The tooling we use is not optimized for it, and why should it be.

emacs config so bad he launch obsidian, YIKES! grantid I’m using obsidian currently on my phone, not for this post, but for journal entries while I’m away from my desk. Use this as a reminder that you can swim through murky waters with your dotfiles for awhile, but occasionally its good to do a clean up, pin it, put em in a docker image, have a good fallback to go to if shit really hits the fan. Iv’e been using https://github.com/waylonwalker/nvim-manager as part of my strategy for awhile now.

Ping 43

Okay so I logged into twitter today, and we are back.... probably not for long, but we are for now. Claude Code source leaked, the tweets are great. [[ thoughts-956 ]], [[ thoughts-958 ]], [[ thoughts-959 ]], Some typescript css text layout with bouncing balls, bubbles, strings, and webcam video to text is blowing up [[ thoughts-957 ]]. This is the tech twitter I remember no sad news how the world is corrupt by the other side.
View
Wyatt's First Printed Cosplay Scales
Wyatt printed these sick scales today and they came out so good on first try, luckily Rhiannon already had the fabric for him and he was able to follow his passion on this project while the spark was lit.
Wreath Of Purity
Longclaw
Seekers Soul
Goal The Great Bench
Goal The Great
Updating The Arch Iso
Wyatt is working on a new arch install and it blew up, time to update the live image.

Social Media is dead

Social Media is dead, interest media killed it long ago. I no longer feel like I'm connecting to people, creating community, having fun, learning. I feel like I'm being shoveled slop from the slop machine, I'm sure mostly create by well intentioned people just trying to make it in the world, trying to make their mark, trying to make something of themselves. The algos long lost the idea of subs and likes, and transitioned to how long you will pause on a topic. What used to be a series of recognizable faces, names, avatars, each with their own personality that I could come to learn and know who was just trollin, who was serious, is now mostly unrecognizable. Platforms have changed and fractured communities people went separate ways, not all the same ways. No one community is like it used to be, and its hard to find.
View

/carry/

I try to keep a pretty light every day carry, but it never works out, keyfobs and headphone cases end up causing more bulk than I’d like, but My EDC is no where near the bulk I had as a kid with my cargo pants decked out with everything I could possibly need.

I hold no attachment to anything in my EDC. Nothing on my person has sentimental value. Anything I carry can be lost, stolen, or destroyed at any point in time. I pick things of sufficient usable, utilitarian, quality sufficient to work. No extra fluff.

Photo taken March 2023

...

3 min read

Where Is The Tech Industry Going

Agents suck Get left behind if you don't use them Burn out if you use them too much The software world has been flipped upside down seemingly overnight. Slow at first, then all at once. It started with auto complete, to chat, to, ide integrations, to agents that would f&!^ over your repo more than it would help. Up till this point we are just little bit better and more specific than copy paste from Stack Overflow. Then in Nov 2025 models learned how to effectively use tools and do what you ask of them, sometimes more, sometimes less, but generally for the basic shit most of us make its a net positive with each iteration. Our techniques for managing work need to change. Our expectations need to change. Burnout for a lot of folks is coming.
View

Is Compaction The Issue

I saw today in work chat something along the lines of "we need bigger context windows" "compaction times are holding us back". Maybe I'm just blessed with the lack of lord jira, maybe juggle too many projects at once and they are all pretty much done when I get back. Maybe I do more long running specs and spend time making good plans that it does not matter. Anyways the point I'm getting to is that if you think that compaction is your main issue slowing you down, and 10x this if you are a manager thinking this is what is slowing down your team you **need** to look at your workflow. Not because it sucks. Not only because it could be better. Because you are signing yourself and your team up for burnout if you are sitting there watching these things run like waiting for paint to dry and firing more prompts at them as soon as they are done. It feels easy. It feels like you are going fast. Its eating more brainpower than you think, and its not getting you to your destination any faster.
View

We f&#ing said @pype.dev, well f&#ing said. I think a lot of us are feeling this, we’ve pitched our brain into a bucket and we are no longer stretching it in the same way. We still work in similar ways of old, with new ways of turning off and saying yes a bunch of times. the best thing I can hope for is that as things get better we have fewer yes loops, and more architectural design debates and deep thoughts. But I fear deep thoughts are gone to the way of “research the leading 10 frameworks and pick the best one for this project.” and letting the clankers do the deep thinking. Its signing us up for a weird distopia.

I think a lot of us wish we could undo what has happened and go back to actually understanding what we are doing, but the world has changed, and if you are building average shit, like the average person, using models trained on average people doing average shit you cant keep up anymore.

I’m in step with @pype.dev here, I really want beads to work for me, but my systems for infra/platform work are all over the place, not one repo. I’m considering trying the BEADS_DIR env var but idk if it fits my workflow. For now, similar to @pype.dev, I am rocking my own home vibed solution that I’ve intentionally put little effort in and its working great and I expect it to be broken and not working with the latest harnesses and models within a few months anyways, cause there is no predicting this train.

oof, outage on the homelab during vacation, brutal. I can think of a couple of similar solutions to what @pype.dev has done to tailscale in, but I’m not sure that I could do this remotely. On one hand I’m so glad that cloudflared just takes care of certs on the other hand this really brings a gap in my understanding of what the heck I would do if it were broken.

An untested DR plan is not a DR plan.

An untested backup does not exist.

Vibe coding is going so far into the news sphere now that Adam Savage even weighs in with perspectives from someone who has built a life around building things with his hands, keeping up with new making techniques, discovering old techniques as they combine with new. He talks about 3d printing reviving his love of the pantograph as one automation technique eases the most difficult part of another.

Lets Land The Plane

Part of @steveyegge 's gastown/beads is a prompt "Lets land the plane". It's very straightforward forward and what any sane human would probably do before finishing work, except the last part. The "generate a handoff prompt for the next session" was not something I've put much thought into. But now that I juggle 6 sessions at a time and often end up with 20 sessions open because I don't want to close them and loose the last bit of context. This is what I need to keep from crippling my laptop memory from all of these stale sessions hanging around. ![](https://dropper.waylonwalker.com/file/b75a3a4d-679c-415d-9d14-231b0f75e0ff.webp) Taken from https://ianbull.com/posts/beads
View

I’ve been having issue with my keyboard disconnecting to my main desktop for awhile. Today I got a cheap bluetooh dongle in and am giving it a run this week to see how things go. The first step was to move it to the new adapter. I’ve never had multiple adapters installed so this was a new to me process.

I was able to do it all with the same keyboard, It did require some juggling between usb and bluetooth modes pluging and unplugging, two keyboards would be simpler to reason about.

I can’t be bothered to change my brain to think about this machine on a different zmk profile it is of absolute importance for it to remain on the same profile, otherwise this would be a simple bind to another empty profile.

I did it with bluetoothctl, I’m sure it could have been done with a gui like blueberry or blueman.

...

I love the level of thought that Jim has put into these changes and making sure that urls don’t change. I’ve got a big change in flight to my main site and this is one of the reasons that I’ve been sitting on it so long. I want to make sure urls arent broken, redirects work as they should, and there are no 404’s from existing urls. Currently the new version only exists on a separate deployement https://go.waylonwalker.com/

I also added the ability to “shuffle” between posts. This is mostly for myself. I like to randomly jump through notes I’ve published in the past for reoccurring inspiration

Love this idea and have it on my new site already as well, and have really enjoyed using it by pressing it a dozen or so times over the course of a few sessions. It highlights that I have too many posts like stars and thoughts and I should do some weighting to main posts. mine is at https://go.waylonwalker.com/random/

Does anyone think fast-code will continue to pay the same salary? The answer isn’t to switch your brain off during your McCode shift and write a poem after work. Your job will be replaced by a Banglasdeshi slop-shop if AI improves (which is inevitable, apparently). Possibly the same sweatshop that loomed my £3 T-shirt. The Luddites didn’t accept their fate so easily.

David has some good points here, but I’m feeling the opposite direction a bit. Execs have always liked keeping the PM’s and the people steering the ship close by and were willing to farm out more and more grunt work. It feels like we are in a weird phase where there used to be a big group of people paid to write code. A few of them are exceptionally good at it and will remain. There will be a need for these people everywhere. Somehow we still need people hand editing assembly code optimizations, fortran, and cobol today. Those industries largely moved on, but a few great ones remain. I think this fast-code slop factory is going to be a short forgotten time in history, but no one yet knows what’s next. We are all waiting to find out. Just with anything there is still value in doing it by hand and...

I don't want someone else running my agents

I don't want to review the pr, I dont want to fight the mass of changes clobbered across the codebase. I want to own my platform. With everything changing with agents writing more code than I can imagine in a day work looks different now. I still want to work with real people. I want to collaborate on ideas. I want someone to bounce ideas off with. I want someone else in the war room with me on launch day, or when the whole thing goes down. But I don't them slopping in my sandbox, if someone is going to be stirring the slop in my product I want it to be me. Work is feeling different now. New lines need to be drawn in new directions. Expectations are changing, the way work is completed is changing, and we are all here trying to figure out what this looks like moving forward.
View

Ping 38

When agents do the work its harder to recognize a dead end.
View

Learning to agent

All we are hearing lately is Agents are the future, something flipped around NOV 2025 with opus 4.5. It turned snake oil into action. It changed programmers will be replaced in 6 months to now. Not all of them, but probably most of us who are not extraordinary. If you fall into the camp of folks not adopting, I got no issues with that. No one is twisting your arm, well maybe your boss or cto is, thats on them. I don't mean to say this is the future as in, get in or get left behind. I mean it as this is where your other engineers probably are, the junior to mid level engineers are here. If you are not trying to meet them where they are how are you going to lead them.
View

Studio Ghibli Images in the Wild

I just stumbled into an image in my org chart of someone who clearly turned themself into a Studio Ghibli character in chatgpt during the small window of time that it seemed to do this for everything. Its clearly the aesthetic that It would do by default for that week, then would not do it whatsoever. I'd link it, but its from an org chart. I mostly found it interesting how we now have these recognizable artifacts from specific moments in time.
View

Ping 36

I feel like there's an inevitable phase to every ai/agentic worked feature/epic where you have to get in and chat with it 2025 style (except it actually works and doesn't turn your project to shit). Planning is great, planning out epics for full orchestrator's to churn for hours on is amazing, but it always leaves me with a handful of thorns multiplied by complexity level of things that I can shout a list of 6 items at a time that it can one shot. I haven't seen anyone put a name to this phase yet, so I'm going to call it the UAT phase for now and it seems like a very necessary part of the SDLC. It was important before, but feels more so now as engineers distance themselves from the implementation.
View

Research, Plan, Implement

I heard this term yesterday, and I think a lot of people are missing out on step 1. It's important to experiment with agents and learn what they can do well and what they cant, this changes every couple of weeks at this point. You might be spending hours planning something that could have been implemented right away, or maybe wasted time planning something that needed more research, more context engineering. Agents start fresh every session, they cant remember what you asked them to do 5 minutes ago in the other session, getting the right tokens in session is critical.
View

Today I learned that docker creates an empty /.dockerenv file to indicate that you are running in a docker container. Other runtimes like podman commonly use /run/.containerenv. kubernetes uses neither of these, the most common way to detect if you are running in kubernetes is to check for the presence of the KUBERNETES_SERVICE_HOST environment variable. There will also be a directory at /var/run/secrets/kubernetes.io/serviceaccount that contains the service account credentials if you are running in kubernetes.

Context Poisoning Was There All Along

I wrote some code by hand on Sunday. Sat down with my son and started building out a game in pygame from scratch. We went to google, we searched how to do something, we copy and pasted from the docs. Not because we are dumb, but because we cant remember some aspects of the pygame api. Now that these patterns are established we no longer have to google them, we simply grep our codebase and replicate the pattern. Easy right? It's funny that it took ai to coin the term `context poisoning` even though it was there all along.
View

If you’re into interesting projects, don’t miss out on qmd, created by tobi.

mini cli search engine for your docs, knowledge bases, meeting notes, whatever. Tracking current sota approaches while being all local

Agents cannot replace the thinking, they only amplify it

Agents cannot replace the thinking, they only amplify it. If you set the agents off in the wrong direction that's where they will go. They will sprint there faster than you can go. This is ok, its one of their advantages, they can give you signal quick. Remember if they are off in the wrong direction more research and planning is needed, and maybe a little bit more thinking on your end to steer them in the right direction.
View
Almost Cheesed It To Port Aquelite
Its A Trap
Collection Party Balloon
Collection L Bracket
Wyatt Hits The Gap

Great gusto here from someone looking to fill landfills less. Get more use from what they paid for. Dodge some tough times in the hardware industry. I’m going to argue that the 10 year computer is not one bit crazy right now. No idea what the future entails, if local llms get good enough to really get so useful they feel required this could easily change. One issue I had with the post as they are looking to get a machine for the next 10 years is they were so focused on themself that they missed the point. They were so focused on buying something that would work for them for 10 years that they bought something brand new rather than thinking about the bigger issue of how do we get hardware to last 10+ years. Some factor of this involves giving our devices a second life. Two things went wrong here. First it appears they they have a perfectly good imac with a broken screen. I know nothing about apple/imac, assuming that the screen is toast and unrepairable, I know you can ssh into a mac this feels like good potential for server hardware. Next they purchased a brand new mac mini. Hardware has been good for a long time, there is no need to buy new right now, especially now. I haven’t bought a new machine in years and most of my hardware is second hand cobbled together stuff, and has no issues. I’ve got one machine thats 16 years old, 2 machines at 9 years, one at 8 years. To get here they need to be repairable, designed to last, and probably no run windows as they will release something that renders them too slow or require new hardware for security that wont work.

Very interesting takes from @thdxr in this interview. A lot has been hashed out by others all over the place, but a hot take here is that code quality is higher than ever right now. Codebases are becoming more consistent than ever. If you are not starting with a good consistent base from the start you are poising your context and doomed to fail and have all the common failures of ai written code. He still reads almost every PR, and will read all of the code eventually. There are a few cases where reading the PR is not worthwhile only when its low stakes, knows that good patterns have been established and followed. He argues that someone needs to be the expert of the code and of the product still and fears that too many people not looking at prs will fail companies.

Thinking about ai productivity again

Thinking about AI productivity again. It's allowing massive amounts of work to get done, to levels that humans cannot physically type out in some cases. But not all of this work is necessarily high value work. Right now I'm working on one of the biggest PRs to an internal cli library. Probably the largest PR I've ever done professionally. It touches all of the cli, refactors every command, reaches into the business logic layers to drive deeper separation. I reaches into the common layers to drive consistency. It ensures that every command (50 or so) has similar flags, supports --plain, --no-color. It specs out contracts to ensure that data goes out stdout, any extra goes out stderr. This makes everything unix pipe friendly. There was quite a bit of research and prep that went in, that turns out to already be distilled down into clig.dev. The point is that this is all good work. It will make the product consistent, repeatable, expected, and most of all boring. Most of the time, it wi...
View
Dummy13 On A Skateboard
Tonight Wyatt gave me a dummy13 that he printed, assembled, and posed all on his own. He's printed quite a few of these in the past, and none came to this level of completion. I'm so proud of him. This one was a near flawless build with only a few mistakes, that I'd argue were poor design, small vertical pins. More importantly he was able to problem solve and use resin to fix these mistakes.
Groal The Great Fail 1
Groal The Great Fail 2

Kids are leaving the party early, not drinking, cant watch netflix without the laptop open. They are leaving the party early to check on their agents. I get it, that feeling that you need to eek out one more prompt, keep your agents running. if they arent running what are you even doing. If not you 6 others are ready to pass you up. The timeline to be first has shrunk to nothing but unachievable.

It’s wild how much of a hit Google took from killing reader, almost any time I hear about killedbygoogle, reader is the top of the list. Its the thing that we all remember being really good and the incumbants just did not match up. Somehow we are here 13 years later still bitching about it, despite it only having a 6 year run. You should probably get an rss reader, and follow some incredible people that make feeds. Most sites that produce content have the ability to subscribe over rss. Unlike @pluralistic.net, I dont read in my reader. My reader is just a list of links out to the web and I typically read it how the author intended on their site. I nod a long to Cory’s enshitified internet just as much as the next guy, I love text based interfaces, I despise the bloat that js has brought on. But I don’t believe all js is bad, I don’t turn it off, even though he has me questioning this now. News sites kinda suck, we can agree there, but its rare that a small indie web creator has fully enshitified their site with js. I don’t buy that. Sub to the feeds.

Did you even like to code?

Here's something I've been wrestling with lately. I keep hearing people come to the realization that they never liked coding, they thought they did, but secretly hated it the whole time. I dont think I've ever kidded myself about this. I like building things. I like having an idea and see it come to life. Just because I like the end product more, and that coding really was a means to an end, something I will never do again in the same capacity that I have in the past, does not mean I did not enjoy the art of solving problems by typing syntax into a file to tell a computer how to solve a problem.
View
Credits

The only thing that seems interesting is AI right now

The only thing that seems interesting is AI right now, I'm writing less code, and I kinda just don't care as much about the small open source stuff as I used to. I enjoy reading about what other people are thinking, doing, creating. But when I go to grab a podcast while I wait on my clankers its one talking about how other people are using them, how to make them more secure, more effective, how the new models change things, what models are good at what. It's all so new and changes so fast. Any sort of new open source project starts out sus that it was just vibe coded anyways, So at the moment it feels like ooh how did you get that, how do I make mine, and that the thing itself has less value. I hate that its this way, but it is.
View
Running through the layers of the tmx 3x6+s. gaming keeb.
Promo video for the tmk 3x5+3 gaming keyboard.

It's all moving so fast

AI is moving so fast this year its hard to keep up, I've written 3 or 4 versions of one blog post to replace I'm Out On Agents [1], but it feels like everything changes before I can get it out. References: [1]: /im-out-on-agents/
View
Tgo V0.1.0
tgo v0.1.0, tmux session switcher written in go

I Built A Tmux Session Switcher

I’ve been thinking about this for awhile now. For years now, fuzzy pickers and last session have been my go to. They have served me well. I can typically only keep so much in my head anyways. I’m often doing a hub and spoke pattern between main project, notes, and infra repo, maybe two projects. Don’t get me wrong, I regularly run with a dozen or more sessions running at a time, but only two to three are in my immediate context at any point anyways.

harpoon for tmux

press a hotkey followed by one more keystroke, currently any left hand letter SIMPLE, FAST, thats of utmost importance, what I want are sessions that I can can be assigned in order of importance from middle row, top row, bottom row.

...

3 min read

Is gpt-5.4 slow?

What you don't have six agents orchestrating the work of 6 subagents yet. I saw in a work chat that people were complaining about 5.4 being too slow and they keep going back to opus. For me its been working great, I have it working on critical infrastructure work, that I will need to maintain. I appreciate its accuracy and completeness. And honestly I'm **rarely** watching agents run. Its like watching paint dry at this point. Its interesting to read their thinking prompts, but not productive work. While its running I'm teeing up the net prompt. Working with another set of agents to write a set of issues for the next epic. I might be too privileged though. I own a whole platform and have plenty of autonomy to work on what I see fit for the day. I don't have a boss breathing down my neck waiting for a single ticket to be complete. I'm working on 6 projects at a time. I'm taking walks to avoid becoming a burnt out zombie. I'm definitely not complaining about it kicking out massive amo...
View

We are the Grey Beards

In November 2025 everyones beard lost its color, we aged into the next generation without realizing it. If you were getting paid to write code at this point in time, you are part of a special point in history where we used to write code by hand. There will be systems air gapped systems somewhere devs will continue to do it how we've always done it, some day they will peek out of this cave and realize that they are the only ones left, no one else remembers what its like. Writing code will quickly become a hobby that people do, in a weird niche way. Not because you want to build something, but like the guy with a mainframe in his garage that likes to watch the lights blink. Because its nostalgic, it's a very cool skill, its fun and rewarding, but it won't be to get something done.
View

Clankers got me tired

I spent all day grinding on a 20 minute fix. I want the agents to do it. They can do it, but they are missing the harnesses they need to replicate my workflows of old.
View
This is the results of a one shot markata-go searchcraft integration

In the age of agents sometimes work gets done on so many different worktrees and branches its hard to tell if there is already a PR or any of them or not, the great gh cli has us covered.

cli
Waiting For My Weekly Token Allowance
Openai gives me a token allowance for my $20 tier subscription, if I'm careful it lasts a few days of heavy side project work.

One of the well worded shitty messages I’ve seen, good severance, help, timeline to cut off coms.

we’re not making this decision because we’re in trouble. our business is strong. gross profit continues to grow, we continue to serve more and more customers, and profitability is improving. but something has changed. we’re already seeing that the intelligence tools we’re creating and using, paired with smaller and flatter teams, are enabling a new way of working which fundamentally changes what it means to build and run a company. and that’s accelerating rapidly.

Much better than the get rid of people cause AI can do the work. Honestly I feel this though. I was just talking with some colleages how do we divvy work in the age of agents without just constantly walking on each other. If each of us is now an architect who is managing teams of junior agents under us it feels MUCH different than before.

I’m far from working in a large software org like this and I’m feeling it. I only imagine that it gets worse the more people that have to orchestrate around each other.

...

The Ghostty Guy

I was today years old when I realized that the ghostty guy is the Hashicorp guy.
View

This was the inspiration for the next update in dropper that became a full clip editor. The one that I’ve long wanted, but forgotten about. It’s going to include this cropper, resize, image extractor, and trimmer.

Learned about this one from the @stipete interview @scotthanselman did on YouTube. This is proof that the internet is alive. It’s such web 1.0 nostalgia to see that people can just build things! Did you know that you can literally just build things and make them exist? You don’t need users, You don’t need a big platform, you can just make something into existance. It seems like something we have forgotten through web 2.0 where everything as become 4 major apps all linking to each other and trying to hoard all of the attention. Scroll through tehre are some really cool apps, probably nothing that has the polish you want, or is going to change your world. What these apps have more than anything you’ve probably used in the recent years, is inspiration. Its xyz, but the way I wanted, or with my little twist. And no one else has to like it but me because I’m the user.

I saw this in @cassido’s newsletter this week and had to give it a run. I despise that there is no dark mode and it insists on burning my retinas 😤. But really this is an absolute beate of a web based markdown editor, I love the command mode to press slash and it just pops out in this whimsical animation ready for me to pick what I want.

Editing a Session Skate Sim clip inside of dropper with trim, scrub, and crop.
In the video clip you can see me reload into the latest version of dropper that supports video thumbnails, turning those unknown clips into a collection I can recognize.

/verify

Inspired by @mollywhite’s verify slashpage. This page serves as the system of record for my online identity. The best places to follow me are:

1 min read
Gma Silk Fail1
Post Lace2 Dream
Lace2

I had no idea there were such things as “reply guy” as a service. I can see this as a really genuine thing where brands want to genuinely engage with their communities, quickly being taken over by slop bros to ruin everything.

THIS, THIS is how most people are feeling about AI right now. Theres lots of “oh ai bad”, “but ai help”, “but ai company sleezy”. Cassidy did a fantastic job summarizing how most of us are feeling. Ending with well at the end of the day, I can’t do anything about the bad, the best thing I can do is learn how to embrace the good cause it aint going away any time soon.

Thoughts Cluster Looks Like A Flower
My thoughts connections made an interesting flower layout.

This is an abolute banger of a game on itch. It nails the nes aesthetic while keeping true to the modern silksong movements. You can play through the first boss Moss Mother, and where you start the first ascend into Bone Bottom. I was in shock when I discovered the little climb effect hornet does when you just cant quite make a jump, the hold jump for height is on point. Her downstrike with the hunters crest is perfect.

astral silently dropped a clever uvx.sh to help builders reach a wider audience, no longer does a user need to have python installed prior to installing a python cli. It does have a hard requirement on having curl or wget available.

Such a good interview @lexfridman is such a talented interview. It’s so cool to see the other side of this. For weeks we’ve heard about the story of the name change, we’ve seen everyone shitting on the security model, buying up all the mac minis in existance, fear mongering not to install this thing. @steipete.me has such a cool story from the beginning talking about making this thing fun and exciting. Giving it a personality that is not “You are absolutely right”. The story of changing the name twice, and getting pwnd on every step the first time and nailing it the second time is incredible. Dude is having fun trying to make the thing he wants in the world exist.

Happy Valentines Breakfast 2026
A one eye'd pirate (egg in toast) in the shape of a heart for Ayla.
Swapping themes with the theme picker cli and watching the output change within about 1-2s live reloaded in the browser.

I keep forgetting about the double gutter problem with nested containers. When you put padding on a parent and the child also has padding, you get twice the spacing you wanted.

.container { padding: 2rem; } .child { padding: 2rem; }

Now your content is 4rem from the edge. Not what I meant at all.

Either remove padding from the parent or use box-sizing: border-box and plan for it. I usually just drop the parent padding when I realize what I have done.

First W In Brotato

After having brotato and doing a few runs every once in a while I finally beat the most basic balanced run in the game! Wyatt wanted to play tonight and its such an easy game to jump in do a few runs and move on without getting overly invested.

Watching back I cannot believe how lucky I got, barely scraping by with 1hp at this point

the last 80s of the game

1 min read
Taking the W in a brotato run

/top4

Definitive ranked lists of my top 3 favorites plus an honorable mention.

Honorable mention: ipython

Honorable mention: typer - fast cli apps

...

/yep

Inspired by @fyrio’s yep slashpage, a list of S tier things I enjoy, use, recommend, want to know more about, or seek out in no particular order, updated as I think about it.

/nope

Inspired by @baty’s nope slashpage, a list of F tier things I don’t like, don’t care, avoid, overhyped, or won’t do in no particular order, updated as I think about it.

Gradient Keycap Results
The gradient keycaps turned out pretty good, but I'm not sure what I did wrong with the interface between the raft and the caps, that came out ** rough, but the effect works.
Camp Rock Sign
Camp Rock Sign all put together, by the fabulous Rhiannon, the letters came out great, her work on the built is amazing, cant wait to see it lit up.
Gradient Keycaps In Bambu Studio
I have an idea for gradient keycaps using tri colored filliment, I'm excited to see how it turns out.

Pm Not Babysitter

Stop babysitting your agents, treat them like a real team and they will reward you.

Back in December I saw theo make a comment that code is now cheap, its the run rate of models, He quoted a study, not sure that he fully even believed it, but it claimed that the average developer after all meetings, training, emails, planning and extra shit in their day averages out 10 well tested lines of code per day. Opus 3.5 made him 10k loc (lines of code) that day.

We have all agreed for decades that lines of code is not a proxy to productivity or quality. Often more code means more risk, more review, more infrastructure. This has become MUCH different. Lines of code are still far from any sort of good metric. That aside, your agents are not doing 10k lines with you babysitting them, and in fact its very likely that the product quality is MUCH worse as you babysit them.

...

Like a dufus this morning I did a hard reset on a git repo for getting I was working on a manifest for. You see I generally use argo, but occasionally I have no idea what I am doing or want yet and I start raw doggin it, fully aware that I’m going to just nuke this namespace before getting it into a proper argocd.

I was overjoyed when I found out that you can diff your manifests with live production using the kubectl diff command. It uses standard diff so you can bring all your fancy diff viewers you like.

# regular manifest kubectl diff -f k8s/shots -n shot # kustomize kubectl diff -k k8s -n go-waylonwalker-com # using a fancy diff viewer kubectl diff -f k8s/shots -n shot | delta # using an even fancier diff viewer # pinkies out for this one kubectl diff -f k8s/shots -n shot | delta --diff-so-fancy

Now I can get those changes back that I thought I lost, and apply updates with confidence knowing what is about to change.

If so many developers are so extraordinarily productive usi…

Not surprising theirs a lag, between the models getting better, the tools getting better, and the masses getting better at using them, it takes time. This is still quite a hockey stick. I’m wondering how many are not posting on Show HN embarrassed they built something they know nothing about and afraid to get questions. I have no idea how anyone would get this ratio, but if I were a betting man, Id bet the ratio of build/show went way up. Plus we are probably getting a ton of people who have never heard of HN start building cool bespoke things for themselves and thats it, they use it, they love it, they might tell/show a friend.

...

If so many developers are so extraordinarily productive usi…

Not surprising theirs a lag, between the models getting better, the tools getting better, and the masses getting better at using them, it takes time. This is still quite a hockey stick. I’m wondering how many are not posting on Show HN embarrassed they built something they know nothing about and afraid to get questions. I have no idea how anyone would get this ratio, but if I were a betting man, Id bet the ratio of build/show went way up. Plus we are probably getting a ton of people who have never heard of HN start building cool bespoke things for themselves and thats it, they use it, they love it, they might tell/show a friend.

...

Camp Rock Letters
Camp Rock Letters going on the print bed for the show choir.

Ping 23

I taught wyatt `#bada55` green, I apologize in advance, I underestimate the power of immature humor has on him.
View

I tried this flow [of running an opencode server on tailscale] on day one of getting opencode, I wanted to prompt from my phone while were were running lights at the theater. It kinda worked, but the ui was really bad on phone, hard to use and the experience overall–it felt buggy. Happy to see they are making improvements and it might now be ready for some real use.

https://dropper.wayl.one/file/9065fcb2-5e40-479c-967e-498bc9bb6a4f.mp4

Ping 21

Agents right now * can I access the project you mentioned? > yes * Can i access /tmp > yes, just do it * While I'm I at it, `kubctl delete...` > yanks plug front internet
View

Agent Management Is Exhausting

The state of development in early 2026 is all wrapped around learning how to manage many agents running in parallel. Everyone’s trying to figure out the workflow.

The secret I’ve discovered is a good, well-defined plan. This could be a markdown file or a GitHub issue. Agents are actually great at writing these for you. They’ll include reproduction steps, outline changes needed, and structure the work.

This is your opportunity to step in. Read the plan. Look for hallucinations. Spot where it’s going off track. Edit the plan before the agent starts coding.

...

Stop Using Boomer Ai

I was listening to these guys talk about migrating off of boomer ai the other day. Introducing the term boomer ai to describe using chat, copy, paste instead of agents. Something magical happened to the tooling and models around december, they got really good. The chatgpt $20 plan hooked into opencode is good, the Free models in Opencode Zen (Big Pickle and Kimi K2.5 Free) are really good. Neither of these quite match up to the speed and quality of the larger plans, but they are good. good enough to throw away your boomer ai techniques and start using agents. Agents are the future, and they are here now. If you are still using chat, copy, paste, you are doing it wrong. Stop using boomer ai and start using agents. You will be amazed at how much better your results will be.

I’m jelous… as I was getting better, I got kicked down again. cant hold a conversation without coughing. Its hitting people from all over like crazy this year. so glad its just the flu and not something seriously harmful for hospitalization.

Mentions

I can now just mention people from my markata Waylon Walker [[ blogroll ]] like @simonwillison.net or @swyx.io

/now [[ upto ]] [[ doing ]]

Aside

...

1 min read

What Your Coding Tool Says About You

open code - libre free as in beer and speech Copilot - corporate 9-5er Cursor - You sip on Philz coffee with your macbook Claude Code - Agentic Workflows or Bust Jetbrains - I didn’t know you wrote java Vim/neovim - definite neck beard VsCode - What else is there?

I really wish I would have got this right a few years ago. Theres a couple of flags I had to use to get mdformat to do hard wraps at 80 characters and not wreck tables. This mix of flags and plugins is workign really well for me so far.

mdfmt() { uvx \ --with "mdformat-ruff" \ --with "mdformat-beautysh" \ --with "mdformat-web" \ --with "mdformat-config" \ --with "mdformat-gfm" \ --with "mdformat-front-matters" \ --with "mdformat-wikilink" \ --with "mdformat-simple-breaks" \ mdformat \ --wrap 80 \ --end-of-line lf \ --codeformatters python \ --codeformatters bash \ "$@" }

And as pre-commmit.

This post was filled with real life, snark, entertainment, feelings. I get a lot of these emails that claim they can change my SEO game if I give them 500, for a site making 0, Link partnerships from small startups. A lot of these are so automated that if I do respond I dont even get a response. I’ve responded to many simply asking what is this about, I get 10 others just like you a week. Can you tell me what exactly you want and what each of us benefit from it, how did you find me. All normal questions, they almost always result in crickets, no response, maybe its time to implement a Billie for more snark.

Ping 19

What no one is talking about is that Deegs doesn't get the red plate without Anstie on the ground. ![](https://dropper.waylonwalker.com/file/6cf67bcf-5111-4ee0-892e-0407eb1acdbe.mp4)
View
Trobio Full2

What is that

I was unironically asked what is that about my keeb today. Followed by no way that works, how would you type a, s, y, u, after showing, I go the "that's weird" walk away.
View
Hornet Sitting
Trobio Fight
Trobio Full

📝 Git Notes

See old revisions of one file # git log --oneline -- <file> git log -n 2 --oneline -- <file> Checkout an old revision of a file # git checkout <commit> -- path/to/file fuzzy pick a file and check out an old revision # #!/usr/bin/env bash set -euo pipefail file=&#34;${1:-}&#34; if [[ -z &#34;${file}&#34; ]]; then file=&#34;$(git ls-files | fzf --prompt=&#34;select file > &#34;)&#34; || exit 0 fi if [[ -z &#34;${file}&#34; ]]; then exit 0 fi if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then echo &#34;Not a git repository.&#34; >&2 exit 1 fi if ! git ls-files --error-unmatch -- &#34;${file}&#34; >/dev/null 2>&1; then echo &#34;File is not tracked by git: ${file}&#34; >&2 exit 1 fi choice=&#34;$( git log --follow --pretty=format:'%h %ad %s' --date=short -- &#34;${file}&#34; | fzf --ansi --no-sort --reverse \ --preview-window=down:70% \ --prompt=&#34;checkout revision > &#34; \ --preview &#34;git show --color=always {1}^..{1} -- '${file}' 2>/dev/null || git show --color=always...
1 min read
Heringbone Fingerboard
I just finished up my latest 6 ply wood fingerboard. I used scraps of purple, blue, red, and gold from the first 5 boards I built to make this pattern.

Dont Trust Users Tokens

User states: Upon picking up an old project and trying to install pip says “cannot find a version to satisfy”

I’ve got this, I’ve had this a hundred times before it’s a python version, a rogue package, maybe a yank from the pinned deps. I pop open the project get us on the same commit. I get a different error, make a few updates and we are good, except the user gets the same error from the start.

They never saw the error I did, and my fix did not magically resolve their error. We circle all the things it could be for hours. I consistently wipe my venv, and recreate with ease, send them the commands I ran to no avail. Something is up and I can’t put my finger on it. We’ve checked all the things and inched as close as we can to running everything exactly the same.

...

2 min read

What a goat, speedrunning silksong at a competitive pace, live, with live audience, while co hosting, and raising $2M for Prevent Cancer Foundation. CEEN moves in ways that do not compute with my brain, everything looks so simple, things that take me so long are done in a few swipes. Watching this it really make silkspear look OP, this thing does so much damage if you never take damage and can use it continuously without needing silk for healing.

High Halls Gauntlet Ending
Conductors Melody
Top Spool

Opencode is changing on the daily right now, today I noticed the word low pop up in Orange text in my opencode window. Looking into this they are exposing variants to the user. This allows you to change between fast or slow and thinking, the later taking more time to prepare before doing an action.

It looks like this toggle may have been here for awhile and I’m just now discovering it. Potentially because its a new feature of the free Zen provider.

Variants Many models support multiple variants with different configurations. OpenCode ships with built-in default variants for popular providers.

Built-in variants OpenCode ships with default variants for many providers:

...

The answer is I do it habitually. If there’s a big enough idea I’ve had floating around in my head and I think others might find it useful / interesting then I usually think it’s worth logging it somewhere. If I don’t, I’ll likely just keep thinking about it so might as well get it out of my head and on the internet where people can find it.

This is how you do it. If you want to do something, you need to make it a habit. Something you crave, something you need. I need to write my ideas down in this blog, it helps me index ideas for later, but more importantly it helps me flesh them out and think through real things.

Congrats on 1k, your site is awesome Hammy

Ping 17

I'm not sure if its good to keep issues and plans in the repo long term, but I'm going to give it a shot. > read @pages/issues/issue-1.md create a plan to fix the issue, then write your > plan to fix in @pages/plans/fix-issue-1.md
View

Never believe in absolutes, see what I did there. The hype bros will take you to the extremes, ai will take your jobs in six months or be burned to the ground in six months. How about its useful now and will be more useful in six months. If you turned off the hype bro feed for six months you would probably be fine, in fact you would probably be better off for not capturing so much noise along the way. AI has gone the way of next js framework, it churns fast, hype bros are always an expert that know exactly whats best for everyone. It changes fast, what was the best last week might be dead next week. In fact getting to know what works well for you and knowing that tool really well for a longer period will take you farther.

Salesforce gets pwnd by the ai hype bros and killed its reputation with employees, letting them know where they truely stand with them. 4k people sounds like a lot, its probably a big chunk of savings, but was it worth the loss of reputation? There must be a better way to give this a trial run that lets them understand this before disrupting the lives of real people right???

Broodmother Eye
Big Flea 1
Cogfly
Beast Crest
Clawline

Ai

Last updated Jan 2026.

Ai is a tool I use a lot for code generation, research, image generation, and debugging. The words I publish on this site are my own unless explicitly stated from the top. There’s only one or two posts in this category.

The core of what this blog is, is my thoughts ideas, sharing experiences. The words are the important part. They are not perfect, I often do not spell or grammer check, and what is here is from a flow state of writing and very often not refactored.

...

Portajohn Progress 01 10 2026
A cutaway of the portajohn keyboard progress, it shows the internal trace from the bottom along with built in supports, reset button, power button, microcontroller cutout. I'm getting very happy with the progress. I really like the feel of the latest build, and can't wait to have this solid build out there.

I thought this was an interesting take from Simon. I’ve been hearing him consistently say there will be more demand for software engineering in the future. More companies will have the ability and need to deal with software applications, but fewer of us will be hand editing any code. I thought this was an interesting interaction in the clip.

Uh Simon, what do you got for us?

I’ve just got the one. I think the act

of the the the job of being paid money to type code into a computer Yeah.

...

Og-Sample

I’m making an effort to make my og images better yet again, I’m going for that next 10% better. I really like my og images, but there are some title sizes that overflow. This page is a page to help debug. How I make these og images is for another day.

I use my own static site generator markata. I can use it to generate a list of posts wrapped in their og image. I use itertools to do a groupby so that I can do roughly every 5 characters larger, and see a wide variety of sizes.

from markata import Markata from itertools import groupby markata = Markata() lens = [{'length':...

...

1 min read

POG: Play Of the Game - used to express shock or excitement after a noteworthy moment.

Broodmother Ending
Broodmother

2026 Resolutions

It’s that time of year, Coming back to work out of a big break and thinking about big changes.

Keep up with daily notes, maybe not here, I tend to have more targeted notes here with full blog posts, but for work daily notes is POG and needs to be leaned on. LLM’s do really good at ingesting markdown and reminding me of things that I need to do, or did, or need to follow up on.

Social media is changing, quickly becoming enshitified, I enjoy interacting with some of the people I’ve met online, reading their opinions, and learning from their experiences. I don’t need their hot takes, don’t care about their political takes. I like boring posts that typically fade out of whats picked up on the algorithm. I like a good 5-10 minute read or a long form podcast talk. I will be aggressively collecting more rss feeds to read and keep up with.

...

Faydown Cloak

In all of the documentaries I’ve seen on how hard it is to recycle plastic, how hard it is to separate all the small pieces from each other, how expensive it is, dirty it is, how just plain ineffective we are at doing it I’ve never seen this angle. In a nutshell the other side of the equation is that as we pull natural gas out of shale is that we pull ethylene out as a byproduct. We don’t even ask for it, it just comes with the methane gas that we are going for. So as we drill, Frack, and mine this out to heat our homes and create electricity we are stuck with all of this ethylene. It’s terrible for the environment, just like methane it’s a rough greenhouse gas. Companies are allowed to flare off a certain amount, they can push some down the pipe, but are still left with tons leftover that they practically give away. Turns out that this stuff is very cheap and very much wants to be turned into plastic. Very clean food grade plastic, very easily and cheaply compared to recycling. Excess is a big problem that needs solutions, but it has hard problems at both ends of the situation that don’t make it easy for anyone trying to take care of it.

Extract text from MDX files, removing J…

Damn this one is getting some reach, I’ve seen it from Simon Willison and Justin Searls and t3.gg. I feel for Adam, He has built a fantastic product that the world is running with, something we all needed. Something that everyone laughs at turns their nose up “ppft I don’t need that” the first time they see it, but once they try people get it, and a lot of them like it...

...

While the non deterministic nature of llms scare the heck out of me in the sense of just cutting it loose on my writing. letting it go through all of my files and just edit them. I do like the idea of mundane tools like “desaturate”, “Gaussian blur”, evolving out of it for text. I don’t yet see this with the tools we have now, but it will be interesting to see them evolve.

Hornet On A Bench
Hornet sitting on a bench. I 3d printed, painted, and assembled this set. I really like how the bronze bench with gold highlights turned out. The distressing on her nail and dress look great in person, and don't come through the best the way the image is lit.

file over app is a fantastic philosophy laid out well and concisely documented very well in this post. The idea is that tools will change, we will want to use different tools, different editors, different computers over time. What’s likely to outlast everything is plain text files that we can interact with a wide variety of tools. Not encrypted in dedicated formats that die with our tools, but in plain text where a computer from 2160 is likey as capable of reading the file as one from 1960 would be.

Kickflip down the 3 set using my new hand made 5 ply fingerboard.

Today I discovered vim-speeddating by tpope. I’m sure I’ve seen years ago but it did not click for my workflow until today. I often go through pictures from my phone for the past few days and make Posts tagged: shots posts, but I want to date them to about when the image was taken most of the time. This allows me to quickly bump days up and down using c-a and c-x even around the new year.

Sound on, listen to those new switches.

vim
I'm Loving These Akko Creamy Yellow V3s
my latest porta john full mx build with Akko Creamy Yellow V3s installed on the right side and a hodge podge of Durock Lupine and kaihl browns on the left.

new keeb so good

New keeb feeling so good I don't want to leave it. I'm going to go from having my worse favorite at work, to having my new favorite at work. ![](https://dropper.waylonwalker.com/file/9cf75771-e3a5-428f-a3a9-0e32fda0e037.webp)
View

Yesterday I wrote about a way to do light mode screen recording to convert to light mode from dark mode with ffmpeg. I was wondering if it could be done entirely on the front end for web applications. Turns out you can. I’m sure there are limited wikis and site builders that don’t allow adding style like this, but it works if you can.

<video src="https://dropper.waylonwalker.com/file/1c53dbcb-4b84-4e94-9f04-a42986ab3fa1.mp4?width=800" controls style="filter: invert(1) hue-rotate(180deg) contrast(1.2) saturate(1.1);" > </video>

I saw this tip from Cassidoo and had to try it out for myself. I kicked on a screen recording right from where my terminal was, converted it, and it actually looks pretty good.

ffmpeg \ -i screenrecording-2026-01-01_10-10-49.mp4 \ -vf "negate,hue=h=180,eq=contrast=1.2:saturation=1.1" \ screenrecording-2026-01-01_10-10-49-light.mp4

Dark Mode

Light Mode

There are a few unsettling things about it, but overall I feel like it was a...

My First Hand Pressed Fingerboard Complete
My first hand pressed fingerboard with teak tuning trucks. It has a purple bottom layer. Sitting on the bottom of a 3-stair.
New Dart Board In The Basement
I got a new dart board in the basement for Christmas, It's been super fun to play with the kids. We are getting a pretty good setup down there.
First Fingerboard In The Press
5 layers of plywood pressed into a 3d printed fingerboard press.
Garmond And Zaza

I actually like linus’s take here. My parents dropped $4k (~$8k in todays money) on a computer when I was a kid, (which turned into something too $$ to let me touch at that point). I played some educational games that no one else has heard of and I’ve long forgotten along with an early ciivilization game. It was e-waste in 2 years we maybe kept it 5, and it was barely working. Contrast this to my PC now I spent $2k on 3 years ago refurb from 2017, and it has no signs of age from me, does everything I need it to. Ram crisis sucks, the outright reason behind it sucks. But on the bright side you can still get a baller build for less than you could late 90s without inflation. The industry is not there for consumers right now, we had better times, but its still not bad times. Keep the hope alive that good times will come.

Simon Says Bell Ending
Simon Says Bell

Yeah there’s some basics, you know things you might expect like using standard error and standard out correctly. One thing I’ll say on that because I think this is commonly misunderstood, standard error is not for errors, it’s for any information that isn’t part of the normal output. So you know often times that’s warnings and errors, but it might just be progress information. You know anytime that you just need to have something go to the user that’s what it’s there for." (6:15 - 6:42)

I’ve definitely done this sin in my own tooling before, and it does make things harder to use. I think I still take err/out at face value. I really like the translation Jeff gave here, one is for normal output, i.e. what the user asked for and the other is extra information. So if I wanted to list something and pipe it into something else, stdout only captures the list, thats it. if you have a bunch of information about config warnings, showing environment, are you sure questions, none of that is captured.

Codeium Is Cooked
Codeium what are you doing? It's spamming I'm a little bit of a nerd in the completion.

I’ve found Gemini to be very useful lately, especially for finding information within long form content.

When writing thought-896, I wanted to use a direct quote from Jeff Dickey, Gemini popped it out very quickly.

give me a quote from jeff just before the timestamp I'm at the interviewer asked what makes a good cli and he started talking about stdout/stderr

In another case, my wife and I are huge Good Eats fans. Alton Brown taught us how to cook during college and on. We watched every single good eats episode nearly 10 years after they aired. He is back with some updates to those those shows on his Youtube. Gemini gives very good detailed responses with timestamps.

ai

Ping 15

[mise](https://mise.jdx.dev/getting-started.html) looks like what I wanted nix to be for me.
View

Mise looks promising

I've been all in on just for a while now, but mise looks so good it might be my next move.
View
Phantom End
Phantom Fight
Phantom

Maxteabag has done a fantastic job with sqlit. Highly recommend taking a look.

A user friendly TUI for SQL databases. Written in python. Supports SQL server, Mysql, PostreSQL and SQLite, Turso and more.

Fixing The Marquee For Jolly Holiday
Waylon up at the Marquee of the theater fixing the fallen letters before the night show.

I really like a good link blog, it’s the old timers version of a reaction video. It gives me new posts to discover from other writers, and gives additional perspectives from ones I trust enough to add to my RSS.

It’s nice to have a place where I can jot down a few notes, fire off my reaction, and nobody can respond to it lol. At least, not in any easy, friction-less way. You’d have to go out of your way to read my commentary, find my contact info, and fire off a message (critiquing or praising). That’s how I like it. Cuts through the noise.

Ditto Jim. I’ve oddly found mine more useful to search than blog posts, zettlekaten, notes, whatever you want to call them. For me writing something down makes it more concrete in my brain that I’m less likely to need to go reference, but I often need to re read or references posts from others, this is where

Gross phone

Is there a world that giving my phone to my kids does not result in it being covered in peanut butter and snot?
View

Developer Vs Artist Ai

The other day I was watching [thePrimeTimeagen]https://youtube.com/@theprimetimeagen?si=jVcp23FbfQSFZfDc) and he talked about devs loving ai and artists revolting. There was some discussion in chat about art being more creative and prime quickly squashed that. He ended with being oddly confused why developers are jumping on board and artists are not. Both had their art stolen to build out the models.

First I want to argue that artists have had some form of ai in their tools for years. Idk, probably not ai as we know it today but functionally similar. Content aware fill. This is a Photoshop feature from Adobe, as far as I know it’s one of the special things you get from Adobe that you don’t get from the FOSS alternatives easily.

This is an example of a good took that is well loves by the community and widely used, if you put ai in it to make it better no one would care, if it made things look oddly ai it would get rejected.

...

4 min read

Such a good breakdown of the leerob article, that is hitting everywhere right now. Feels like sanity was just a bit late to getting things right and it would have just worked for them how leerob was trying to use it, but MCP sucked so he jumped.

Reading their loose descriptions of a CMS, its an interesting realization to realize I’m rolling my own cms. I kinda feel like theres a few inspiration features to take from here, but I have no regrets. As a developer I like being able to build my own tools, I like being able to search and edit from nvim, and not have to write GROQ queries, and transforms. There were some really good points here that as I get more and more content on my personal site, I do kinda feel it. I’m surprised there is not more tooling that does some of these things for piles of markdown.

pinning this to re-read later, feels like a lot of good tidbits here.

It really feels like M$ is coming down hard on GH lately to make some unfavorable decisions for users. Maybe there is good reason for all of these changes from a business perspective, I can’t judge that. But right now there are some really great alternatives out there. I’m so grateful for what forgejo and gittea offer, and at the same time seeing the community get split up from GH is sad.

Ping 12

Is `bet` new teen lingo? My kid is starting to say _bet_ in every sentence. > So he explained it as "I'm down", "You bet", "Yes", "I like that", "You betcha"
View

Ping 11

Naming things is hard, pings will now be numbered.
View

Silksong DLC announcement already, we waited 8 years for the game, and are getting DLC’s months after launch. Dudes I haven’t even finished the game get, maybe not even half way. It’s amazing. Its amazing that these three make such a kick ass game with great art, story, voice, gameplay, and now drop a free dlc in 2026.

I'm being gaslit by the ai

I'm being gaslit by the ai. It just did a big hard change, now cant do a seemingly basic change, and assures me that that its fixed my issue on every iteration.
View
Finished Elf House
Waylon and Rhiannon standing in front of a mostly finished elf house built for the Jolly Holiday Performance at the local theater.
Cogwork Saved Pill

I’ve been using this one for awhile now, I have a post type that I only edit from my phone, but I have all the post numbered. I set up a template in obsidian for using templater, the template goes right in the static site repo, I point templater to the templates directory and this has been working pretty seamlessly for awhile.

Kelsey has a really good lightbulb moment here about platform engineering.

“if you had to do all the deployments for the entire company what questions would you ask of the development team?”

That’s your api, your platform, this is your product as a platform engineer. It’s not images, docker, terraform, hcl, yaml, kubernetes, It’s building out the right api for your company to deploy its products effectively.

https://www.youtube.com/watch?v=HdUbTyvrfKo&t=429s

...

notifications for static site builds

This morning I set up notifications for changes to my static site builds leveraging git name status [1] and ntfy. ![notification of changes](https://dropper.waylonwalker.com/file/1c69e648-5aa3-4f66-9085-a045b99450a5.webp) References: [1]: /git-name-status/
View

--name-status is a great way to see what files have changed in a git diff alongside the status code. I recently used this in a script to create a report of new and modified files during a build.

git
Dude Locked In
My son wanted to help shovel snow, usually this means, I'll piddle around, have Fun, maybe make things worse, but it's ok cause I'll make it a good time. Tonight he was LOCKED IN and got a good chunk of the neighbors drive and entire sidewalk done.

fast changing dev server today

The dev server is cooking today, I've dropped markata builds from 2m40s (hot cache) in prod to 15s (hot cache) in dev. Currently building 2745 posts and 274 feeds. ![screenshot of the dev builds from k9s](https://dropper.waylonwalker.com/file/c3e8b9de-d4be-4c7c-ab9b-a13a25c7673c.webp)
View

I learned to today that setting MEMORY on your minecraft server causes the JVM to egregiously allocate all of that memory. Not setting it causes slow downs and potential crashes, but setting INIT_MEMORY and MAX_MEMORY gives us the best of both worlds. It is allowed to use more, but does not gobble it all up on startup.

In this economy we need to save all the memory we can!

Here is a non-working snippet for a minecraft server deployment in kubernetes.

containers: - name: dungeon image: itzg/minecraft-server env: - name: EULA value: "true" - name: INIT_MEMORY value: "512M" - name: MAX_MEMORY value: "3G"

and in docker compose

Cogwork Core Gang Fight

I did not realize all the places to be considered as AI water usage. Hank goes deep highlighting all of the sources he is aware of, most reports leave off a lot of these sources, some reports go maybe too far adding sources that may not make sense depending on the question you are asking.

As someone that runs computers with gpus in their house, and watching LTT make AIO installs on GPUs I’ve wondered what would AI use water for, now I understand that its a lot. No where near agriculture, but a lot.

Unlike running a gpu in your house, potentially with a closed loop AIO, data centers are filled with hardware making heat and it all must go somewhere. Current technology has this done with evaporative cooling, i.e. its not a closed loop, the water goes into the sky.

He goes on to point out that its not just the data center, using water, but also chip fab and power plants.

...

Age verification hitting bluesky?? At least its not yet requiring your govt issued id or anything, but stepping that direction. I don’t know how I feel about age checks, does it actually protect kids when parents aren’t involved? I can’t say anything there, but it really does feel like its about ready to hurt the rest of us, requiring us to whip out ids and personal data for anything done online. This is a real problem that is hard to solve, and reasons why it has not been solved yet.

damn this is a rough one. A users entire home directory removed by claude code from an rm command.

rm -rf tests/ patches/ plan/ ~/

Reading the first half of that command it LGTM. If you had approved rm, you are hosed. If this is inside a larger script its running, you really gotta read close. This one still feels pretty obvious, but I can imagine some bash doing some nasty things I miss if I read it and understand it let alone glance at it.

I’ll take this as a reminder that I really need to be paying full-ass attention to agents, and moving towards a better sandbox for them, something in docker, maybe something like distrobox that is a magic wrapper over podman that just gives you the things you need for what it does. Something that starts up with access to start web servers, run agentic cli of choice, see project, git commit. It feels like the right thing has a lot of what distrobox does, but distrobox has too much and would be prone to this...

Cogwork Dancers Fight

OG is short for open graph, a set of standard meta tags that are used for social media sharing. This is what tells other websites how to describe and display your site when shared on social media, text messages, or discord.

One Year Of Shots

I’ve been running my shot scraper api for a year now. It creates og images for my website and thumbnails for my [[ reader ]] using a headless chrome instance.

a histogram of shot counts by day

You can see in the histogram that I’ve had a few big spike days, This has been mostly for days that I’ve integrated into a new service or changed the endpoint. On February 13, 2025 I swapped over from using the post to using template specific to open graph images.

...

2 min read

I found snow-fall component from zachleat, and its beautiful… to me. I like the way it looks, its simple and whimsical.

There is an npm package @zachleat/snow-fall if that’s your thing. I like vendoring in small things like this.

curl -o static/snow-fall.js https://raw.githubusercontent.com/zachleat/snow-fall/refs/heads/main/snow-fall.js

I generally save it in my justfile so that I remember how I got it and how to update…. yaya I could use npm, but I don’t for no build sites.

get-snowfall: curl -o static/snow-fall.js https://raw.githubusercontent.com/zachleat/snow-fall/refs/heads/main/snow-fall.js

Usage #

Now add the component to your page.

Today I learned an important lesson that you should periodically check on your kubeconfigs expiration date. It’s easy to do. You can ask for the client-certificate-data from your kubeconfig, decode it, and use openssl to get the expiration date.

Not every print needs supports

Not every print needs supports. So many models default to having it on, whether needed or not. Well designed parts, designed for 3d printing almost never need supports (depending on constraints).
View
Slab Fight
Stolen Dress
Moss Mother 2 Fight

reminder Include steps to reproduce

Include steps to reproduce your bug when you file a bug report or issue. You may quickly forget how you got there, and no one can fix a bug that is not reproducible.
View

This looks like a really good low cost option for some workholding. There is never a shortage of workholding in the shop and everything has a place. Having something low cost that you can have a bunch of makes a lot of sense. Maybe you still need a super scucum unit for really clamping the shit out of something, but this easily covers most use cases in a garage workshop. I want to build it.

Moorwing

Moore’s Law is Dead pitches a pretty ingenious sku for the new gabecube aka steam machine. I fully support repairability and ewaste reduction. most of these components have not had MAJOR improvements in years, hence his channel name. There is a possibility here that Valve could ship with their unique hardware, (apu, psu, case, ports, networking) and let you bring your own ssd and ram from an old device that you might not use anymore. I love this idea. At the same time it feels like entering the star wars universe where there are no more new manufacturing and everything is cobbled together from old hardware made long ago.

All I want for Christmas is, filliment

All I want for Christmas is filament I don’t need gifts or fancy things I just wanna model, tinker, and print, watch layers stack just right. Santa, if you’re listening... PLA, PETG, ABS will do.
View
Needle Strike
Conchflies Fight

When using two GitHub accounts the gh cli gives very easy gh auth switch workflow from the cli.

gh auth switch –help Switch the active account for a GitHub host.

This command changes the authentication configuration that will be used when running commands targeting the specified GitHub host.

If the specified host has two accounts, the active account will be switched automatically. If there are more than two accounts, disambiguation will be required either through the --user flag or an interactive prompt.

What a heart breaking video to listen to. I’m trying to do a better job of being positive right now. I’m trying to look at the world in what I have control over (not much more than my attitude about it). AI is killing so much right now I’m trying to look at it as the good tools the engineers made it to be. Ownership is dying around every goddamn corner. Hats off to Edison, this guy gets it. We need more companies like this taking a stand for the average person who wants to make it out there.

What a great campfire story Casey stumbled into. Whether any of this is true few will ever know, but its very reasonable that a race condition and a stalled job to apply configuration caused by someone who left the company 10 years ago caused an outage. I find it hilarious that they call this guy he answers, yup I still know the password, but how do I know you’re legit, I’m not just handing out the password. Casey did a stand up job telling this story.

Linus is Techbrophobic like the rest of us. This is such an unexpectedly mild take from him. I expected some threat to the mother of the vibe coder, but he gave a pretty great middle of the road take. The industry sucks, it smells off, we know a lot wrong with it, it feels like theres a lot more wrong than we know. But the tools that its making are really good when used in the right ways. They are not a replacement for anything, they are assistive. They can lift someone from not knowing how to code to making a small webapp for their use. Someone who wants to write backend and give them a decent front end, someone who whats to write front end and give them a decent backend.

Great take from someone with more experience than most can ever...

gpus are awesome and I need one for Bambu Studio to be usable in a distrobox. Adding the --nvidia flag to distrobox create bind mounts the nvidia /dev/ devices and sets up the necessary environment variables. Once we are in there are a couple of packages to install to make it work.

Forebrothers Fight
Forebrothers Full
Forebrothers
Here is a video clip of my Bambu A1 poop flinger fixed and not jamming during operation after my fix.
Bambu Poop Flinger Jammed
My bambu A1 poop flinger has been getting jammed up for awhile now, here is an image of it in the jammed position.

my home row

My home row layout. It's not quite home row mods. ![](https://dropper.waylonwalker.com/file/4a7971fc-8d22-49b9-ae77-5551f5c8d914.webp) https://dropper.waylonwalker.com/file/fd74f80e-ff5e-4548-8419-bd407144bb6c.excalidraw
View

I got the kubernetes in my basement autism

What flavor of autism did you guys get, I got the kind where I run kubernetes in my basement. ![My homelab as June 2025](https://dropper.waylonwalker.com/file/49b356bc-f32c-4332-85ea-0eb2b7860091.webp) https://www.youtube.com/shorts/5Cac-cf5MOE
View

The k3s system-upgrade controller is a fantastic tool for upgrading k3s automatically. It has done a fantastic job for me every time I’ve used it. Today I ran it on a cluster that needed to upgrade several minors and I learned that the controller does not pick up on changes to the channel url if you change from minor to minor.

The solution I came up with was to name the plan with the version it supports. Then on each patch upgrade, change both the plan name and the channel. I use gitops with argocd, it automcatically cleaned up old plans, created new plans, and the system-upgrade-controller picked up the plan and started applying immediately.

# Server plan apiVersion: upgrade.cattle.io/v1 kind: Plan metadata: name: server-plan-v1.33 # <- This is important if you want to change the channel name namespace: system-upgrade spec: concurrency: 1 cordon: true nodeSelector: matchExpressions: - key: node-role.kubernetes.io/control-plane operator: In values: - "true" serviceAccountName: system-upgrade upgrade: image: rancher/k3s-upgrade channel: https://update.k3s.io/v1-release/channels/v1.33 --- # Agent plan apiVersion: upgrade.cattle.io/v1 kind: Plan metadata: name:...

I did not realize that David’s site was built on a homegrown Static Site Generator. As someone who also does this myself I appreciate the effort. I build my site on markata. It started as a project to learn a set of tools and has become a project that I depend on everywhere and cant put down. It’s a great tool, but you probably shouldn’t use it. Anyways, I feel this really shows on David’s site. His site is filled with custom features that make it very unique, one off, and always a pleasure to read.

gpus are awesome

GPU's are awesome. I just added gpu support to my bambu-studio distrobox and its flying! On my wayland based system the native package has never worked, (arch or bazzite), but running in a distrobox does. Outside of distrobox the 3d rendering canvas is black, no output. It used to work fine without gpu support, was snappy enough, complex models were a bit sluggish, but fine. Lately something happened and simple models bring it to its knees. It got unusable! ![](https://dropper.waylonwalker.com/file/a06bbf8b-abea-472e-8d96-4255d522444d.webp) > The print I happen to be working on is some custom designed gumdrops for a > theater set. The ui is working and not lagging 30s between clicks causing > clicks to happen on the wrong ui element.
View

Niche companies will rise from the ashes. Companies that want to build good products for customers. Companies that will get hundreds of users. They will treat them right and make enough money to support themselves, maybe.

Alongside them we will self host. We will run our own services out of our basement. There will be downtime, but its ok. We will enjoy ourselves. We will tell everyone how much better it is BTW

Next to that is a firehose of shit piling back into the circular snakes mouth as all of your data flows freely between any company that can get their hands on it. These companies will spend and make money hand over fist. Most people will continue to use these services until enough is enough and unplug from everything.

In this world I don’t see how we sustain the amount of engineers we have created. Small companies run lean, small, and allow slow organic growth happen.

...

This feels very promising for the future as we enter a world that is more and more dependent on AI that inference is so cheap. I did not understand the scale to how much cheaper inference is compared to training. As we get better with training I imagine this gets significantly better as well. I know they all claim to be profitable on inference, but scrolling through Simon’s feed here you see several articles on the stark difference.

Nic is also building out a similar workspaces script. This feels like such a great thing to have ai work on fully customized tools for your personal workflow. Also Nice shout out!

This looks like great prototyping tool for k8s. I too often ask ai to get me going with the things I need. I’ve used k8s long enough that I can generally remember all the things I need, roughly where they go, would probably forget a few things and need to iterate, but I cannot remember exactly what goes where and need examples at a minimum. I need to give this a go from desktop and see if it will work for me. Right now looking through mobile looks promising.

Apple Boxes Complete
A complete stack of apple boxes for the local theater.
Design For Bosch Colt Dust Collection V1
Isometric view of the Bosch Colt dust collection design.
Dust Collection For Bosch Colt V0
Dust Collection for Bosch Colt router v0 made of 3/4" plywood.

setting COLUMNS env var to a number greater than 0 will make the terminal resize to that number of columns.

COLUMNS=80 uvx --from rich-cli rich myscript.py

I discovered this when I was trying to make a low effort readme generated from the code, but did not depend on the size of terminal it was ran on.

The tea command for gitea (used by forgejo) has a flag for login. With gitea you can have multiple accounts logged in. When you try to run a command such as repo create it will prompt you which login to use, but I learned that you can bake it in to all of them with --login <login-name>

2025-11-21 Notes

Learned about nginx_auth today. Feels good to unlock a new skill that I did not quite understand before. I don't think I grasped that there is a backend...

1 min

Check out octelium by octelium. It’s a well-crafted project with great potential.

A next-gen FOSS self-hosted unified zero trust secure access platform that can operate as a remote access VPN, a ZTNA platform, API/AI/MCP gateway, a PaaS, an ngrok-alternative and a homelab infrastructure.

2025-11-19 Notes

Making progress on dropper this week.

1 min

Another Big Cloud Outage Nov 2025

Today I woke up to finding out that cloudflare hade a widespread outage. My [[Reader]] uses tailwind cdn for styles and it was down. Otherwise it was not so impactful to me and felt kike they were quick to have it up.

I’m not really researching here, just jotting thoughts down from a parking lot waiting for pickup.

It feels like we are seeing a lot of these lately. They feel much more frequent. It feels like a whole industry was sold on 9’s and reliability of big cloud that we just aren’t getting.

...

2 min read

👏👏👏preach it prime! M$ continues to prove that they are not making products for you something else is affoot and shit you don’t want is shoved down your throat and forced on you.

Prime points out that the agentic is prompt injected itself😂. Rather than making a better os experience it’s assuming you are stupid and need everything done for you. But what I don’t get here in the text scaling example. Why the F does it not just fix it for me. When I ask the machine to make text bigger it puts a flashy circle where to click. This is a one time setup for someone who gives no fucks to remember how to do it. Why is the machine doing this weird hand holding watching us do it’s work rather than just doing it? I like the pattern when you change display setting it gives you a counter that reverts everything if for some reason shit is so bad you can’t even see it. Do that, not this help me click bs.

Now in parallel we have steam making Linux desktop better and better. Allowing you to just access the hardware you own to do what you want to do with it. Providing a fantastic hands off out of the box experience for the price of the hardware. No ongoing fees, no upgrade cycle,...

Absolutely banger of a video, what a wild idea to send gippity a bit off course and just see how far off the rails it will go. Dude did a banger of an edit on it. I’ll admit that I listened to the whole thing, but did not watch much, saving here as I might go back when I have time to really watch it. It was really weird how easy it was for chat to say something that could be true, but nearly no chance of it actually happening over and over and just keep it going down this dark spiral of conspiracies. It was ready to electrocute him and separate him from anyone who had a chance of being a non believer. At any moment was ready to say that those closest to him might be his problem. gipity is not your friend, or your therapist.

I found an interesting side effect of manually running my script to generate [[ stars ]] posts is that you get notified when one gets renamed. Today I noticed that Ned Batchelder created a coveragepy org.

Today I learned how to use AliasChoices with pydantic settings to setup common aliases for the same field. I’m bad about remembering these things, and hate looking up the docs. I like things to be intuitive and just do the thing I want it to do. Especially when they get configured through something like yaml and do not have a direct lsp look up right from my editor. I figured out how to support what might be common aliases for a storage directory. These can be set up as environment variables and used by config.

3d-Printed Corner Clamp

Getting ready to batch out 18 apple boxes for the local theater. Need to step up my woodworking tool game here quick on a low budget. Whipped this up up and built the prototype box , went really well. We have 4 in the arsenal now, might do 4 more if we need more assembly capacity. Pretty proud of the first 3d printed thread project here. The design for good 3d prints can be quite different with its anisotropic strength and hollow sections being nearly weightless when compared to traditional manufacturing methods. Its so fun to be able to do it for almost no cost right in my home office.

3d-printed corner clamp printed in black pla.

Isometric view of my corner clamp v1 that supports up to 3/4" sheets and includes slots for dowell points on 3/4" and 1/2" material.

No fancy orchestration. No distributed event streams. No cloud-native… | Anton Martyniuk | 270 comments

No fancy orchestration. No distributed event streams. No cloud-native anyth…

Lean on your skills and your goals. If your goals are to have fun, use whatever you want. If you are looking for a job, Lean on tech that bridges the gap between your resume and the job you want. If you want to build a good product use the tech you are best at. No one in their right mind would throw away 20 years of tech progression because Zuck built facebook ftping php to a server.

The sentiment in this post is fine at best the picture feels triggering and oversimplies way too much. If you like kubernetes just fucking use kubernetes.

...

Techbrophobic

I just heard someone drop the this term and it kinda fits a lot of shit on the internet right now. Arguing that its OK to question AI, its OK to like it, its OK to question if it needs to be in every goddamn thing we do, question its morality on training and the slop being pushed at us all the time.

I’m not Technophobic I’m Techbrophobic

I heard this and it kinda hit with a lot of things that I’ve resonated with lately. Tech bros of today have been compared to Steve Jobs in a lot of ways. Whether its style or the way he was so good at marketing, but this feels different. When Jobs launched the iPhone as this next great thing, He fucking made the thing.

...

3 min read

Are we cooked? Are we? Yes the consumers are cooked there are no more affordable cars with basic shit that you need to go point a to point b. Ford make us cars we can afford and you won’t be cooked by this dumb shit. If you can market it?

Most people don’t care what sticker price is and only the monthly payment. This is why we are cooked. We stopped caring that these things cost way too much. I’m probably in a small minority that just want an affordable reliable vehicle and could care less about features past climate control. I don’t use them. My phone has maps and music I don’t need a screen in my vehicle for anything.

Mcat Anything

I’ve long looked for a way to cat anything in the terminal. I’m am terminally in the terminal. I manage all of my projects, code, website, notes, files, servers, infrastructure, almost everything from the terminal. I occasionally open a file manager, mostly at home, only so that I can browse images.

Compounding my issue, I’m a tmux user. It works great for me, and I barely have to think about it at this point. The keybindings are second nature to me. I can go between server, terminal, nvim, and between projects instantly, no loader, no lag, no animation, it just works for everything that really matters to me for really getting things done.

mcat is a new tool that seems like it can cat anything in the terminal, code, files, images, markdown, markdown with images, and even video, without leaving tmux!

...

2 min read

Missing Thoughts

No one is perfect, this is why we have things like checkpoints or gates in the form of pull requests, linting, type checking, and tests. What happens when you work on small side projects by yourself that try to be content focused? What happens when you end up building a lot of the tech under that site and build it on the bleeding edge of all the tech you make? They are likely missing these things and occasionally there are some periods of regression. This is one reason I really like the term digital garden to describe one’s small corner of the internet where they share their thoughts.

There will be regressions

There were signs, signs I did not notice

...

3 min read

2025-11-04 Notes

Today I gave mcat a try and it's so sick. It can anything right in the terminal, pdf, image, even video. It even works inside tmux unlike almost anything...

1 min

Microsoft has been addding features to Minecraft for over 10 years now. Idk if there was momentum from the mojang theme, but we’ve barely paid attention to any updates in the last five years. The ocean update was huge, caves and cliffs were huge then it trailed off to we play each release on release day, use commands to try out new features, then never touch them again either to play minecraft as we always have or to play a modded pack with crazy new features that really make an impact on gameplay.

Absolutely love this selfhosted arc of pewdiepie that is going on right now. It’s crazy to witness now fast he is picking up linux / self hosting, and sounds like soon will be programming. In this one he built a $20k AI beast that crushes gippity with power, speed, proximity, and security. No one to take your data, no latency to the data center, no one else bogging down your prompts, just raw speed. It looks absolutely wild. He implemented RAG and gave it a bunch of data about himself and its able to spit out his wife’s name and phone number in under a second. It writes code at blazing pace. This may be the future that we get over the next few years as things shift towards AI there will be more affordable options, and a larger second hand market for building out these highly capable machines.

I greatly appreciated the wide variety of experienced maintainers of large oss projects. From webdev to desktop application. The most common sentiment here was don’t contribute to open source just to contribute to open source. Bring something meaningful to the project. Find a project you like, look at the discussions/issues for work or start some discussions. If there are no meaningful features that you can add to projects that you use and love, make your own thing. Adam from tailwind really hit on this one several times. He has made tailwind extensible so that you don’t have to contribute to tailwind to get new capabilities, you can probably just extend tailwind with your thing. Its likely that it makes a lot more sense or your use case, and if it turns out that it makes sense for everyone have the discussion about bringing it in. The upside to small oss projects is that you can move at whatever pace you want and break them all you want when the user base is just you. As you move your stuff into tailwind you have to be very careful not to break the massive tailwind user base and you have to bend to the release schedule of tailwind.

...

Corner Clamp V1 Isometric
Isometric view of my corner clamp v1 that supports up to 3/4" sheets and includes slots for dowell points on 3/4" and 1/2" material.
Act Ii
Last Judge

rustfs by rustfs is a game-changer in its space. Excited to see how it evolves.

🚀 RustFS is an open-source, S3-compatible high-performance object storage system supporting migration and coexistence with other S3-compatible platforms such as MinIO and Ceph.

Rules

There is no such thing as magic Be ready to roll back live deployments If CI was too fast be suspicious
1 min read

It’s so easy to forget low level tech sometimes. Things that are dead simple and just work without a hitch. git is one of those rock solid things thats very easy to remember all that it does, this is a classic use case.

This just works

cd /parent/directory/for/repo git clone ssh://username@server/path/to/repo

In order to recieve you must update the remote to allow recieve.

git config receive.denyCurrentBranch updateInstead

Now you can pull update push.

...

Well done write up about reflecting solar energy back to earth from low orbit space. I did not know this was a thing, apparently it is/isn’t. Solar is a great technology, its largest limitations are that its not consistent. This tech does not fix this problem, what does is efficient long term storage. I’ve seen some crazy ideas going back to my days in school, maybe elementry school. Theres a lot of innovative ways to store potential energy by moving heavy objects uphill whether fluid or solid. The issue is that energy storage at grid scale is HUGE and not efficient enough. Even assuming this idea had any legs at all, it still doesn’t solve the problem of inconsistent power because it still cant go through clouds!

[…

Wild to see the LinkedIn post linked here to see how out of touch this feels. I find it astonishing that they have something so ingrained into gaming culture as twitch, yet build something like Prime Gaming. Maybe I have no idea what Prime gaming is, but it feels like the opposite of ownership. What I get from steam is a sense of ownership. I own the desktop/laptop/handheld, no one cough nintendo cough cough cant remotely disable my device for using it inappropriately. I have a sense of trust with steam that as long as Gabe is alive I own what I paid for and will be able to open up and play anything at any time on any device I want. It might be a $100 dell workstation raised out of the coorporate refurb bin, it might be a high end machine, It could be my 2010 gateway or my 2045 custom build and they are all likely to play a good amount of my library at some level. I still understand that I really own nothing and the moment steam turns off its servers its quite likely that everything is broken, but its by far the best we have. Far from the status quo we are headed towards with subscription and cloud based gaming. If they wanted to...

...

Great justification for using the cloud. The infrastructure requirement for signal to be such a great app would be massive for a small team with low budget. The cloud is fantastic at unknown scaling, bursts beyond reasonable capacity to run yourself, getting compute everywhere in the world, and offloading huge infrastructure management costs.

DHH is 100% right that we have gone too far, too many things come out cloud first for services that can be ran locally cough such as your bed cough cough. One week ago when the world came to a hault, I did not bat an eye at these small teams with complex requirements going down with AWS.

Their own products seem quite damning to me. It signals that they cannot themselves become resilient to themselves. It shows how hard this problem is, how much cost in complexity and resources it requires. I’m sure there are fail overs that happened successfully that we will never hear about, critical products with large engineering overhead.

...

Just starred croc by schollz. It’s an exciting project with a lot to offer.

Easily and securely send things from one computer to another 🐊 📦

I often want to run an s3 sync in an isolated environment, I don’t want to set any environment variables, I don’t want anything secret in my history, and I don’t want to change my dotenv into something that exports variables, I just want s3 sync to work. dotenv run is the tool that I’ve been using for this, and this uv one liner lets it run fully isolated from the project.

uv tool run --from 'python-dotenv[cli]' dotenv run -- uv tool run --from awscli aws s3 sync s3://bucket data

multi-line #

same thing formatted for readability

uv tool run \ --from 'python-dotenv[cli]' \ dotenv run -- \ uv tool run \ --from awscli \ aws s3 sync s3://dropper data

There are probably 10 ways to skin this cat, but this is what I did, if you have a better way let me know, I’ll link you below.

First 3d Printed Threads

Working on an upcoming project that requires some threaded screws. Trying to keep a low budget on this one with as much to come off of the printer as I can. It might become a slant3d portals product if it works out. I always like making test prints for stuff like this especially to see how the feel is off of the printer that is going to print the final product and take much longer. First try was a success.

I started out looking up standard half inch thread pitch and size, but ran out of time to get the exact profile of a half inch bolt, so I will need to fix that later. Th

The print orientation is critical for strength here. This part is a full 1/2: so it should be strong either way, but to make sure we are printing the bolt horizontally to get nice long print layers. To do this we have to give it a bit of a flat spot on the top and bottom. This does not hurt performance, if anything it probably helps give some room for poor tolerances.

2 min read

Atuin desktop sounds dope AF, tried to install it off the AUR and it was broken for me. Seems early and the dev team is all in on mac. They have an official .deb and .rpm. I’ll have to try again later, maybe the binary will work.

The idea of building out runbooks from my Atuin data sounds dope AF. It sounds like a mix of markdown and executable cells like a jupyter notebook, but not. Really pitching hard to those of us in the system administration, dev ops, SRE space. Having something that you walk through when a system goes down and you are feeling panicked in DR mode sounds relieving.

Cloud is cooked bois. Seriously too much dumb shit relies on the cloud. Too much critical shit relies on single AZ’s. If normies are literally loosing sleep over an AWS outage (queue the Uncle Roger Voice), You’ve Fucked up. It’s wild to even think about a bed relying on the cloud let alone fully stop working when UE-1 goes down. I want to live in a world of opt in FEATURES, things that bring value to a product because it makes it better. Somehow a bed smells suspiciously like a cash grab for a subscription because its cloud connected. And yet for some reason it takes 16GeeeBee’s per month. I don’t own one of these, and I don’t want to. I don’t want a subscription for everything, I want my shit to just work. The future we are headed towards a world that is ever more reliant on a few key clouds. Which is fine. It’s fantastic that small companies can start and scale without owning an infrastructure team. It’s great that they have the ability to give us many nines of reliability. Some things just don’t need the cloud.

Spinning a 3d printed test block on a threaded t handle.

FastAPI is a modern and efficient web framework for Python, built on top of the Starlette web framework, and pydantic for data validation and serialization.

FastAPI is a modern, fast (high-performance), web framework for building APIs with Python based on standard Python type hints.

The key features are:

The +5 point increase for FastAPI is one of the most significant shifts in the web framework space. This signals a strong trend towards using Python for building performant APIs and reflects the overall strength of the Python ecosystem.

FastAPI.">Starlette has a head request that works right along side your get requests. This morning I fiddled around with custom routes for GET and HEAD, but had to manually set some things about the file, and was still missing e-tag in the end. Turns out as a developer you can just add a head route to your get routes and starlette will strip the content for you, while preserving all of those good headers that fastapi FileResponse created automatically for you.

...

Today I learned that while .stignore and .gitignore look very similar they are not. My obsidian directory had been locked up for a few weeks and I had no idea why until I logged into the web ui and saw errors. The errors were some confusing regex validator not matching. I don’t know what the exact error was, but I went in and only ignored the files I cared about instead of the entire gitignore. Primarily I was getting conflicts in my .git directory.

3d Printed Dovetails Fanned Out
Experimental slices of 3d printed dovetails laid out in a fan. Each have sharpie notes written on them.

3d Printing Dovetails Experiment

I hit an issue with 3d printing oversized parts that I have not hit before. I’m working on some jigs for an upcoming woodworking project that will involve a lot of repetition. We want to utilize some dowel joinery and jigs for consistency. These parts will be up to 20in in length this is much larger than my print bed.

Here’s where I went wrong, I wasn’t really thinking through my previous applications. They’ve all been slip fit, primarily print in place joints that need to move. My go to offset for print in place on my printer is 0.2mm, sometimes 0.1mm depending on the scale.

A live hinged [[ knife-sharpener-double-hinge-first-try ]].

...

This is super cool, thanks to Brodie for reading me this content as I do household chores. lowtech magazine is a website ran completely on solar power with only enough battery backup to cover most days. Adding enough to cover all days would increase its carbon footprint and negate the carbon offset of the solar panels it runs on.

It’s fascinating to see a web server running completely off grid in a close power system. These interesting websites are fascinating keep em coming Brodie.

The Year of the Linux Desktop is a meme, every year is the year of the Linux desktop as it gains rounding errors of market share. Outside of Linux nerds, developers that use servers on the regular, cheap asses reviving old hardware that is dead in the eyes of other OS’s, the average user wont even notice a difference with the right distro. I ran bazzite with plasma for over a year, It would be super beginner friendly while allowing users customization on levels never seen on non-Linux machines. Other than adobe, roblox, and EA games with easy anti-cheat most users probably aren’t going to run in to any issues. They probably wont even notice at this point, which is where the meme comes in. Why would anyone switch if its not noticeably different for the average user, they wont, until what is working for them stops working for them.

Handle Jig Alignment Window
Handle jig for theater boxes. The image shows the centerline lineup. This jig came out with a handle a little bit too big, going to go with a smaller one for the real boxes.

This is a sick no-build version of tailwind. I have a couple of projects that the build step of tailwind is cumbersome on, mostly because they are for non-js devs. Some are for backend python devs, some are for folks that mostly want markdown with some styles. This is a perfect no-build tailwind alternative.

python extras are for shipping

Python has two ways of adding optional dependencies to your projects pyproject.toml file dependency-groups and optional-dependencies.

for development

Dependency grooups are used when working on the project, they do not ship with the project, users cannot select to install them with the project. These are for things like running tests, linting, or docs. You might want to run these in ci, or keep your dev machines tight. For the most part you can probably keep these in dev. Depending on your team, fluency, and tolerance for slower installs extra packages. Adding too many tight groups might make it hard for the team to remember all the groups and which one to use and end up with them using --all-groups anyways.

...

3 min read
Sister Splinter
Cling Grip Bind

anthony has some of the best python highlight videos each year. This might be a good sign, but each year there seems to be less and less that I am chomping at the bit to get to. I thought the remote debugger looked every interesting, his use case for babi seemed very interesting. I wonder what textual would look like built in a 3.14 world, would it still have built its own debugger/console?

uv tool run --python=3.14 babi

Without a process flag you need sudo permissions to attach a pdb debugger similar to gdb.

Kraft-Coordinates

Handy reference for coordinates in the kraft world.

Overworld:-208 71 -291 Nether:-26 9 -36

Overworld: 209 62 -752 Nether:26 1 -94

1 min read

PEP 735 describes dependency groups as sets of optional dependencies that are not shipped with the package but intended for development purposes.

The PEP includes an example for groups that include test, docs, typing, and a combo typing-test.

[dependency-groups] test = ["pytest", "coverage"] docs = ["sphinx", "sphinx-rtd-theme"] typing = ["mypy", "types-requests"] typing-test = [{include-group = "typing"}, {include-group = "test"}, "useful-types"]

This is implemented in uv and can be used by several of their commands.

uv sync --group test uv run --group test uv add --group test pytest uv remove --group test pytest uv export --group test uv tree --group test

Dependency Groups are not Extras #

The docs describe extras as being intended to ship with the application and dependency groups intended for development. The spec allows both to exist with the same name, but care should be taken as tools may have different implementations.

...

I really like how well the local dev is setup to run off of production data here. I’ll use this as a reminder that I need to set up lite stream on a few of my projects that it’s missing from and include a nice sync prod data Posts tagged: justfile recipe.

Litestreams interface always throws me for a loop. It works fantastic, but the global config stored in /etc and some of the commands break my brain. It’s not you it’s me.

Using real data when you can is goated. Fake data is so often a perfect example of what someone thinks the backend should look like and does not include things that users actually do, running pipelines for days, or setting titles to paragraphs worth of text. Obviously this is not possible everywhere and the more sensitive your data the harder that process becomes.

I smell a dependency to python-dotenv dying in my workflow. I originally read the title of the post and thought, “I know how to manage .env and almost skipped it”. I’m leaning more and more on uv run these days, so this should just go in my [[ just file ]] to make it easy to run.

Interesting catch from the HN discussion over his article that came out yestereday. I scanned it yesterday and it has some really fascinating diagrams showing different phases of the web being open, to being siloed, to somewhere that we are trying to make it easy to publish, and retain ownership. I don’t know enough about bluesky, but the core is build on the AT protocol, you can self host your own instance, you can build different front ends for it. So rather than having siloed instagram, FB, twitter, there are clones of those platforms that read the same data from everyones data, that they have the option of self hosting.

I like this distinction between Mastadon here. Mastadon can also be self host, but its data aggregation is...

Wanderers Crest Bind
Reapers Crest Gangfight
Violent Flintbeetle 2
Violent Flintbeetle Granted
Violent Flintbeetle 3

This is a super cool movement, I like the idea of giving access to composable components like we have in open source. You want to build a website you have a bunch of options from raw dogging assembly all the way up to predefined templates that just need your content. Idk if the analogy is perfect but there are aspects of it that work. I see where right now we are somewhere in raw dogging c or python. We have cheap nuts and bolts and some low level things, but once someone needs some coupler like this it’s dropping down to drawing it by hand.

Violent Flintbeetle 1

I can’t believe this thing is so devicive. I kinda can’t belive that I sit on the same side as Mathes and his always against the grain, non corporate influenced response. So many others have praised Haiden for bringing back the real gladiator bloodsport that SX is, is it that though?? It’s a race to the finish. different than a lot of other racing its very unpredictable takeout moves happen, occasionally as an accident, often taking both riders down at the same time.

Also different than MANY sports we have a huge industry of weekend warriors, Some of which make it into the night show of the biggest race on TV. You see we only bring 20 riders from each class, the top half to top quarter are “Factory” riders, the rest are privateers, sometimes these privateers are completely their on their own.

There is also something called a last chance qualifier. This is your last chance to get into the night show, often fought by these privateers out of box vans with their brother as a mechanic. Often that last spot is filled by sketchy on edge riding and takeout moves from a rider that looks like he is barely making it, but would run circles around anyone at your local race.

...

Covetous Pilgrim
Sherwood Gangfight
Long Pin
Halfway Home Gang Fight
Rosary String
Threefold Pin
Thread Storm
Progress so far on the Funk server elytra track. It goes through two sea lanturn lit caves so far.
A Full Cheese Board
A macropad filled with cheese keycaps placed in random orientations.
Full Box Of Cheese Caps
A full box of 9 keycaps sit behind a cap placed in front, they are custom wedge of cheese caps.
Printing A Full Plate Of Cheese Hats
A Bambu Lab Printer is working on the first few layers of cheese hats to be placed on top of keycaps.
Cheese Cap On A Macropad
A cheese keycap placed in the middle of a macropad, currounded by black/purple caps in a blue case.
A Box Of Caps And A Macropad
A macropad with a pixel heart and mlg glasses sit on a clean white background.
Heart Of A Macropad
A pixel heart kecap in the center of a macropad, the macropad is admittedly dirty, filled with small bits of fuzz.
First Cap Hat, It's A Heart
A 3d printed keycap with a heart glued to the top of it. The heart resembles a pixelated game asset.

I first met Adam in college, he seemed like quite a character on the outside, but was always quite smart and often leaned towards realistic solutions to problems rather than over complicating things. He was part of the SAE Formula car, well known for taking a simple problem and trying to turn it into a real formula one carbon fiber solution. I remember a period where he was a fan of old world blacksmithing as they would say at the time. He even got a few very simple and light parts on the car that were easy to make unlike the carbon fiber alternatives. By the time I was there he was more of a leader and did not do a lot of design on any whole system, but would take out class projects for a component or help with some hard problems. This company feels like it is a great extension of who he was a that time, with about 15 years of professional experience tacked on.

First Box Of Caps
A print in place box sitting on the printer bed used as a raft for the 9 caps perectly nestled inside in a 3 by 3 pattern.
Fourth Chorus

zmk two hand hold down

I don’t know about you, but I don’t re-flash my keyboard enough to ever remember where I put the bootloader. Sometimes its the last thing I think about in a refactor and I end up cornering myself into a place where I cant get into that layer anymore. I’ve started putting hardware switches on my newer builds, but some older builds don’t have a hardware one, so it requires disassembly and jumping the microcontroller. Even when I have one though, I gotta flip my board over and its annoying sometimes, so I prefer to have a keystroke for it.

What I’ve landed on recently is the idea of a two hand hold down combo for the bootloader. These combos are ones that there is no way I can hit without picking my hands up from their normal homerow position and pressing four keys simultaneously with pointer and thumbs.

Here are some example layouts from keymap-editor

...

2 min read
Lace
Beginning Of Little Boxes
Four little 3d printed boxes laying on a white background, one contains a painted lid that says M 2x5.

Why Make a Website in 2025

Inspired by Jim and Dave

If it’s not something that you enjoy, you might as well move on there are far better ways to spend your time in 2025. Only the weirdos read this shit anymore, the masses have long moved on to curated social media feeds, and on to chatting with llms. I enjoy spending some time in the digital garden every once in awhile tweaking templates, creating 4 min read

I needed to display some hover text in a web app that I am using tailwind and jinja on. It has no js, and no build other than the tailwind. I want this to remain simple. Turns out that you can use a span with a title attribute to get hover text in HTML.

Today I learned how to use tar over ssh to save hours in file transfers. I keep all of my projects in ~/git (very creative I know, I’ve done it for years and haven’t changed). I just swapped out my main desktop from bazzite to hyprland, and wanted to get all of my projects back. Before killing my bazzite install I moved everything over (16GB of many small files), it took over 14 hours, maybe longer. I had started in the morning and just let it churn.

This was not going to happen for re-seeding all of my projects on my new system, I knew there had to be a better way, I looked at rsync, but for seeding I ran into this tar over ssh technique and it only took me 6m51s to pull all of my projects off of my remote server.

store

I’ve been 3d printing for years, and create a lot of my own designs. Many of them are hyper specific to me, but for the ones that I think others might find useful I will be putting up here for sale, you can buy prints that will show up to your door in a few days. I’m leaning on the slant3d print farm so this depends on your proximity to them. The prints are typically black petg, if you would like a different color reach out to me and I will see what other options we have, or for an additional fee I can print it myself and ship out special colors.

These are all designs that I made and actually use myself, they bring me joy knowing that I made just the thing that I wanted to exist and if you buy something I hope that it brings you this joy as well.

I’ve used these skateboard wall mounts for years, I have 5 in my office featuring new decks in the queue, and probably 10 in the garage to display used decks, and fully assembled boards for me and my kids. I use these for both regular...

...

When you fill all of your time with a bunch of other things, it becomes really hard to become a friendly person. Prime talked about trying to learn how to drop the hurry in his life, and how to not always be in a frenzy of going from one thing to the next. It’s something that puts us in a state that its hard to remember to be friendly. Hard to remember that theres always time for coffee.

I do my best to always leave time for coffee, whether at home with my wife and kids, as well as at work. I am in a very unique place at work where I have a rare set of skills for the industry I am in. This comes with a lot of people insterested in how to do things like running data pipelines or managing server infrastructure. I always take time for these conversations, I find them interesting, and useful. Sometimes you end up with someone who asks the same questions every 6 months, other times, you have someone flourish from these conversations. I’m...

...

Skull Ant

I’ve been leaning on lazy-self-installing-python-scripts more and more, but I did not realize how much tooling that uv gives you to help manage your scripts.

uv init --script up uv add --script up typer rich uv remove --script up rich sed -i '1i #!/usr/bin/env -S uv run --script' up chmod +x up ./up

The result is a script that looks like this, its executable as what looks like regular command in your shell.

Silkspeer
Berry Picking

Only 1 hour into the release of silksong, and it’s taken down all of the eshops, and steamdb dows 100K concurrent players. The Humble store ran out of steam keys for silksong already.

You guys better not break this thing before I get off work and My son gets home cause we are playing this tonight!!

I just Check steamDB, and they have 441K concurrent players right now. An Indie game! This shows when you treat your fans right and make something incredible they stand behind you.

Everything is becoming political these days! I hate it. I regularly hear a friend say these podcasts need to set the politics to the side, but you know what its fukin hard when the gov is upending every corner of life and rebranding it with their own new twist. The billionaire class is winning and it looks like there ain’t a thing we can do about it. Here’s another example of someone taking head of an office they have no business being in. An entire set of working class folks let go for this guy to take over. And what does he want to do, make govt services as satisfying as apple. Apple is cutting edge, it is not something that is one bit sustainable. Their launch sites are generally super heavy, hard to scroll, slow, over animated, but damn they are satisfying the first time you scroll through them, after that just let me through.

Brilliantly said. Vibe coding is legacy code. It’s code that we forget exists. Code that no one touches, you replace it. If you touch it you are more likely to break it.

The worst possible situation is to have a non-programmer vibe code a large project that they intend to maintain. This would be the equivalent of giving a credit card to a child without first explaining the concept of debt.

As you can imagine, the first phase is ecstatic. I can wave this little piece of plastic in stores and take whatever I want! …

Read more in the full post

When To Vibe Code

I enjoyed this post from Theo and think it deserves re-iterated, revisited, and to remind myself of some of these things.

https://youtu.be/6TMPWvPG5GA?si=guQem4R8dLOMBntP&t=1356

The first diagram describes that there has become a spectrum of agentic coding from vibe coding where you don’t ready anything, to looking at everything in detail, across a group of people who don’t have a clue what the code says to people who could do it way better if they took the time.

...

2 min read

I saw this post from Simon and I had to give it a go and got some pretty good results. His script is a small cli wrapper around Darren Burns’s Rich Pixels. It works well even through tmux, since there is no terminal magic, just unicode blocks.

Some not so good, and needed the terminal font size cranked up.

This one is one that I’ve been using quite often, I did’t have a hotkey for it, I just used the rm shell command.

!!rm %<TAB><CR>

When you type !! from normal mode it will automatically put you in command mode with .! pre-filled, then you just type rm and <TAB> to auto-complete the current file name, and <CR> to execute the command.

:.!rm %<TAB><CR>

Making it better #

The one quirk that I don’t like about this is that the buffer remains open after deleting, and sometimes I forget to close it and end up re-creating it by mistake when running :wall or :xall.

Create a DeleteFile command with vim command.

...

The Knight collects the mark of pride charm after defeating the mantis lords.
The Knight reigns victorious against the three mantis lords, earning the respect of the mantis village.
The Knight falls victim to the Mantis Lords in his first attempt to challenge them.
The little night steps in front of the three mantis lords and draws his nail signaling his challenge.
Parkour though the thorns yields a wanderers journal.
Unlocking the Spore Shroom Charm in Hollow Knight Keeb Run
A tricky parkour through the thorns to yield a mask shard and complete a full mask.
Cut Away Keycap Down
A cut away keycap on a Durock lupine switched pressed all the way to bottom out.
Cutaway Key Cap Up
A cutaway keycap sitting on a durock lupine switch
Freshly Cut Keycap Cut Away
A keycap glued to a 2x4 freshly turned into a cut away keykap.

Keycap Cut Away

I was curious how/if my custom keycap design was hitting my switches. So I set out to find out what the fitup inside of this assembly looks like, but not theoretically, a fully sliced view into their fit up in the flesh.

To setup for this cut, I flooded the edge of a 2x4 with hot glue, and inserted the cap such that the step was tangent with the edge. This way I could use the edge as a guide to cut one side off and leave the stem in tact. I took a handsaw to it and filed it smooth.

Removal was applying some isopropyl alcohol and it popped right off.

...

1 min read
The long trek has paid off and we have aquired Isma's tear, it coats our outter shell with protective coating from the acid, giving us access to new parts of the world.
Finishing the battle before accessing Isma's tear in Hollow Knight
Making light moves of this tricky parkour run between deepnest and the royal waterways

Knife Sharpener Small Upgrade

I’ve used this knife sharpener that I printed for a few years now. I thought that it was based on the Russian designed TSPROF, but in looking through the history it looks very similar to the USA Edge Pro Inc Apex designs that goes back to the 1990’s. The angle isn’t quite holding like it used to. I’ve got a lot of ideas for my own model, but for now I’m going to print some spacers to help get repeatable angles.

setting the angle on my sharpener

Where I want to place a fixed height collar

1 min read

Vim :noa is a command that runs what you call without autocommands on. This is typically used when you have some BufWritePre commands for formatting, most auto formatters are implemented this way in vim. It can be super useful if you have something like a yaml/json file that you have crafted perfectly how you want it, maybe it has some source code for a small script or sql embeded and your formatter wants to turn it into one line. You could get a better formatter, but for these one off cases that aren’t a big bother to me I run :noa w.

vim

Forgejo supports repository mirrors, I think this is how I am going to handle migrating all of my github repos into forgejo. over time I’ll probably go through and delete a bunch of unnecessary one from github, ones that might have a user or two I might keep on github. I have such small scale projects with almost no users I am not sure that It really matters for me or not.

This commit to my keymap gets rid of vertical combos, those were a bad idea to me. Maybe I didnt give it a shot, but hitting two keys at once on purpose with the same finger is a skill, one that I don’t have. This change maps those symbols so that they work as a combo or layer switch, so getting the layer key in first does it by layer, but pressing them at the same time gives me the combo, kinda feels genius. We will see how it goes.

I’m playing through peak right now with Wyatt and it is a great game, a small wholesome indiegame that is legit hard, but fun with the simplest concept. You are a scout who has crashlanded on an island, your goal is to get to the peak with your friends. You must manage hunger, stamina, weight, health and energy. You have limited resources and must help everyone to the top, if someone is low on stamina, they are going to need a helping hand or a stonger climber to go up and set pitons and ropes. Its a fantastic collaborative play game

a short clip of me playing with wyatt, I did not have anything great to add, but this is just a random clip

It was insta-ripped off by roblox with microtransactions pay to win garbage. It looks one for one the same damn models and interface, they spared nothing at making it look exactly like the original. They let you buy a golden apple assuming it gives you crazy stamina to climb with ease, and it costs goddam robux. As Big A says here theres nothing they can really do, the roblox platform just lets this happen, and if they didn’t they would loose huge revenue because this is so prevelant. Legal fees would crush this small team that made it.

This man feels sad, he never had a chance to bloom. He was stuck behind the drudgery of jira tickets. This is what the consultant driven agile has got us. Its ripped out all the thinking and creativity, its left us with moving tickets across the board, not allowed time to run on an idea when we have one. Not allowed to do extra work or refactoring in a module that we are already in. pushed to move faster for less.

I feel like this mans experience has been quite different from my own and I’m grateful to have some leeway to be creative and do some meaningful work outside the jira board. I’m grateful to be able to provide a good income for my family without taking on all the risk myself.

Crazy that we wrote such similar posts on the same day independantly, I just wrote I'm Out On Agents sitting offline in a doctor office. The two pull out’s are very good,

“AI is not magic, it’s a headache”.

By definition AI is magic to the vast majority of people, but funny how true this is.

“When I finish tasks, I’m not fulfilled… if anything I’m relieved.”

...

I'm Out On Agents

Its the year 2025 and we are only a few years into having 6 months to live before ai takes our jobs, and the big push right now is agents, managing agents. I will fully concede to I’m not doing it right, or a future state gets better than where we are right now, but right now they kinda suck.

Chat is what really kicked off ai uses and goes back as old as computers, but it always sucked. Then chatgpt rocked the world with the biggest launch day in history and showed us that it could actually be pretty good. Unethically trained on everything they could get their hands on, burning cities worth of electricity to train, and keep training to stay ahead of the competition. It does a damn good job. There are tells, and if you see enough of it there is a lot that turns to slop, but if you had never seen it before, there is no way you would assume that it was not a computer.

It does a damn good job at being average, it can do what seems like everything not related to security and authentication...

...

Doing Some Keeb Modeling And Thought This Was Cool
The inside of a keyboard before the tools are used to cut away switch cutouts in the board.

Today I gave modd a try, and it seems like a good file watcher executor. I tried using libnotify to send desktop notifications, but all I got was modd, I might not have notifications setup right on the awesomewm machine.

config goes in modd.conf

**/*.py { # check formatting via ruff prep: ruff format --check . # check docstring formatting prep: pydocstyle . # # # check type hints via ty prep: ty check . # # # run linter via ruff prep: ruff check . }

I installed it using installer from jpillora, pulling pre-built binaries right out of the github repo.

curl https://i.jpillora.com/cortesi/modd | bash

Then you can install it, and on file change it will run the commands you configured.

dev

2025-08-25 Notes

Gave modd a try and it seems pretty good, will likely be slotting it in next to my justfile usage.

1 min

# The Death of the User Interface > **TL;DR:** We're witnessing the end of graphical user interfaces. AI agents like Claude Code are eliminating the need for windows, menus, and clicks, replacing them with natural language. The computer is finally learning to speak human, not the other way around. --- ## 🔮 A Personal Revelation Last week, I realized something profound: **I haven't opened Finder in months.** Not once. Where I once clicked through nested folders, dragged and dropped files, and navigated hierarchical menus, I now simply tell Claude Code exactly what I need: - _"Find all the test files modified in the last week"_ - _"Move the old backups to archive"_ The commands execute instantly, precisely, without me ever seeing a window, icon, or folder. > This isn't just about convenience. It's a fundamental shift in how humans interact with computers, and it signals the beginning of the end for user interfaces as we know them. --- ## 🚴 → 🚀 The Bicycle That Became a Teleporter In 1990, Steve Jobs famously described computers as "bicycles for the mind," drawing from a Scientific American study showing that humans on bicycles were the most efficient locomotors on Earth. The metaphor was perfect for its time: computers amplified human cognitive abilities just as bicycles amplified our physical capabilities. But bicycles still require you to: - **Pedal** the mechanism - **Steer** the direction - **Navigate** the terrain - **Learn** the balance Traditional user interfaces work the same way. They're tools that amplify our abilities, but only after we learn their language, their layouts, their logic. > **What we have now with AI agents isn't a bicycle anymore. It's a teleporter.** You simply state your destination, and you arrive. --- ## 📜 From Xerox PARC to Natural Language: A 50-Year Arc ### The Timeline of Interface Evolution **1964** → Douglas Engelbart invents the computer mouse at Stanford Research Institute **1973** → Xerox PARC develops the Alto, the first computer with a GUI **1979** → Steve Jobs sees the Alto, immediately grasps its revolutionary potential **1984** → Macintosh launches, bringing GUI to the masses **2024** → AI agents begin replacing graphical interfaces entirely That language dominated for five decades. Windows, Mac OS, and even modern web applications all speak variations of it: _point, click, drag, drop, menu, submenu, dialog box, button._ We became so fluent in this language that we forgot it was a language at all. ### The Abstraction Layer Pattern Every abstraction layer in computing eventually gets replaced by a higher-level one: | **Era** | **From** | **To** | | ------- | ------------------- | ---------------------------------- | | 1950s | Machine code | → Assembly language | | 1960s | Assembly | → High-level programming languages | | 1980s | Command line | → Graphical user interfaces | | 2000s | Native apps | → Web applications | | 2020s | **User interfaces** | **→ Conversational AI agents** | > Each transition follows the same pattern: what once required specialized knowledge becomes accessible through more natural, intuitive interaction. --- ## 👻 The Invisible Operating System Traditional operating systems: Windows, macOS, Linux, are abstractions over hardware. Web applications are abstractions over REST APIs. Both require user interfaces because they need to translate between human intent and machine execution. **AI agents represent something fundamentally different:** they're abstractions that understand human intent directly. No translation required. ### Consider the Mental Journey of a Simple Task 🖱️ Traditional UI Approach 1. Open Finder/Explorer _(remember where it is)_ 2. Navigate to directory _(remember the path)_ 3. Scan through files _(parse visual information)_ 4. Select multiple files _(remember shortcuts)_ 5. Right-click for menu _(know this exists)_ 6. Choose "Move to..." _(understand terminology)_ 7. Navigate to destination _(remember another path)_ 8. Confirm operation _(hope you got it right)_ 🗣️ AI Agent Approach 1. "Move all PDF files from Downloads to Documents/Reports" **Done.** > The difference isn't just efficiency, it's cognitive load. With traditional interfaces, you're translating your intent into the computer's language. With AI agents, the computer learns your language instead. --- ## 🧠 The Mental Load Revolution Every interface element, every button, menu, icon, and widget, is a **tiny cognitive tax**. Even the most intuitive interface requires you to: - ✓ Understand its visual language - ✓ Remember its organizational structure - ✓ Learn its interaction patterns - ✓ Maintain mental models of its state This is what UX designers call **"extraneous cognitive load"**. Mental effort spent on using the tool rather than accomplishing the task. > When you tell Claude Code to "set up a new Python project with pytest and black pre-configured," you're expressing pure intent. The mental energy you would have spent on navigation can be redirected to actual problem-solving. --- ## ⚡ The Present: Early Adopters and Edge Cases We're living through the transition right now. ### What's Happening in 2024 - **AIOS** → Embedding LLMs directly into operating systems - **Claude Code** → Replacing entire categories of developer tools - **Cursor & Copilot** → Making IDEs conversational - **Warp Agent Mode** → LLMs in the terminal for multi-step workflows ### What I No Longer Do I see it in my own work every day. I no longer: ❌ Browse through file explorers ❌ Click through git GUIs ❌ Navigate package manager interfaces ❌ Hunt through documentation sites ❌ Configure tools through preference panes Instead, I describe what I want, and it happens. **The interface hasn't been simplified, it's been eliminated.** --- ## 🍎 The Future Steve Jobs Glimpsed > "Ultimately computers are going to be a tool for communication. Not computation, not productivity. Communication." > > — Steve Jobs, 1983 International Design Conference At that conference in Aspen, a 28-year-old Jobs made predictions that seemed like science fiction: - Portable computers with wireless connections - Instant access to remote databases - Devices as primary means of communication He was right about all of it, but even his vision was constrained by the paradigm of his time. He imagined better interfaces, more intuitive interactions, simpler designs. **He couldn't imagine no interface at all.** Yet in that quote above, Jobs understood something fundamental: the real revolution would come when computers could understand us as naturally as we understand each other. > That future is arriving. The question isn't whether AI will replace user interfaces, but how quickly and how completely. --- ## 🔄 The Last Interface There's an irony in writing about the death of user interfaces, or rather, there **was**. This article itself is proof of the transition: generated through conversation with Claude Code, shaped by human intent rather than human interface manipulation. I provided the ideas and direction; the AI handled the execution. **The future isn't coming, it's already here, manifesting through the very words you're reading.** Soon, articles like this won't be "written" in the traditional sense. They'll be conversed into existence, with AI agents handling not just the typing but the research, fact-checking, formatting, and publishing. The tool will disappear into the task. ### The Holdouts and the Inevitable Some will mourn this loss. There's something satisfying about direct manipulation, about seeing and controlling every step. Just as some still prefer command lines to GUIs, some will always prefer clicking to conversing. But for most of us, the appeal of **zero cognitive load** will be irresistible. > Why learn an interface when you can just say what you want? > Why navigate when you can simply arrive? --- ## 🎯 Conclusion: After the Interface We stand at an inflection point. For fifty years, ever since Xerox PARC invented the GUI, we've been refining the same basic paradigm: **humans learning to speak computer**. Now, **computers are learning to speak human**. The death of the user interface doesn't mean the death of design or user experience. If anything, it makes them more important. When the interface disappears, what remains is pure interaction design: understanding human intent, anticipating needs, handling edge cases gracefully. The challenge shifts from: - ❌ _"How do we make this button more obvious?"_ - ✅ **"How do we understand what the user really wants?"** > Steve Jobs gave us bicycles for the mind. > AI agents are giving us something else entirely: **minds that understand our minds.** > No pedaling required. **The user interface is dying, and that's the most user-friendly thing that could possibly happen.** --- _What do you think? Are we witnessing the end of user interfaces, or just another evolution? How has AI changed your own relationship with traditional software interfaces?_

This is an insane level of agentic llm use, the author claims to not even use his filesystem anymore, its too cumbersome to find where downloads and documents are and way too easy to ask an agent to move all pdf’s from downloads to documents.

...

Damn, social media is at an all time low. I’ve felt all of these issues and when I got a new phone I started fresh, I didn’t install one social media app. Luckily Youtube has remained solid for me. Yes shorts are a bit less what I came for and more addicting content they had to do in order to keep up. There are some legit good commedians, a bit of good knowledge and a bunch of trash that is hard to look away from on shorts. I still find myself able to find content I enjoy and signed up for on YouTube. I feel like I get a one way relationship with someone similar to a TV show or news anchor of old media.

Social Media has morphed from follows likes and similar, to viral posts by creators I don’t recognize. posting and immediately getting like by two hot women with accounts created this week. The rest of the real creators left on there are stuck trying to keep up, echo viral trends, trying to keep up the content treadmill. A few come through, but most feel somewhat forced. A lot of it is ai generated, and whats not mostly doesn’t feel that human anyways.

The people on here seem to really tie the internet to social media and are ready to quit the...

2025-08-23 Notes

Today, some great work on the knife sharpener re-design. I've been using the same one since I first got my ender 3 3d printer, and have wanted to make some...

1 min
Knife Sharpener Double Hinge Wing Nut
A 3 lobed wing nut perfectly hiding the m4 cap screw underneath of it, flooded in uv resin.
Testing out the double hinge knife sharpener holder for the first time.
Knife Sharpenter Double Hinge Mid Print
A bambu A1 printer printing my double hinge mid print under a uv light
Unlocking Kings station in my hollow knight keyboard only run
The final blow to the Dung Defender as he admits defeat and allows the little knight to access the valve in the royal waterways.
Using desolate dive to unlock the Royal Waterway bench in my Hollow Knight keeb only run.
Entering the royal waterway during my hollow knight keeb only run.
Using the simple key to unlock the Royal Waterway in Hollow Knight during my keeb only run.
Purchasing the Lumafly Lanten from Sly's shop in Dirtmouth during my Hollow Knight keeb only run.
Helmet Hidden In Design
A CAD design for a movable hinge that turned out looking like a space helmet.

Today I needed to make a backup of some config. I wanted to add a timestamp so that I knew when the backup was made. This would make unique backups easy, and I could tell when they were made.

cp configfile configfile.backup.$(date %s)

If you want to decrypt the timestamp into something more human readable. You can list backup files, strip out the timestamp, and then convert it to a human readable date.

/bin/ls | grep backup | sed 's/configfile.backup.//' | xargs -I {} date -d @{}

or just throw it to the date command by hand.

2025-08-21 Notes

https://youtu.be/-EYRzF0zp3U?si=mKCPlMDecrqzvjuF

1 min

Not algorithmic recommendations. Not SEO-optimized listicles.

I mean real, surprising, meaningful discovery.

Search is brok…

The hype bro influencer culture is over, we are fucking burnt the fuck out. I’m done scrolling through ai slop on social media, I like in a few times a week with hopes to see some friends at the top of my feed and jump out. The Doom and Gloom of politics, everyone has a side that will bring glory and the other side will start an apocalypse did me in, ai generated bs is just driving those platforms further into the ground, I’m tired and done.

...

"Business in the front, party in the back" isn't just some throwback style. It's the whole point.

In ou…

We need more mullets (as sam describes them). Not so serious, but serious when it counts. Ready to back you up, get some shit shipped, roll up their sleeves and do the work, stand up in front of people and pitch ideas. We have too many hustle bros pitching shit they cant do, ai doomers who have been here 10 minutes think they can replace everything they don’t understand with a word calculator, framework Andys afraid to ship till its perfect. Grow a Mullet.

...

Damn this VAnessa is hitting my feed with hard topics, I’m not sure whether to subscribe or to block. These top websites only feel worse every day, when I post on twitter and I get 4 likes by accounts that were created 5 minutes ago with racy profile pics it feels obvious. I wonder how larger accounts deal with it. Now that llms have made making these bots mimic humans easy It really makes you want out. I’ve really become a curmudgeon and leaning on rss over the past year, I dont like it, but idk what to do.

This is a crazy theory I did not realize was out there, but damn power just keeps costing more and more. She does not mention it here, but there are many sources of power for the grid that cost vastly different amounts to produce, generally “clean energy” solutions are harder and more expensive to bring online and don’t just turn on and off at the flick of a switch. Anyways, how are the power companies divying this power out to users, do some get preferred rates or supply? My rates just went up for the summer period “temporarily”. Our infrastructure is aging hard to upgrade and needs something done to it. Who’s really going to pay for it, these AI companies are throwing big numbers but do they have any real money? Do they have any real revenue after building out massive data centers filling them with the most expensive hardware? These guys are burning cash like crazy.

Today I learned that its spelled “Rite of Passage”, and is short for ritual. Mac has so many of these things that are just different, but do not let you reconfigure them and you are stuck with it. copy / paste I don’t get, the 3 times I’ve touched a mac since I was a kid its frustrated me. Is it lock in? or is it them actually thinking this is the right way and you all shall do as we say.

2025-08-17 Notes

After a long time I begrudgingly setup window rules for hyprland. What I wanted was the ability to log out and jump back into work with a freshened work...

2 min
Wyatt Drew A Watertower In Aesprite
A post apocolptic water tower sitting on a rock drawn in blues and greens with moss hanging from it, including a rusty red top and legs. Drew by Wyatt.

2025-08-16 Notes

[x] remove nextcloud - [x] pause photoprism - [x] pause syncthing - [x] move data to walkershare - [x] filepermissions 1000:1000 all of it - [x] organize how...

1 min

Interesting longhorn storage performance test, author does highlight right away that this is a simulation and not a REAL test. I did not fully understand the storage semantics before reading through this.

This is an important distinction for applications that use sqlite or a tool on top of sqlite such as diskcache. With sqlite it is not recomended to run over nfs due to missing required file locking mechanisms.

Longhorn storage still provides a lot of benefits to these applications as the storage is automatically replicated, if the node that your application is running on goes offline a new pod will start on an existing node. If you have planned downtime, you can cordon and drain a node. Since the data is available in another location you will be able to start a new pod on anther node. barring your PodDisruptionBudget settings, taints, and affinity, this may happen automatically.

2025-08-14 Notes

Huge progress on shots not to be confused with shots inspired by . I'm building out my own instagram grid design, right now its 4 wide, but I wonder if it...

1 min

2025-08-13 Notes

Inspired by Justin Searls Shots, I made started my own shots feed for self hosted Instagram style photos. The layout could use a lot of work, the feed seems...

1 min

2025-08-12 Notes

Sad day yesterday. We discovered that our freezer was left cracked over a day or so. Kids self serviced themselves to some sausage dogs at some point and...

1 min

David’s got me looking at Forgejo. I’ve seen a lot of GitHub jumpers just this week, and I’ve been tempted for a long time to self host one anyways, so it might be time. I don’t have hard issues with anything, I just like self hosting my own personal stuff.

On the flipside, I hope this does not turn yet another thing to shit. I lived through the download software from sourceforge and hope you get the right download now button and not the one from the virus ad. I’m not putting my really public/useful projects on a self hosted platform… well not as the only source, I see how that comes off edgy. I like having some trust in the platform. Currently theres a lot of issues with M$ and GitHub using you for your data, but I don’t think injecting virus, malware, bitcoin miners is a worry I have coming from a GitHub release, unless it was put there by the author.

Justin has such great feeds on his site, I love how the main feeds are so prominant just to the left of the article you are reading. slops in particular feels like a great category. Saving this chat for later, or found it particularly interesting, but don’t really want to make a post about it.

20 years is a long time to work on something, congrats Blake! So many great links to small web creators, why, and how to build your own site.

As algos turn to shit the small web remains a space that cannot be ruined. There will always be rss feeds from real humans writing for other humans.

there is literally no universe that this is true 10k lines and its not bug filled crap? ok Lex Luthor, its time to step away from the keys

Is this 10k real production code? Dry in the sense that it hasn’t re-implemented the same s3 api dozens of time? What language are we talking something dense like python? something very verbose like html? Maybe a language where you implement everything from scratch like lua. This matters a lot. Playing with little POC applications that dont mean anything I can quickly come up with 500-1k likes of code that I may never look at again. I’m sure I can come up wtih 10k decent lines of code a day.

But for the same application without duplicating everything over and over? For something that moves the needle and really matters?? every single day?? Consistently +10k, not 10k changes, not 10k deletes of yesterdays code. nah thats wack.

2025-08-08 Notes

I found this post from miriam.codes while reading dbushell's notes. I kinda agree with Miriam and David here. AI is really making me feel like an old...

2 min

Discovered the Brutalist Report from CJ on syntax.fm on their rss-is-not-dead episode. The way he described it, I was like gnaw thats whack, not into it, but I had to check it out. It’s actually great! Except the political shit, I go to rss to get away from political finger pointing. The Hacker News list is great, maybe I need to pay more attention to hacker news??

It’s facinating how many people are making the jump from mac/windows, not just to linux, not just to archlinux, but to a full on tiling window manager. DHH has omakub and omarchy. Omakub is advertised as easy and for beginners, but many are skipping right over that to go straight for the hard stuff.

DHH mentions hyprland here, one thing I think he is missing is that this is the first real mainstream tiling window manager that is a competitor to i3, awesomewm, qtile that runs Wayland. I think they were able to pull a bunch of great benefits such as lack of screen tearing and animations from this.

I wonder how much of killed-by-google is due to is 20 percent time. Allowing engineers to follow a passion project turns into a real product that doesn’t have full backing and support of the company.

similar to DHH as much as I am hurt by reader and all of their privacy BS that comes from ad based revenue I appreciate YouTube and them supporting all of the creators on it. Giving a platform for small creators the ability to sustain themselves and reach a larch audience without big coorporate rules.

Googles 20 percent time is fascinating to me. It seems like a great way for engineers to fill up their tank with new skills, passion projects, and the need to scratch an itch. To me these days it feels like something that would incentivize good talent to join.

I can remember back earlier in my career December and January were slow months for big companies. Riddled with vacation and annual planning cycle. I would use this time to create tools and libraries that would help me move quicker throughout the year.

I clearly remember having a conversation with a colleague several salary grades ahead of me come mid February asking what I was up to. I was furiously pecking away at some of these projects while he let me know that he had been waiting for this years plan for months and had no tasks from the boss.

That said, I don’t think any major tech company is going to adopt 20% time these days. It’s too chaotic, too hard to manage and impossible to measure.

...

Niki has one of the coolest yet simple personal sites that I have seen in a long time. We need more of this on the internet! hover over his face, try dark mode, submit personal data, there are so many really cool Easter eggs to discover!

I wholeheartedly agree that packaging is broken, semver is broken, expecting much better from a system of oss that is built on top of volunteers, passion projects, nights and weekends is a fools errand. With that I disagree that we we dont need lockfiles. Maybe its Nikki’s experience in java and my lack that puts us on this opposite spectrum, but without lockfiles the world changes underneath us as we release. One small change to your source can introduce a whole set of new features/bugs that you did not plan on without a good locking system. It can also cause you to need to do dependency resolution at application build time and not ahead of time.

Fantastic write up on their experience in ai, opinions on ai being a hoax with a veil of reasonable usefulness. Arguing that most people do not understand enough to see the difference, and thought leaders see where it is now, see where it was yesterday, it must be going to general intelligence tomorrow and you all will loose your jobs without this. I appreciate the satirical language here.

Letting Ai drive code feels like giving up so much control. It feels like its leaving so many brain cycles open for other things, yet its not quite good enough to do production level things on its own, so we must watch it, we must review it, yet its code can be some of the worst to review left unattended. I’m feeling this right now as I’m avoiding writing a bit of js that I could probably do myself. Some day this is likely to flip, and it will get better and we will spend our brain cycles thinking about architecture, security, marketing, big picture ideas about the problem we are trying to solve, but we are not yet there and as long as we still need to review I find it a much more pleasant workflow to have in a separate window than have it change the whole fucking project for a simple change.

Woof, ai is sucking the soul from everything, being forced onto teachers who don’t want or care about it and are simply sharing ai-slop to their kids without giving it much thought. remember that it is rude to share ai-slop with others that you have not vetted, It’s next level to turn this into teaching material for children who are forced into your classroom and have no choice about the matter, you should be ashamed.

2025-08-05 Notes

Yesterday I started building out some qrcode tooling for myself starting with qrcode.waylonwalker.com. This is part of my tinyapps project.

1 min

I have a couple of use cases for simple qr codes in python coming up. One is for blog posts, the other is for auth into a new server application logged to a terminal. I tried the qrcode library and it does not look as nice to me and I found pyqrcode to be quite nice.

import pyqrcode url = pyqrcode.create('https://waylonwalker.com/qr-codes-in-python') url.svg('qr-codes-in-python.svg', scale=8) print(url.terminal(quiet_zone=1)) url.svg('qr-codes-in-python.svg', scale=12) url.svg('qr-codes-in-python.svg', omithw=True) # width is controlled by the container url.svg('qr-codes-in-python.svg', omithw=True, module_color='#ffd119') url.svg('qr-codes-in-python.svg',...

...

A great alternative to tailwind colors that has everything defined in one colors file for only 0.3kb. it feels well worth the weight if you are trying to skip a build step or avoid npm/node. It has even more colors than tailwind. I appreciate that there is a grey palette that is fully desaturated.

I’ve got a few samba shares going in my homelab, and I’m struggling finding a great app to scroll through vacation photos with my wife. I want something intuitive, non intimidating, and just works. Turns out that the default file browser application for hyprland works great, but you need to enable previews for remote storage for it to work for my use case here.

Sometimes, all you need is a mindset shift, a blocker in your mind that holds you back from doing certain things. And for me, I have consumed enough tutorials and posts about Kubernetes, that I need to put to use and create. I have been stuck in the learning cycle, lets push to prod with kubernetes.

This hurts. I know others with this learning style that need to see the full picture before actually doing something with new tech. The way I first got into kubernetes I was looking for the easy route and somehow k8s came up several times as a suggested route Looking for a Heroku replacement, What I found was shocking!, So I dove in head first with k3s and

...

If you want to use it for the purpose of learning it, please do use it.

Kubernetes as usual is a tool like others, you can’t use one tool everywhere. Where bash scripts work, they just work, where they don’t they fall apart too, kubernetes works like a charm.

Use your grug brains a little and choose wisely! In the end, who the hell cares if you use kubernetes or bash scripts to scale if your users are happy?

Well Said!

This post feels like it was written by someone who has never tried kubernetes, someone who reads twitter, listens to t3.gg and thePrimeagen (who cant even container let alone kubernetes). If you cant run linux, use bash, build your own docker images, run docker comfortably. If infra is not your thing kubernetes is probably not for you.

Kubernetes Was Built for Google

Just like how react was built for facebook to solve facebook problems with many teams contributing effectively to the same interactive interfaces. Turns out that react is actually a pretty good product if you have a highly interactive page, and if this is your bread and butter, you can make overly heavy static sites with too much build very effectively. It works and runs much of the internet now.

We are getting serious. We need serious tools. Big companies use Kubernetes. We should too. It feels more professional. It sounds like we know what we are doing.

...

Great guide to setting up a samba server right in kubernetes. I tried it out after too long of playing with trying to get connected to a samba share on ucore, no idea what was wrong, but this just works, and will live in my homelab no matter what distro I’m on, no playbook required to set it up, just good ol k8s manifest. TBH I cheated and haven’t set up the secrets yet, so its not quite in argocd or in my github repo, but POC is there and it works as advertised without issue.

The message so many of us need to hear, stop scrolling and start creating. I’m not sure that I have a heavy issue with this, I barely scroll the socials anymore, I have my own rss reader curated with people that I enjoy consuming from. YT is often done as a family activity (with my wife) or listening while doing something like dishes. But I think I’ve been on the other side of this for awhile. There’s something that ticks my brain by twiddling with linux nonsensically or pip install thing-i-heard-about-today and try it. I’m not imune though, I often fill gaps in the day with nonsense short content, but try to avoid the short trap.

How many times in one video can Prime say dude just use arch, dude arch would be way easier, dude you know how hard you are making this on yourself.

I do not envy those who desire full size configurability but stuck with the opinions of GatesJobs. Windows and Mac are so rigid, that it makes it impossible to do any level of customizability that I would want to do for productivity.

Unless you Must work on win/mack for some reason of work, you make something for one of them, you use Adobe, or you play competitive online multiplayer with easy anticheat there is a distro for you. The number of things that you need a win/mack for is greatly shrinking, you don’t have to submit yourself to the pain of Gates that this guy has done.

Homelab Update Jul 2025
Basement shelf with 3 computers, a network switch, an uninterubptable power supply, one monitor underneath, and a wifi access point to the right.

2025-07-27 Notes

Today Wyatt and I conquered cathulu in Cat quest III.

1 min

Ben sold me on the mini pocket pry here. It’s funny how so many minimalist tools become over the top titanium damascus with wild patterns and designs. they look amazing, but are they worth the insane price for simple things? I like my edc to be things I don’t worry about breaking, loosing, or giving away. Fancy ass prybars for $200+ gives me all of those negative feelings I don’t want on my edc.

Ben is always good for a banger of a video, this images app is something that i really want in my homelab, he did some great polish here! The idea of building vibe coded applications for your own personal use with all of your own personal opinions and workflows is something that has been an appealing part of ai, I’ve definitely tossed a few apps in my homelab that I use occasionally and they do what I ask of them pretty accurately.

This feels great to use, but also seems to kill any startup idea I have, as most of them feel like they could be vibe coded out by someone with a bit of skill and they just host their own. Maybe this is a good thing, maybe we are moving into an era of more people owning their own app they use for themself, maybe i need a security related startup?

I really enjoy David’s Glossary, he has absolutely nailed it. I’m working on one for myself that feels close but not quite. I want to have a list of words that auto glossary to terms for me, maybe this is too much automation and I should just lean on wikilinks, i.e. sick wikilink hover, they only take wrapping in brackets. But like David mentions here its a lot of work to make sure they are right on all the older posts. I think it needs to be done with js on my setup, I don’t have no fancy wroker to modify html on the way out, I’m fully static right now, so i would need to do full rebuilds any time the glossary changes, i’m trying to cut down on the number of features that require full site rebuilds and potential cache issues.

I like reading about old hardware and how to keep it running, sending shit out to e-waste after barely using it for a year makes my skin crawl. I find it interesting how most of these resurrections start with a linux build, and the author giving in and going for linux for the first time and enjoying being able to use something they thought was useless for real work.

That being said I have weird thoughts similar to this guy about being able to take a machine and write a novel somewhere off in the distance, but any time I try to do real work form any laptop these days the ergonomics become so unappealing that I tend to just not do anything away from my desk. Theres something that sounds so great about opening vim on old hardware that could last for hours, sip on coffee and write away, but it never works out like that in practice.

2025-07-24 Notes

Completed the 8-bit dungeon in Cat Quest III with wyatt today.

1 min

2025-07-23 Notes

Today I set up hypridle on my hyprland desktop build. It was not too bad, I'm probably going to tweak it as it I go if it bothers me, for now I'm giving it a...

1 min

2025-07-22 Notes

Next I ripped a calendar from the docs. When hovered I get a full year calendar, right click gives me only the current month.

1 min

2025-07-21 Notes

In my adventure to rice out hyprland I set up a sddm theme today, and it looks sick by only changing the wallpaper. I tried out one theme and was pretty...

1 min

Such a fantastic use of uv, its so fast and flexible and does everything I need that next time I go to set up some more complex testing like this I’m going to lean towards it more than i would something like tox. In the post Daniel sets up matrix testing for testing out different versions of python with the same pytest test suite.

2025-07-19 Notes

Progress on markata themes, I'm able to get feedback in the terminal. I'm building out a custom color model that will be able to mix and blend colors with...

4 min

big fan of eza and dust, I like these aliases to have some common commands at my fingertips. I often use the tree command and yes it sometimes goes too deep to actually be useful.

I am a linux user through and through. Desktop, server, vms, containers, everything except my phone is linux. With this I spend a lot of time in the terminal, and have been a long time user of !! to rerun the last command, but with the ability to tack something on at the beginning or end.

TIL about fc, which opens the last command in your shell history in your $EDITOR or pass in your editor -e nvim.

man fc

!! pronounces bang bang and will run the last command in your history.

...

2025-07-17 Notes

TIL pygments-htmlformatter is a big win for markata, didn't have a chance to take notes yesterday, but I'm really working on templates and themes. It's...

1 min

I’ve been a long user of pygments, it’s been the thing that injects <spans> with funny little class names like sc and si into the code blocks of my website. I’ve even gone as far as implementing a plugin for md-it, but I had no idea how to re-style it. I long ago got a theme that looked good enough from somewhere and just used it, maybe I pulled something from their docs site and forgot. Today I learned you can list all the themes easily from the library itself, and render out new css.

from pygments.styles import get_all_styles list(get_all_styles()) # [ # 'abap', # 'algol_nu', # 'algol', # 'arduino', # 'autumn', # 'borland', # 'bw', # 'colorful', # 'default', # 'dracula', # 'emacs', # 'friendly_grayscale', # 'friendly', # 'fruity', #...

2025-07-15 Notes

I'm working on hyprland, one thing I am missing from my awesomewm setup is rofi list all running windows. Sometimes I put a browser instance in a different...

1 min

DT says it so well in this video, I’ve never really been one to shit on software projects, with maybe a VERY small handful of exceptions. The shitting on ubuntu always rubbed me wrong, shitting on flatpak and snap I never got, shitting on systemd because of Leonard Pottering I never got, DT puts it in such good words here. If you don’t like it you are probably not the target audience.

If Ubuntu is too bloated, don’t try to debloat it, this is not windows, we have options, Ubuntu is one option and so much is intertwined together in something like Ubuntu if you think you want to try to “debloat” it good luck. If you have a problem with Snaps, this is probably not for you. You are probably looking for a distro with more control, probably something that you choose everything for.

2025-07-12 Notes

Starting the polkit agent for hyperland arch to handle permission elevation for desktop applications.

1 min

Always enjoy a good read through someone elses setup. I appreciate the desire for pi clusters they are cute, they seem cheap, but feel a bit overrated (at least for those of us with relatively cheap electricity). I love seeing the refurb “tiny desktops” getting a second useful life in a homelab after they have serve their useful life in the corporate world sitting behind the monitor of some reception desk. These things rock, they are underrated, x86_64, not ARM, so they just work. Until ARM becomes more normalized in the datacenter this is where its at.

2025-07-11 Notes

Continuing my exploration of Searchcraft I loaded all of my blog into it. It fully posted, indexed, and had my content ready for search in a literal blink....

1 min

2025-07-10 Notes

[](https://www.youtube.com/watch?v=VFlLRH3ifcM)

1 min

2025-07-09 Notes

What a nightmare this glossary plugin turns out to be, it broke my site. I had it really close, then one more change asked for to the llm, an LGTM and did...

1 min

I’m digging these web2app’s from DHH’s omarchy for setting up an opinionated archlinux hyprland. This gives a way to quickly open a web app as an app either with a hotkey or run launcher in its own dedicated window that you can put on it’s own workspace. I really like a workflow of keeping one window per workspace on one monitor and I can quickly navigate between apps with a single hotkey. This gives you the power to switch through things like chat, terminal, browser, steam game with blazing speed from the keybaord, no clicking no searching, just going directly to it.

Check out kyantech and their project Palmr.

🌴 Palmr. is an open-source file-sharing platform focused on privacy and security. It enables users to upload, manage, and share files with features like password protection, custom links, and access control without tracking or limitations. Designed for seamless and secure sharing, Palmr. is completely free.

2025-07-08 Notes

Setting up the hyprland run launcher to not be case sensitive.

1 min

2025-07-07 Notes

leaning into the rediculous rainbow borders instead of getting rid of them in hyprland.

1 min

awrit is a full graphical browser that runs inside of kitty. I’ve moved on some of my machines away from kitty as the maintainer has seemed so hostile and there are other great therminals out there, but I’m going to give this a go. I have kitty running on my hyprland setup as it is the default anyways. It is actual chromium rendering to a kitty graphics protocol.

Smooth clipboard settings for tmux is critical for my workflow. I’m often grabbing snippets of terminal output to paste into team chats, blog posts, or llm prompts. Admittedly, I’m often doing this with the mouse, unless it’s coming from neovim, which I generally do with motions. Moving from an xorg based setup to hyprland has required me to reconfigure my tmux clipboard settings. This is what I did.

First install wl-clipboard with AUR.">paru.

paru -S wl-clipboard

Next add this to your tmux config. I’ve long had this config, but with only the xorg/xclip setup, now this checks for wl-copy, uses it, or falls back to my old xclip setup.

command palettes are overrated

Command palettes are slow, and overrated, you should treat yourself better. You probably installed VSC*** out of the box and your co-workers see you using the mouse and reprimanded you as they should. Mouse usage is not OK if you are a software dev, you should have the cheap ass free mouse that came with your cousins dell machine five years ago and only use if for emergencies. If you want to be fast you cannot do that by moving cursors to imprecise locations and clicking with your hand. You are not a caveman, put down the stones and get with the damn times. You need to be moving with precision.

So you are taking your first few baby steps away from that Logitech MX Master and you need to get shit done, during these infant months the command palette is your friend. Use it you will be 10x faster than Razer Naga Ron from accounting. If you are in an IDE like VSC*** or a JEttedBrains editor they come with a command palette for running commands and fuzy finding files, use it. If...

...

4 min read

2025-07-06 Notes

hyprland volume control, I wasn't sure if I needed something specific for wayland/pipewire, nope pavucontrol just works.

1 min

2025-07-05 Notes

I might have gpg setup right for kdewallet on hyprland, and I just timed out the request before.

1 min

2025-07-04 Notes

Failed to gpg-setup-for-kdewallet correctly on hyprland, brave still complains. Maybe someday I'll figure it out and complete the post.

1 min

I’ve ran my homelab on k3s for a year and a half now, and have had talos fomo the whole time. I’m not sure if this article helps or hurts. Helps to see that techdufus struggled and wished he went k3s first, but theres so much good to it that I want it.

I’m getting there, ok, I have some of it figured out but not firing on all cylinders like I want.

for PostgreSQL (way better than managing databases manually)

Amen to this, cnpg is kick ass and has me tempted to drop sqlite for my production database default. I mostly make small shit on the side that is never going to blow up. sqlite is really good, but the automation that comes along with cnpg to just run it on all nodes and backups once you establish the pattern with the first one is sick.

...

just fucking use kubernetes

You want to run containers?

JUST FUCKING USE KUBERNETES.

Shut up. Close twitter and fucking do something. Life is complicated. You know what else is complicated? Email. DNS. Life. Kubernetes is the least painful way to orchestrate containers at scale. Docker Compose is for your laptop.

...

markata parallel render

_._ __/__ __ __ _/_ Recorded: 07:53:56 Samples: 71681 /_//_/// /_\ / //_// / //_'/ // Duration: 92.741 CPU time: 91.748 /_/ v4.5.1 Program: /home/waylon/git/waylonwalker.com/.venv/bin/markata build --pdb 92.740 Markata.run markata/__init__.py:443 `- 92.714 HookCaller.__call__ pluggy/_hooks.py:479 [2 frames hidden] pluggy 92.714 PluginManager._hookexec pluggy/_manager.py:106 |- 38.207 wrapper_register markata/hookspec.py:265 | |- 26.105 render plugins/link_collector.py:59 | | |- 10.012 BeautifulSoup.__init__ bs4/__init__.py:122 | | | [14 frames hidden] bs4, html | | |- 5.599 <listcomp> plugins/link_collector.py:181 | | |- 4.050 <listcomp> plugins/link_collector.py:173 | | |- 3.466 Markata.map markata/__init__.py:565 | | |`- 2.092 markata/__init__.py | | `- 0.942 BeautifulSoup.find_all bs4/element.py:2008 | | [2 frames hidden] bs4 | |- 9.107 render markata/plugins/render_markdown.py:260 | |`- 8.902 result_iterator concurrent/futures/_base.py:612 | | [5 frames hidden] concurrent,...

principal-engineer-at-meta

Jake Bolam principal engineer at Meta, has some of the best career advice for those looking to become principal or just be better at their craft. This video was such a banger I had to bring it in as a full post, and not just a thought. It was a random YouTube auto play, something that I probably wouldn’t have clicked on given title an thumbnail, but turned out to be very impactful. Jake is such a smart guy with a lot of great insights, and I can tell he thinks really quick on his feet, he just pulled all of these things out of his head on the fly.

Jake had a super long period of on boarding at meta, he came in as a seasoned leader yet took many months to get going. This was a phase during or near the end of the COVID-19...

...

For anyone self hosting a bunch of apps under one domain, I just swapped all of mine to Host matching which includes the full subdomain, and it is glorious to not have 9+ items hit on all of your pages and only the one that you actually want.

open one > edit > gear icon next to url > Host

vim usage is becoming normie level. Just like archinstall made it too easy to install arch and brought normies into the ecosystem. It killed ArchBTW^TM^, distros like lazyvim have killed vimBTW^TM^. It used to be that to run arch, vim, nvim you had to read the docs, and go deep on understanding. running archinstallor lazyvim make it so easy to get started that you miss all of the details, you no longer have to understand ctags, quickfix, what an lsp is, or even how to set your own keybindings. You just use the damn thing, like you would with VSC****. No shame to anyone who does this, but you are probably missing out on a bunch of really useful features of a very core tool in your workflow.

Just discovered Sylvan Franklin in this post and he is cracked, sub now.

I got virtual machine manager running on two Bazzite machines today. It was a bit tricky, more than I thought actually. I ran into all sorts of virtualisation not setup issues when I tried the flatpak. Then I found that Bazzite comes with a ujust setup-virtualization command that does all the work for me. I tried that and again virtual machine manager was here, but not working, this time it feels like flatpak issues.

In a Hail Mary attempt I got it working by using an ubuntu distrobox container to run the UI. And it worked!

From the host we create the container to use from distrobox. This is an ubuntu machine, it can be any os of your choosing, preferably one that you are familiar with and contains virt-manager in its package repos.

distrobox create -i ubuntu distrobox enter ubuntu

from inside the distrobox container #

Now that we are in the distrobox we are no longer in an immutable distro and we can easily install anything we want. I actually like this process. I might have shit like this that I use for a month or a few...

...

csv

name,age,city Alice,30,New York Bob,25,San Francisco Charlie,35,Chicago Charlie,35,Chicago Charlie,35,Chicago Charlie,35,Chicago Charlie,35,Chicago Charlie,35,Chicago Charlie,35,Chicago name,age,city Alice,30,New York Bob,25,San Francisco Charlie,35,Chicago Charlie,35,Chicago Charlie,35,Chicago Charlie,35,Chicago Charlie,35,Chicago Charlie,35,Chicago Charlie,35,Chicago graph TD A-->B A-->C A-->D D-->E document.addEventListener('DOMContentLoaded', function() { (function() { const ctx = document.getElementById('chartjs-1'); new Chart(ctx, { "type": "bar", "data": { "labels": ["Red", "Blue"], "datasets": [{ "label": "Votes", "data": [12, 19] }] }, "options": { "responsive": true } }); })(); (function() { const ctx = document.getElementById('chartjs-2'); new Chart(ctx, { "type": "line", "data": { "labels": [ 65, 59, 80, 81, 56, 55, 40 ], "datasets": [ { "label": "My First Dataset", "data": [ 65, 59, 80, 81, 56, 55, 40 ], "fill": false, "borderColor": "rgb(75, 192, 192)", "tension": 0.1 }...

perfect

Perfect is a made up word that humans use to describe something that is above average, or works really well for them. The idea of perfection is fleeting, as you think more deeply about something, you can continue to chase the idea of perfection to unimaginable senses. Sometimes perfect simply means good enough. Could there be something better, Always, but at what cost. If I spent 10 more minutes on this post would it be better, maybe, but I might fuck it up. If I spent my lifetime studying how humans read and think, sole focused on how it pertains to this post, ya it would get better. When I use this word perfect it’s not meant in the most literal sense of the word, but perfect to me, maybe good enough given the constraints I have, its the best thing I’ve got.

I just never quite understood why the word just can send people over the top. I get it when you don’t know someone, you don’t have history with them, and they come in saying you are doing something wrong.

I pulled this out into a full post just

just

I just never quite understood why the word just can send people over the top. I get it when you don’t know someone, you don’t have history with them, and they come in saying you are doing something wrong.

When you say “just,” you’re skipping over all the invisible complexity. You’re assuming the problem is simple, and that the person asking for help hasn’t already considered the obvious.

You’re not seeing the constraints:

...

2025 is not the year to get put on the market, its rough out there. Junior’s have little chance, senior+ are even struggling. We had it easy from 2020-2023, now its over saturated and you have to want to be in this industry to be here and stay here. It used to be a fine place to get a good job to pay the bills, the bar has been raised and if you don’t want to be here you are going to struggle. Theo covers this in this linked video deeply [[ thoughts-472 ]].

David’s design on his blog is fantastic likely from years of small improvements like this converting ugly quotes to pretty quotes and optimizing fonts.

It’s common for markdown libraries to convert the first to the second like my build script does.

This is new to me, I had no idea that markdown libraries did this, I’m now interested if markdown-it does it.

For subsetting I use the fontTools library but I’ve no idea how to setup Python environments. I got it working once and failed to document the process.

...

Copier has a few quirks with vcs that I just discovered by trying to test out some changes. I may have some config that I have long forgotten about somewhere deep in my dotfiles, I don’t think so, but id love to be wrong and corrected, please reach out.

I tried throwing everything at this template to make it work. I tried a bunch of flags that did not work. I tried making commits to the local repo to get rid of the dirty warning. I really wanted to test new changes locally without committing and pushing untested and potentially broken changes.

uvx copier copy ../markata-blog-starter . uvx copier copy gh:waylonwalker/markata-blog-starter@develop . uvx copier copy ../markata-blog-starter . -wlg --trust

What Works - –vcs-ref #

Finally after trying everything to get the local copy to work, and my guess of @branch not working I found this to work. It does require me to go to the repo on my develop branch.

uvx copier copy gh:waylonwalker/markata-blog-starter --vcs-ref develop .

...

I came across checkbox from canonical, and it’s packed with great features and ideas.

Checkbox is a testing framework used to validate device compatibility with Ubuntu Linux. It’s the testing tool developed for the purposes of the Ubuntu Certification program.

pypi yanks suck, they are rare, this one got me today as it was a pinned dependency in my dependency chain. The latest release broke python 3.6/3.7 (which 3.6 has been EOL for 3.5 years btw), and it claimed >=3.6. In order to allow users to still install xlsxwriter without pinning down it needed yanked. I’m not sure if there was another way around it as pypi releases are immutable, so you cannot fix

This now has me wondering what the heck is using it with old pythons.

It appears to have broken builds on Canonical/checkbox for ubuntu 18.04. Checkbox is a device compatibility testing framework.

https://github.com/canonical/checkbox/actions/runs/14644718138/job/41098549191#step:8:125

I try to use conventional commits on all of my commits, but I often end up only using feat/fix. I need to keep this page handy and get new verbiage worked into my language

Optionally include a scope fix(parser):

A bang indicates a breaking change note. For example …

Great breakdown of nextjs. I was highly unaware of its performance optimizations before reading this. The smell of vendor lock in from next/vercel has been there from the start, this is the first real claim I’ve seen.

I’m out on modern js front ends, complex builds that change every 6 months, design patterns are out of date just as fast. Its hard to keep up, especially when you don’t have the use case for highly interactive apps. Libraries like htmx or plain ol js gets the job done on the majority of sites and everything I tend to work on.

I’m totally with Prime here, there is something about the read only, mouse clicking part of my brain that causes me to be more critical of the code at a different level. It doesn’t hit the part of my brain thinking about the edit or how to do the edit, it hits a part thats thinking about how I will have to deal with the code moving forward.

Vendor lock in disguised as performance. Nextjs aparantly now streams all of your metadata on the fly with js. This would obviously kill all seo right, well not if you’re on vercel they automatically detect search crawlers and serve the metadata. Why the f do they need to do this and not just serve everyone the metadata. The Web is this beautiful place where anyone can create and build amazing things with a relatively low skill. Js is meant to be enhancement, not degrade the experience of its users.

I’ve been using gitingest web ui [[ thoughts-516 ]] for quite awhile to serialize git repo into llm friendly text files. This gives tools context about repos that are not in the training data so that it knows about it and how to use the code in the repo. gitingest also has a python library [[ thoughts-517 ]]

I had a use case for a project not yet on git, and found yek.

Their instructions tell you to curl to bash.

curl -fsSL https://bodo.run/yek.sh | bash

I don’t like curl to bash from random sites, so I have my own self...

...

Today I discovered brightnessctl to adjust the screen brightness on my AwesomeWM machine. Its a command line utility that you can use to adjust the brightness of your screen. A command line interface like this gives you the ability to bind keys with something like [[xbindkeys]] or your window manager configuration.

sudo apt install brightnessctl # or paru -S brightnessctl

Now that you have it installed you can use it to adjust the brightness of your screen, this worked particularly well for my laptop screen, I don’t think this works for monitors, in my experience they are usually controlled by the built in osd.

I thin a lot of us have this issues, especially on side projects. At work therre are expectations, jira tickets and so on, keeping you shipping. I think there is something to be said about getting that quick and dirty POC to the right group of people early for feedback before you add redis caching, kubernetes, auto scaling, disruption budget, distributed nodes, high availability, backups, disaster recovery. At work you kinda have to have the right person to shoot ideas by that can understand that you probably need some of these complex things for your app and it will take time to get right.

I would love to have a browser based video editor I could throw on a server and do quick edits from anywhere. I tried to get this one to work and struggled to get front end to send api requets to backend. I think the root of it was their redis wants to run on 80, this caused a permission error so I tried to run 8880:80, but redis was still unable to start due to a config permission error.

I love this idea of tiny useful apps for yourself. In fact I’m working on a project to built out tinyapps for myself to replace my common needs. I absolutely love that all of the state is stored in the url bar, nothing is stored server side. As much as I love to hate js, I really appreciate that things like this can be built to just live on the web, be accessible from anywhere, and live practically forever as they require such little hosting demand.

This looks like a very useful formatting tool to keep in the back of my mind. I do a lot of python and our tool tends to be pre-commit, named after the git hook pre-commit. It specifies a bunch of tools to run, you can run them in ci, manually, and opt into doing it before commit. I like the simplicity of this one not needing a whole ecosystem, but rather just leveraging the cli commands from those tools. This would probably be something that would get in the way of setup for new devs and not something I would throw on one project by itself, its another thing for everyone to figure out how to install and run on every platform, I’m sure its not hard, but being on python teams pre-commit just fits in.

Focus on the joy, not the suck. Nothing you do in life will be absolute pure joy with no downsides forever, life does not work that way, your brain does not look that way. Look at anyone who ever got massive billion dollar payouts for something like minecraft and how much their life is not glorious when they have nothing to really look forward to.

Prime talks about it in almost a cliche way, every boring ass task is an opportunity to grow. This is so real though, if you look at every task ask a shit you gotta do to check that jira ticket off and make bossy lady not scream at you its going to be a hell. If you rather look at it as opportunities to implement new features in new ways or learn something to better yourself and watch yourself grow you are going to take a big dopamine hit. I think prime talks about this in the sense of larger projects. He as talked about his experience being much less of a daily standup, but more of a ok we got three months to figure this out lets go boys. When you are stuck in that daily jira grind it’s harder to see that larger picture of the learning and growing you are doing over the course of 3 or 6 months.

...

Should I go to college? Was my education worth it? Should I keep going. A question that comes in all too often accross most industries that require some level of education. DHH has such great takes on it, some I had never fully thought about. He starts out with should we have people study niche topics (using Russian Poetry as an example). Yes the world deserves people who can make their life works out of something that brings them and many other so much joy, but no you probably shouldn’t go 100k’s into debt to do it. Should I get a software engineering degree, or become a doctor also have similar answers, it needs to be somewhat justified and not outrageous as has become the norm.

We used to listen in to Dave Ramsey on long car rides and he would have people call in and say, they went half a million dollars into debt to become a dentist, only to discover they did not want to do dentistry. At this point it’s too bad, you gotta suck it up and pay that off with something that makes some serious cash, and the only skill you probably got that can bring in that level of cash is … dentistry.

They dive into the college experience, learning to have adult debates with classmates about...

...

webtui, looks like a pretty sick design aesthetic. I like the keyboard driven nature of it, the look and feel is on point to a terminal interface, sadly it looks like it is not a 2 way street, you don’t automatically get a tui our of your website, just one that looks the part in the browser.

I’ve never heard of niri, or a scrolling window manager, it looks quite interesting. I think tiling window manager misses out on named sessions and hotkey straight to tmux sessions, Brodi mentions not using tmux right before this segment. Niri looks quite interesting, but looks like it suffers specificity. maybe there are other tools that allow me to jump straight to something like brave, or steam, but I don’t see how I could jump to a specific terminal.

I’m way behind on my notification game and need to pick it up. maybe I’ll look into hcio as well. maybe I’ll look into something that goes straight to signal or just get things working on ntfy. An 80GB log file is massive and the kind of thing id like to see notifications more.

The rich console is themeable, I’ve been a long time user of rich and had no Idea. You can define your own theme keywords and use them just like you use normal rich keywords in square brackets like'[bold red]'.

I’ve long avoided running ads on my blog for the same reason. For a few months I ran an ad above the fold. It was a “Your Ad Here” kind of thing, and in the messaging I was looking for content relevant to my content, not google driven ads. This resulted in nothing, no hits, not a one. I’m kinda with Will on this one beer money is not worth degrading the project for. I seriously thought some of the big projects with a moderate level of success got a good cut for these sponsorships. Some of the companies are big companies, like how do they even go through meetings and decide who gets beer money without spending more than that in decision making resources. Maybe they have a guy with more autonomy than I would expect.

Browsing for the minio tag that I have running right now I discovered that you can do minio --version and you get the same version that matches the docker tag, this is super convenient and helpful. I also notice that they use timestamped version numbers. I kinda dont mind this. It feels easy to understand how far behind it is. I really appreciate that the version in the container matches the version inside the container.

It’s not as pretty or flexible as semver, it does not communicate trees of majors and minors, but how often do we continue supporting/patching older majors and minors, in my experience only really big teams or teams with sufficient motivation are doing this.

food for thought.

You can unset multiple environment variables at once. I did not know this was a thing, its something that ended up happening organically on a call and asking someone to run unset. They had never done it before and did not know how it works, but did exactly as I said instead of what I meant. I like this handy shortcut doing it in one line rather than each one individually, I will be using this in the future. You might need this for something like running aws cli commands with localstack.

I am going to start trying to employ this rhythm to my writing. I’m not very sure how I feel about it, there is something almost too assertive about it. It’s giving me a (i’m great and you should too) kind of vibe. I want to become more assertive in my writing.

I’m giving this a shot and see what I learn, you might notice in my tils.

i3lock is a fantastic lockscreen for tiling window managers.

If you are using a tiling window manager within a public space you need to add a lockscreen. I have one machine that I take with me to a public space. Its secure enough that I can leave it, but not secure enough that I want to leave it unlocked. So when I need to leave it behind for the restroom I need to lock it up.

arch wiki

paru -S i3lock # or apt install i3lock

Now that you have i3lock installed lets lock that screen.

...

kraft

Kraft is the family gaming server that we started early 2025.

Villagers are really hard to get gong. We have this huge villager tower on the server, we nearly every bed filled, and one day we logged in and there were three. Not sure what happened until I witnessed one of them jump maybe 3 blocks down and off himself. I checked my last two villagers and they were each on one or two hearts left. We almost lost every single villager on the server.

To get villagers to breed and make baby villagers you need beds, which we already have, and food. I gave my guys some food and they started making baby villagers immediately, crisis averted as we start to get the first few fresh full health villagers on the server.

1 min read

This talk about live store really made me think about database transactions in a new way. They are talking about live-store, and the complexity of distributed applications like a notes app with the ability to go offline and continue working. The complexity of resyncing each instance is not simple, conflict resolution accross all the possible installs that may or may not even be online is a really hard problem. They go deep on discussing an event driven paradigm that is driven off of a log of events and how this changes how we deal with databases. Using the event log as the source of truth we can do things like forget about database migrations, we can replay all of the events onto a new database. Its very interesting to rethink in terms of a log system that speaks in terms of understandable events (not table operations) as the source of truth for an application.

my nvim spellcheck setup

I’ve gone too long without a proper spellcheck setup in nvim. I know it’s there, I just don’t use it, I don’t have the right keybinds, like I do with vim date, to make it work, and its clunky.

I really struggle with bracketed keybinds, they don’t flow for me. I have to shift into it and hit two keys, you cant just pop through them with intent, it always feels clunky to me.

I barely use F-keys in my keymap so that was free game. On my keyboard I have F1-F9 in a numpad layout on my right hand, so F4-F6 are home row, these are super easy to pop...

...

2 min read

I need to find this podcast, was DHH this animated through the whole thing?

You don’t need a mentor. There’s no secret sauce left inside anyone’s head any more. It’s all been tapped, bottled, tweeted, and shared a million times. Sample some of that, but also guard your ignorance. You’ll lose it soon enough.

It takes work, one on one hand holding is a shortcut. Sometimes one that we need. Sometimes we need to level up quick, hence why your job might pair you up with someone for the first few months, but it is not something you need, you can figure shit out on your own with hard work. These days we have things like gippity to bounce ideas off, and you can generally get the sense of the direction the average of the internet it was trained on. Always add your own experience and make a choice for yourself.

The object storage (S3-compatible) platform MinIO created a bit of a stir this week

I had not heard about this before it came in through selfh.st. I use minio a lot, and did not know there are so many great alternatives out there for it. I might be looking into some of these options such as garage.

Its hard to tell from this article what mino dropped, but luckily for me it seems to be all ui related. I use the UI for debugging/feedback/sometimes learning, but at this point I’ve got good flows for setting up new access keys, buckets, and everything with the cli.

I suffer hard from NIH, I’m cheap, I like building things, I hate reading the docs, the perfect recipe for some bad NIH. I really like DHH’s take here. If no one builds anything new we get stuck with the same old shit. I think theres a lot of things that as far as my use case is concerned feature complete and needs no more. I would just build with it or on it, but not re-invent. It’s a slippery slope.

I really like the idea of Jim’s Eternal Links, and really want to take it for myself. To expand here I want to be able to look for common places for rss feeds, and be able to scrape out rss feeds for sites that I tend to link to often. Also if they have something like a /blogroll it might be a good place to find new great people to follow.

Maybe we need a little more friction in the world. More things that merit our time. Less things that don’t.

I can resonate with this post, less friction feels like it leads me to thinking less, having less skin in the game, understanding less, feeling less fulfilled. Vibe coding is a new trend of 2025, it feels like the future, but it does not quite feel like the present yet. It’s riddled with errors and I only get frustrated when it doesn’t work. I like having some friction that leads me to think and pay attention. There might be a future where this is not required for some things like coding up crud apps, but that does not feel like today.

Some of the best things from the old internet are still preserved with RSS. Content is shared via simple files, which means the slow-loading, ad-stuffed and tracker-filled clutter of the modern internet are mostly absent.

There aren’t any algorithms. RSS readers are wonderfully dumb. There’s no AI sifting through content to find whatever will outrage you the most. You just get new posts and mark them as read. It’s a calmer world.

With RSS I follow lots of people writing about normal people things. People blog about getting back into playing the drums, a fun book they just read, a tough problem they’re working through and the other day to day things of life. This type of content tends to get buried on social media — it doesn’t get the clicks and sell ads like fear and outrage do.

I feel like a curmudgeon, but i feel all of these things. I dont think that the new web is completely terrible, what is terrible is that the options of an algorithm ran by companies with differing goals is seemingly the only option. RSS still works, its fantastic, I personally love it, but theres only a small fraction of the internet that it reaches both ways. Few people have a reader, even...

This is a very interesting cli, its so simple. I stumbled accross the gi command awhile back and was like pfft, I dont want to install something for that. Didn’t even realize that you don’t install it, its just http. Their install instructions lead you to putting a curl funtion in your bashrc.

function gi() { curl -sLw \"\\\n\" https://www.toptal.com/developers/gitignore/api/\$@ ;}

This now has me wondering “What else can build like this?”

linkarzu has a way to navigate his entire mac using a hyper key. Everything looks so tight and polished, also a lot to remember! Lucky he has a system of mnemonics that make it easy to remember. His setup is very Mac focused using mac only apps, so this would not work for me, though I’m sure I could get something similar on linux. He did mention Kanata which is cross platform.

I use a far different system that is fast loose and easy. On every system I run I have 9 workspaces that let me put 9 applications, I can easily move apps to different workspaces and have a side by side if I need. The core of what I do is terminal, web browser, and chat. Those go on workspaces 4,5,6, whch are home-row keys. If I’m running obs, that is on 8, steam goes on 1. but I have some freedom to move. Sometimes 2 will be an image editor or a video editor, sometimes something else all together, but I can quickly go to each app.

I do like his layered approach. I run a 42 key keyboard so things can get a bit cramped quickly. And when thinking in mnemonics you only get 26 letters in the alphabet, but prefixing these with another layer this number goes up exponentially. Sublayers sound sick to be honest.

If you need to target a specific k8s node in the cluster, you can use labels. You want to treat your nodes as much like cattle as you can, but sometimes budgets get in the way. You might be like me and just run any free hardware you can get in your cluster, or you might have some large storage or gpu needs that you can’t afford to put on every node in the cluster.

kubectl get nodes --show-labels # add the bigpool label kubectl label node k8s-1 bigpool=true kubectl get nodes --show-labels # remove the bigpool label kubectl label node k8s-1 bigpool-

To use the label in a pod set spec.nodeSelector to the label that you applied.

css if() just landed, I’m struggling to understand what I an do with this that I can’t do with something as old as classes. I can get it if I don’t have control over html creation or js to add classes. The example that Una shows includes data that could directly be a classname with a set of styles in css rather than this crazy css variable unpacking out of a data attribute and an if statement.

Allen Carr1 on quitting smoking: [Carr] recommends working to really notice and internalise that disconnect [between what we want and what we enjoy]. He tells smokers to pay attention to their next cigarette. It’s like mindfulness but for noticing the unpleasantness.

I can appreciate the restraint here, theres something about the mindfulness behind it all.

Linux Is About Choice

This Luke Smith video came across my feed Linux, Bitcoin: When Tech Projects Become “Too Popular…” Don’t forget the goal.. It’s interesting to hear his perspective about Linux, FOSS, Free Software being the end goal, and that we are loosing sight of the goal. This sentiment really aligns with the early FOSS movement from Stallman, but was this ever the goal?

Luke talks about these projects getting taken over by people with no passion for the original goal of freedom and privacy. They want the projects to grow, get bigger, and become mainstream. This feels exactly the opposite of anything Luke would want, so my bias alarm goes off here. Honestly I do see some of the grossness of projects like this that were grassroots, for freedom and...

...

6 min read

Markata got a shout out part way through the latest episode of LNL, I will go back, re-listen and take some of the feedback. His thoughts on Markata were interesting. On one hand it really is a thing for me that works for me, and as a person with too many side projects I don’t have the focus to really give it polish. On the other hand it really confirms why listen to podcasts, news, finger on the pulse, opinions and how often these guys are wrong, they are not the expert they probably look at 6 things like this a week. He said that it was some sort of javascript thing, that maybe he could fix or customize with javascript if he wanted, kinda shocking, I thought maybe I accidentally added node modules or something dumb, nope, I have a whopping 1.4% js. So most of the comments were plain wrong. I get it he probably peeked at it for 30s and realized it wasn’t the thing for his problem. At the same time I should probably do a better job at marketing what it really is, cleaning up the docs and demo.

Such a great message right now. I feel like everywhere I turn is negativity, especially social media. It feels like so many things are trying to divide and create hate. “This” is what we should be doing with social media. There are a lot of elements of “there are two ways to have the biggest building in town, tear down all the bigger buildings, or just build the biggest fucking building”, If you want to be successful in X then surround yourself with others successful in X. This is a catalytic skill that everyone needs to have in their belt.

I’m currently [[replacing-google-search-apps-with-self-hosted-web-apps]] and decided to create a simple b64 encoder/decoder, just start typing to enter text, escape to deselect, then e/d to encode/decode.

I’m trying to make these apps super simple, self hosted out of minio, static html, and javascript. It’s been fun to get back to some simple interactive web development like this. No build just a website that does something. No broken builds, no containers to deploy, just push to minio.

encoded = btoa(content); decoded = atob(encoded);

Here is the result.

f2 by ayoisaiah is a game-changer in its space. Excited to see how it evolves.

F2 is a cross-platform command-line tool for batch renaming files and directories quickly and safely. Written in Go!

Great conversation with Billy Basso the creator of Animal Well on the code architecture of Animal well. It’s all hand crafted C++. He talks about early games he tried to build being heavy in oop, and really got lost in oop. Animal well is very flat, there is no inheritance, just lists of entities that all implement similar methods in their own way. Layering and order of entities becomes very important. Its crazy how much he had to think about hardware and MS build being very helpful with this, but needing to know all of the console apis.

This is great, beautifully captures a modern backend view of https://motherfuckingwebsite.com/. I honestly resonate with almost all of this. I have found myself in more trouble than help when trying to fully vibe out a project. It never refactors, it leaves it shit everywhere, it mostly does what you say, until you get to something that seems easy, so you try to do it yourself, but you break its brittle piece of shit into pieces any time you try to touch it. AI coding help is great, mcp seems like it really has some game changing abilities, but hands of vibe coded crap aint there yet for me.

Bugs exist when your test-enforced implementation fails to match the behavior described in your documentation. Without documentation a bug is just undefined behavior.

This is quite an interesting thought, so does this mean that, none of my undocumented side projects have bugs? no I think there is still some implied behavior that naming things covers. a function get_bucket_contents implies doing something wtih s3, getting stuff from your local filesystem or crashing would be considered a bug. I think the argument here is that if I start mining bitcoin when you call get_bucket_contents and I have not documented it that this is a feature not a bug. If I were to take this a step further, now do I need to document that this does not also start a bitcoin miner? maybe this is more of an unwanted feature than a bug, I’m convincing myself more and more.

tinyapps

I’m working on replacing my usage of google inline search apps with real apps, these are ones that I create and host on my own homelab. The first three that I created are mostly chatgpt based, with a bit of hand edit after the fact, uploaded to minio and become an app on my k8s-pages

I’m leaning on 3 min read

I’m trying to replace my usage of google inline search apps with real apps, today I used a stopwatch to time some things out at work by opening stopwatch. This was something I just wanted running in a tab on another screen, it was not timing running code or anything, I was using it as a reminder to check browser caches every 5 minutes or so for some testing.

So tonight I whipped up a stopwatch, clock and timer, all of which are using the wakelock API to keep the screen on while the app is running.

Interesting take on kubernetes from a front end perspective. All valid arguments to me, and really the answer to any do you need to any specific implementation of tech is probably no. We got along just fine before k8s ever existed and you still can, but its really nice in a lot of cases. If your skills lean toward backend or infrastructure I encourage you to give it a try.

There are a lot of beginner friendly k8s distros that you can setup with relative ease, kind and k0s are great for single node, If you want multi-node k3s is what I generally use. If you want a very lightweight OS that you only interact with through an api, and has a very small attack surface talos is an amazing product.

Internal, on-prem, self hosted. If you are trying to avoid the cloud for cost, rules, regulations, red tape, kubernetes is a great option to manage your container workflows yourself without needing to have a cloud budget, get approvals and sign offs on running...

m9a devlog 1

It’s sad to see textualize.io close the doors, but textual is still alive and maintained as a n open source project. I tried to use it very early, and struggled, this was before docs and tutorials really existed, before a lot of the widgets and components existed. Then as we all do I got busy and moved on to other things in life and did not have the capacity to build TUIs.

I like tuis, I like staying in the terminal. I use lf daily to move files around when I want something more than mv and cp. I use k9s hourly to...

...

Just listened to this as I am really starting to get into grafana and feel like there isn’t a mountain of setup this time around realizing how much of my stack is brand new. Drill Down and Alloy are both new and key to my setup. The Ai integrations at the end sound wicked good, I will be interested if you can do similar things with an MCP vs how much proprietary stuff needs grafana cloud.

Ultimately though a business needs a product. Textual has always been a solution in search of a problem. And while there are plenty of problems to which Textual is a fantastic solution, we weren’t able to find a shared problem or pain-point to build a viable business around.

I can totally see this. Finding a marketable business idea is not easy, working in the developer space where everyone wants to do it themselves is no better. Textual specifically I could see, I really wanted to build things on it as it came out, I had ideas, it was hard to use at the time and changing, so I took a break, got busy with far too many other things, and really I ’m good with rich most of the time.

I daily use k9s, its absolutely amazing at what it does and appreciate that I could build something like it in python, its just hard to justify the time investment for the things I tend to work on.

Which is why Textualize, the company, will be wrapping up in the next few weeks.

...

So it’s back to plan A: taking a year off. I plan on using this time to focus on my health–something I haven’t prioritized while working as a CEO / Founder of a startup.

Wish you the best Will, you have given us textual and rich, and from what I can tell left it in some great hands.

All I can say for certain is that I would like to write more. Writing scratches many of the same itches as software development, and it is a skill I’d like to nurture.

Go get em Will, write to your hearts desire, and resist the urge to make an SSG company this time.

Dang Strong takes against markdown here with a strong push for bespoke content models/structures. This idea is completely foreign and wild to me. I get it that markdown has its issues with flavors, add ons and what not, but overall its mostly transportable, its a skill that works most content sites and writing tools. I am so far on the other side that I seek out tools with markdown as an option and lean away from wsiwyg tools with specialized data formats on the backend.

I’ll end with, I’m also a dev that creates very simplified content and maybe seeing the backend of a site with lots of custom fields would be very eye opening for me.

Last year I attempted to do some newsletter-style link aggregation… that good intention imploded spectacularly. But I switched to Obsidian this month and now I have a better system for aggregating links (post on that coming later). Inside this issue you’ll find some games, some homelab server hardware, some AI discourse™, some musical instruments, and more.

This hits so close to home, I even went through the effort of making a weeknotes script, one weeknote post. I also was inspired by obsidian but it didn’t work out for me, so my script uses data from markata.

Do you remember regression models from college: given some data, you find a best fit line that allows you to predict Y given X. At the end of the day, ChatGPT, and LLMs in general, are the same thing as the regression model – it’s just that ChatGPT is the largest and fanciest model we currently have to model language and information.

I really am coming to the idea of calling it a “word calculator”, this seems to be the most succinct description of llms that the lay person can comprehend and relate to.

ChatGPT does not hallucinate or become unhinged

I think Steve goes much deeper on this in his intervew on fafo.fm. They describe it more as a pleaser or “yes man” essentially all the companies that are building these models want to give the “best” answer, better than their competitors. With this comes the risk of it being completely wrong, they are designed to always give an answer.

...

I’ll triple down on the link-blog chain here, see this one going around all over this week and finally had time to read through when it hit my rss reader via Chris.

It should come as no surprise that nearly every vibe-coded app on the Internet struggles with security issues; look no further than the vibe-coded recipe app that leaks its OpenAI keys. Every time one generates code by prompt, they create a new stillborn program; vibe coding is the art of stitching together their corpses into Frankenstein’s monster.

Damn, that is a strong statement, stitching together the corpses, strong statement here. The OpenAI key thing feels kind of obvious to me, every set of docs, blogs and examples on the internet need to be runnable for people to learn and try out new tech easy, putting secrets in the wrong place is easy, putting them somewhere that you can decode them without sharing them is hard team specific, app specific, and so nuanced to your architecture that its rarely...

...

Under 2000 everything is happy, green field. Any decision you have made is relatively easy to back out of (barring you making a library with downstream users), but as you go, regret kicks in. Regret we didn’t make that pydantic 2 upgrade earlier, as new features become more apealing. Regret that we chose sqlite for simplicity, speed, agility, and now we might need robust and distributed. Regret that you chose a front end framework, or to have a front end at all to a backend problem. Regret that you put 6 layers of abstraction on your db early on and now that you understand the problem you want different abstractions, but all of your endpoints deeply depend on the current one.

Vibe coding will not save you, it will only make these wrong decisions for you without the context that you have. You will hate it’s decisions more because you had no input into some of them.

“Gradually roll out your releases to a small group of people”

~ roughly what prime said (I’m listening live)

This really hit home with me, tests can be so good at making sure that we dont repeat bugs and that laser focused things work, tests are generally small and focused, but this does not replace some sort of integration testing. These days very few things are written as a monolith, and hence there are a lot of interactions that really need to play well together accross various systems.

They call out Crowdstrike here, which took down the world blue screening critical windows systems everywhere in 2024. It was revealed that a small changed was rushed through and skipped critical rollout paths since it seemed like a small change. Crowdstrike also runs at a super low kernel level of access and a small memory bug can kill the system.

I’m trying to level up my sre game. I’m trying to set up grafana dashboards for everything and it is such a wide surface area. It’s never just one thing you have to have 3 or more things hooked together in order for the data to flow.

I’m really getting not invented here vibes, and thoughts that I can just build this myself. Not grafana and it’s scalability necessarily, but small components of observability.

I’m trying to learn proper logs, monitoring, otel, and grafana. Today I imported a bunch of pre-made k8s dashboards and made a few of my own for specific apps, and it made me want to know how I can turn my own custom dashboards into infrastructure as code. Turns out grafana makes it pretty easy to do this, if you have the grafana dashboard sidecar running. It will pick up any ConfigMap with the grafana_dashboard label and import it.

Go to Dashboards -> Pick a Dashboard -> Export -> JSON.

hollow knight home row layout

I just made it past 100% in my main hollow knight run, so now I will allow myself to get silksong when it comes out. I did this with a little bit of YT guidance, but mostly just figuring it out. I only just discovered the ⭐ ReznoRMichael hollow-knight-completion-check which got me an extra 2% for a few items I must have got and not saved on, because I was sure I had them.

Hollow Knight is a game that can be played with keyboard or controller, You can use analog stick for movements, but they just translate to dpad, there really are no analog moves in the game. This makes it ripe for playing on pure keyboard. I really favor controller when there...

...

fix feed descriptions

Today I fixed a bug in markata that has been occurring for a few months where the description for posts come out as None if coming from cache, the issue was a pretty simple check and pull properly from cache. This fixes all the descriptions in feeds and metadata on the post.

While in there we went ahead and improved our get_description to more accurately return plain text without escaped characters, remove cutoff words, and add an elipsis if the description cuts off the text.

While I was there I made longer form posts, til, blog-post use the super description of 500 characters instead of the regular 120 character description.

Steve is such a great listen, the neurospicy 🌶️ rambles this episode goes on is so relatable. I feel like I really missed out on some great takes on intellij vs neovim, but got some really great knowledge about vector db’s, embedding, text compression, similarities to vector algegra like infinite craft.

Just popped open infinitecraft and I’ve definitely played this with my kids before, super fun, just could not remember the name of this one. I do remember an android one as well that is alchemist or something like that, which we have also played a lot.

This episode really got me thinking about the difference between HA and DR and my approach to each one. They talk about it from the perspective of a cach cow kind of app rather than a homelab or internal tooling, but think of HA as 9’s how many 9s are we willing to pay for, tink of DR as dollars how many dollars will we loose during the period of recovery. So much more in the episode, a lot of talk around cloud vendors and what they give you vs a purpose build platform with HA and DR in mind.

I’ve been using ruff to lint my python code for quite awhile now, I was pretty early to jump on it after release. Some of my projects have had a nice force-single-line setting and some have not. I dug into the docs and it was not clear what I needed to make it work.

[tool.ruff] select = ['I'] # you probably want others as well [tool.ruff.isort] force-single-line = true

Turns out I was missing Isort in the select list.

Astral is doing great things in the python industry. They are disrupting entire categories of tools with extremely fast, easy to use, and feature rich alternatives that make it really hard to keep using the incumbent. So far I am seeing no signs of evil, sometimes with such a disrupter there is some sort of downside that make it hard to want to do the switch. In the interview they even mention things like leaning on lsp so that it works across all editors rather than building out vscode integrations that work for most developers. As a neovim user I greatly apreciate this.

ty, has a playground running at types.ruff.rs. You can edit code in there and see what the type checker results would be in browser. This looks good, excited to see it running in my lsp.

Here is an example where a Optional may not be defined.

Checking for existance before using it resolves the issue.

I was looking back at my analytics page today and wondered what were my posts about back at the beginning. My blog is managed by markata so I looked at a few ways you could pull those posts up. Turns out it’s pretty simple to do, use the markata map with a filter.

from markata import Markata m.map('title, slug, date', filter='date.year==2016', sort='date')

Result #

[ ('⭐ jupyterlab jupyterlab',...

...

Astral is working on some great things around python, they have created a high standard for python tooling built on rust that works really well, runs fast and covers everything in the space it resides in. ty appears to be their linter coming soon.

This is madness that Wes Bos made this with manifold.js and no openscad! Yes, I have these stupid brackets everywhere, yes, I hand model my own brackets. No I don’t do it enough. I don’t like that these model generators like openscad cannot make fillets and chamfers, but I appreciate the heck out of the speed and automation you can make iterations of things.

Link to the promo video. https://bsky.app/profile/wesbos.com/post/3lo4h7unk6s2i

How is usability and it doing the thing I paid for it to do a selling point?? Any time I’ve touched a windows machine in the past 7 years has felt awkward, I have no idea where things are now, but they look so much worse.

How is usability and it doing the thing I paid for it to do a selling point?? Any time I’ve touched a windows machine in the past 7 years has felt awkward, I have no idea where things are now, but they look so much worse.

Interesting how confidently he says we can easily go to the top. really makes you wonder what we the normies are leaving on the table by using these general purpose models and what could be achieved with really tuned in models. Could I make an automatic blog tagger more accurately, maybe smaller, maybe tuned so well it runs fine on cpu?

The web is everywhere, its the one true write once and run anywhere platform. Millions sunk into browser performance and things like the v8 engine allow us to run our shitty websites anywhere and it still runs good…. most of the time

I didn’t realize that postiz had a helm chart, I just hand rolled mine based on the compose file they provide. I went from running the compose stack locally to running in my homelab with kubernetes. I am using cnpg rather than a postgres container which I really like the workflow of as far as backup and restore. The one hiccup I ran into was changing the domain from localhost to my homelab domain killed all of my integrations and they needed the redirect url updated.

portal-platformer-devlog-1

Here is the current state of my platformer yet to really be named, I want to make something in between hollow knight and portal.

I made one once in make code arcace on a pybadge. It was quick and dirty, but fun to work on. It had the basic of blocks that I could move, blocks i could put a portal onto, and a goal for each level. Some levels you can just walk through and some levels required you to really think about where to place the portal.

So this version of the game is a least 2 years in the making, I open it every few months give it a day or two and move on. Its mostly something that I work on with my son. He really likes to jump around on projects so its hard to make real progress on something, but we are hitting an age where he is able to come back to projects a little better.

...

Check out goose by block. It’s a well-crafted project with great potential.

an open source, extensible AI agent that goes beyond code suggestions - install, execute, edit, and test with any LLM

Looking for inspiration? Reloader by stakater.

A Kubernetes controller to watch changes in ConfigMap and Secrets and do rolling upgrades on Pods with their associated Deployment, StatefulSet, DaemonSet and DeploymentConfig – [✩Star] if you’re using it!

This is a wild concept for a slicer, essentially he didn’t even make a slicer just a crazy pre-process and post prossess to cura slicer, deforming the part until it doesn’t have any overhangs, creating a normal planar slice, then undeforming the output from cura. He also mentions that the rapid moved needed modified as well. I’m assuming this is because they are generally long distances and not short, without breaking these long lines up we would still end up wtih a straight line after deform.

This is an absolute banger of a review by prime and Dylan Beetle. I love the similar takes with different perspectives, would really like to see them podcast together, but this one way style interview does really well to cover a lot of issues in open source, rug pulls, version pinning, thankless maintainers, what its like to open source from a large company.

Interesting takes on Diun here. I agree that I like to be in control of updates and pinning not to latest. both seemed like they weren’t going to run it because they can look up the latest version. Maybe I need to be less aggressive on keeping things up to date and its a me problem. I just got diun setup and hooked into ntfy, and I kinda like the automated checklist of new images that I can review and update.

To be a bit more clear, having control over changes coming in from others, even if I dont care to see the changelog, it is nice to roll out an update, have it in your git history, watch it deploy and work like before, if not roll back and read the changelog. For internal applications I’m down for automated releases like argo image updater give you, this thing has already gone through review, launch the damn thing at least to a dev space.

Davids blogs always have so many links that send me down new rabbit holes. Interesting that his experience with smart home is turning away, I’ve been somewhat interested for awhile, but never fully pulled the trigger on buying things.

I really hope tailscale enshitification does not take off, but really for me, I barely use it even as a homelabber. Idk why, but every other homelabber praises it so much and I just dont find myself using it.

xeiaso, has the coolest characters on her blog. Definitely something I’d like to replicate. I really appreciate how each one has its own sprite sheet, and they have conversations with each other.

Diun, looks like a very interesting tool to monitor for image updates, it does not make any change, it only makes notifications. This feels like an easy start to getting image updates started with low effort, keep git ops, but requires manual updates. I see this as a tool that would be a great start and pair well with automated image updaters to ensure they are working as expected.

Keel looks interesting, I might give it a try as a simple image updater. I’m unsure if it fits my gitops patterns though. I like to keep everything defined in git, I don’t like drift outside of that so Keel might not be the thing I want.

Changing k8s Storage Class - Migration Job

I’m setting up longhorn in my homelab, and I ran into an issue where I initially setup some pvcs under longhorn, and later realized that to get longhorn to snapshot and backup I needed to hand edit volumes after the fact or change storage class. I’m all in on gitops so option 1 was not an option. So changing storageclass it is.

Now the issue is that you CANNOT mutate storageclass on a provisioned pvc, it is an immutable attribute.

This migration job will create a new pvc with the new storageclass and move the data from the old pvc to the new pvc.

...

Damn he makes this easy. I did not know about hx-select. yes there is waste in requesting the entire thing every 5s, but damn that was easy to get life reload. I’ve only done very specific backend endpoints, built pages up from partials, made endpoints for partials. keeping this one in my back pocket.

I’m just kind of amazed that he could do this all in html without touching the backend or js, typically things like this require one or the other. Yes js is running, but no other js library I’m aware of lets you do this.

homelab drive ids

ls -l /dev/disk/by-id/

Drive Bay 1 ata-ST4000VN008-2DR166_ZDHBZSWZ

+————————————————————————-+ | [ Power] [ Reset ] | +————————————————————————-+ | [ BAY 5 ] 3TB WD30EFRX WMC4N0D3J9R7 ext4 /mnt/sdf4 | +————————————————————————-+ | [ BAY 4 ] 14TB EXOS ZTM09R9N zfs main pool mirror /mnt/main | +————————————————————————-+ | [ BAY 3 ] 14TB EXOS ZTM0AALS zfs main pool mirror /mnt/main | +——————————————-+ | [ BAY 2 ] 4TB IRONWOLF ZDHBZV3N zfs tank pool mirror /mnt/tank | +————————————————————————-+ | [ BAY 1 ] 4TB IRONWOLF ZDHBZSWZ zfs tank pool mirror /mnt/tank | +————————————————————————-+

1 min read

Using pbpaste for command substitution keeps sensitive or long URLs out of your shell history. Instead of typing git clone https://github.com/user/repo-with-long-name.git, copy the URL to clipboard and run git clone "$(pbpaste)". This prevents the URL from appearing in ~/.bash_history or ~/.zsh_history.

To get pbpaste working on both Xorg and Wayland, add this to your shell config:

if [[ $(command -v wl-copy) ]]; then alias pbcopy='wl-copy' pbpaste() { wl-paste; } elif [[ $(command -v xclip) ]]; then alias pbcopy='xclip -selection clipboard' pbpaste() { xclip -selection clipboard -o; } fi

The function approach (instead of alias) enables command substitution, while the quotes around $(pbpaste) handle spaces and special characters safely.

Now you can use it.

...

looking into trying these Mill-Max pins on a handwired 3d printed build to see if I can get away from specialty hot swap sockets. Damn they aren’t exactly cheap, I really want the nice short ones but they start at $20 per 60ct and you need two per key, that adds up quick.

jina reader is a pretty sweet tool to convert a site to ai compatible text. There are other web to markdown types of tools, but the convenience of just adding r.jina.ai to the front of any page makes it so easy to grab for one page of docs.

the racked up 4 framework mainboards sound wild. connected with usb4 and 5gig ethernet. they said they can run big models quantized down from 600Gb to within the 512GB limit they have. This seems wild to bring this level of capability to such a low price point. It will be really cool to start to see demos come out.

Trailmakers Pioneers

Trailmakers 2.0 Pioneers was released today as an update to trailmakers. It’s a brand new campaign mode that requires you to mine resources to get materials to craft your vehicles rather than salvage parts like you so in the Stranded Campaign. There also seems to be a more linear play through of the story with the frogitts, unlike stranded where it let you do anything completely open world, as long as you had the equipment to go there.

Out of the gate Wyatt came in with four frogitts to rescue, I don’t know how he found them all, I’ve only been able to find the first one that the master gives you to bring home as a tutorial.

After Wyatt left for bed I played a little more and beat the first of what felt like a boss level enemy, he had much different attacks. I did not think I would make it as I got hit hard from his first explosion attack before I realized what it did.

...

I think I’m getting really close to having a good workflow setup for using pyapp. Such an amazing project to allow developers to create applications in python without passing on the hassle of python and managing installs to the user.

THPS 1 School Gaps

On the road to Gap Master achievement I got all School Gaps in THPS1. This is a super fun level, I’ll have to admit that I had to look up at least a quarter of them, and could not find them myself, mostly due to the naming, all of the rail tricks were actually ledges and I was looking for big rails. None of the warehouse gaps were manuals so I had no idea that the downhill and accross the gym would be manual tricks.

Previously THPS 1 Warehouse Gaps next

THPS 1 Mall Gaps

This is one of the most memorable levels for me in THPS1 from when I had originally played it. Surprisingly there aren’t as many gaps in it as I thought there would be, there are definitely a lot that you can make up on your own. Anyways here’s my playthrough of all the mall gaps in THPS1 on my way to gap master.

Previously THPS 1 School Gaps Next

This is such a cool idea, I tend to not use laptops at all because they are so uncomfortable I just wait till I’m back at my desk. This solves two main issues I have with laptops, the posture to use them is shit, the keyboards that come on them is not what I want to use. I’ve solved the latter with my own custom keyboard.

THPS 1 Warehouse Gaps

On the road to Gap Master achievement I got all Warehouse Gaps in THPS1. This is this classic warehouse level that everyone thinks of when THPS is mentioned. Such a good level, compact, easy to play, with some fun gaps that might take a few tries to hit.

Next up THPS 1 School Gaps

I run tailwind for my personal blog, whenever I update it, pre-commit goes in and fixes end of file. I’m sick of these things fighting each other, since it is a generated app it is going to et ignored from pre-commit from now on.

Long live RSS! Rss is not dead David, you are right there. I really agree with David that learning a topic well enough to form thoughts and write about it really help learning. You don’t need to be an expert, but forming your own thoughts, putting ideas in words takes a lot more than surface level knowledge. When you try to write or speak about something you quickly realize where your holes in understanding are.

Blogging helps me learn. When I commit knowledge to writing it reinforces what I know and shines a spotlight on what I don’t. Most topics require additional research. Even then, I occasionally get things wrong, or miss different ways of thinking, and I welcome corrections. I’ll often update and enrich my posts based on feedback. Without my blog I’d miss other points of view.

As they say, the best way to get an answer on the internet is not to pose a question, but to assert the wrong solution! Most feedback I get is constructive. Sometimes it’s blunt but I try not to read into unspoken sentiment. Some people are more direct. If the end result is positive learning, I can take a hit or two.

After that embarrasing death I made my way over to a touchstone I found and Woodie is back from the dead, but without his beloved Lucy, to get her we will need to go

I like Davids idea for cotton coder here, reminds me a lot of Thoughts, which turns out to be mroe commonly called a linkblog. I can relate to David heavily on gathering too many side projects and soem collecting more digital dust than you would really like them to. I use thoughts for quick publishing, very similar to David’s notes. I have tags and titles, but the titles are a reflection of the post I’m taking a note on. They are short and sweet, I put just enough thought into them without overthinking them. They live as a separate server hosted website, but the data gets pulled into my blog at build time, so they end up in the same place eventually.

I’m really excited about valkey, an amazing project by valkey-io. It’s worth exploring!

A flexible distributed key-value datastore that is optimized for caching and other realtime workloads.

python bindings for valkey, forked from redis.

one notable difference I see from redis is that you can install with libvalkey to autmatically get faster parsing support.

For faster performance, install valkey with libvalkey support, this provides a compiled response parser, and for most cases requires zero code changes. By default, if libvalkey >= 2.3.2 is available, valkey-py will attempt to use it for response parsing.

To kick off the second session, I noticed that when you have a torch you can light your cooking pot, what I did not realize was that this burns your cooking pot to smitherines. Nothing left but a frame of ** ashes.

I can’t believe I’ve never see this Tim Berners-Lee quote, but I can’t unsee it and will be required to reference it from now on.

eventually every URL ends up as a porn site

I had a friend let his blog domain expire, within a short period it was scooped up and was hosting porn. I don’t know why, but my best guess is that they were holding it ransom with the most embarrassing content to have your personal site replaced with.

As I was gathering resources with Lucy, minding my own business ** I got hit with an attack from a Clockwork Bishop, man these things hit hard and have really good aim. I took three hits before getting away, leaving me with very low heath at the end of this play session.

fragmention

This post is still WIP. …..

https://indieweb.org/fragmention##Challenges

I’ve been digging through David Bushell’s blog over the past day, he has some really good ideas about blogging and webdev. One really interesting post I came accross is url-fragment-text-directives. I’ve long had id’s linked on my headings, though sometimes broken, or now showing the link, I’ve done my best to include them. Fragmentions extend this to allow any text to be linkable like this.

...

I’m building in a [[ fragmentions ]] implementation into my blog, I wanted to add some text before the fragment to indidate that it was the highlighted fragment that someone may have intended to share with you.

To get a newline in a :before I need to use \A and white-space: pre-line.

body :target::before, body [fragmention]::before { content: "Highlighted Fragment:\A"; white-space: pre-line; @apply font-bold text-yellow-600; }

Here is what it looks like on my not yet live implementation of fragmentions.

Interesting thoughts here on blog post titles, do we need them? They are so ingrained into everything.

It makes me think about markata.dev. I don’t require you to add any meta data to your post, you don’t need a title at all, but you do have to name a markdown file, and this does end up being your title if you don’t set one.

Titles are a lot of pressure! I think there is a reason that the big text-based social networking sites (Mastodon, X, Facebook, Threads, LinkedIn, Bluesky, etc.) don’t have titles. Especially for short posts, the title just isn’t necessary. Just say the thing.

Interesting observation what rss readers do without one.

...

Damn prime makes an interesting point near then end of this video. He’s seen a bunch of people able to just throw down charts and shit at their company and end up being “the coding guy” cause they proompted something once. In a way I can relate, I got into software in a similar way, but at a time that it took a lot more hard work, understanding , and copy past from the right stack overflow. Based on some of the people around me at the time I can only imagine how some people must feel like they got pushed into it without wanting it, and now are building something they don’t know anything about with no care about it or care to build any expertise. Is the future proompted charts from enterprise chatgpt or do we only continue growing more need for software from here.

I had the grass for a hat, so I figured why not. I'm not sure if it really helps this time of year, but I thought it looked good on Woodie.

I’m really excited about pangolin, an amazing project by fosrl. It’s worth exploring!

Tunneled Mesh Reverse Proxy Server with Identity and Access Control and Dashboard UI

On day two I had enough materials gathered to make the garden digamajig to prep the soil for gardening. I planted the few seeds that I stole from the birds right away.

fixed long standing nvim startup error

Here’s the diff, this is it.

local M = {} M.setup = require("waylonwalker.setup") M.settings = require("waylonwalker.settings") + M.lazy = require("waylonwalker.lazy") M.options = require("waylonwalker.options") M.globals = require("waylonwalker.globals") M.keymap = require("waylonwalker.keymap") - M.lazy = require("waylonwalker.lazy") M.autocmds = require("waylonwalker.autocmds") M.util = require("waylonwalker.util") M.plugins = require("waylonwalker.plugins") M.snippets = require("waylonwalker.snippets") return M

The error #

On first install of my dotfiles I’m presenting with this flashbang of an error filling the screen with red background. Its kinda hard to read, I’m not deep into lua and reading their tracebacks. It pops up in this pager that if I scroll too far it quits and the error is gone...

...

2 min read

Testing fresh nvim installs can be a pain, and hard to di without borking your known good install. I’ve been using NVIM_APPNAME to run a test nvim in a sandbox that wont bork my main install. This usually runs for me in under a minute, can be down under 15s if I remove some of the TreeSitter installs at the end. This beats a full docker build of my full devtainer to test out nvim packaging woes.

rm ~/.cache/wwtest -rf rm ~/.local/share/wwtest -rf rm ~/.config/wwtest -rf cp -r nvim/.config/nvim/ ~/.config/wwtest NVIM_APPNAME=wwtest nvim --headless "+Lazy sync" +qa NVIM_APPNAME=wwtest nvim --headless "+TSUpdateSync" "+sleep 5000m" +qa NVIM_APPNAME=wwtest nvim --headless "+MasonUpdate" +qa NVIM_APPNAME=wwtest nvim --headless "+TSInstallSync! c cpp go lua python rust tsx javascript typescript vimdoc vim bash yaml toml vue just" +qa NVIM_APPNAME=wwtest nvim --headless "+MasonInstall lua-language-server rustywind ruff ruff-lsp html-lsp typescript-language-server beautysh fixjson isort markdownlint stylua yamlfmt python-lsp-server" +qa NVIM_APPNAME=wwtest nvim

I’ve started to use this as a...

Setting up 4G Backup with Google Fi and Netgear LM1200

I connected my home network to have 4G bakcup with Google Fi and Netgear LM1200. Goodle Fi offers free data-only sim cards that you can order from their service. It takes a couple of days, and a new sim arrives in the mail free of charge. It does pull data from your account, so if you are not on an unlimited plan be careful of how much you let go through the sim.

I’ve owned this for a few years now, but it’s been disconnected for a good six months or so. I’m not s[e what happened, but it stopped recognizing the old sim card. no need to point out the coffee stains at the end, its definitely not related

Activating the sim asked for a confirmation code shipped with the sim card, then brought me to this page.

...

3 min read

ahrefs-cleanup-2024

This post is a big work in progress, expect it to keep getting better.

Another hit on 404’s caused by tags, was tag parsing from thoughts into posts, this cause links to the full comma separated list of tags rather than one per tag.

You can see on the website the whole dang set of tags was being treated as a single tag.

...

When I want to put a date in a document like a blog post from vim I use !!date from insert mode. Note that entering !! from normal mode puts you in command mode with :.! filled out. This runs a shell command, i.e. date for this example.

It outputs the following

Fri Jan 31 08:46:11 PM CST 2025

You can also pass in a date such as tommorrow by pasdding in the -d date -d tomorrow.

...

Just after the first night started I found my way back to the center of the map and made a stone campfire. I really like to use the stone campfires as they last forever, you just have to add wood. I was lucky enough to find stone by the Tall Bird to make this one on first day.

Today I ran into an interesting question, why am I being asked to configure tzdata while installing npm. Turns out that the aptitude cli has a why command that very handily nails down why you have something installed on a debian based system.

apt install aptitude

Why tzdata #

Now we can query why we need tzdata and see the full chain with the root package being npm.

On the first day I made a look around my home biome, and ran into a Tall Bird

Today I ran into this interactive prompt on ubuntu while installing node and npm, and I do not want to manually configure this interactively every time I run an install, moreso in docker I do not have the interactive terminal to do so.

Configuring tzdata ------------------ Please select the geographic area in which you live. Subsequent configuration questions will narrow this down by presenting a list of cities, representing the time zones in which they are located. 1. Africa 2. America 3. Antarctica 4. Arctic 5. Asia 6. Atlantic 7. Australia 8. Europe 9. Indian 10. Pacific 11. Etc 12. Legacy Geographic area:

Why tzdata #

Checking aptitude why tzdata it shows that the chain goes back through npm.

I always select the character _. He comes with an axe called _ she has some dark humor (but not too dark), I like her. She also does not wear out so you always have a weapon and way to chop wood with you.

dst session one

Wyatt is also documenting his run, while we aren’t playing in the same world we are playing together.

https://wyattbubbylee.com/dst-forever-world/

I always select the character Woodie. He comes with an axe called Lucy she has some dark humor (but not too dark), I like her. She also does not wear out so you always have a weapon and way to chop wood with you.

...

3 min read

Big fan of Primes setup. I was not far off of his setup before he really came on the scene, but I’ve picked up a ton of nuggets from him and how he operates. I took his first developer productivity course on Front End Masters as it came out.

It is interesting to see him roll back his ansible scripts for bash scripts here. I converted my setup to ansible after watching his first, but have also since rolled back to bash scripts for quite similar reasons. Ansible is great for remote tasks that need to be done on a fleet of machines, but like he says here overkill for this purpose and ends up something that you need to read the docs for every change to your dotfiles.

Unlike prime I’ve really leaned harder on installing everything in a docker image and developing out of a docker image. I’ve long built docker images of my dotfiles with the idea that its nice to be able to just use them on other machines, but it rarely happened.

In the past year I’ve moved bazzite, an immutable distro. It comes with podman and distrobox, so I install very little on it, a few flatpaks from the store for brave and signal, but most of what I really use day to day comes from my devtainer. It’s nice...

...

https://www.youtube.com/watch?v=03KsS09YS4E&t=610s

Today I learned about the basic calculator, bc. At the very end of this video prime uses it to add numbers in vim.

You can start a calculator repl at the command line, by running bc.

Since bc supports standard unix pipes you can easily pipe data from vim into bc and back out using !!bc. All you need is a string of math on the line you want to calculate, go to normal mode and run !!bc to get the answer.

...

markdown split panel

Today I was playing with markdown split panels. I want to be able to compare and constrast occasionually, today the inspiration hit to do this using admonitions.

screenshot-2025-02-04T02-28-46-750Z.png

This is what I am going for, one admonition that is easy to remember, that nests inside of itself , and I can put as much markdown on the inside that I want.

...

Make MinIO Access Key

Today in my homelab I wanted to setup a new service that needed a MinIO access key. So I created a new user and a new access key with the MinIO CLI rather than poking through the ui like I have before.

screenshot-2025-02-03T02-13-38-628Z.png

The MinIO CLI has two levels of access, global and user level. Most of the commands in this post will have several ways to do similar tasks that would potentially work. We are going to prefer to use the user level...

...

I’ve been back to putting some images on my blog lately and thinking about making them a bit thinner through the use of aspect ratio for simplicity. I’m leaning pretty heavy on tailwindcss these days due to some weird quirks of markdown-it-attrs I cannot have slashes in classes from markdown so I made a .cinematic class to achieve this.

.cinematic { @apply aspect-[2.39/1]; }

Example

screenshot-2025-01-31T14-50-00-094Z.png

There is a glimmer of hope out there that normal people can scrap together enough gpu to really run the latest models themselves. The ui really appears to be having huge leaps forward such that doing things like rag is no longer such a research project that it was just a few years ago. So excited to see Prime go through this homelab exercise.

Attrs does not like ‘/’ characters in its classes, so to use some tailwind classes with custom values we must make new classes in our tailwind input css.

.cinematic { @apply aspect-[2.39/1]; }

Given the following markdown with attrs added to the image and to the paragraph block.

![screenshot-2025-01-31T14-50-00-094Z.png](https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png){.aspect-[2.39/1]} ![screenshot-2025-01-31T14-50-00-094Z.png](https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png){.cinematic} {.cinematic} ![screenshot-2025-01-31T14-50-00-094Z.png](https://dropper.waylonwalker.com/api/file/50cfa8dc-9d46-4f02-877b-688fa5510a83.png)

We get the following output with only the middle one working correctly.

screenshot-2025-01-31T14-50-00-094Z.png{.aspect-[2.39/1]}

...

Oh, this kills me to hear it. RSS is the OG way to subscribe and share content out to others. It gives you control of what you subscribe to and reminds you when new content lands on your favorite sites. It is a huge component of web 1.0 and I feel is the most decentralized social media can ever hope to be.

markata 0.8.0

I realize that I never did a post on markata 0.8.0, so here it is. 0.8.0 was released on Jan 2, 2024, just over a year ago at this point. This was the release that we got pydantic support, and multi feeds.

screenshot-2025-02-01T02-37-59-690Z.png

Markata is leaning on pydanttic for configuration and Post models. These models are filled with validators such that you can give it an empty markdown post and it will figure out some pretty sane default values for the frontmatter. From there you can progressivly enhance your post with more information like title, date, tags, slug, description.

...

2 min read

markata 0.8.0

I realize that I never did a post on markata 0.8.0, so here it is. 0.8.0 was released on Jan 2, 2024, just over a year ago at this point. This was the release that we got pydantic support, and multi feeds.

screenshot-2025-02-01T02-37-59-690Z.png

Markata is leaning on pydantic for configuration and Post models. These models are filled with validators such that you can give it an empty markdown post and it will figure out some pretty sane default values for the frontmatter. From there you can progressively enhance your post with more information like title, date, tags, slug, description.

...

2 min read

If you’re into interesting projects, don’t miss out on tailpipe, created by turbot.

select * from logs; Tailpipe is an open source SIEM for instant log insights, powered by DuckDB. Analyze millions of events in seconds, right from your terminal.

I fully believe in our right to repair, ewaste reduction, and bringing a second life to still good hardware that is not up for it’s originally intended purpose. This is a sick console like experience you can strap to the back of a tv, throw in your back to take on a trip, or leave stuffed in your vehicle to game in the backseat. Sucks that it cant do 4k, but I’ve used mine on large screens, and it does quite well for a lot of games, maybe not AAA, but the cartoony multplayer games I play with my kids do quite well.

Damn these deepseek memes go hard. Wild to see openai get played by their own game.

It’s crazy that the normie news that I have seen on deepseek shows that the Chinese made what the Americans did at a fraction of the price, without taking notice that they are building on the shoulders of openai.

👏👏👏 This one is really good. I’m right there with him on most of this. I am very hesitant on subscription models, and all the ai tools feel like they are getting ready to be the next round of death by a thousand cuts, this time with pretty limited free tier and relatively high prices to run. I’m sure we will see companies get taken by huge bills soon by building off of someone else’s service.

On the flip side I’m definitely the guy that gets in a rut of just copy paste to the ai, wait for codeium to to inject. I feel like I have issues of momentum more than anything. When I’m on one side or the other I tend to stick it out for too long, but less so on going without because that llm drug is calling you when you hit a hard problem.

I’m excited to see him build out a homelab for llm stuff that he mentioned at the top. I’m interested, but probably not building one out for myself until we start to see some cheaper maybe used hardware to do it.

Markata DidYouMean

Coming in Markata 0.9.1 is far better documentation. i.e. Documentation that actually exists for everything. As part of poking around I realized that I often go to look up the docs for a plugin and forget that the path is /markta/plugins/feeds, sometimes I might try /markata/feeds or /plugins/feeds.py or /feeds or I might even forget the plugin name exactly and try something like feed and get a 404. So I added a didyoumean plugin to markata that takes care of this.

screenshot-2025-01-31T14-53-31-264Z.png

I made a quick recording of this early feature, pay close attention to the url as it...

...

2 min read

Kelsey says several times in this interview, you don’t need kubernetes. If you are running one node you don’t need kubernetes. My question though is, would you use kubernetes? Ya I get it if you are a web developer, data scientist, backend dev, but if you are looking to bee a whole ass engineer, or infrastructure engineer, you know kubernetes, Should you use kubernetes on single node?

I came accross from_attributes today it allows creation of pydantic models from objects such as a sqlalchemy Base Model or while nesting pydantic models. I believe in the past I have ran into some inconsistencies with nesting pydantic models and I’ll bet one had from_attributes set and another did not.

Arbitrary class instances¶ (Formerly known as “ORM Mode”/from_orm).

Pydantic models can also be created from arbitrary class instances by reading the instance > attributes corresponding to the model field names. One common application of this functionality is integration with object-relational mappings (ORMs).

To do this, set the from_attributes config value to True (see the documentation on Configuration for more details).

...

Dang strong stance that tmux and zellij should not exist. I really do get his point though. Theres a good number of terminal features I often miss out on because I run tmux. Its an app that runs apps, and doesn’t let all of the signals back to the host. But its fantastic at what it does, and brings so much to the table that the little bit of downside it brings is well worth it to me. The other thing missing in this discussion is that I can take my hotkeys and session workflow to any machine just by running tmux. I do not need to run a certain terminal, or install it headlessly on a server to get special features just for it.

cold builds

Here are a list of some cold builds from my site. I’ve ran this site for a long time and would like to have some references to go back to, and wish I had kept a few profiles of cold builds laying around to compare with. The time is now lets keep some cold build links around for reference.

screenshot-2025-01-31T21-23-56-725Z.png

1 min read

pesos

Pesos is the act of Publish Elsewhere Syncicate to Own Site. It is an indieweb concept that I recently started applying to my own site.

here does it skip again

In short it is the concept of pulling data from other sites that you use and republishing it to your own site. This gives a single source of information for you, and protection against sites and apis changing or rug pulling. Other people might have a lot more use cases for this, but I already begin a lot of my data right on my site.

...

hover z-index and positioning

I broke my sick wikilink hover recently in a refactor, today I did some diving in to figure out what happened.

As you can see in the screenshot below, the link is in a list of links, and when the hover image pops up it sits behind all of the other text. The z-index of the list-item is supposed to be raised above the others on hover.

Manually setting z-index to 20 in the inspector I noticed this message from devtools, “The position: static property prevents z-index from having an effect. Try setting position to something other than...

...

analytics

I’ve been posting on this site since 2016, when layoffs were rolling through the company I worked for at the time. Starting a personal blog and a pile of side projects felt like one of the best things I could do for my resume, so off I went. This site is built on markata, more about that in the /colophon.

The old version of this page embedded static SVGs from my Python Markata build. Those files are gone in the markata-go site, so this page now renders the yearly...

...

Just starred bazzite by ublue-os. It’s an exciting project with a lot to offer.

Bazzite is a cloud native image built upon Fedora Atomic Desktops that brings the best of Linux gaming to all of your devices - including your favorite handheld.

I built out a tool for myself to manage my nvim configuration, and I wanted to quickly see which one I am running in my starship prompt. Here’s the config I ended up with. It warns if the NVIM_APPNAME environment variable is not set, and it shows which nvim I am using if it is set.

I recently noticed that my og images were missing emoji. They were taken using headless chrome in a container. I fixed it by adding an emoji font in the containerfile / dockerfile.

RUN apt-get update && apt-get install -y \ # Add fonts with emoji support fonts-noto-color-emoji \ && rm -rf /var/lib/apt/lists/*

Before #

Here’s what they were looking like with broken emoji fonts.

And now with the fixed emoji font.

I put thought bubbles on my thoughts posts and stars on my github stars posts

For my next drive upgrade in my homelab I am gong to be using one of these factory recertified drives from serverpartdeals.com. Found them on an LTT video awhile back. They are some lightly used and recertified, fully burnt in drives.

Shop for drives that are certified once again by the manufacturer to work like new. Factory ReCertified drives are cost-effective alternatives compared to factory-sealed new counter parts. Additionally, unlike in mass production, the re-certification process involves closer attention to the overall operation of the hardware so that the re-certification will not have to happen a 2nd time

dust is one of my favorite rust rewrite tools. Its so useful for narrowing down file system bloat and cleaning up some disk space on your nearly full disks. It runs right in your terminal and gives you a nice bar graph on the top directories in use.

Keycloak looks like an interesting way to setup sso. It’s part of the cncf so it’s got a good backing. I want something better for argo workflows and this might be it. I’m curious what else I can tie into it.

Don’t stop learning! Stop trying because you have a doomer outlook on ai, llms, industry and think they are taking over. If you have no hope for the future, if you stop now you are cementing in that you will be no good and the ai will be better. Many, maybe most of us in this industry go here by hard work, long nights of learning, trying to solve problems that our job had. If llms take over then the world is going to be a whole lot different, it will be a world you cannot predict or plan for. For now put your head down and succeed in the world we have today.

TEEJ has some great thoughts on this whole sentiment, put this on for you morning walk or whatever you do.

a night of rounds

Tonight my son and I played rounds, I pulled clips of all the final rounds of each set of rounds. We play hardly any games with guns in them, this is one of the few exceptions, it feels quite whimsical, fun, and strategic, and not at all realistic or first person. The strategy part really brings me back to the fps games I would play with friends in my teens.

I thought I had him on this one. I had this rare power up that allows me to shot through walls. It came down to the very last round and he had too much firepowerfor me.

The final round of round 2 was Super fast. I felt like I nerfed my homing power up by adding fastball to it and it didn’t really home in anymore. What made it so quick, I think he had glass cannon and I laid down two well placed shots.

...

2 min read

wondercraft session one

My son and I are starting a new Minecraft server today called wondercraft.

We are running a few mods on this server notably FTB Ultimine for less grindy resource gathering, Sodium for shaders, and Universal Shops.

We are runninng on Minecraft 1.20.1, I think this is because it was the latest supported by Universal Shops, its at least one major release old at this point.

...

I like the charts that Theo brings to to these videos. Shout out for a positive k8s reference and not shitting on it.

Htmx brings html/css just a bit further down the complexity graph with little to no extra effort, while react allows us to go all the way full complexity at the cost of build and dev complexity to go from zero to 100 as soon as its introduced.

htmx brings us back to the ease of jquery ajax without any complex swapping or json parsing, all of the object parsing and html templating is done in the backend, the front end just tracks where to put it. HTMX couples the frontend and backend much tigher, since all of the front end html is generated in the backend, done correctly it is not possible for the front end to get out of sync and try to do things that the back end does not know how to handle, vice versa.

It’s interesting how many people in tech maintain a blog. I think part of this brings us back to web 1.0 days when so many individual websites owned the web it was a free for all unindexed land and you got to own a small piece of it.

I agree with most of Brittany’s points here I write a lot to keep my skills sharp, and to refer back to. Brittany mentions keeping all her old posts, even the cringy ones. I’m all with you here, I’m just wodering how you look back at anything you wrote in the past and not get a bit of that feel, maybe its just me, but I see cringe and mistakes gallore, but it all makes me better moving forward.

nice overview of availability measurements and what they really mean. The crazy world we live in today depends on so many things runnig, its also so hard to measure your uptime, The uptime metrics can mean a lot of different things. The site is up and accepting traffic, but can users make changes or submit orders, there is a lot more to it than just up or down. I really appreciate Brittany’s story from Nike nested in there.

nvim-manager

I recently built a cli application as a nearly-one-shot-app called nvim-manager. It manages your nvim dotfiles install.

screenshot-2025-01-31T21-21-40-707Z.png

nvim-manager allows you to install pinned versions of your dotfiles, your friends dotfiles, and distros in ~/.config. This allows you to have stable versions that will not break installed while you change things.

...

/now

This page is meant to be simple view into what is happening in my life right now. Inspired by @NowNowNow. and Derek Sivers.

Last Update 2026-04-19

Last Update 2025-10-29

...

2 min read

one-shot-s3-cleanup

So I made a mistake in an app I am working on and ended up creating thumbnails of thumbnails, and thumbnails of thumbnails of thumbnails… etc. I was able to delete them all, but I wanted to make a one-shot script to do it.

I got the idea of the one shot app from Simon Willison and replicated his setup in a chatgpt project

a mistake was made in my s3 bucket and I've created a bunch of extra files write a script that deletes all files that contain _thumb_thumb ⬢ [devtainer] ❯ aws s3 ls s3://dropper 2024-12-29 14:32:32 16158 02271f4c-be18-4bea-b23e-d00f9fe42b9f.webp 2025-01-11 14:20:49 2878 02271f4c-be18-4bea-b23e-d00f9fe42b9f_thumb.webp 2025-01-11 14:21:17 2858...

...

Bluesky is almost excatly like twitter was when I joined years ago. It’s gone crazy lately bogged deep in politics, bots, and ads. I’ve seen like two scroll pages of ads in a row, its nuts. What I did not know before Joel pointed out here is that the feed I am looking at is my following feed, its only feed of people I follow in descending order. On bluesky you get to pick your feed!!! This feels like tweetdeck did back when we were able to run that. You could tune in search terms and save them it was glorious. Bluesky has some really interesting ones that you can use like popular with friends, only posts, my bangers, that have a pre defined algorithms.

This man is responsible for making gaming on linux what it is today. Such a heartfelt story to hear that reviving his dad’s machine was at the core of what drove him to do what he has done for the wider gaming on linux community. Update on your schedule, remove all the tracking and bloatware, this is what drove him to start using linux before making it accessible for his Dad.

But really do update, this is not your 2002 PHP box, things need updated and regular updates help the process.

Today I learned that the docs in postiz are a bit behind, (fantastic docs btw, they are to the point, and cover almost all of what you need). The docs state that you need to include an R2 bucket to handle uploads.

This issue shows that more work has been done, one of which is local storage. The compose file they use in the quick start has the required env variables to set this up.

STORAGE_PROVIDER: "local" UPLOAD_DIRECTORY: "/uploads" NEXT_PUBLIC_UPLOAD_DIRECTORY: "/uploads"

looking into my running instance I can see my images there.

we beat trailmakers

Today we broke through the atmosphere in trailmakers ready for pickup from those back at mission conrol.

I haven’t posted a lot of gaming content to by blog, idk why, but I think I am going to start, especially for the ones that are good memories with my son.

Today we hit 100% of the required parts required to build the space ship and leave the atmosphere of the planet that the story is set in. Trailmakers is a game where you design and build your own vehicles. The campaign mode standed is a story where you are in a high tech freighter ship that crash lands on a distant planet. Your crew back home can come as far as the planet your on but cannot break through the atmosphere. Your job is to collect all the wreckage and gain all the parts required for a space ship build to take you out of the atmosphere to meet them.

...

Just tried using my twitter api key for the first time in quite awhile. Apps now need to be tied to projects in order to work. It looks like projects are where pricing comes into play. Thankfully they still give a free tier for doing small time things for myself. You can really see the effect that llms have on these things though as it is 5x more expensive to read posts than to make posts currently. Data is the new gold for these kind of companies.

Really interesting way to generate a rules file for agentic workflows based on your current repo. John uses gitingest here, looks like a fantastic tool, but probably not useful for most private repos. I’m sure you can replicate the same thing in a private repo wtih a small amount of effort the few times you need to do it. gitingest looks like a great way to pull in some extra context for some open source dependencies that you have though.

Replace hub with ingest in any github and get a prompt friendly codebase ready to feed into any llm. It combines the entire codebase, based on a gitignore style glob that you pass in, into a single TXT file.

First release of nvim-manager is out. Your dotfiles change a lot, sometimes it’s hard to manage all of the places you have installed them and potentially made hand edits to. nvim-manager allows you to easily make static releases of your dotfiles, and keep your nvim install from breaking by leveraging NVIM_APPNAME and pinned releases of your dotfiles stored in ~/.config. In this directory you might have many nvim configurations installed, nvim-manager automates the process of installing and updating from your dotfiles, while keeping previous pinned versions untouched.

I can say I had the same kind of feelings when I first saw something called “Own Your Web” being run in Buttondown. I totally get it. It takes time and effort to build your own stuff, email sending is hard, not done right ends you in the spam folder. There is something about the name though that I think needs to set an example and self host as much as it possibly can.

The changelog has covered this several times, do they need to go to the crazy lengths they do to run their site, no probably not, but it keeps them in the loop. They are using the tech they talk about in a very real and production critical way to run the show.

Cant wait to see more from ownyourweb.site

Gyroscope better than a mouse?? Nerd nest really sells how having two gyros in the way they have done for noise cancelling changes the game on it, and makes it a contender to replace a mouse.

It really makes me want to try it. I love how repairable this controller looks. I’ve got to imagine that the fact that it comes as a kit, and all the parts are available that this hits S tier repairability. My current controller of choice is a PS5 and I’ve had stick issues I wish I could fix.

No analog triggers, I’m out. Maybe they will make it an option in the future idk. I don’t play shooters where I need a hair trigger, this won’t work on session or driving games.

micro usb, seriously, that kinda kills it for me too.

...

Chris Coyier had a small re-align on his site, some good nuggets in here.

I like the idea of having a photo of myself prominently on the site, so you know who you’re dealing with here.

I really like this after thinking about it and I think I am going to make sure I get my face back on my posts. I do have my 8bit style pixel art image of me that I use on social media, but no real picture.

I feel like a lot of people redesign their entire website when it’s time to update to the latest list of social networks and I’m no different. Once you touch it you gotta keep going.

...

I’ve only recently learned what colophon means, and I really like to read through site that use it. If you don’t know its about how the site is built. I’ve always liked peeking under the hood of things to understand how they work, it’s what turned me towards an engineering degree.

I love how he mentions that he chose the name when he was 17 and he is stuck with it. I particularly like the name, it has something special to it. Hats off to you for doing something that has lasted so long for you. I fully understand though, I have projects that I made a year ago that I think why did I name it that. At the same time when I try to think of a name I end up with the I don’t have anything good and I’d rather build the thing so fuck it, its going to be what it is.

What a great first guest for FAFO. Kelsey is always such a great listen. He talks about killedbygoogle and how engineers get no incentive to work on old projects, google had no incentive, and you got the thing for FREE in the first place. He talks about end of career and having love you money, having so much in the bank you can say no. If you are presented with a project that does not align with your values you can say no.M

Justin even mentions how Google has more killedbygoogle projects than Amazon has total projects.

If we knew how hard it would be, we would never build it.

Autumn’s Fav quote from ep1 of shipit

/start

Welcome to waylonwalker.com, my small corner of the internet. I currently have 3606 posts published, here are some links to help you get started around here.

2fcdafc0-f152-4fa9-ac91-799acd9084d3-239-1.webp

I have quite a few different feeds that you can browse or subscribe to in your rss reader, you can find them on my 3 min read

slow nfs performance

I’m running a two node k3s cluster at home, I thought I could simply mount an nfs share on each worker node, and essentially have the same storage accross all nodes. I’m already learning why this is not reccommended.

I’ve been running some cronjobs and argo workflows on the second node for awhile, these are things that run in the background and I don’t care if they take a bit longer to keep my master node freed up for more critical work.

I just started trying to build this site in a cronjob, It was taking 20 minutes to build, and something I noticed was that markata was taking minutes to run glob ( search for files ), normally this happens in a few ms and I never notice this step.

...

2 min read

A nice list of slashpages you might want to consider including / aliasing / 301ing. These feel like nice things to setup and keep in the back pocket for obsidian style wiki link to easily. I get kinda bad at wiki-linking as much as I would like to, mostly because it does require some amount of work to make the page, and keep it up to date over time, then remember that you even have it.

Some are serious, some very common, some quite useful.

/colophon

Colophon a page that describes how the site is made, with what tools, supporting what technologies

All posts on this site are written by Waylon Walker, the typical content has changed and evolved over time. I go back and make a few corrections, but for the most part things stay pretty much as they were published originally.

see more in 1 min read

Theo does a fantastic history of serverless here.

Theo can’t have an infra video without shitting on k8s. Specifically people who have never touched k8s pushing fear of k8s to large audiences of people who have never touched k8s. If you are a webdev who solely lives in webdev space and never touches as much as a dockerfile listen to him. If you touch infra at all try it before you take his opinion at face value.

If you plan on having traffic spikes 10x your regular traffic for something like black friday, serverless might be right for your use case.

He argues that targeting a stateless deployment of serverless leads to better code. I’d like to see more examples here. Maybe most of the code bases I work on already do this. I’ve never targeted a serverless deployment, but I’ve targeted horizontally scaled deployments many times and they feel like they have the same targets. For instance if I spin up 8 pods for my application or uvicorn with 3 workers I have to target statelessness, all of the state must live in the database and cannot live in memory. Even if I target 1 instance in a containerized environment I have to be ready for restarts at any point in time.

...

linkding looks like an interesting alternative to thoughts. Thoughts is focused on the note being a value add tweet length blog post that you share to the public. This seems more focused on fire and forget with some note taking and search ability. I should definitely level up the search and tag discovery in thoughts.

Lane from boot.dev madde this fantastic video about serving files on the internet. It has me wondering if I need to rethink a few of my things that I have built. I have a few things I am serving media from, but I have very aggressive cloudflare cache rules on them, so each file should only be uploaded about once per year.

My problem going straight out of minio right now is how do i set headers for cache control on it. If I can’t set the cache control and everything is coming out of minio this does not solve my problems.

I went back and played with presigned urls and you can in fact control and set response headers, this is definitely the way and I have been wrong.

This is a cool new feature coming to bash, I can’t think of a use case I have out of the gate, but it looks cool. I’m thinking this might be good to keep in the back pocket for something like CI where I don’t have a hightly tuned bashrc file, and I want a dynamic curl request based on some state that exists as a fille.

Nicely worded Cassidy! Javascript can be too much, it can bog down low powered devices, we can ship so much that its untenable on poor connections. It can be argued that its a bad language and putting it on the server is a mistake, but it brings sites to life. It makes it possible to extend the static nature of html/css with just a little special spice only your site needs.

I’d add to the argument that a lot of js should go away over time. Over time libraries such as jquery have fallen out of use, not because they are bad, or have been replaced by new libraries, but because the browser has adopted most of the functionality that jquery brought.

As a primarily python dev I’d really like to see htmx die a very similar graceful death. There have been several iterations on this idea, and the crux of it is very similar, give the ability to use HTTP verbs...

...

Red Hat has donated the whole open alternative to docker to the CNCF, the hosts weigh in with thier opinions all being pretty positive as they seem to be a legitimate donation and not dumping crap on open source.

Personally I’ve been running podman exclusively at home since switching to Bazzite in August. I’d like to use buildah in ci. I gave it a try, but was unable to swap out my use of kaniko for buildah, I will get there, but it was not quite as drop in as I wanted.

Holy shit these AGI models are incredibly expensive to run, require lots of wild hardware that there is not enough to go around, and requires shit tons of power to run.

Now more than ever is time to distinguish yourself with deep expertise, jack of all trades is being eaten by ai. People with deep expertise are getting a jack of all trades bump from ai, not o3, just the regular stuff.

setting up ucore-zfs

I just setup my oldest hardware on the newest hotest server distro ucore-zfs. This is a gateway FX6860 manufactured in 2010.

My current boot log shows that I first started daily driving bazzite back in August 2024. I’ve been hapily using it since my arch install was plaugued with a crippling display driver error, or something that would lock the display for minutes every 30s or so, it became unusable. I switched because this is what I put my son on and it was working great for him.

waylon@razorcrest:~$ journalctl --list-boots IDX BOOT ID FIRST ENTRY LAST ENTRY -19 7e6e154d2609407da24fa12814eadbd7 Thu 2024-08-29 16:15:15 CDT Thu 2024-08-29 17:37:25 CDT

Four months later and I am really loving the immutable distro experience. My base system gets fresh reliable updates, and I barely install anything directly on it, a handful of things are snaps or flatpaks from the discover store, but my main workflow is now in distrobox. It has been rock solid reliable, and just...

...

3 min read

Theo weighing in on the 2025 job market. It’s no 2018 out there right now, the ratio of jobs to engineers in the market has flipped big time. Theo as usual really focuses on community, being in a community, and being a good citizen. At the end of the video Theo weighs in on his experience hiring, and generally it starts with we need someone to do x does anyone know someone, then goes to a more formal internal post, then more formally asking internally does anyone know someone, then maybe to his community, and if he really still needs the person it might become an external post. These days there are so many good engineers on the market that very few good jobs actually get a posting for in his opinion.

This tip of using tinkercad to do boolean operations on an stl of a solid gridfinity bin and an outline is absolute fire 🔥🔥🔥. This feels like a relatively simple operation, but to do it to a generated stl proves hard to do in most modeling software, at least harder than it needs to be. Somehow tinkercad got it right and made it a very basic operation to do.

It took me a minute to find the Merge button that Uncle Jessy mentioned, they call it a group in TinkerCAD.

Great list of 4 tips for running fastapi applications.

Fat routers with all of the logic built in makes them hard to test, hard to refactor, causes lots of duplication, and makes it hard to reuse the business logic code later in something like a cli application.

I really like this advice! He reccommends deploying as early as you can get a healthcheck live in your application. I’ve found too many times developers build something that is really hard, or impossible to deploy, when if they had tried to deploy early they would have spotted some easy to fix issues. This is less important if you are building out of a template that your team commonly deploys from, but very important with new patterns.

https://youtu.be/XlnmN4BfCxw?si=ks1wvmgDyoQLgrv2&t=1093

Depot’s uptime seems to be great. I definitely hit some issues with it this afternoon 12/24/24 that were not reported. I wonder if my issues were with the fly integration. Maybe fly ran out of credits to depot or something.

Here the integration to depot appears to be opt in using the --depot flag on fly deploy. This must have changed over time though because today it was giving me issues and I had to opt out using fly deploy --depot='false'. Looks like a great service and I just learned about them on their bad day.

Just learned about depot today ironically because it seems to be down and fly is using them under the hood to do the container builds, seems like a really great service for fast builds accross your team.

This was an eye opening video into agentic editing workflows.

Dfferent ai tools use different rules files, windsurf uses .windsurfrules.

Test out your rules file by having it say something at the beginning of the output to verify that the rules are being applied correctly.

He suggests to use this key rule for debugging purposes, otherwise you are guessing to what rules if any it is following.

Dax talked about this in a recent How about tomorrow podcast https://thoughts.waylonwalker.com/post/461. He is using it as his dev machine, he just ssh’s in and devs on it. Feels like quite an interesting workflow, their prices seem competitive, but as a cheap ass homelabber I see their prices and think I could grab a used optiplex for the cost of a month or two of these and probably wouldn’t know the difference. DAX mentions longer compile times so maybe he does notice.

This is a pretty great episode talking shop with typecraft. They talk setups, cameras, content creation. I found them talking about their linux setups particularly interesting. Dax talked about his flow from building his own machines to using reliablesite.com.

Dax hates on c-a, both typecraft and dax use c-s, which normally freezes a terminal, we can all agree that is useless. I use the default c-b, it seems fine for me.

Dax talks about terminal.shop and how they originally planned to have a web front end, but after they had so much success they stuck with it. now they are leaning harder into it and are building out integrations with a bunch of languages and an api, but no front end.

I’ve kinda fallen out of using direnv now that a lot of my projects use hatch, I generally just hatch shell into them. I just need to make sure I go through all of them and make my installer uv. Now I’ve been thinking about making uv my only needed dependency to run a python project and leaning more to something like uv run --with . uvicorn myapp --reload

I still cannot believe I thought I had such a unique idea with thoughts only to find out shortly thereafter that Simon beat me to the punch by about 20 years!

Simon put a lot of work into this [post](https://simonwillison.net/2024/Dec/22/link-blog/#thoughts.waylonwalker.com) please check it out. Its not only filled with tons of little nuggets about blogging, it has just a ton of links to other posts I’m itching to read now.

https://simonwillison.net/2024/Dec/22/link-blog/

...

I really like this idea of keeping a set up contacts in a markdown repo, and being able to wikilink them to different tickets / meetings and what not. I’m imagining the graph you can build, it feels quite interesting. Even more relevant as we see things like teams rolling out retention limits to messages.

Here is Cassidy’s format, I like it but I’m probably not going to track the birthday of most people I work with, thats just not the relationship I tend to have with work friends. It might be a midwest or non tech thing, but I am not even aware if any of my co-workers have social media, and I assume that if they did it would not include anything work related but more football and other sports.

thoughts 0.0.4

This is such an improvement to the backend of my website it warrants a blog post of celebration. For far too long I’ve been dealing with a tiny ass edit form on thoughts. I tend to not edit them, and try to get them right in one go. This is kinda the point of a thought, its a quick post meant to be the size of a tweet, but sometimes I’m leaving thoughts on a video or long post and want to make sure I have a good save point, but I just keep the thing in draft and hope I don’t loose if for far too long.

Let’s see this change in action!!

This is the tiny ass form nested deeply in the flow of the feed. When I made it I naively just swapped out the post itself with the edit form, and swapped the post back in after edit.

...

I’m really excited about jnv, an amazing project by ynqa. It’s worth exploring!

Interactive JSON filter using jq

I’m really excited about studio, an amazing project by outerbase. It’s worth exploring!

A lightweight Database GUI in your browser. It supports connecting to Postgres, MySQL, and SQLite.

Cheers to the Unique brains dave. I can say I am 100% with Dave on all of these, except the clean environment thing, lucky Dave. If I have enough room to see what I am doing and walk around a mess, I probably wont even notice it. I’m so hyper focused on what is right in front of me that mess could be a huge pile of cash and i’d never see it.

I love me some styled rss, it’s how the OG internet was made to be. You choose what you want to read and when. There is no middleman aggregator inflating the reach of things they want you to see or suffocating things against them. It’s just you and your internet friends.

Cassidy has a quite lovely and easy to read rss feed, with an open source style sheet, that is part of her open source blog template for astro blahg, love that name by the way!

I first learned of styled rss feeds from shoptalkshow.com, specifically from Dave Rupert.

Dave uses a pretty bog standard styled rss feed with

Today i got hit by this accessibility issue on my site. Low contrast links are not distiniquishable. I had not seen this error title before it was new to me, maybe I have bad memory or maybe it’s new to me.

I ended up dropping the background color of the site down a notch as I didn’t really care for the semi-dark brown anyways. I’m liking the near black bg-zinc-950 much better now.

Now I got that 100 A11y score in lighthouse.

I found this nugget in thechangelogs justfile, it lets you add color to your justfile with variables quite easily.

# https://linux.101hacks.com/ps1-examples/prompt-color-using-tput/ _BOLD := "$(tput bold)" _RESET := "$(tput sgr0)" _BLACK := "$(tput bold)$(tput setaf 0)" _RED := "$(tput bold)$(tput setaf 1)" _GREEN := "$(tput bold)$(tput setaf 2)" _YELLOW := "$(tput bold)$(tput setaf 3)" _BLUE := "$(tput bold)$(tput setaf 4)" _MAGENTA := "$(tput bold)$(tput setaf 5)" _CYAN := "$(tput bold)$(tput setaf 6)" _WHITE := "$(tput bold)$(tput setaf 7)" _BLACKB := "$(tput bold)$(tput setab 0)" _REDB := "$(tput setab 1)$(tput setaf 0)" _GREENB := "$(tput setab 2)$(tput setaf 0)" _YELLOWB := "$(tput setab 3)$(tput setaf 0)" _BLUEB := "$(tput setab 4)$(tput setaf 0)" _MAGENTAB := "$(tput setab 5)$(tput setaf 0)" _CYANB := "$(tput setab 6)$(tput setaf 0)" _WHITEB := "$(tput setab 7)$(tput setaf 0)"

Usage

Hurl was mentioned by @gerhard on the latest changelog and Friends. Looks like a feature rich easy to use testing tool that is tested via what looks like a config file.

Hurl is a command line tool that runs HTTP requests defined in a simple plain text format. It can chain requests, capture values and evaluate queries on headers and body response. Hurl is very versatile: it can be used for both fetching data and testing HTTP sessions. Hurl makes it easy to work with HTML content, REST / SOAP / GraphQL APIs, or any...

Today I discovered the Urllink function in bash from the ujust tool from ublue.it. Seems like a cool trick, but might not work everywhere.

On reboot of my opnsense router it did not tailscale up. I’m not sure if a key expired or what happened. The fix was to first enable ssh, then ssh in and run tailscale up.

In opnsense System > Settings > Administration > Secure Shell > Enable Secure Shell

ssh <opnsense ip> 8 # to select shell tailscale up

Follow the link to log in.

now uncheck secure shell to lock down the opnsense machine.

...

I’ve been debugging a cloudflared tunnel issue in my homelab all day today, and getting really frustrated. My issue ended up being that it was running twice, once without the correct config file and another with it. I believe that cacheing may have compounded the issue.

In yesterday’s post I setup a cloudflared tunnel on my ubuntu server to expose applications running on the server to the internet. I’m setting up a new server and running cloudflared in its own vm.

setup cloudflared tunnel on...

I run a cloudflared tunnel on my ubuntu server to expose applications running on the server to the internet. I’m setting up a new server and running cloudflared in its own vm.

sudo wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -O /usr/local/bin/cloudflared sudo chmod +x /usr/local/bin/cloudflared

#

Now setup the config directory. For the systemd service to work, the config file needs to be in /etc/cloudflared. I like to give my user rights to edit the config file without being sudo, we will do that here by creating a group cloudflared, add ourselves to the group, give ownership of /etc/cloudflared to the group, give group write access to the directory, and refresh groups.

sudo mkdir -p /etc/cloudflared sudo groupadd cloudflared sudo usermod -aG cloudflared $USER sudo chown -R root:cloudflared /etc/cloudflared sudo chmod g+w /etc/cloudflared newgrp cloudflared

login #

Now we can log into the domain zone with cloudflared.

...

Just starred nvtop by Syllo. It’s an exciting project with a lot to offer.

GPU & Accelerator process monitoring for AMD, Apple, Huawei, Intel, NVIDIA and Qualcomm

This is a really amazing documentary of argocd. I got into k8s pretty late in the game. Which is pretty typical for me. As I went to use k8s for the first time i was using workflows, then cd. both of these tools had a level of polish that made them seem like they had been there forever and not quite as young as they actually are.

I thought it was interesting how they focused on how the name must be two syllables or less, start with a or b, logo needs to be cutesy funny and recognizable seemed interesting, but puts them at the top of lists and makes them look like they’ve been there forever.

A new completion plugin that I might give a try. Readme makes it sound like its built on some fast teck that allows them to handle a lot of items and run more frequently. The videos look like they don’t have some of the same issues cmp does for me. Maybe its my configuration, but I’m pretty sure it does not update when you backspace and things like that.

I’ve been playing with 3d printing some items through the slant3d api. I’ve been pricing out different prints by running a slice request through their api.

I’ve been using uv for project management. It’s been working well for quick projects like this while making it reproducible, I’m still all in on hatch for libraries.

mkdir slantproject cd slantproject uv init uv venv . ./.venv/bin/activate uv add httpx rich python-dotenv

Get an api key #

You will need an api key from the slant api, which currently requires a google account and a credit card to create.

# .env # replace with your api key from https://api-fe-two.vercel.app/ SLANT_API_KEY=sl-**

slicing an stl with teh slant api #

Then you can run the python script to price out your print. I’m not exactly sure how this compares to an order, especially when you add in different materials.

SQLModel models ship with an is_, and is_not that you can use to compare to None without pesky linters complaining.

This comment summed it up quite well.

I believe this is concerned entirely with SQLAlchemy, not with SQLModel, and has to do with the required semantics to construct a BinaryExpression object. Hero.age == None evaluates to a BinaryExpression object which is eventually used to construct the SQL query that the SQLAlchemy engine issues to your DBMS. Hero.age is None evaluates to False immediately, and not a BinaryExpression, which short-circuits the query no matter the value of age in a row. From a cursory search, it does not seem that the is operator can be overridden in Python. This could help explain why the only possibility is by using the == operator, which can be overridden.

so rather than using Team.heros == None we can use Team.seros.is_(None) which checks for itentity not equality.

Gridfinity generator uses open scad, so you can make rugged boxes, bins and base plates with form input. not fully custom fit to things, but you can custom size square bins, hole cut out sides and all. From what I can tell, no bento box either. so as long as what you are looking for is square this generator has you pretty well covered. I’m definitely using this for simple bins and rugged boxes.

I came across pz from CZ-NIC, and it’s packed with great features and ideas.

Easily handle day to day CLI operation via Python instead of regular Bash programs. 🇺🇦 #supporting

faststream by airtai is a game-changer in its space. Excited to see how it evolves.

FastStream is a powerful and easy-to-use Python framework for building asynchronous services interacting with event streams such as Apache Kafka, RabbitMQ, NATS and Redis.

I came across faststream from ag2ai, and it’s packed with great features and ideas.

FastStream is a powerful and easy-to-use Python framework for building asynchronous services interacting with event streams such as Apache Kafka, RabbitMQ, NATS and Redis.

How to make helix themes transparent. You can make any built-in theme transparent in helix with one line, a few extras and you can make all the pop ups, help menus and status line trransparant as well.

mkdir -p ~/.config/helix/themes hx

:o ~/.config/helix/themes/dracula_transparant.toml

# ~/.config/helix/themes/dracula_transparant.toml inherits = "dracula" "ui.background" = { fg = "foreground" } "ui.menu" = { fg = "white" } "ui.popup" = { fg = "white" } "ui.window" = { fg = "white" } "ui.help" = { fg = "light-gray" } "ui.statusline" = { fg = "gray" } "ui.statusline.inactive" = { fg = "black" }

:config-edit

porta-john design update, working on moving the seams to line up with an edge to eliminate long noticable seams. These seams are required because I don’t have a printer big enough to print this in one shot.

hotswaps are going in. I’m getting really excited for hotswaps as they will make keebs more repairable, and users can self change out the switches if they want. I can also pre-build them ready to go, and drop in switches at the time of order. I did learn today that these are hyper specific to gateron, damn all these switch manufacturers and their special pinouts.

Last thing I gotta make more room for wiring the microcontroller and running wires out to the rows and columns, my first prototype build took waay to long to build.

MX keycap stem dimensions. I used these to create my new caps and all these dimensions worked great. The one dimension I had issues with was the outer diameter off the cap stem, not shown here. 5.3mm ended up being a good outer diameter for me. I print them at an angle and the bottom of the stem can get a bit of sag, pressing out on the outer wall of the switch and can actually stick the key.

Tailscale comes with a feature called taildrop that lets you easily share files between machines on your tailnet. If you have tailscale on ios/android it shows up as a share target when you try to share something, and you can pick the machine to share with.

What was not obvious to me was how to receive the file on linux. The linux tailscale service does not automatically receive the file, which can be kinda nice that you can put it where you want, but was not obvious to me at first. Use this command to receive files.

This is a wild key cap that uses a lever to convert horizontal key presses to vertically press the switch down. The leveret v2 uses two of these on thumbs, one to press outward, and what appears to be one straight forward which feels like it would have to be a wrist motion, but who am I to judge without having it in person.

After first setting up a new k3s instance your kubeconfig file will be located in /etc/rancher/k3s/k3s.yaml.

You cans use it from here by setting $KUBECONFIG to that file.

export KUBECONFIG=/etc/rancher/k3s/k3s.yaml

Or you can copy it to ~/.kube/config

cp /etc/rancher/k3s/k3s.yaml ~/.kube/config

If you have installed k3s on a remote server and need the config on your local machine then you will need to modify the server address to reflect the remote server.

...

Today I gave n8n a try using podman, their docs gave me docker commands, but it ran fine on my machine using podman.

Someone has created a knock off of the ltt screwdriver and made it printable, and it works really well. I have one printed with 6 different bitholders. I popped some labels on them in bambu studio as I printed to mark them for metric/inch and so on.

I’ve had mine for about a year now, and I use it quite often. I used to be a dedicated screwdriver kind of guy, but as life has changed I’m not working out of a shop with tools at reach as much, I’m grabbing a couple of items and heading to a job in the house or a neighbors house. It’s not 30s to grab just the right dedicated screwdriver anymore. Also having some setup with hex and torx is a game changer. It’s also super handy that you can just pop the bits right into a drill or impact.

Highly recommended print. Sorry for not buying the real deal Linux, I got kids to feed here. I owe you a t-shirt order or something.

uv now can install python for you. uv is inspired by rust’s cargo, an all in one fast package and installation manager. uv is so fast and becoming feature complete, it’s really changing the python packaging ecosystem.

New-caps-for-porta-john

Today I dropped some new caps in the porta-john. I need to do a bunch of posts on zmk and my journey building the porta-john, I’ve been rocking it for at least two weeks now pretty solid and I am absolutely loving it. More on that later.

The model of the caps are KLP-Lame by braindefender , they are super rounded and smooth. They look really good on camera and feel good to the finders.

I printed these at home on my ender3 s1 pro with a black and purple silk filliment. I printed all 42 at once using a

...

Vim has a handy feature to format text with gq. You can use it in visual mode, give it a motion, or if you give it gqq it will format the current line. I use this quite often while writing in markdown, I do not use softwraps in vim, so gqq quickly formats my current line into a paragraph. Once I have done this for a single line one time I typically switch to the motion for around paragraph gqap to format the whole paragraph and not just the current line.

A slug is the part of the url that comes after the domain. Commonly matches the file name of a markdown file many blogging systems. These are typically human readable, unique identifiers for pages within the site.

Wikilinks are a core concept within obsidian to link to documents by Slug wrapped in double square brackets. These are commonly used within wiki site generators.

[[slug]]

Obsidian gives you a keybinding alt+enter to go to that file, but if it does not exist it will create the file for you in the root of the project. It’s a nice way to quickly make new documents.

blogging in 2024

Over the past years couple of years blog traffic has been tanking, for some time I thought it might have just been me, but then i heard it from Dave Rupert on Shop Talk show, and it made sense. LLMs and AI is slowly killing the internet as we know it.

I dug into my emails from the google search console team and found two results nearly one year apart. Impressions are only 60% of its value a year ago while clicks are only 35% of where they were a year ago. I’m getting less impressions and even less clicks.

May 2023

...

It was not obvious to me, but if you have a wikilink such as Trying Obsidian, you can jump to the file in obsidian, just like you can with lsp go to definition, the keybinding is alt + enter.

Very inspiring video Jason, these people faced adversity and crushed it. The market is so hard right now, its not easy to get a job, move around, and recover from a layoff. Everyone in this video just showed that you can make it in this industry right now, you just have to be willing to work harder than the rest. The bar is raising, a lot of great people are already putting in hard work to make it.

Community is Key, Theo mentioned that a lot of the companies he works with don’t even post openings, they go to their community first and are often filling spots through lower risk community hires.

Thor always comes in hard with fire takes in his shorts. Especially if you are early in our career take this in. If you dont yet have kids, but plan to, double take this in.

I’ve long used copier to create all of my posts for my blog, and it works really well for my workflow. I think of a title, call a template, and give it a title. out of the box obsidian did not seem to work this way. It seems like it wants me to right click a file tree and make a new file using the tree, this is not my jam.

Here is what I came up with to replace my til template.

Trying Obsidian

I am giving obsidian a try, this is a test post to learn the flow. Something that has been really hard for me for a long time is images, I don’t include a lot of images just because it takes so much longer just to get the post out. I store them in a separate repo, I need to resize and compress them for the web so they aren’t so big.

This is my current wallpaper.

I took he screenshot and just pasted it in.

...

16 min read

I’m giving obsidian a go as an editor for my blog and one of the main things I want to fix in my workflow is the ability to quickly drop in images. on first look through the community plugins I found Image Converter. I set it up to convert to webp and drop them in a git submodule. I may make it something other than a git repo in the future, but I’ve learned that adding images to my blog repo quickly makes it heavy and hard to clone on other machines.

Once the images are there they are pushed and deployed as their own site to cloudflare pages. I made a quick edit to my

Docker no Docker, what!!!

So fly.io uses Dockerfiles to deploy your app, but no docker. They use containerd to download your docker images into firecracker microvms to run your app. Firecracker is the same tech that runs aws lambda functions.

Fascinating short post on the beans under the hood at fly.io and how they scale your app globally.

Damn Johnny is always such a positive vibe, just getting steamrolled by this braille shit. WTF are these brand sleeping on. Happy to hear that Andy and Brian are supporting him well.

Also kinds shows what shoes are good when he goes to buy shoes cause no one will send him any and he goes with Etnies.

Johnny keep it going!

Niklas Luhmann created the Zettelkasten method of notetaking, He was the Da Vinci of writing, holding a high standard that we can take inspiration from even today in this digital era.

As many times as I have seem the Zettelkasten covered, I never knew that it roughly translated to little cards in a box.

Mischa lays out four principles of Zettelkasten.

My blog, tils, and thoughts make up my own zettelkasten. I am not going to say that mine is a perfect representation of his method, but the components are here. rather than building books, my thoughts and tils build up to blog posts. The rate of blog posts I write definitely changes with the seasons of life, as seasons change it becomes a bigger or smaller part of the season.

...

Even after switching to my hm and ht behaviors I am running into some issues where sometimes I am still accidentally hitting mods(&hm) and layers(&ht) while typing and it’s been getting frustrating. My main issue has been on &ht, they are configured the same so I suspect that my pinkies just move a bit slower over the keys than my pointer/middle finger.

I just added quick-tap-ms and require-prior-idle-ms to my &hm and &ht behaviors, and a few intentionally sloppy passes through monkeytype seem to show that its working well. A few days of trying this will tell whether it was a good fix or if I have maybe gone too far the other way.

The end goal here is to be able to roll over keys faster without worrying about hitting other layers or mods.

I’ve had a couple of uploads to twitter fail recently and has been a pain. I tried some online converters for convenience, but none of them worked. I reached out to chatgpt and found succeess with this ffmpeg command.

I’ve been working on something, I’m gong to combine my mechanical engineering skills with my love of great keyboards and start a custom keyboard shop for building custom keyboards for exactly what people need with an emphasis on portability.

Damn Prime covers this so well from all angles. Can’t overstate the importance of that last step. Look at the issues, and raise an issue if there is not one before putting in a bunch of hard work. Make sure that the maintainers are open for your changes and no one else is already working on it.

50 minutes into this episode they start a discussion on seo, and naming posts. They give Jerod the task of googling for tmux and see how high up the ranking they find Nick, expecting a number one post, and he cant even get to Nick.

The problem? Jerod is such a beginner he doesn’t even know what to search, he starts with a long query about getting started with tmux, but all of Nick’s videos are why you should use advanced features of tmux, but Jerod has yet to discover that these exist.

As experts we often come up wtih a post title for the exact thing that we are trying to teach someone how to do, but yet, they haven’t discussed that they need that feature yet, they just want the getting started guide, or tell me why I should start using tmux. Not why sessions are better than windows, and tabs suck all together.

Definitely an eye opening conversation listening to two experts sit in shock as the beginner just gets dropped big tech articles, and Nick Jani-freakin-takis doesn’t even hit the query page after page.

...

This is a wild keyboard test. This is exactly what I want to see from ticklemykeys.com. I want to make ergomechanical boards that you can use and abuse. I want you to not be afraid to take them with you or to eat a nutrigrain bar in the same room (cough 2015 mac). And If something does go out, I want users to be able to repair it themsleves, key caps, switches, batteries, and microcontrollers should be replacible parts they can get at a good cost from the shop if they have paid for a board.

Today I swapped out all of my keys that are used dual purpose for letters and layers to homerow layers. This prevents goofy things happening when rolling, and prefers-tap makes it so that keys that are rolled over get hit as letters instead of as layers. This was one of my biggest hurdles jumping into zmk, lt as a homerow key just does not behave the same as the ht/hm behaviors with tap-preferred set.

They had split ergo boards back in 1983??? WTF who the heck keeps these row stagger boards going. This board looks like endgame material, If this thing was more normal, it’d kill a whole section of the ergo mechanical keyboard industry for good reason.

animal well codes

fish bubbles ul d dl l dl ur ul

jellyfish d l d l d l u r

bar dir

...

1 min read

Very interesting approach to htmx and fast api. It uses separate decorators for returning template partials and json that can be stacked to include both options on a single route. The templates are explicitly set in the decorator. Separate decorators are used for full page and partial pages. I don’t see an example of full and partial pages being combined. I think the demo app must be behaving in a spa like fashion where it does not get all of the data when it calls index and index will ask for user-list.

Definitely going to keep my eye on this project and ponder on it.

Very interesting approach to htmx and fast api. It uses separate decorators for returning template partials and json that can be stacked to include both options on a single route. The templates are explicitly set in the decorator. Separate decorators are used for full page and partial pages. I don’t see an example of full and partial pages being combined. I think the demo app must be behaving in a spa like fashion where it does not get all of the data when it calls index and index will ask for user-list.

Definitely going to keep my eye on this project and ponder on it.

miniserve is a sweet http server, replacement for python -m http.server. It’s fast, runs off a small binary, but why would I want to use it over something that already exists on most machines, because it includes a bunch of features like qr codes, pretty themes, and uploads. I’ve used python -m http.server many times to transfer files from one machine to another in a pinch, like at a family members house. But what if they have an android, windows, or something not easy to get a python repl running on, you can run miniserve and upload from their device rather than hosting from their device.

interesting, seems like such a simple way to completely remove the need of a whole other cli. No offense to anyone working on wget, but generally I use it out of lazyness or something wierd is happening and I am looking for a second opinion. Cool to know that wcurl exists and will start shipping with curl.

I’ve started leaning in on kubernetes kustomize to customize my manifests per deployment per environment. Today I learned that it comes with a diff command.

kubectl diff -k k8s/overlays/local

You can enable color diffs by using an external diff provider like colordiff.

export KUBECTL_EXTERNAL_DIFF="colordiff -N -u"

You might need to install colordiff if you don’t already have it.

sudo pacman -S colordiff sudo apt install colordiff

Now I can try out kustomize changes and see the change with kustomize diff.

Animal well does not let you remap keys, and really doesn’t even inform you that it is keyboard compatible. I had to play around and discover the keymap, which can be a bit tricky on a 40% board. This is what I found.

I recently started seeing email-decode.min.js show up on my blog posts, and I wondered what the heck ? I didn’t put it there. Turns out that cloudflare put it there from pages to safely serve email addresses for me.

inspecting the page without js running we can see that the mailto email is swapped out for email protected. Neat feature.

❯ curl --silent https://waylonwalker.com/diskcache-as-debounce/ | grep email <a class="decoration-pink-500 hover:decoration-pink-300 hover:text-pink-100" href="/cdn-cgi/l/email-protection#a4ccc1c8c8cbe4d3c5ddc8cbcad3c5c8cfc1d68ac7cbc9" rel="me"><span class="__cf_email__" data-cfemail="630b060f0f0c2314021a0f0c0d14020f0806114d000c0e">[email&#160;protected]</span></a> <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script></body>

Looking deeper into this article it looks like this feature comes from Scrape Shield and enabling Email Address Obfuscation.

markdown it py running in rust claims to be 20x faster. I’ll definitely look into this if markdown it py is ever a bottleneck in my performance. At first glance it appears that plugins are written in rust not python, and there is no admonition plugin, so I’ll keep my eye on it for now, but I can’t use it.

diskcache has a peekitem method that allows you to lookup the expire_time of a cached item without changing it. I recently used this to implement debounce for fastapi background tasks with multiple workers running. since all the workers I care about are on the same machine, but running in different processes diskcache was a great option. All workers have access to the same disk, but not the same variables in memory.

I’ve been using fastapi more and more lately and one feature I just started using is background tasks [[ thoughts-333 ]].

I am using it for longer running tasks and I don’t want to give users the ability to spam these long running tasks with many duplicates running at the same time. And each fastapi worker will be running in a different process so I cannot keep track of work in memory, I have to do it in a distributed fashion. Since they are all running on the same machine with access to the same disk, diskcache is a good choice

My brain first went to thinking I needed another service like redis running alongside fastapi for this, then it hit me that I can use diskcache.

Here is how I used diskcache to debounce taking screenshots for a unique shot every 60 seconds.

kind cluster

kind{.hoverlink} is a very useful tool to quickly standup and teardown kubernetes clusters. I use it to run clusters locally. Generally they are short lived clusters for trying, testing, and learning about kubernetes.

Kind is Kubernetes in Docker, its very fast to get a new cluster up and running. Other than checking a box in docker desktop it is the easiest way currently to get a cluster up and running. I’ve used docker desktop for k8s before I really developed on k8s and it was buggy at the time and sometimes started and sometimes didn’t, when it didnt I had no idea how to fix it. I’d suggest kind as the best option to get a cluster up and running locally.

If you are looking for a production ready cluster this is not it. I really like

...

Yesterday I realized that I have overlooked the default installation method of the sealed secrets controller for kubernetes kubeseal this whole time an jumped straight to the helm section. I spun up a quick kind cluster and had it up quickly. I can’t say this is any better or worse than helm as I have never needed to customize the install. According to the docs you can customize it with [[ kustomize ]] or helm.

Not gonna lie, kinda pumped about this one. I manually did one, jotted down the coordinates, opened the gcode in vim, added markers between setup/teardown and print. then added the wipe, the copy pasted the print+wipe section a bunch of times.

My printer tends to run a bit better on single prints than printing a dozen at once as it has less issues with retract start and stop.

Damn, supply chain vector attacks are wild. Random guy in Primes stream was getting $40k offers to buy their open source project while in university and they have never made anything from it. What a social engineering attack this is. It would be so easy to make it look like a good deal and that the package was going to a good new owner who has real resources to maintain it.

Supply chain attacks are so big these days engineers definitely need to take these into consideration. It’s wild that such a simple attack vector hit some really big applications. This particular vector is so easy to avoid. You are already hosting web content, just curl the file and self host the script, then you own it. That eliminates this attack vector all together, but doesn’t completely remove supply chain attacks, the js file can still hit external apis internally.

What I see has happened in this case is that the owner of the domain polyfill.io changed. so anyone who directly linked to them got a malware injected script used.

I can only imagine the number of applicatons that are not even being maintained anymore getting hit by this. TLDR, if you are taking something to production, where you are goind to deploy it and let it run, host the js yourself. these cdns are great for prototyping, but tread with caution.

Well spoken prime. Co-pilot is a fantastic tool for templating, boilerplate, or just getting something done that is just outside your knowledge or care to know. Bit if you really want to learn something, you need to use your hands. Reading the solution only gives you the happy path. This does not give you that path that most people would take, and completely misses debugging. If you are very new and learning it’s unlikely that you can write large blocks of code without running a test or a script to try it. Taking these shortcuts will hinder your ability to do it yourself.

If I were to devils advocate here, copilot is still not the greatest at the big picture, you still have to drive, and tell it I want to use python, fastapi, I want to load settings from .env. taking these shortcuts can help you move quick and get the big picture. This is especially helpful for someone who might know one language or framework and is trying a different one, but at some point you need to do...

Interesting, linux supports 32 programmable buttons, special buttons that do nothing that hotkey programs like xbindkeys can pick up and run things, seems like it would be very intersting to use on a macro pad. You could easily do dynamic and complex tasks without clashing that keybinding with something else.

I’m going to look into this for my next obs setup. No matter what I try to do with the hyper key it always tends to do odd things depending on the application I am in. typically its tmux, and it starts trying to do something I don’t want it to.

I’ve long had issues with my qmk keyboard media keys on my arch install, I always thought it was on the keyboard end. Today I learned that playerctl fixes this.

paru -S playerctl

Once it is installed all of my media keys started working right away.

I played around with it a bit more and came up with a way to display the current playing title in my notifictations.

Great listen for anyone interested in productionizing python code with docker. Itamar brings up some

Don’t trust base images for security, upgrade your packages. Vulnerabilties become published and solved giving the bad guys istructions how to wreck your day and these fixes wont come to your docker application for up to two weeks due to image build tatency.

For job based containers pre-compile your pyc for faster startup.

Alpine linux is probably not what you want for python. Many packages such as postgres ship pre-copiled binaries that work for most linux distributions wich use glibc, but alpine uses musl so the binaries will be incompatable requiring you to need to install a bunch of build dependencies.

Homelabbers have been some of the best co-workers I have ever had. Typically have a get shit done, If there’s a way I will find it kind of mentality. If you are struggling to get a job in tech right now its tough. Starting a homelab on a pc you pull out of the trash is a good way to get some experience that you can talk about in interview questions.

Linked video has some great points!

podman requires qemu-system on

❯ podman machine init Looking up Podman Machine image at quay.io/podman/machine-os:5.1 to create VM Extracting compressed file: podman-machine-default-amd64.qcow2: done Error: exec: "qemu-img": executable file not found in $PATH

The fix to this for me was to install qemu-system before podman machine init.

Currently Posting is a super early postman like tui (terminal user interface). It looks so good. Darren is really getting into a groove, and textual is getting to a place that is allowing him to really make these beautiful.

I am so impressed with the progress that he has made so early, it looks so close to postman in the freaking terminal, and the ui is so good. He already has think like jump that give you a way to around the ui like easymotion plugins. Theres themes and a command line, oh man its so good. star it.

Check out sqlsync by orbitinghail. It’s a well-crafted project with great potential.

SQLSync is a collaborative offline-first wrapper around SQLite. It is designed to synchronize web application state between users, devices, and the edge.

THIS! is the same reasons that I built thoughts{.hoverlink}. Simon has bee a big inspiration along the way. He defintely changed the format of my posts as I watched him build out his quote posts.

Link blogging is a pleasantly low-pressure way of writing online. Found something interesting? Post a link to it, with a sentence or two about why it’s worth checking out.

Ditto! just make a post.

Kellan brings some interesting thoughts on where the internet is headed in 2024. Interestingly I see myself headed in a similar direction. Feeling like I know just enough to say fuck it and build my own platform for me to me me, from thoughts{.hoverlink} where I link and make thoughts on posts like this, to reader{.hoverlink} which is my rss reader replacement that I wanted in 2013 when it was killedbygoogle

And particular with the collapse of the social spaces many of us grew up with, I feel called back to earlier forms of the Internet, like blogs, and in particular, starting a link blog.

Ai has really had quite the two sided effect since...

Setting up DNS overTLS in opnsense has made my dns just a bit more secure and reliable. I recently had an outage of half the internet within my house. This also hit some of my friends and not some. It did not hit my mobile network. What seems to have happened is a dns issue with my isp not resolving some domains. This setup corrected my issue and I was back online more securely.

Argo events is an event driven automation framework for kubernetes that can create kubernetes objects among other things based on events. I’ve been using native kubernetes cronjobs to kick off jobs based on a cron trigger.

For instance I am running reader.waylonwalker.com every hour, to rebuild the site and re-deploy it. It takes about two minutes to fetch every rss feed, so this is a nice application of a job compared to a web server fetching the feeds live. Now my posts may be up to an hour stale but they load fast.

Argo events takes event drien architecture to the next level allowing to be triggered by many more things, and do many more things than creating a cron job. I’m definitely thinking about dropping this in my homelab.

What I'm learning in 2024

2024 has been a learning fueled year, Diving deep into things I never would have previously thought I would. It’s been a bit of a mix of the 🔥hot twitter trends, and exactly what tech twitter tells you not to do. It just goes to show community is great, the tech community is filled with strong opinions, but you need to think about what really makes sense for you, your career and your customers (or lack there of).

Damn did I sleep on k8s for way took long. This is like exactly what I’ve needed for a lot of things. It’s a perect example of what happens when you listen to the tech community tell you.

Looking for a Heroku replacement, What I found was shocking!

...

Today I am playing around with tailwind, flexing the css muscle and learning how to build new and different layouts with it.

I created a new post template that mimics a terminal look in css where I could inject the post title, description, and other frontmatter elements.

I think this is a pretty cool layout, I could make a carbon.now.sh{.hoverlink} clone or more realistically I could make it into a template for blog pages and this could become og images.

Still...

...

Just discovered this really cool launcher from the DHH distro omakub. github.com/omakub{.hoverlink}.

Ulauncher comes out of the box looking good, supports extensions, and shortcuts like I have a lot of mac launchers have. I installed it plus a theme and in no time It was looking good and launching applications.

In the past I have leaned in on rofi for task launching, it is good. I just felt it was harder to configure to get right or look good.

This is DHH’s linux startup script. Call it a distro if you want, but he doesn’t. It’s made to take a vanilla ubuntu install and configure everything the way he likes it. There’s a number of great nuggets in here to pick up on.

No need to write bespoke configs for every essential tool just to get started or to be up on all the latest command-line tools. Omakub is an opinionated take on what Linux can be at its best.

Check it out and give it a ⭐ basecamp/omakub{.hoverlink}.

Sometimes I struggle to get my os to report dark mode to chrome, luckily there is a way to force chrome to always use dark mode.

I’ve never really gotten into dark reader and extensions like this. For some reason they all make websites look really weird to me and I don’t really care for it. What I want is websites designed to be in dark/light to always go dark, if the designer didn’t design dark just let it be light.

Tailscale allows you to ssh into all of your tailscale machines, it busts through firewalls and accross networks without complex setup. If you have used tailscale before this is an obvious no brainer. What is not obvious is that you can configure tailscale to allow ssh connections from devices within your tailnet without even a ssh daemon process running right through the tailscale daemon.

tailscale status tailscale set --ssh

I picked this up from the tailscale youtube channel.

Tailscale

I hit an issue with markata where even though a bunch of articles were cached, the site build was still slow because I was hitting hashlib.sha256 so hard for cache keys. I was shocked when this popped up in my profiler as a significant portion of the time spent. I swapped out for xxhash and that issue completely went away.

I just implemented a latest blog post link in Markata by asking for the first post slug from the blog feed. The implementation uses the jinja_md plugin to render jinja against the markdown and a tag to redirect.

My latest blog post is [[ {{ markata.feeds.blog.posts[0].slug }} ]]. Click the link if you are not automatically redirected. <meta http-equiv="Refresh" content="0; url='/{{ markata.feeds.blog.posts[0].slug }}'" />

Setting up the feed #

Feeds are setup in markata.toml configuration. They provide a handy way to create an html feed, rss feed, and quickly reference a filtered set of posts like this.

# you will need to enable the jinja_md plugin along with the defaults [markata] hooks = [ "markata.plugins.jinja_md", "default", ] # set up the blog feed [[markata.feeds]] slug = 'blog'...

Great set of tips here!

No waiting. No “waiting until tomorrow” or “It’s Friday, let’s wait until Monday” to deploy. If your deploys are so slow that deploying an hour before the end of the day is a risk, that’s a separate problem. If you’re afraid of a Friday deploy, your system is too brittle, or you don’t have foolproof rollback procedures, or you don’t have people you trust on call to resolve it. Each of these is a problem that you can fix.

This one I find interesting I think there are some industries where customers come in large waves over the weekend, and a weekend bug can not only ruin someones day off, take longer to fix, but also cost a lot of money.

Not deploying on Friday is totally what that team should be doing.

...

Be Fast, Practice, Hone your craft. There’s a lot to be said here about honing your craft for editing text, picking up a few extra WPM, learning vim shortcuts.

Also just build shit. The more you build new and different things the more not only your text editing will just roll out, your skills to see patterns in code and architecture will flourish.

Read their bios, and the answer is always no. They loved to play, sure. They had some base talent, typically. But they also invested an absurd amount of time into that skill set.

This! is actually what turned me on to Post Malone. I remember hearing his story in how he was just known as the guy with a guitar because he was always playing it between class and everything.

Refactoring one line links into wikilinks

Previously I had setup a feature of my website to expand one line links into a card. This was not a standard, even to the point that some formatters wrap the links with , thus breaking my custom plugin. Moving to the wikilink standard will allow my markdown posts to work accross more site builders without custom integrations.

Expand One Line Links

Wikilinks are standard to a lot of wikis written in markdown.

...

2 min read

about this site

I registered waylonwalker.com and started making content for it in 2017 after a big industry downturn in 2016 that left me scared for what would happen if I were laid off. The company I was working for at the time did it’s first major downsizing in history sending many really good engineers out to look for new opportunities in a world flooded with many in the same situation. This was very similar to what happened to the tech industry in 2024.

This was very similar to what happened to the tech industry in 2024.

See Waylon Walker for more about me.

...

4 min read

Just starred eol-dr by pypeaday. It’s an exciting project with a lot to offer.

A crowd-sourced guide to help techs help their non-tech spouses / partners / parents / kids when we are at the end-of-life

sick wikilink hover

Today I set up some sick wikilink hover effects using tailwind see A Case For Tailwindcss. When you hover over them they show an image preview of the link that you are going to. I cant find where I have seen this but it comes from some docs sites.

I’ll finish this article later, just excited to see it up.

1 min read

This is one of my favorite changelog episodes of all time. I had no idea all the work that has gone into the right to repair and ifixit. They talk a lot about apple and its trend to be less repairable from unservicable air pods to serialized components within iphone.

A lot of legal talk that was far more interesting that I thought it would be. Recently winning the right to repair case against John Deere, and creating repairability scores for devices to be placed in stores like energy guide is.

markata

This post is a work in progress.

Markata is the static site generator that I created to build my website about this site. I built it for me and I enjoy using it. I know everying it can do and I can extend it to do more easily. I have set it up for some friends to also use it and am proud that it helps them publish their content.

It’s a meme to create your own static site generator to make your website. Yes its funny, I don’t recommend it if your not ready for the level of work that comes with it, but at the end of the day it’s very...

...

my linked in work history

My linked in work history is empty. I made up a position about content developer that tracks how long I’ve been blogging. I think i did this because LinkedIn requires it. Either way this is public knowledge and fine sharing.

If you have taken any security class for your job seriously you have already been told not to share your work with most companies to the public, this is private information that only opens you up for social engineering attacks against that company.

I care about the security of these companies I work for and their reputation, so I refuse to publically share it.

...

Your LinkedIn is Garbage

Your linkedin link sits at the top of your resume, its one of the first things I see when I open your resume, but yet it gives me no more information that the damn resume you sent me.

Save that space on your resume for something useful.

Fine if you want it on your resume make it actually useful for someone reading your resume.

...

distrobox gives you distrobox-host-exec to run commands on the host. This is handy to get access to host level clis that you probably wouldn’t want to run from the container like podman, docker, flatpak.

DESCRIPTION distrobox-host-exec lets one execute command on the host, while inside of a container.

Under the hood, distrobox-host-exec uses host-spawn a project that lets us execute commands back on the host. If the tool is not found the user will be prompted to install it.

Distrobox is so interesting and cool, I’ve only recently started realizing how much it can do especially related to hardware and graphics, this is quite an example that runs obs in a distrobox. I had no idea distrobox would let you connect to cameras and gpus so seemlessly, and give you a gui to work from. And with distrobox you can export so that it just looks like an app on your system.

andydunstall has done a fantastic job with piko. Highly recommend taking a look.

An open-source alternative to Ngrok, designed to serve production traffic and be simple to host (particularly on Kubernetes)

2024 has been a wild year for infra with going “back” to on prem being made popular by @dhh. Well it looks like ahrefs saw right through the cloud trends an decided to ride the anti cloud train until it came back around to the station.

Being just a bit critical of the article it is impossible to get an apples to apples without actually running something of this scale and spending too much to find out. I cant imagine raw ec2 and ebs being the cheapest route into aws. They used no serverless tech in their article, but I digress, because I like this own your shit and build good product train.

What about People?!

This follow up does dive into the typical gut reaction that people cost a lot of money, you must account for them. You see when you hire people who are actually good at what they do, and run lean a lot of cost goes away, you have levels of management that disappear, levels of tooling that don’t need to exist, departments of IT don’t need to exist.

...

When using justfiles each line is ran separately from the last, unless you specify the file to be ran by something other than just such as bash. If you want variables to persist you need to set a shebang.

Also if you are using your script i a way that you want it to exit when it fails you need to set -e and -o pipefail. This is critical if you are thinking about using just for production scripts like ci/cd. I’ve hit too bugs where ci passes, but no artifacts were created issues for this exact reason.

Damn this Tim Paul quote finishes hard and such a good point. None of the stuff around llms just work. Good ui’s, front end, back end, infrastructure, product. All these things still need to exist, and in fact for ai to be good we need to still go hard on them otherwise everything will die in a heaping pile of ai slop

I’m no developer, but I got the AI part working in about an hour.

What took longer was the other stuff: identifying the problem, designing and building the UI, setting up the templating, routes and data architecture.

It reminded me that, in order to capitalise on the potential of AI technologies, we need to really invest in the other stuff too, especially data infrastructure.

...

interesting pricing model from popsql (pronounces Popsicle). At a glance you pay for data retention, want the abiltiy to recall all the queries you ran within the last year, run at a higher frequency, you jump a pricing tier.

such a sick episode with dax.

SST’s free tier will be free as long as aws allows a free tier, their free tier literally costs them nothing.

They talked about keeping SST small, the limitations that brings, but also the number of problems that just go away when you only have 3 people building. Lots of process disappears, everyone can trust everyone, no one needs to wait for approval, everyone is their own PM and just builds cool shit. They don’t have to worry about big costs and making payroll because they are profitable so much higher than their costs.

If they can get through phase one of just being the go platform for a very specific audience of users, and gain marketshare, the ideas of offerings on top of this are endless.

just has been by go to tool for saving commands in a way that I can replay them and have team members replay them without relying on the shell history of any given machine. This is my go to default step, it lets you pick a just command to run with a fuzzy picker.

Hatch be flyin.

This new release of hatch includes support for the new package installer uv which is just mind blowing fast compared to anything else we have in python right now.

[tool.hatch.envs.default] installer = "uv"

The other features are cool too, check them out. I’ll probably be using the test runner, but I’ve been waiting for the uv support since uv launched.

Imagine waking up to a $1,300 for running an example project! That sounds like peanuts for a cloud bill but for an individual trying to learn that hits my monthly budget real hard.

That’s what happened to Marciej, make sure you check out the full article and give them a 👏 on Medium if you have an account.

The more I see things come out about aws, the more it makes me sick, and confirm my feelings that I cannot possibly use them for a side project without some real $$ planning to come out of it.

Yes, S3 charges for unauthorized requests (4xx) as well[1]. That’s expected behavior.

...

This page shows how to customize your fastapi errors. I found this very useful to setup common templates so that I can return the same 404’s both programatically and by default, so it all looks the same to the end user.

from fastapi import FastAPI, Request from fastapi.responses import JSONResponse class UnicornException(Exception): def __init__(self, name: str): self.name = name app = FastAPI() @app.exception_handler(UnicornException) async def unicorn_exception_handler(request: Request, exc: UnicornException): return JSONResponse( status_code=418, content={"message": f"Oops! {exc.name} did something. There goes a rainbow..."}, ) @app.get("/unicorns/{name}") async def read_unicorn(name: str): if name == "yolo": raise UnicornException(name=name) return {"unicorn_name": name}


This post sat in draft for months. I stumbled upon it again and found great success returning good error messages based on user...

TIL how to display the list of nfs mounts on your network.

showmount -e

You can even look for mounts of other machines on your network.

To allow access only to the , you can pass add the Resource field to the User Policy when you create a new token.

You can inspect sqlite tables with the sqlite shell.

note that you get into the shell with sqlite3 database.db

.tables

I also learned that .tables, .index and .schema are helper functions that query the sqlite_master table on the main database.

Here is an output from my redka database. The sqlite_master table contains all the sqlite objects type, name, tbl_name, rootpage, and sql to create them.

With the liscense changes to redis there are several new forks out there. One that I am particularly interested in is redka.

curl https://i.jpillora.com/nalgeon/redka | bash chmod +x redka ./redka database.db

We now have redis running on port 6379 that we can connect to with a redis client. And we have a sqlite database that we can inspect.

❯ sqlite3 database.db "SELECT name FROM sqlite_master;" rkey rkey_key_idx rkey_etime_idx rkey_on_type_update rstring rstring_pk_idx vstring rhash rhash_pk_idx rhash_key_id_idx vhash

We can look at the values in the vstring table.

The main system that I am concerned about is my arch BTW machine. I found a great article from the official archlinux site covering it.

For my machine I am concerned with this line.

The xz packages prior to version 5.6.1-2 (specifically 5.6.0-1 and 5.6.1-1) contain this backdoor.

I checked my xz package with AUR.">paru, and I am good.

AUR.">paru has some nice features that I rarely use, and hav to look up when I need them. Here are two commands to help with dependency management.

❯ paru -Qii nodejs Name : nodejs Version : 21.7.2-1 Description : Evented I/O for V8 javascript Architecture : x86_64 URL : https://nodejs.org/ Licenses : MIT Groups : None Provides : None Depends On : icu libuv libnghttp2 libnghttp3 libngtcp2 openssl zlib brotli c-ares Optional Deps : npm: nodejs package manager [installed] Required By : node-gyp nodejs-nopt npm semver Optional For : None Conflicts With : None Replaces : None Installed Size : 46.86 MiB Packager : Felix Yan <[email protected]> Build Date : Thu 04 Apr 2024 05:11:09 AM CDT Install Date : Mon 15 Apr 2024 07:27:02 AM CDT Install Reason : Installed as a dependency for another package Install Script : No Validated By : Signature Backup Files : None Extended Data : pkgtype=pkg

You can...

Jerod (It’s ya boi) and Adam are my favorite tech news nerds, and have the sickest podcasts in tech. Yes plural podcasts they run seven podcasts maybe more. If you want it short and sweet they got the best 15 minutes of tech news each week this is it. My favorite is Ship it, sad to see Gerhard go, but Justin and Autumn are crushing it. Every episode is highly polished and surrounded by the sickest beats in podcasting.

Subscribe to one pod if you want, but I recommend collecting them all with the master feed.

⭐⭐⭐⭐⭐

Small web app to convert html into markdown. Pretty cool idea. I actually want to look into this for reader and see how well it would work. Right now I am just pulling descriptions, but maybe I can pull full web pages, and keep the full intent of the first 200 words or so in the cards.

I recently had to update my copier-gallery command to trust my own templates because some of them have shell scripts that run afterwards. Be warned that this could be a dangerous feature to run on random templates you get off the internet, but these are all mine, so if I wreck it its my own fault.

copier copy --trust <template> <destination>

All the the copier copy api can be found with help.

Today I accidentally ran f2 in ipython to discover that it opens your $EDITOR! I use this feature quite often in zsh, it is bound to <c-e> for me, and since I have my environment variable EDITOR set to nvim it opens nvim when I hit <c-e>. Today I discovered that Ipython has this bound to F2. If you know how to set it to <c-e> let me know I’ve tried, a lot.

export EDITOR=nvim ipython <F2>

better yet add export EDITOR=nvim to your .zshrc

Damn 2024 is such a shit show, now Devin seems to be out as a complete scam. It’s really teaching us to have skepticism for what you find on the internet. Turns out that when broken down frame by frame much of the description in the video was a straight up lie. Personally it seemed quite plausible that it was percentage points better than the competition, but I was not holding my breath for it to be a hands off engineer.

I learned about the sqlite_master table from this stack overflow answer. This helps make a lot of sense to how sqlite works. The master table contains all the sqlite objects and the sql to create them.

The .tables, and .schema “helper” functions don’t look into ATTACHed databases: they just query the SQLITE_MASTER table for the “main” database. Consequently, if you used

I’ve really been enjoying using sqlmodel for my projects that need a database. One thing that I definitely lacked on for too long was indexing my database. I hit a point with one database where it was taking 7s for pretty simple paginated queries to return 10 records.

For every field that you will be querying on, you can create an index, by setting it equal to Field(index=True)

class Hero(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) name: str = Field(index=True) secret_name: str age: int | None = Field(default=None, index=True)

example courtesy of the docs

The docs cover this pretty well, and in quite depth - Optimizing Queries

This is a cool snapshot testing tool that automatically creates, and updates test values for you.

Starting with some test code.

from inline_snapshot import snapshot def something(): return 1548 * 18489 def test_something(): assert something() == snapshot()

now if I run pytest my tests will fail because my assert will fail, but if I run pytest --inline-snapshot=create it will fill out my snapshot values and the file will then look like this.

inline-snapshot is a new tool that I am trying out for python testing. It takes snapshots of your outputs and places them inline with the test.

Here is the most basic starter.

import inline_snapshot def test_one(): assert 1 == snapshot()

Now when I run pytest my tests will fail because my assert has no value, but if I run pytest --inline-snapshot=create it will fill out my snapshot values and the file will then look like this.

import inline_snapshot def test_one(): assert 1 == snapshot(1)

It also works with pydantic models.

Today I learned how to VACUUM a sqlite database and cut its size in about half. It’s a database that I have had running for quite awhile and has some decent traffic on it.

Why is it important to do a VACUUM? In short its becuase the file system gets fragmented with as data is updated. On delete the files are removed from the database and marked as available for reuse in the filesystem, but the space is not reclaimed.

To VACUUM a database, run the following sql command. You can do it right form the sqlite shell by running sqlite3.

You will need about double the current size of the database as free space to do the VACUUM, you need space for a full copy, journaling or write ahead logs, and the existing database.

...

Check your system to see if you are vulnerable to the xz backdoor.

I found this line most pertanent to me.

The xz packages prior to version 5.6.1-2 (specifically 5.6.0-1 and 5.6.1-1) contain this backdoor.

Also it appears that arch is not vulnerable as it does not directly link openssh to liblzma, so the known attack vecotor is not possible. read to the end of the linked article for more.

![[None]]

Install it

{ "ThePrimeagen/harpoon", branch = "harpoon2", dependencies = { "nvim-lua/plenary.nvim" }, config = function() require("waylonwalker.plugins.harpoon").setup() end, },

harpoon config

I learned that tailwind animations are pretty easy to add only needing a few classes. For some reason though my brain broke, thinking that I could dynamically change the number and you can’t cause there are only so many pre compiled classes without using an arbitrary value with brackets.

Here are the classes that I used to transition my colors very slowly.

<div id="square" class="transition-colors ease-in-out duration-700"> </div>

And the entire square element.

I recently updated ollama, and it now installs a systemd service that I was not expecting. Seems like a great option, but I hadn’t expeted this and I was able to kill it previously. It was using up gpu, and I do other things on my machine with a gpu. I tried pkill, kill, and everything, it was still coming back.

No matter what it comes back

# stop it systemctl stop ollama.service # disable it if you want systemctl disable ollama.service # confirm its status systemctl status ollama.service

You can confirm this with the following command.

# checking running processes ps aux | grep ollama pgrep ollama # checking gpu processes gpustat --show-cmd --show-pid

Next time you want to start you can do it as before with ollama serve.

I found this statement quite intriguing.

multi-cursors are just macros.

This is quite a philisophical video and mostly prime talking about the things that make vim vim, and what prime needs in and editor vs what he can live without.

Typer makes it easy to compose your cli applications, like you might with a web router if you are more familiar with that. This allows you to build smaller applications that compose into a larger application.

You will see similar patterns in the wild, namely the aws cli which always has the aws <command> <subcommand> pattern.

Lets setup the cli app itself first. You can put it in project/cli/cli.py.

import typer from project.cli.api import api_app from project.cli.config import config_app from project.cli.user import user_app from project.cli.run import run_app app = typer.Typer() app.add_typer(api_app, name="api") app.add_typer(config_app, name="config") app.add_typer(user_app, name="user") app.add_typer(run_app, name="run")

Creating an app that will become a command is the same as creating a regular app in Typer. We need to create a callback that will become our command, and a command that will become our subcommand in the parent app.

...

I learned not to fear the arbitrary size feature of tailwind. While building out reader.waylonwalker.com I kept getting content flowing off the screen, and struggling to keep it on the screen. I really felt that I should be able to do this with vanilla tailwind, but after some encouragement from Twitter I decided to lean on arbitrary values and it worked.

Don’t fear the arbitrary values.

<li class="max-w-[100vw]"> </li>

Learn more about using-arbitrary-values from their docs docs

This is pretty sick, I wanted this early on when I was making lockhart. I wanted to do the git hook thing but could not figure it out and did not know that prepare-commit-msg was a hook that I could use.

Git Hooked Then I remembered! Git hooks! Lol. Why would I have that in my brain - who knows!

I asked claude again, and they whipped up a simple script that would act as a hook that triggers with the prepare-commit-msg event.

This is awesome, cuz if you want to add a git message, you can skip the hook. But if you are lazy, you exclude the message and it will call the LLM.

...

Each time I go to set up npm I am frustrated by the errors saying that I don’t have permission to npm i -g <package>, and it’s frustrating. And I forget what I need to do to tell npm to install packages in a directory I own, and my shell to look there so that I can use the executables.

mkdir ~/.npm-global export NPM_CONFIG_PREFIX=~/.npm-global export PATH=$PATH:~/.npm-global/bin

For the fix to remain persistent you need to put these two lines in your shell profile like ~/.bashrc or ~/.zshrc.

One Day Build - Play Outside

Inspired by Adam Savage and his One Day builds on youtube. I often build things, and want to make them generally useful for others and over configure out of the gate. This project is purely for me inspired by a need I have.

This post will not directly show how to make a weather app, but document the process that I went through to make mine. It will show the tools that I used to make it, and the final result.

It often goes in our house ask dad while he is busy and he will probably just say yes without thinking much. This happens a lot when kids ask to go outside. I think sure, go for it, you will figure it out. Then my wife walks in and asks where they are, followed by, did you even check the weather, its -11 degrees outside right now.

...

6 min read

If you are designing a website in dark mode the scrollbars can be finicky to match the theme. Here is a pretty sane default that looks nice without being obnoxiously contrast to the rest of the site.

<style> ::-webkit-scrollbar { height: 1rem; width: 1rem; } ::-webkit-scrollbar-track { background-color: rgb(24 24 27); } body::-webkit-scrollbar-track { background-color: rgb(39 39 42); } ::-webkit-scrollbar-thumb { background-color: rgb(82 82 91); } ::-webkit-scrollbar-thumb:hover { background-color: rgb(113 113 122); } body::-webkit-scrollbar-thumb { background-color: rgb(82 82 91); } body::-webkit-scrollbar-thumb:hover { background-color: rgb(113 113 122); } ::-webkit-scrollbar-corner { background-color: rgb(39 39 42); } </style>

Want a rounded scrollbar thumb? add these styles.

::-webkit-scrollbar-thumb { border-radius: 0.25rem; border-radius: 9999px; } body::-webkit-scrollbar-thumb { border-radius: 0.25rem; border-radius: 9999px; }

This makes a very nice looking default darkmode scrollbar.

Before deploying to cloudflare pages with wrangler you need a cloudflare api token. You can get one at dash.cloudflare.com/profile/api-tokens.

Next install wrangler using npm.

npm i -g wrangler

Create a Project #

Before you deploy to cloudflare pages you need to create a project. You might already have one, or you might want to create one in the webui, but you have the option to create it at the command line with wrangler.

npx wrangler pages deploy markout --project-name reader-waylonwalker-com --branch markout

Deploy #

Now you can deploy your static application using wrangler to cloudflare pages.

...

For my reader app I am using cronjobs to schedule my a new build and upload to cloudflare pages every hour. In this example I have built a docker image docker.io/waylonwalker/reader-waylonwalker-com and pushed it to dockerhub. It uses a CLOUDFLARE_API_TOKEN secret to access cloudflare, and the entrypoint itself does the build and upload.

I am working on a page for htmx-patterns and I ran into a situation with lots of duplication. Especially when i am using tailwind I run into situations where the duplication can get tedious to maintiain. The solution I found is macros.

Now I can use the same code for all of my links, and call the macro to use it.

If you’re into interesting projects, don’t miss out on taipy, created by Avaiga.

Turns Data and AI algorithms into production-ready web applications in no time.

jinja has a loop variable that is very handy to use with htmx. Whether you want to implement a click to load more or an infinite scroll this loop variable is very handy.

{% for person in persons %} <li {% if loop.last %} hx-get="{{ url_for('infinite', page=next_page) }}" hx-trigger="intersect once" hx-target="#persons" hx-swap='beforeend' hx-indicator="#persons-loading" {% endif %} {{ person.name.upper() }} - {{ person.phone_number }} </li> {% endfor %}

Now for every chunk of contacts that we load we will trigger the infinite scroll by loading more once the last one has intersected the screen.

Out of the box FastAPI.">Starlette does not support url_for with query params. When trying to use url_for with query params it throws the following error.

starlette.routing.NoMatchFound: No route exists for name "infinite" and params "page"

In my searching for this I found starlette issue #560 quite helpful, but not complete, as it did not work for me.

import jinja2 if hasattr(jinja2, "pass_context"): pass_context = jinja2.pass_context else: pass_context = jinja2.contextfunction @pass_context def url_for_query(context: dict,...

...

Kind (Kubernetes in Docker) is a tool that makes it easy to create and tear down local clusters quickly. I like to use it to test out new workflows.

Argocd is a continuous delivery tool that makes it easy to setup gitops workflows in kubernetes.

Here is how you can setup a new kind cluster and install argocd into it using helm, the kubernetes package manager.

kind create cluster --name argocd # your first time through you need to add the argocd repo helm repo add argo https://argoproj.github.io/argo-helm helm repo update # install argocd into the cluster helm install argo argo/argo-cd --namespace argocd --create-namespace # deploy the app of apps kubectl apply -f apps/apps.yaml

If you want to add repos and apps to your cluster you can use the argo cli to do that, but first you will need forward the argocd port and login.

feeds

I have several feeds that you can consume my content with. Many posts will cross between them, so if you would like to follow a certain stream of content in your rss reader thats what this is for. This one might feel like it has some extra noise with multiple posts per day, including starts, and instagram style posts, for a bit less look at the [[ main ]] feed.

This is a feed of everything that I have published on my site to date including Posts tagged: blog, [[ til ]], 1 min read

Very interesting article by Sylvain, suggested by Simon Willison.

Definitely some things that I want to come back and try later on.

Here is the TLDR of the whole post

PRAGMA journal_mode = WAL; PRAGMA busy_timeout = 5000; PRAGMA synchronous = NORMAL; PRAGMA cache_size = 1000000000; PRAGMA foreign_keys = true; PRAGMA temp_store = memory;

This is interesting, and something I need to consider. I definitely have an application with slow count queries. I am not sure how to make it better as its not a full count(*) so a count table doesn’t work, nor does counting by index.

...

Inspiring story transitioning into tech from nursing. I also came to tech through a set of circumstances that made it difficult for me to excel at my current job. Looking back it is something that I was always interested in and I was just unsure how to get in, I am so glad that I figured it out, it has been such a great benefit to my family.

I really enjoyed listening to trshpuppy’s journey in through building projects, and choosing tech not based on what she wanted to learn, but what fit the project the best.

Thoughts

These are generally my thoughts on a web page or some sort of url, except a rare few don’t have a link. These are dual published off of my thoughts.waylonwalker.com site. It’s a fully dynamically rendered site 2000’s style. Posts are stored in a database and instantly available. Almost all of the posts were written in a small <textarea> field within a chrome extension that I built for it.

These posts are intended to in two ways. One, link building for the author. I hope that I give the people helping me out along the way just a little bit of a boost. Two, they serve as a permanant commented bookmark for me to search, and come back to later when I have forgotten where I have seen something.

...

great poll of git questions

poll: did you know that in a git merge conflict, the order of the code is different when you do a merge/rebase?

merge:

OTHER BRANCH’S CODE

...

kubeseal is a pretty simple to get started with way to manage secrets such that they can be stored in a git repo and be picked up by your continuous delivery service.

Sealed Secrets provides declarative Kubernetes Secret Management in a secure way. Since the Sealed Secrets are encrypted, they can be safely stored in a code repository. This enables an easy to implement GitOps flow that is very popular among the OSS community.

In my homelab kubernetes cluster I am using kubeseal to encrypt secrets. I have been using it successfully for a few months now wtih great success. It allows me to commit all of my secrets manifests to git with out risk of leaking secrets.

You see kubeseal encrypts your secrets with a private key only stored in your cluster, so only the cluster itself can decrypt them using the kubeseal controller.

https://sealed-secrets.netlify.app/

Installation happens in two steps. You need the kubernetes controller and the client side cli to create a sealed secret.

...

Great episode covering a seemingly simple topic. What I really benefitted from was hearing all the different use cases, from logging, debugging, to a/b testing, caching, and auth. I hadn’t even thought of it being applied to a router. I thought of it being applied for an entire application. This seems very useful for things like an admin router, all routes would need to have the admin role to get in.

![[None]]

I’ve been using these decorators to modify the behavior of specific routes. It will do things like 404 admin only routes in a way that looks just like fastapi’s default, or only allow certain roles into the route, or redirect unauthenticated users to login.

After listening to yesterday’s syntaxfm I’m now really thinking about middleware and the benefits it might have. middleware would make it easy to apply things like admin to an entire admin router, so you wont forget it on any one admin route. It will look cleaner as the admin checker is only applied once per router, not once per route.

kubernetes 6 months in

I stumbled into kubernetes December 2023 when I was looking for a better way to self host applications. I was looking for something that didn’t require logging into a server and building and deploying like a cave man. I wanted a smoother experience than docker compose was giving me.

https://waylonwalker.com/looking-for-a-heroku-replacement/

This post turned into a list of tools that I have adopted into my k8s workflow, and plan to keep. enjoy.

...

I switched from a 60% vortex pok3r to a 40% corne June, 2021. I can relate to a lot of what Carlos talks about here. I think going from 60%-40% made my journey harder than it needed to be. There’s no going back now, but it took me a really long time to be able to hit all of the numbers and symbols, just figuring out how to do the layout was hard there’s not much space.

I didn’t touch type. I never really used my pinkies, except maybe for ESC, Shift, CTRL, Backspace et al.

I can relate to this, my typing habits were terrible. Shortly before going split ortho I worked on my speed with lots, and lots of practice on keybr and monkeytype. I took my speed from 35wpm to 80wpm with a few months of steady practice. This is one of the best things I did for myself.

Once I got split it dropped down to single digits and slowly rose back up to 80, just barely breaking my PB on monkeytype.

...

Carlos has a pretty sick setup here, I can relate to mostly, cept the macos part. My main critique is that I don’t think he gave window managers much chance on linux, and they just don’t work on MacOS/Windows.

Most of the time I have a single, maximized window.

I can relate to this. I should really make a full post about my experience with tiling window managers. TLDR, I came for tiling and I stayed for the workspaces.

Multiple Displays An exception here could be streaming: having multiple displays can help preventing doxing yourself if you only share the screen of one of them. I only did stream like 3 times and that’s what I did, but I’m sure experienced streamers have better workflows (with or without multiple displays).

...

An absolute fantastic episode about blogging, thinking about a web1.0 kind of world today, and what it means moving forward.

Web 1.0 is robust, you own your own destiny, you own your data, you can do what you want. There is no platform to tell you what you can and cannot do. But the future web is stealing your data to build AI models, spam sites are duplicating your content and stealing your SEO. You may or may not care, but at the end whether you get traffic or now you own your web 1.0 sites.

![[None]]

I figured out the killer combination for python lsp servers, ruff and jedi! ruff does all of the diagnostics and formatting, then jedi handles all the code objects like go to definition and go to reference.

Underrated python library to on board ruff, or just use it on a project where its not the norm. ruff claims that its 99.9% compatible with black and when you read through the known differences they are clearly edge case bugs in black.

See this page for more about the comparison to black https://docs.astral.sh/ruff/faq/#how-does-ruffs-formatter-compare-to-black

oh and I just noticed that it is maintianed by Charlie, and comes straight out of astral.

![[None]]

First I need to fetch my thoughts from the api, and put it in a local sqlite database using sqlite-utils.

fthoughts () { # fetch thoughts curl 'https://thoughts.waylonwalker.com/posts/waylonwalker/?page_size=9999999999' | sqlite-utils insert ~/.config/thoughts/database2.db post --pk=id --alter --ignore - }

Now that I have my posts in a local sqlite database I can use sqlite-utils to enable full text search and populate the full text search on the post table using the title message and tags columns as search.

sthoughts () { # search thoughts # sqlite-utils enable-fts ~/.config/thoughts/database2.db post title message tags # sqlite-utils populate-fts ~/.config/thoughts/database2.db post title message tags sqlite-utils search ~/.config/thoughts/database2.db post "$*" | ~/git/thoughts/format_thought.py | bat --style=plain --color=always --language=markdown } alias st=sthoughts

Now I am ready to search my thoughts, which is a tiny blog format that I created mostly for leaving my own personal comment on web pages, so most of them have a link to some other online content, and their title is based...

This is the best tree I have ever built in minecraft. It took at least 4 stacks of logs and leaves despite what it looks like.

It is placed where Welscraft’s island in the hermitcraft season 10 seed, but on our own server we call lonecraft.

We started this server a few weeks after hermitcraft season 10 started, and play on it a few times per week. It has a pretty successful day one iron farm that took us way more than one day to complete, and the farm behind this is our first ever villager driven farm. Somehow potatoes got cross contaminated and now its pumping out potatoes and some bread, but no carrots or beat roots.

World Seed: 5103687417315433447

I’ve been using this for a few weeks now and it’s fantastic. It’s reminds me of lazygit, it gives a nice quick interface into the things I need and it just works. Yes I can git status to see what changed, then diff the files, then commit hunks, but lazygit can do that in just a few keystrokes. lazydocker does this for docker. It gives me a nice view into whats running, what’s eating up disk space, and the networks I have. And if I see I have a bunch of exited containers, there is a bulk command righ there to clean them up.

tldr docker ps on steroids

Go is feeling more and more like something I could throw in my tool belt as a python dev. I really like that it’s garbage collected and has great error management. I am just not sure how to work it in without it being the main thing. The thing that is so cool is the ability to ship tiny pre-compiled binaries that just work, and the raw speed. these binaries just get up and working without any warm up. writing any cli in python I’m going to be using something like typer, and it takes half a second just to warm up, so even hello world cannot be faster than half a second.

Great example from Anthony showing how easy it is to practice building database orm models and playing with them in a repl. This is good practice even if you are in a big code base to be able to test and learn in a simplified code base that does not have a mountain of other code around atuh, permissions, security, and other complex things that come into real production code bases that might make it hard to focus on what you are trying to do.

Today I came across some sqlalchemy models that created some relationships, some used backref some used back_populates. I was stumped why, I had never came accross backref before and I felt skill issues sinking in.

https://docs.sqlalchemy.org/en/14/orm/backref.html

As stated in the sqlalchemy docs, backref is a legacy feature. Its shorthand to creating relationships between parent and child, but only adding it to the parent. While this is simpler it introduces some invisible magic.

I came across minio from minio, and it’s packed with great features and ideas.

MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.

I came across uv from astral-sh, and it’s packed with great features and ideas.

An extremely fast Python package and project manager, written in Rust.

How do you pronounce URL, is it U.R.L or Earle? I’m about 50/50, mostly when I am in a hurry I use Earle as it is one syllable and easy to say. I picked this up from MPJ of fun fun function, who took over Dev Tips. In this episide Jim uses Earle and they make fun of him. If it’s good enough for Jim, I am done with my 50/50 and I’m going all in on Earle.

Episode also included a fastinating corrdinated attack that used Ars Technica profile photos communicate directions for the next attack via query parameters in the image url.

This really makes me want to try Dolphin Mixtral with ollama now. It looks very impressive from this video. The ability to keep adding features before becoming confused is though with a lot of these llms.

Being chat based, this is not a co pilot replacement. I was really hoping for an in line co pilot like tool that I can run locally. I have not used co pilot yet, but I have had great luck with codeium.

Great take on low code. I have definitely felt the pressure of being presented low code options, “look it does almost everything you need, and you can do it without code.” Granted there are tons of great low code environments that serve their markets well (things like zapier).

As pointed out here when they fall short rather than being hard, it goes to nearly impossible. As Theo points out here many applications follow an 80/20 rule. 80% of the app is really easy to put together, and takes about 20% of the time, probably less. What no code does is it takes that 80% that is already easy, makes it even easier ( pitches it as faster whether or not that is true ), and makes the last 20% of the project impossibly hard to create and maintain, so you just should have picked a tool that had the capability of doing the whole thing from the start anyways.

poc is not product

A poc is not a product. I started focais, not in a rush, but as something that I already had a POC for and thought it would be easy. I wanted to build tools to make creating blog posts like this one easier. I stared with shots a tool that takes screenshots of websites.

For the poc, I made a single fastapi endpoint that takes a url and returns a screenshot of the page. It converts the url into a key that I can lookup to see if I have the shot, if I don’t I go get it. With the open source libraries out there, this is not too hard of a task.

But this wasn’t enough

...

5 min read

I’ve heard prime say just give it the one eyed fighting kirby so many times, and execute it few times, and there is no way to find it online, so this will be the link that I will come to, when I need to remember what @theprimeagen means when he says Give it the one eyed fighting kirby.

:s/\(.*\);/console.log(\1)

So what is this? #

This is a vim substitute comand to replace text in the buffer. the one eyed fighting kirby is a regex capture group to capture everything between matches, and assign it a value to place back in after the match.

substitute in a nutshell, :s/<what you want to replace>/<what you want to replace with>

Here is a contrived example of text.

...

This is a pretty sweet interface into llms. I used it a bit with my son tonight while he was asking me for datapack ideas.

❯ mods -f 'I am trying to have fun on my minecraft server and am creating a minecraft datapack send me some load.mcfuncions that will make it fun'

You can continue the conversation with a -C

❯ mods -C -f 'I like where you are going with number 4, can you make it so that it runs when a player opens a door'

You can pass it some data

This is a pretty sweet interface into llms. I used it a bit with my son tonight while he was asking me for datapack ideas.

❯ mods -f 'I am trying to have fun on my minecraft server and am creating a minecraft datapack send me some load.mcfuncions that will make it fun'

You can continue the conversation with a -C

Today I was running some sqlmodel queries through the sqlalchemy orm. Admittedly I’ve not done enough orm queries before, and I’ve done quite a bit of raw sql. I was trying to get objects from two separate models that had relationships setup.

session.query(User, Images).where(User.id == 3).all()

It is incredibly slow, and gives me the following warning.

SELECT statement has a cartesian product between FROM element(s)

What I learned from the SQLModel docs is that you should give it a join to correct this and go much faster.

So after months of fighting with gf not going to template files, I finally decided to put in some effort to make it work.

This was the dumbest keybind in my config, that I copied from someone else without understanding it.

I have jinja templates in a directory called templates. I want to bind gf to open a template file, but it is trying to open a new file ./base.html

{% extends "base.html" %} {% if request.state.user %} {% block title %}Fokais - {{ request.state.user.full_name }} {% endblock %} {% else %} {% block title %}Fokais {% endblock %} {% endif %} {% block content %} {% if request.state.user %} <h1 id="title" class="inline-block mx-auto text-5xl font-black leading-loose text-transparent bg-clip-text bg-gradient-to-r from-red-600 via-pink-500 to-yellow-400 ring-red-500 text-shadow-xl text-shadow-zinc-950 ring-5"> {{ request.state.user.full_name }} </h1> {% endif %} {% include "me_partial.html" %} {% endblock %}

What did not work #

I tried all sorts of changes to my path, but it still didn’t work.

...

vim

html code generated by my jinja templates generally look half garbage because of indents and whitespace all over the place. I just learned about these pesky Whitespace Control characters that can get rid of the whitespace added from templating.

You can also strip whitespace in templates by hand. If you add a minus sign (-) to the start or end of a block (e.g. a For tag), a comment, or a variable expression, the whitespaces before or after that block will be removed:

thoughts on unit tests

Your browser does not support the audio element.

Theo’s response puts a lot of my feelings about unit testing into words. Many of us have grown up in this world preaching unit testing. We often hear these statements “Everything must be unit tested, tests make code more maintainable.” In reality when we are not writing complex low level code unit tests are probably the wrong approach.

thought 192, a thought about theo’s reaction to prime’s unit testing

...

5 min read

Authentication from cli tools can be a bit of a bear, and I have to look it up every time. This is my reference guide for future me to remember how to easily do it.

I set up a fastapi server running on port 8000, it uses a basic auth with waylonwalker as the username and asdf as the password. The server follows along with what comes out of the docs. I have it setup to take basic auth, form username and password, or a bearer token for authentication.

The og of command line url tools.

# basic auth curl -u 'waylonwalker:asdf' -X POST localhost:8000/token # basic auth with password prompt curl -u 'waylonwalker' -X POST localhost:8000/token # token curl -H 'Authorization: bearer...

...

Most bloggers on my twitter blog right into a file that goes on git. I kinda expected to have more database folk. I have my blog in markdown on git and the editing experience is top notch. I can just find files edit them in MY EDITOR, push them and I got a post. I am running thoughts in a sqlite database with a fastapi backend, and holy crap the instant nature of posting feels so much better. Both sides have good points.

I am working on fokais.com’s signup page, and I want to hide the form input during an htmx request. I was seeing some issues where I was able to prevent spamming the submit button, but was still able to get one extra hit on it.

It also felt like nothing was happening while sending the email to the user for verification. Now I get the form to disappear and a spinner to show during the request.

Let’s start off with the form. It uses htmx to submit a post request to the post_request route. Note that there is a spinner in the post_request with the htmx-indicator class.

The intent is to hide the spinner until the request is running, and hide all of the form input during the request.

...

DataDog ddqa is building out a textual app and deploying it with pyapp. They have CI setup to fully build and cross compile their textual tui into github releases that you can just download from their releases page. This is something I am looking at for markata. This would be pretty sweet to be able to make it just work on places like windows. It would also be interesting to try to build a full desktop app with pyapp.

Excluding routes from fastapi docs, can be done from the route configuration using `include_in_schema`. This is handy for routes that are not really api based or duplicates.

From the Docs #

from fastapi import FastAPI app = FastAPI() @app.get("/items/", include_in_schema=False) async def read_items(): return [{"item_id": "Foo"}] 

trailing slash #

I’ve had better luck just routing both naked and trailing slash routes in fastapi. I’ve had api’s deployed as a subroute to a site rather than a subdomain, and the automatic redirect betweens them tended to always get messed up. This is pretty easy fix for the pain is causes just give vim a yyp, and if you don’t want deuplicates in your docs, ignore one.

...

This is a handy guide to cancelling stripe subscriptions.

# Set your secret key. Remember to switch to your live secret key in production. # See your keys here: https://dashboard.stripe.com/apikeys import stripe stripe.api_key = "sk_test_51ODvHtB26msLKqCAPBAo1qkBBuIfT5tQBX6YFWCLMsPixIExxITCRVa9tNCIqkdQS8olhR79NYXsFWBPKsM3LbGO00zEcNQfNI" stripe.Subscription.modify( "sub_49ty4767H20z6a", cancel_at_period_end=True, )

You can even inverse it by flipping True to False and re activate the subscription.

Today I am working on fokais.com, trying to get to a point where I can launch by workig through stripe integrations. This is my first time using stripe, so there has been quite a bit to learn, and I am probably building in more than I need to before launching, but I am learning, and not in a rush to launch.

I am building the fokais backent in python primarilyt with fastapi and sqlmodel on sqlite. My billing integration is going to be all Stripe.

Here is a link to the stripe docs for your refrence, especially if you want to see how to cancel subscriptions in other languages. They include code samples for many popular languages.

This is the part of the user model that includes the cancel and reactivate methods. It pretty much follows the stripe guide.

...

You can find your customers next billing date through the stripe api by using Invoice. and passing in customer, customer_details, subscription, or schedule.

import stripe stripe.api_key = "sk_test_51ODvHtB26msLKqCAPBAo1qkBBuIfT5tQBX6YFWCLMsPixIExxITCRVa9tNCIqkdQS8olhR79NYXsFWBPKsM3LbGO00zEcNQfNI" invoice = stripe.Invoice.upcoming(customer="cus_NeZwdNtLEOXuvB")

Within the invoice, you can find the next_payment_attempt as a epoch.

Stripe has it’s own query language for querying data. I’m just getting into using it and it seems pretty good so far. I needed to lookup the price for products. I was able to find prices for my product using the python api as shown below.

Prefix Description Notes ac_ Platform Client ID Identifier for an auth code/client id. acct_ Account ID Identifier for an Account object. aliacc_ Alipay Account ID Identifier for an Alipay account. ba_ Bank Account ID Identifier for a Bank Account object. btok_ Bank Token ID Identifier for a Bank Token object. card_ Card ID Identifier for a Card object. cbtxn_ Customer Balance Transaction ID Identifier for a Customer Balance Transaction object. ch_ Charge ID Identifier for a Charge object. cn_ Credit Note ID Identifier for a Credit Note object. cs_live_ Live Checkout Session ID Identifier for a checkout Session object in live mode. cs_test_ Test Checkout Session ID Identifier for a checkout Session object in test mode. cus_ Customer ID Identifier for a Customer object. dp_ Dispute ID Identifier for a Dispute object. evt_ Event ID Identifier for an Event object. fee_ Application Fee ID Identifier for an Application Fee object. file_ File ID Identifier for a File object. fr_ Application Fee Refund ID Identifier for an Application Fee Refund object. iauth_ Issuing Authorization ID Identifier for an Issuing Authorization object. ic_ Issuing Card ID Identifier for an Issuing Card object. ich_ Issuing Card Holder ID Identifier for an Issuing Card Holder object. idp_ Issuing Dispute ID Identifier for an Issuing Dispute object. ii_ Invoice Item ID Identifier for an Invoice Item object. il_ Invoice Line Item ID Identifier for a Invoice Line Item object. in_ Invoice ID Identifier for an Invoice object. ipi_ Issuing Transaction ID Identifier for an Issuing Transaction object. link_ File Link ID Identifier for a File Link object. or_ Order ID Identifier for an Order object. orret_ Order Return ID Identifier for an Order Return object. person_ Person ID Identifier for a Person object. pi_ Payment Intent ID Identifier for a Payment Intent object. pk_live_ Live public key Public key in a live environment. pk_test_ Test public key Public key in a test environment. pm_ Payment Method ID Identifier for a Payment Method object. po_ Payout ID Identifier for a Payout object. price_ Price ID Identifier for a Price object. prod_ Product ID Identifier for a Product object. prv_ Review ID Identifier for a Review object. pst_live_ Live Connection token Connection token in a live environment. pst_test_ Test Connection token Connection token in a test environment. py_ Payment ID Identifier for a Payment object. pyr_ Payment Refund ID Identifier for a psuedo Refund object of a payment. qt_ Quote ID Identifier for a Quote object. rcpt_ Receipt ID Identifier for a receipt. re_ Refund ID Identifier for a Refund object. req_ Request ID Identifier for a HTTP Request rk_live_ Live restricted key Restricted key for live environment eg. stripe-cli rk_test_ Test restricted key Restricted key for test environment eg. stripe-cli seti_ Setup Intent ID Identifier for a Setup Intent object. si_ Subscription Item ID Identifier for a Subscription Item object. sk_live_ Live secret key Secret key in a live environment. sk_test_ Test secret key Pecret key in a test environment. sku_ SKU ID Identifier for a SKU object. sli_ Subscription Line Item ID Identifier for a Subscription Line Item object. sqr_ Scheduled Query Run ID Identifier for a Scheduled Query Run object. src_ Source ID Identifier for a Source object. src_ Source ID Identifier for a Source object. sub_ Subscription ID Identifier for a Subscription object. tml_ Terminal Location ID Identifier for a Terminal Location object. tmr_ Terminal Reader ID Identifier for a Terminal Reader object. tok_ Token ID Identifier for a Token object. trr_ Transfer ID Identifier a Transfer object. tu_ Topup ID Identifier for a Topup object. txi_ Tax ID Identifier for a customer Tax object. txn_ Transaction ID Identifier for a Transaction object. txr_ Tax Rate ID Identifier for a Tax Rate object. we_ Webhook Endpoint ID Identifier for a webhook endpoint. whsec_ Webhook Secret Secret key for signing a web hook.

Stripe has so many keys and ids this is a very helpful list to decode what exactly an id is for.

Looking for a Heroku replacement, What I found was shocking!

Your browser does not support the audio element.

I’ve long hosted my personal blog as a static site on waylonwalker.com. It’s all markdown, converted to html, and shipped as is. It’s been great, I’ve moved it from GitHub Pages, to Netlify, tried Vercel for a minute, and have landed on Cloudflare Pages. Each migration has not really been that hard, it’s just pointing ci to a different host after the site has built.

Now the part that I have struggled with is how to cheaply host a server rendered application that can just live on forever without me paying for it. This is a harder problem as it costs more to keep servers spinning, memory, and disk all ready for you to use at a moments notice.

...

Dang this is such a good message. I can’t exactly relate to being forced into the overworking situation that PirateSofware is talking about. I can relate to being conditioned to feeling a certain way and changing that is very difficult. I can also relate to not feeling like I am getting enough done in the day. Sometimes a bit of separation is good.

I’ve been using tailwind for a few months now and I can still say I’m loving it. I’ve been using it to create some rapid prototypes that may or may not ever become something, a document that is likely to go to print (a resume), and some quick dashboards.

A few months back in september of 2023 I made a case for tailwindcss. And have been using it on quite a few projects since.

I started working on fokais.com only a few weeks ago, It’s going to be a SAS to make blogging easier. I’ve started hosting some tools for this blog that I really like that I think I can turn into a service. It’s been fantastic to quickly pump out new pages with tailwind.

screenshot of https://fokais.com

I’m working on something that might go to print, so I want the page breaks to happen somewhat in my control as the content author. As I do my writing I break my content up in to many short sections using h2, sometimes an h3. These are generally short sections that go together, should stay together, and typically are not too lengthy to cause a large white space in print.

I found a way in css to only allow page breaks to happen on h2 and h3, and it turned out perfect, suck it WSIWIG editors

How to Build a Website or App - Syntax #696 This podcast episode covers a wide range of topics related to building a website or web application from start to finish. syntax.fm Great tips in this one. They discuss everything from front end to backend, databases and ORMS, here are a few of my favorite points. Use good data or good fake data make it have some variation like long and short text Don’t use a database if you need one, static content is eaiser to manage end to end test, (does the site load page x) You DONT NEED all this complexity, you can deploy a site with HTML and CSS.

Nice take by @t3dotgg. Some of the old patterns that go deep into webdev, MVC, separation of concerns, REST, are things we are told to believe on day one, thrown so many things, no mental bandwidth, or experience to form our own opinions we must take them as fact. Rarely do we take these facts and revisit them with our new understandings years later.

heroicons is a really nice set of many of the basic icons that you will need for building nice ui’s. They have a really nice copy as svg or jsx button, so that you can just yank it and paste it on your page without any extra packages or installation.

Kubetail is a pretty sick bash script that allows you to tail logs for multiple pods in one stream. Very handy when you have more than one replica running.

wget https://raw.githubusercontent.com/johanhaleby/kubetail/master/kubetail chmod u+x ./kubetail

Now with kubetail I can tail all the logs for every shot-wayl-one pod in the shot namespace.

I am converting my docker compose env secrets over to k8s secrets. This guide was clear and to the point how I can replicate this exact workflow.

First set the secret, the easiest way is to use kubectl wtih –from-literal because it automatically base64 encodes for you.

kubectl create secret generic minio-access-key --from-literal=ACCESS_KEY=7FkTV**** -n shot

If you don’t use the --from-literal you will have to base64 encode it.

echo "7FkTV****" | openssl base64

Once you have your secret deployed, you have to update the container spec in your deployment manifest to get the valueFrom secretKeyRef.

Interesting principle here. What a great example, If I’m looking at the second jQuery example, I have to dig into dev tools or make some assumtions that this team uses jQuery, and selects by id, therefore I can grep for $("#d1").

Consider two different implementations of an AJAX request in HTML, the first in htmx:

I was looking to add running kubernetes jobs to a python cli I am creating, and I found this solution, mostly thanks to ollama run mistral:7b-instruct-q4_K_M and my loose understanding of what the yaml syntax is supposed to look like for a kubernetes job. This will let me create a job in the cluster, choose the image that runs, the command that is called, and how long until the job expires and is cleaned up. While the job still exists I can go in and look at the logs, but once its ttl has expired they are gone.

I think just, might just be the thing I have been looking for. I’ve been looking for some ci/cd that I can host myself, but everything looks pretty big, so for now I am going to use just as my task runner.

I installed with installer.

curl https://i.wayl.one/casey/just | bash

I set up my devtainer builds with just. Here is my justfile, yes you just need the cli and a file named justfile.

I was curious to see what was going on inside of my minio object storage. Great technique here by Frank to create an inspector pod, then you can do as you wish with the data.

I created the manifest as pvc-inspector.yml

apiVersion: v1 kind: Pod metadata: name: pvc-inspector spec: containers: - image: busybox name: pvc-inspector command: ["tail"] args: ["-f", "/dev/null"] volumeMounts: - mountPath: /pvc name: pvc-mount volumes: - name: pvc-mount persistentVolumeClaim: claimName: pvc-name

Then used it like this.

I recently spun up k3s in my homelab. I’m trying to offload some work off of my free tier fly.io app in order to keep it free tier without crashing.

# install and start k3s curl -sfL https://get.k3s.io | sh - # check to see if your nodes are started sudo kubectl get nodes

My main hiccup so far was the machine I am running on runs zfs on root, and it would not start the master node. Rather than figuring out how to make zfs play nice I just pointed k3s to a drive that is not zfs.

![[None]]

Yet again twitter cards were causing me pain. This time it was me not realizing that they require full urls, and not relative or abolute urls.

This was not working

<meta name="twitter:image" content="/shot/?path={{ request.url|quote_plus }}" content-type='image/png'/>

This does work with a full url

ollama is the easiest to get going local llm tool that I have tried, and seems to be crazy fast. It feels faster than chat gpt, which has not been the experience I have had previously with running llm’s on my hardware.

arel is a “Lightweight browser hot reload for Python ASGI web apps”

I just implemented this on my thoughts website using fastapi, and it’s incredibly fast and lightweight. There just two lines of js that make a web socket connection back to the backend that watches for changes.

When in development mode, this snippet gets injected directly on the page and does a refresh when arel detects a change.

import os import arel from fastapi import FastAPI, Request from fastapi.templating import Jinja2Templates app = FastAPI() templates = Jinja2Templates("templates") if _debug := os.getenv("DEBUG"): hot_reload = arel.HotReload(paths=[arel.Path(".")]) app.add_websocket_route("/hot-reload", route=hot_reload, name="hot-reload") app.add_event_handler("startup", hot_reload.startup) app.add_event_handler("shutdown", hot_reload.shutdown) templates.env.globals["DEBUG"] = _debug templates.env.globals["hot_reload"] = hot_reload @app.get("/") def index(request: Request): return templates.TemplateResponse("index.html", context={"request": request}) # run: # DEBUG=true uvicorn main:app --reload

I just discovered arel for hot reloading python applications when content changes from this snippet that implements it for fatapi.

...

jpillora/installer is the install script generator I have been looking for. It downloads binaries for your machine from GitHub releases and unzips them for you. It grabs the latest release, so you can easily update them. I have tried scripting these installs in the past and struggled to consistently get the latest version for every package and unpack it correctly.

Also these pre-compiled binaries install rediculously fast compared to building them from source.

Check out some example links.

opening in a browser will show metadata

...

I wanted to host some static files through fastapi. Typical use cases for this might be some static web content like html/css/js. It could also be images or some data that doesn’t need dynamically rendered.

The docs cover how to host static files, and give this solution that is built into fastapi.

https://fastapi.tiangolo.com/tutorial/static-files/

from fastapi import FastAPI from fastapi.staticfiles import StaticFiles app = FastAPI() app.mount("/static",...

...

I recently se tup minio object storage in my homelab for litestream sqlite backups. The litestream quickstart made it easy to get everything up and running on localhost, but I hit a wall when dns was involved to pull it from a different machine.

First I had to configure the Key ID and Secret Access Key generated in the minio ui.

❯ aws configure AWS Access Key ID [****************VZnD]: AWS Secret Access Key [****************xAm8]: Default region name [us-east-1]: Default output format [None]:

Then set the the s3 signature_version to s3v4.

aws configure set default.s3.signature_version s3v4

Now when I have minio running on https://my-minio-endpoint.com I can use the aws cli to access the bucket.

...

why-is-postgres-default

Serious question.

But, why. It’s the most loved db, right? Right? Maybe it’s time to rethink it.

Don’t get me wrong, if I need a relational db as a service, PostgreSQL is going to be my first choice, but why do I need to run a separate application for it?

...

makeplane has done a fantastic job with plane. Highly recommend taking a look.

🔥 🔥 🔥 Open Source JIRA, Linear, Monday, and Asana Alternative. Plane helps you track your issues, epics, and product roadmaps in the simplest way possible.

Pagefind is absolutely insane. I’ve tried a number of static site searches, and found them all hard to get get going, clunky and not the best experience as a user or developer.

I setup pagefind in about 2 minutes on my site where it found and indexed 833 pages in 2 minutes.

The only downside I see so far is that it is a lot of bandwidth to the user. On simulated slow 3G you can definitly feel it, but not terrible. Anything slower and its going to start feeling frustrating.

edit: I have actually fully deployed it on waylonwalker.com, and its fast!

...

I’ve recently given tailwindcss a second chance and am really liking it. Here is how I set it up for my python based projects.

https://waylonwalker.com/a-case-for-tailwindcss

npm is used to install the cli that you will need to configure and compile tailwindcss.

npm install -g tailwindcss-cli

Setup #

You will need to create a tailwind.config.js file, to get this you can use the cli.

...

A Case For Tailwindcss

I was watching @theprimeagen recently and I think he sold me on using tailwindcss. The thing about tailwind is that it is not a big component library, it’s a set of css classes mapped to a few (usually one) style.

All css classes are shitty, so you might as well use someone else’s shitty css classes on all your projects rather than thinking you’re being smart with a new set of classes that you will hate in 6 months when you come back to the project. roughly quoted from memory of @theprimeagen

So unlike big component libraries like tailwind, it comes with a cli that that it uses to create the final css file. It is able to treeshake out all the tailwind classes that you are not using and only ship the ones that you are using.

...

3 min read

Kinda mindblown that this is even possible. This is so far outside of my current thinking that i didn’t even think of an elegant way to implement semantic search accross images and text at the same time. I know it happens at Google, but I envision that as still text search accross tags and meta data about the image.

Based on the number of responses CLIP is the thing that does this.

This is the greatest nvim emmet plugin I have tried. In the past I had tried the vim plugin a few times and just could not get a good flow with the keybindings and found it confusing for my occasional use. emmet-ls just uses lsp-completion, so its the same flow as other completions.

You can try it out by installing with :Mason

Make the easy things easy

It’s so easy to get out of rhythm, get busy, and drop the ball on some things that you really want to do or should do. This blog is a good example. I took some time off for some family reasons, but have taken a long time to get back to it simply because I am out of rhythm. As I am trying to get back into the rhythm there is some tooling that I have set up for it that I completely forgot about that feel good to use again.

Simple Repetitive Tasks that I have to do often can just feel soul crushing, and one main thing that got me interested in programming.

AI tools are becoming more and more useful at solving these problems. For instance code generation tools like co-pilot or codeium are really good at boilerplate and pattern repetition. Things that used to be a few vim macros is now just banging on tab.

...

An extension to disable elements during flight of an htmx request, Looks super useful for things like a create or delete button where the server would end up with an error if you double delete or double create. This eliminates an error path that the user might see under normal use of the ui.

The htmx-request class is added to htmx-target elements. You can target this css selector to create loading state throbbers.

By default the target element will the self, but you can use the typical htmx css selector to select which element will recieve the htmx-request class while the request is running.

The only way to override the name of the class is through config.

Prime concisely made sense of why htmx is so awesome compared to what has become modern reactive web dev in 2 minutes. I had never thought of it this way and it’s incredible.

One thing I have comepletely missed out on with my use of htmx is setting the disabled state while the server is working, what a genius move!

Three ways to support updating other content. Fantastic article walking through the different ways to update other parts of the screen using htmx.

In htmx there is no 2 way data binding, the dom is your state, and if you have elements derived from the same data on the screen in different places you need to think about how to keep them in sync.

sqlite-utils is primarily a cli tool for sqlite operations such as enabling full text search, and executing searches, but it also has a nice python api that is exposed and pretty straightforward to use.

from sqlite_utils import Database db = Database("database.db") db["post"].enable_fts(["title", "message", "tags]) db["post"].search("water")

This returns a generator object that you can iterate over the row objects with.

> A command-line utility for taking automated screenshots of websites

Daaaang, this is such an elegantly simple way to get web screenshots with a cli. I was literally up and running with two commands on my arch linux machine (which it warned was unsupported by playwright).

pip install shot-scraper # Now install the browser it needs: shot-scraper install shot-scraper waylonwalker.com shot-scraper https://datasette.io/ shot-scraper https://datasette.io/ -h 1280 -w 1920 shot-scraper https://datasette.io/ -h 480 -w 720 shot-scraper shot --selector '#posts' https://thoughts.waylonwalker.com/post/89

Note shot-scraper https://datasette.io/ is a full length screenshot of the entire page.

Oh and its pretty dang fast, let alone the setup time, this crushes on startup time in my attempts to use a headless browser in the past.

I’d never given this much thought, but there are so many guides that are complete guides for beginner workflows, but once you get beyond beginner there is likely no manual for what you are trying to do in programming. There is no guide that will tell you the best way to get your companies salesforce data, alongside of the ERP data and present it to the users who need to know in a way that compels them to make the right decisions. You are going to have to build this out for yourself by piecing together knowledge about each subject.

Most of the time when creating links in html you want to maintain the default behavior, as this is what users are going to expect, but sometimes your site behaves such that it does not fit, and it does something unexpected anyways. in this case you might want to make the default behavior to open the link in a new tab rather than relying on users to control click.

Use this with restraint as this can make your site feel janky and do things that do not feel natural to the web.

I went down the route of leveraging the json-enc extention in htmx, but later realized that this completely breaks browsers/users who do not wish to use javascript. While most of the web would feel quite broken with javascript disabled, I don’t want to contribute to that without good reason.

Taking a second look into this issue, rather than using json-enc, and using as_form to get form data into a model keeps the nice DX fo everything being a pydantic model, but the site still works without js. with js htmx kicks in, you get a spa like experience by loading partials onto the page, and without, you just get a full page reload.

copied from

I’ve definitely been missing out on setting up a proper jinja loader on a few projects, I need to lean on this a bit more.

class jinja2.FileSystemLoader(searchpath, encoding='utf-8', followlinks=False): ''' Load templates from a directory in the file system. '''

The path can be relative or absolute. Relative paths are relative to the current working directory.

I kept running into limits in the number of subuid and subgid’s I had on my system by default. As always thank the arch wiki guide for having the most comprehensive yet consice guide to setup podman.

What I needed to do to fix the error.

I love rich inspect. It’s one of my most often used features of rich. It gives you a great human readable insight into python object instances.

>>> from rich import inspect >>> text_file = open("foo.txt", "w") >>> inspect(text_file)

I have a pyflyby entry for it so that I can just run it ang get automatic imports. To not clash with the standard library inspect, which is quite useful on it’s own, I have aliased it to rinspect.

A feature of jinja that I just discovered is including sub templates. Here is an example from the docs.

{% include 'header.html' %} Body goes here. {% include 'footer.html' %}

And inside of my thoughts project I used it to render posts.

<ul id='posts'> {% for post in posts.__root__ %} {% include 'post_item.html' %} {% endfor %} </ul>

note that post_item.html automatically inherits the post variable.

I am trying to use htmx on a new fastapi site for my thoughts, and have been hitting this error.

Mixed Content: The page at 'https://front.mydomain.com/#/clients/1' was loaded over HTTPS, but requested an insecure resource 'http://back.mydomain/jobs/?_end=25&_order=DESC&_sort=id&_start=0&client_id=1'. This request has been blocked; the content must be served over HTTPS.

What is happening #

I have an htmx component that gets the current users name, but if they are not logged in the backend redirects to a login form.

<div hx-get='/users/me' hx-trigger='load'> get me </div>

But for some reason when the front end gets this redirect, it tries to do it through http,...

...

On void linux. Under `/etc/containers/` there is a file called `registries.conf`. It is complemented by `man 5 containers-registries.conf`. Change (for me lines 11-12) which say [registries.search] registries = [] to

[registries.search] registries = ['docker.io']

(drawn from https://www.projectatomic.io/blog/2018/05/podman-tls/)


Without the above you won’t be able to use basic podman functions. You might get errors like:

Various documentation (redhat blog entries, man podman pages) say that dockerhub is a default, but without this step it’s clearly not.

Good luck. Feel free to use the comment box below if you have a github account.

...

Here is a snippet provided by @tiangolo to store the users jwt inside of a session cookie in fatapi. This was written in feb 12, 2020 and admits that this is not a well documented part of fastapi.

It’s already in place. More or less like the rest of the security tools. And it’s compatible with the rest of the parts, integrated with OpenAPI (as possible), but probably most importantly, with dependencies.

It’s just not properly documented yet. 😞

But still, it works 🚀 e.g.

![[None]]

When setting up a new machine, vm, docker image you might be installing command line tools from places like pip. They will often put executables in your ~/.local/bin directory, but by default your shell is not looking in that directory for commands.

WARNING: The script dotenv is installed in '/home/falcon/.local/bin' which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.

To solve this you need to add that directory to your $PATH.

export PATH=$PATH:~/.local/bin

To make this change permanant add this line to your shell’s init script, which is likely something like ~/.bashrc or ~/.zshrc.

In order to turn url encoded links back into links that I would find in the database of my thoughts project I need to urldecode them when they hit the api. When anything hits the api it must urlencode the links in order for them to be sent correctly as data and not get parsed as part of the url.

Here is a snippet of how I am using urlib.parse.unquote to un-encode encoded urls so that I can fetch posts from the database.

In order to send data that includes special characters such as / in a url you need to url encode it. You have probably seen these many times in urls with things like %20 for spaces.

I’m working on a chrome extension to make quick blog posts, like thoughts or a persistent bookmark tool with comments. The backend is written in fastapi and when I check to see if I have a post for a page I need to url encode it.

curl -X 'GET' \ 'https://thoughts.waylonwalker.com/link/?link=https%3A%2F%2Fhtmx.org%2Fextensions%2Fclient-side-templates%2F' \ -H 'accept: application/json'

curl example generated from the fastapi swagger docs.

Here is how I used javascript’s encodeURIComponent to turn my chrome extension into a notification when I already have a post for the current page.

Lately in 2023 I have been leaning on lazyvim for my new setups where I am not necessarily ready to drop my full config. It’s been pretty solid, and comes with a very nice setup out of the box, the docs are pretty fantastic as well.

A nice cheat sheet for jq. jq looks so nice, but it so quickly gets overwhelming on how to select what you want. I was able to make a jq contains query.

Underground Bases with Wyatt

Playing minecraft with Wyatt today he started a server all on his own and had me join. All vanilla, only one rule, underground bases.

I spawned into the server and it was already night time. I gathered up some wood on my way down a tree, and was attacked by zombies before I could get any tools, so I ran up another tree and crafted a crafting table.

Now to follow the rules, it’s time to head underground to build my base.

...

The next version of markata will be around a full second faster at building it’s docs, that’s a 30% bump in performance at the current state. This performance will come when virtual environments are stored in the same directory as the source code.

I was looking through my profiler for some unexpected performance hits, and noticed that the docs plugin was taking nearly a full second (sometimes more), just to run glob.

| |- 1.068 glob markata/plugins/docs.py:40 | | |- 0.838 <listcomp> markata/plugins/docs.py:82 | | | `- 0.817 PathSpec.match_file pathspec/pathspec.py:165 | | | [14 frames hidden] pathspec, <built-in>, <string>

Python scandir ignores hidden directories #

I started looking for different solutions and what I found was that I was hitting pathspec with way more files than I needed to.

len(list(Path().glob("**/*.py"))) # 6444 len([Path(f) for f in glob.glob("**/*.py", recursive=True)]) # 110

After digging into the docs I found that...

...

I recently discovered elia by darrenburns, and it’s truly impressive.

A snappy, keyboard-centric terminal user interface for interacting with large language models. Chat with ChatGPT, Claude, Llama 3, Phi 3, Mistral, Gemma and more.

AUR.">paru is an aur helper that allows you to use a package manager to install packages from the aur.

The Aur is a set of community managed packages that can be installed on arch based distros.

paru just makes it easy, no clone and run makepkg. You can do everything paru can do using the built in pacman installer.

You will need to manually instal pacman from the aur in order to get started.

...

I took a break

Life comes in waves, and sometimes you need to set down some of your projects to focus on others. For the first part of 2023 I’ve really had a lot of family stuff to focus on, we also are pretty new homeowners and are still trying to get our new to us house cleaned up and modernized.

You can see in my growing list of repos that I have poked around on quite a few side projects over the past few months. This has been quite relaxng to me, mostly things that I use to learn from, but also a lot that are tools and things I use that bring me joy.

I haven’t wrote about it at all yet, but I have really been starting to lean into pydantic on all of these side projects. I have really been enjoying the type system. A good friend

...

Pydantic and singledispatch

I was reading about pydantic-singledispatch from Giddeon’s blog and found it very intersting. I’m getting ready to implement pydantic on my static site generator markata, and I think there are so uses for this idea, so I want to try it out.

Let’s set up some pydantic settings. We will need separate Models for each environment that we want to support for this to work. The whole idea is to use functools.singledispatch and type hints to provide unique execution for each environment. We might want something like a path_prefix in prod for environments like GithubPages that deploy to /<name-of-repo> while keeping the root at / in dev.

...

2 min read

If you’re into interesting projects, don’t miss out on oxen-release, created by Oxen-AI.

Lightning fast data version control system for structured and unstructured machine learning datasets. We aim to make versioning datasets as easy as versioning code.

Oxen by Oxen-AI is a game-changer in its space. Excited to see how it evolves.

Lightning fast data version control system for structured and unstructured machine learning datasets. We aim to make versioning datasets as easy as versioning code.

Check out WaylonWalker and their project lockhart.

Lockhart is an AI-powered Python library that generates elegant and efficient code, much like the charming and deceiving wizard Gilderoy Lockhart. It allows developers to effortlessly create impressive code and deceive others with their skills, just as Gilderoy Lockhart deceives others with his charm and wizardry.

Quickly and easily create new versions of your Python package with the gh release command. Get the version number, changelog, and

Releasing a new version of your Python package can be a daunting task. You need to make sure that all the necessary files are included, and that the version number is correct. But now, with the help of the gh release command, you can make the process much smoother.

The gh release command allows you to quickly and easily create a new version of your Python package. All you need to do is provide the version number, the changelog, and the distribution files. For example, if you wanted to create a new version of your package with the version number v1.2.3, you could use the following command:

gh release create v1.2.3 -F CHANGELOG.md dist/*.whl dist/*.tar.gz

This command will create a new version of your package with the specified version number, and include the changelog and the distribution files. It’s a great way to make sure that all the necessary files are included in the release, and that the version number is correct.

...

cli

Fix Arch Linux randomly rejecting passwords with one command. Try ‘faillock –user $USER’ to reset login counter and regain access. Quick solution for a smooth computing"

If you’re an Arch Linux user, you may have experienced a frustrating issue where your password is randomly not being accepted by the system. This can be a major inconvenience and can cause a lot of frustration, especially if it happens frequently.

The good news is that there is a simple fix for this issue. The following bash code can be used to fix the problem:

bash faillock --user $USER

...

pypa has done a fantastic job with pipx. Highly recommend taking a look.

Install and Run Python Applications in Isolated Environments

Minecraft Doc Day 18
A crows nest added atop the storage silo offers a high lookout.

I came across neogen from danymat, and it’s packed with great features and ideas.

A better annotation generator. Supports multiple languages and annotation conventions.

I’m really excited about mason.nvim, an amazing project by williamboman. It’s worth exploring!

Portable package manager for Neovim that runs everywhere Neovim runs. Easily install and manage LSP servers, DAP servers, linters, and formatters.

I came across mason.nvim from mason-org, and it’s packed with great features and ideas.

Portable package manager for Neovim that runs everywhere Neovim runs. Easily install and manage LSP servers, DAP servers, linters, and formatters.

Minecraft Doc Day 17
Construction of a floating base begins on Day 16.
Minecraft Doc Day 12
Farm animals gathered and penned on Day 12.
Minecraft Doc Day 12
Beet and pumpkin farm plots prepared near the main base.
Minecraft Doc Day 11
Standing on Wyatt’s freshly built dock overlooking the water.
Minecraft Doc Day 11
Wyatt joins to conquer a zombie spawner and build a dock together.
Minecraft Doc Day 10
Secret storage area built as part of a tiny base challenge on Day 9.
Minecraft Doc Day 9
Early storage silo construction begins with terraforming and chest placement.
Minecraft Doc Day 8
After leaving the world paused, a surprise death screen leads to a survival reset.
Minecraft Doc Day 7
A newly constructed animal pen expands the farm.
Minecraft Doc Day 6
End of Day 5 shows the finished perimeter fence and first animal pen.
Minecraft Doc Day 5
Start of Day 5 with work on the perimeter fence and gathering resources.
Minecraft Doc Day 4
Outer perimeter fence under construction around the base during Day 4.
Minecraft Doc Day 3
The roofline of the base is complete and the tree farm is cleared for fresh oak and acacia saplings.
Minecraft Doc Day 2
Sun setting over the fresh house frame as Day 2 brings sand collection for windows.
Minecraft Doc Day 1
The wooden frame of the new house begins to take shape on Day 1.

Give github actions the -e flag in the shebang #! so they fail on any one command failure. Otherwise each line will set the exit status, but only the last one will be passed to ci.

#!/bin/bash -e

What is -e #

The -e flag to the bash command allows your script to exit immediately if any command within the script returns a non-zero exit status. This can be useful for ensuring that your script exits with an error if any of the commands it runs fail, which can help you identify and debug issues in your script. For example, if you have a script that runs several commands and one of those commands fails, the script will continue running without the -e flag, but will exit immediately if the -e flag is present. This can make it easier to troubleshoot your script and ensure that it runs correctly.

In windows the solution is not quite as simple. You can define a function in a Windows batch script that wraps an if statement to check the exit status of a command and handle any errors that may have occurred. Here is an example of how you might define a function called “check_error”...

...

Minecraft Doc Day 0
Acacia biome spawn with trees and resources in a new hardcore world.

minecraft documentary

This is my first time journaling a Minecraft hardcore world, my son Wyatt is also documenting his journey in a survival world on wyattbubbylee.com.

init

I logged into a brand new hardcore world. I was welcomed by a great Acacia biome spawn full of resources. I quickly cut my first tree, crafted an axe and set out to find my first sheep. I was able to find enough sheep for a bed, several cows and pigs.

...

I recently setup some vm’s on my main machine and got sick of signing in with passwords.

Moving panes between tmux sessions is something that makes tmux a very flexible and powerful tool. I don’t need this feature very often, but it comes in clutch when you need it.

Using choose-window I was able to come up with a way to select any pane withing any other session and join it into my current session.

# Choose a pane to join in horizontally bind f choose-window -Z 'join-pane -h -s "%%"'

Push/Pull from scratch #

I’ve long had this one in my tmux config, I always have a “scratch” session that I’m running, I often use for looking at things like k9s accross repos within a popup.

This use case puts a pane into the scratch session, then pulls it back out. I will use this to move a pane between sessions in the rare cases I need to do this.

I just shared some ssh keys with myself and ran into this error telling me that I did not set the correct permissions on my key.

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0750 for '/home/waylon/.ssh/id_*******' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. Load key "/home/waylon/.ssh/id_*******": bad Permissions repo: Permission denied (publickey,gssapi-keyex,gssapi-with-mic). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.

I changed them with the following commands.

Check out nvim by Allaman. It’s a well-crafted project with great potential.

Minimal, blazingly fast, and pure Lua based Neovim configuration for my work as DevOps/Cloud Engineer with batteries included for Python, Golang, and, of course, YAML

With the latest release of version of nvim 0.8.0 we get access to a new winbar feature. One thing I have long wanted somewhere in my nvim is navigation for pairing partners or anyone watching can keep track of where I am. As the driver it’s easy to keep track of the file/function you are in. But when you make big jumps in a few keystrokes it can be quite disorienting to anyone watching, and having this feedback to look at is very helpful.

nvim exposes the winbar api in lua, and you can send any text to the winbar as follows.

vim.o.winbar = "here"

You can try it for yourself right from the nvim command line.

:lua vim.o.winbar = "here"

Now you will notice one line above your file with the word here at the very beginning.

...

vim

I really like having global cli command installed with pipx. Since textual 0.2.x (the css release) is out I want to be able to pop into textual devtools easily from anywhere.

You can pipx install textual.

pipx install textual

But if you try to run any textual cli commands you will run into a ModuleNotFoundError, because you need to install the optional dev dependencies.

Traceback (most recent call last): File "/home/u_walkews/.local/bin/textual", line 5, in <module> from textual.cli.cli import run File "/home/u_walkews/.local/pipx/venvs/textual/lib/python3.10/site-packages/textual/cli/cli.py", line 4, in <module> import click ModuleNotFoundError: No module named 'click'

Pipx Inject #

In order to install optional dependencies with pipx you need to first install the library, then inject in the optional dependencies using the square bracket syntax.

I am working through the textual tutorial, and I want to put it in a proper cli that I can pip install and run the command without textual run --dev app.py. This is a fine pattern, but I also want this to work when I don’t have a file to run.

I set up a new project running hatch new, and added the following entrypoint, giving me a tutorial cli command to run.

... [project.scripts] tutorial = 'textual_tutorial.tui:tui'

https://waylonwalker.com/hatch-new-cli/

If you are using setup.py, you can set up entrypoints in the setup command.

...

For far too long I have had to fidget with v4l2oloopback after reboot. I’ve had this happen on ubuntu 18.04, 22.04, and arch.

After a reboot the start virtual camera button won’t work, It appears and is clickable, but never turns on. Until I run this command.

sudo modprobe v4l2loopback video_nr=10 card_label="OBS Video Source" exclusive_caps=1

“cell shaded, long, full body, shot of a cybernetic blue soldier with glowing pink eyes looking into a selfie camera with ring light, llustration, post grunge, 4 k, warm colors, cinematic dramatic atmosphere, sharp focus, pink glowing volumetric lighting, concept art by josan gonzales and wlop, by james jean, Victo ngai, David Rubín, Mike Mignola, Laurie Greasley, highly detailed, sharp focus,alien,Trending on Artstation, HQ, deviantart, art by artgem” -s50 -W832 -H416 -C12.0 -Ak_lms -S373882614

I ran into an issue where I was unable to ask localstack for its status. I would run the command and it would tell me that it didn’t have permission to read files from my own home directory. Let’s fix it

I would run this to ask for the status.

localstack status

And get this error

PermissionError: [Errno 13] Permission denied: '/home/waylon/.cache/localstack/image_metadata'

What happened #

It dawned on me that the first time I ran localstack was straight docker, not the python cli. When docker runs it typically runs as root unless the Dockerfile sets up a user and group for it.

...

aws

In my adventure to learn django, I want to be able to setup REST api’s to feed into dynamic front end sites. Potentially sites running react under the hood.

To get started lets open up a todo app that I created with django-admin startproject todo.

pip install djangorestframework

Install APP #

Now we need to declare rest_framwork as an INSTALLED_APP.

INSTALLED_APPS = [ ... "rest_framework", ... ]

create the api app #

Next I will create all the files that I need to get the api running.

...

Markata now uses hatch as its build backend, and version bumping tool. setup.py, and setup.cfg are completely gone.

“An astronaut working in a lab, there is a series of eggs ready to hatch baby snakes on the table, experiments running, beakers, test tubes, cyberpunk trending on artstation, neon lighting, volumetric lighting, pink lighting” -s50 -W800 -H450 -C7.5 -Ak_lms -S4048189038

Markata 0.5.0 is now out, and it’s huge. Even though it’s the backend of this blog I don’t actually have that many posts directly about it. I’ve used it a bit for blog fuel in generic ways, like talking about pluggy and diskcache, but very little have I...

...

My next step into django made me realize that I do not have access to the admin panel, turns out that I need to create a cuper user first.

Right away when trying to setup the superuser I ran into this issue

django.db.utils.OperationalError: no such table: auth_user

Back to the tutorial tells me that I need to run migrations to setup some tables for the INSTALLED_APPS, django.contrib.admin being one of them.

python manage.py migrate

trydjango-migration.png

yes I am still running remote on from my chromebook.

...

I am continuing my journey into django, but today I am not at my workstation. I am ssh’d in remotely from a chromebook. I am fully outside of my network, so I can’t access it by localhost, or it’s ip. I do have cloudflared tunnel installed and dns setup to a localhost.waylonwalker.com.

I found this in settings.py and yolo, it worked first try. I am in from my remote location, and even have auth taken care of thanks to cloudflare. I am really hoping to learn how to setup my own auth with django as this is one of the things that I could really use in my toolbelt.

I have no experience in django, and in my exploration to become a better python developer I am dipping my toe into one of the most polished and widely used web frameworks Django to so that I can better understand it and become a better python developer.

If you found this at all helpful make sure you check out the django tutorial

The first thing I need to do is render out a template to start the project. For this I need the django-admin cli. To get this I am going the route of pipx it will be installed globally on my system in it’s own virtual environment that I don’t have to manage. This will be useful only for using startproject as far as I know.

pipx install django django-admin startproject try_django cd try_django

...

While updating my site to use Markata’s new configurable head I ran into some escaping issues. Things like single quotes would cause jinja to fail as it was closing quotes that it shouldnt have.

Jinja comes with a handy utility for escaping strings. I definitly tried to over-complicate this before realizing. You can just pipe your variables into e to escape them. This has worked pretty flawless at solving some jinja issues for me.

<p> {{ title|e }} </p>

Creating meta tags in Markata #

The issue I ran into was when trying to setup meta tags with the new configurable head, some of my titles have single quotes in them. This is what I put in my markata.toml to create some meta tags.

[[markata.head.meta]] name = "og:title" content = "{{ title }}"

Using my article titles like this ended up causing this syntax error when not escaped.

...

When I am developing python code I often have a repl open alongside of it running snippets ofcode as I go. Ipython is my repl of choice, and I hace tricked it out the best I can and I really like it. The problem I recently discovered is that I have way overcomplicated it.

So in the past the way I have setup a few extensions for myself is to add something like this to my ~/.ipython/profile_default/startup directory. It sets up some things like rich highlighting or in this example automatic imports. I even went as far as installing some of these in the case I didn’t have them installed.

import subprocess from IPython import get_ipython from IPython.core.error import UsageError ipython = get_ipython() try: ipython.run_line_magic("load_ext pyflyby", "inline") except UsageError: print("installing pyflyby") subprocess.Popen( ["pip", "install", "pyflyby"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, ).wait() ipython.run_line_magic("load_ext pyflyby", "inline") print("installing isort") subprocess.Popen( ["pip", "install", "isort"], stdout=subprocess.DEVNULL,...

...

Just starred markata-todoui by WaylonWalker. It’s an exciting project with a lot to offer.

A todo plugin for markata. It is a tui (text user interface) that runs in the terminal using textual. It gives me a trello-board feel from the terminal. I can create, update, delete, move, and fully manage my todo items from the terminal with it.

Astronauts stunting some stylish color explosion

A long needed feature of markata has been the ability to really configure out templates with configuration rather. It’s been long that you needed that if you really want to change the style, meta tags, or anything in the head you needed to write a plugin or eject out of the template and use your own.

Now you can add some extra style to your site with the existing built-in template.

[[markata.head]] text = """ <style> img { width: 100%; height: auto; } ul { display: flex; flex-wrap: wrap; } </style> """

You can have more than one Head #

Each text entry in markata.head just gets appended raw into the head.

...

Looking for inspiration? markata-slides by WaylonWalker.

A slides plugin for markata that allows you to create presentations in markdown from the comfort of your favorite editor. Each new h2 tag (## in markdown) becomes a new slide. This plugin leverages the built-in feeds plugin for navigation, and adds in some hotkeys (j/k) to go the the previous and next slides.

I’m really getting into using hatch as my go to build system, and I am really liking it so far. I am slowly finding new things that just work really well. hatch new is one of those things that I didn’t realize I needed until I had it.

creating new versions created by myself with stable diffusion

❯ pipx run hatch new --help Usage: hatch new [OPTIONS] [NAME] [LOCATION] Create or initialize a project. Options: -i, --interactive Interactively choose details about the project --cli Give the project a command line interface --init Initialize an existing project -h, --help Show this message and exit.

Note! I am running all of these commands with pipx. I like to use pipx for all of my system level cli applications. To emphasis this point in the article I am going to use pipx run hatch, but you can pipx install hatch then just run hatch from there.

Running hatch new -i will ask let you interactivly choose details about the project, such as the project’s name.

...

Hatch has an amazing versioning cli for python packages that just works. It takes very little config to get going and you can start bumping versions without worry.

Hatch version cover image

creating new versions created by myself with stable diffusion

For trying out the hatch version cli let’s make a simple project with the terrible name pkg.

...

Markata is a great python framework that allows you to go from markdown to a full website very quickly. You can get up and running with nothing more than Markdown. It is also built on a full plugin architecture, so if there is extra functionality that you want to add, you can create a plugin to make it behave like you want.

Full transparancy… I built markata.

The talk is live on YouTube. Make sure you check out the other videos from the conference. There were quite a few quality talks that deserve a watch as well.

https://youtu.be/Wq9YBamSgs0

Packages I Maintain

I open sourced the static site framework that I use to build my-blog among other side projects. It’s a plugins all the way down static site generator, that makes me happy to use.

{% gh_repo_list_topic “waylonwalker”, “markata” %}

my-blog is built on a number of small repos. I set it up this way so that creating content is fast and easy to do. I don’t have to worry about carrying around large images with my lightweight text files just to make some posts.

...

I spoke at python webconf in March 2022 about how I deploy this blog on a continuous basis.

Building this blog has brought me a lot of benefits. I have a set of custom curated notes to help describe a problem and how to solve it to me. At theis point it’s not uncommon to google an Issue I am having and finding my own blog with exactly the solution I need at the top.

I also bump into people from time to time that recognize me from the blog, its a nice conversation starter, and street cred.

The talk recently released on Youtube, you can watch it without having a ticket to the conference for free. There were a bunch of other talks that you should check out too!

...

I got all the pypi packages that I own behind 2 factor authentication. 💪

Recently this really made it’s rounds in the python news since pypi was requiring critical package maintainers to have 2FA on and even offering them hardware tokens to help them turn this on.

I feel like this caused a bit of confusion as turning on 2FA does not mean that you need to do anything different to deploy a package, and it DOES NOT require a hardware token. You can continue using your favorite 2FA app.

You might wonder what this means for my projects. It means that to edit any sensitive content such as pull a new api token, add/remove maintainers, or deleting a release I need to use a TOPT (time based one time password) application such as Google Authenticator, Microsoft Authenticator, Authy, or FreeOTP.

...

I was on Talk Python

After years of listening to talkpython.fm I had the honor to be part of episode-337 to talk about Kedro for maintainable data science.

I was quite nervous to talk on a show that I helped shape my career in such a profound way. I started my journey towards software engineering near Michaels first few episodes. His discussions with such great developers over the years has made an huge impact on my skill. It has always given me great advice and topics to go deeper on.

...

1 min read

I just love how some features of vim are so discoverable and memorable once you really start to grasp it. Sorting and uniqing your files or ranges is one of those examples for me.

" sort the file :sort " sort the file only keeping unique lines :sort u " sort a range :'<,'> sort " sort a range only keeping unique lines :'<,'> sort u

I recently used this to dedupe my autogenerated links section for rich-syntax-range-style. More often I am using it to sort and uniqify objects like arrays and lists.

Here is what the markdown looks like.

* [py-tree-sitter](https://github.com/tree-sitter/py-tree-sitter) * [rich](https://github.com/Textualize/rich) * [@textualizeio](https://twitter.com/textualizeio) * [rich](https://github.com/Textualize/rich) * [another post](https://waylonwalker.com/designing-kedro-router) *...

How to vimgrep over hidden files.

I needed to delete all build pipeline steps that were named upload docs. I currently have about 60 projects running from the same template all running very similar builds. In the past I’ve scripted out migrations for large changes like this, they involved writing a python script that would load the yaml file into a dictionary, find the corresponding steps make the change and write it back out.

Today’s job was much simplar, just delete the step, were all steps are surrounded by newlines. My first thought was to just open all files in vim and run dap. I just needed to get these files:positions into my quickfix. My issue is that all the builds reside within hidden directories by convention.

variability

...

vim

image from Dall-e

a sprinter edging out his opponent by Dall-e

It’s about time to release Markata 0.3.0. I’ve had 8 pre-releases since the last release, but more importantly it has about 3 months of updates. Many of which are just cleaning up bad practices that were showing up as hot spots on my pyinstrument reports

Markata started off partly as a python developer frustrated with using nodejs for everything, and a desire to learn how to make frameworks in pluggy. Little did I know how flexible pluggy would make it. It started out just as my blog...

...

People exceptionally talented in the Deliberative theme are best described by the serious care they take in making decisions or choices. They anticipate obstacles.

I am risk-adverse. I want everything well thought out and calculated before I make any sort of change. I have never gambled in my life and just the thought of it makes me anxious.

I can use this as a strength to plan out potential issues and prevent them. I do this quite often with my role in infrastructure.

I need to make sure that I use deadlines to keep this as a strength and not hinderence.

...

A common meta thing that I need in python is to find the version of a package. Most of the time I reach for package_name.__version__, but that does not always work.

In searching the internet for an answer nearly every one of them pointed me to __version__. This works for most projects, but is simply a convention, its not required. Not all projects implement a __version__, but most do. I’ve never seen it lie to me, but there is nothing stopping someone from shipping mismatched versions.

I appreciate it

While its not required its super handy and easy for anyone to remember off the top of their head. It makes it easy to start debugging differences between what you have vs what you see somewhere else. You can do this by dropping a __version__ variable inside your __init__.py file.

...

The one reason I switched to arch

The community, that’s it, end of post, roll the credits.

I am a tinkerer, I am not going to run a stock desktop manager, mostly becuase that’s just not how my brain works. I need to tweak everything to fit my needs. Grantid I have not spent much time in many full fledged linux desktop environments. They are far more customizable than windows ever will be, I absolutely love that about them. Inevitibly I end up in a situation where I hit a wall, it just won’t do what I want it to do, or my lack of understanding what came wtih it holds me back.

I love minimal installs. I love just building up my system from the bottom up with things that I like, I understand, and that I can script.

...

Recently I added two new bash/zsh aliases to make my git experience just a tad better.

Most of our work repos were recently migrated to new remote urls, we scriped out the update to all of the repos, but I was left with a tracking error for all of my open branches. To easily resolve this I just made an alias so that I can just run trackme anytime I see this error.

There is no tracking information for the current branch. Please specify which branch you want to merge with. See git-pull(1) for details git pull <remote> <branch> If you wish to set tracking information for this branch you can do so with: git branch --set-upstream develop origin/<branch>

getting the branch #

The following command will always return the currently checked out branch name.

git symbolic-ref --short HEAD

Injecting this into the suggested...

...

git

So many terminal applications bind q to exit, even the python debugger, its muscle memory for me. But to exit ipython I have to type out exit<ENTER>. This is fine, but since q is muscle memory for me I get this error a few times per day.

╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮ │ <ipython-input-1-2b66fd261ee5>:1 in <module> │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯ NameError: name 'q' is not defined

After digging way too deep into how IPython implements its ExitAutoCall I realized there was a very simple solution here. IPython automatically imports all the scripts you put in your profile directory, all I needed was to create...

...

It’s no secret that I love automation, and lately my templating framework of choice has been copier. One hiccup I recently ran into was having spaces in my templated directory names. This makes it harder to run commands against as you need to escape them, and if they end up in a url you end up with ugly %20 all over.

Yes the solution comes from a competing templating framework.

I install copier with pipx, so I need to inject cookiecutter in to my copier environment to use the slugify filter.

pipx inject copier cookiecutter

If you are using a normal virtual environment you can just pip install it.

...

Textual has devtools in the upcoming css branch, and its pretty awesome!

Textual is still very early and not really ready for prime time, but it’s quite amazing how easy some things such as creating keybindings is. The docs are coming, but missing right now so if you want to use textual be ready for reading source code and examples.

As @willmcgugan shows in this tweet it’s pretty easy to setup, it requires having two terminals open, or using tmux, and currently you have to use the css branch.

https://twitter.com/willmcgugan/status/1531294412696956930

...

Using Different versions of python with pipx | pyenv

I love using pipx for automatic virtual environment management of my globally installed python cli applications, but sometimes the application is not compatible with your globally installed pipx

This one took me a minute to figure out at first, please let me know if there is a better way. I am pretty certain that this is not the ideal way, but it works.

My first technique was to make a package that printed out sys.version.

...

2 min read

curl has done a fantastic job with curl. Highly recommend taking a look.

A command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features

How I Quickly Capture Screenshots directly into My Blog

When I am creating blog posts it’s often helpful to add screenshots to them to illustrate what I see on my screen. Sometimes I lack good screenshots in my posts because it just takes more effort than I have in the moment, and I prioritize making content over making perfect content.

When I have something to take a screenshot of, I need to take the shot, optimize the image, often convert it to a better format, publish it, and create a the img tag in my blog.

I created this tool for myself in python because that is what I am most familiar with, but realistically most of what I am calling are shell scripts that I could do in just about any language.

...

3 min read

Copier < 6.0.0b0 considered dangerous

Copier is a fantastic templating library written in python, but older versions have a dangerous bug if you are using it inside of existing directories.

As of May 15, 2022, the stable release of copier now includes these changes, if you have not already make sure you update.

I Use copier several times per day and get fantastic benefit from this project, this post is not intended to crap all over copier in any way, but is rather a PSA for other users who do use copier like I do so that they know the dangers of using copier inside an existing directory.

...

I came across cli from httpie, and it’s packed with great features and ideas.

🥧 HTTPie CLI — modern, user-friendly command-line HTTP client for the API era. JSON support, colors, sessions, downloads, plugins & more.

PyOhio CFP's

Here are some CFP’s that I used for PyOhio 2022.

https://pretalx.com/pyohio-2022/cfp

Markata is a plugins all the way down static site generator, that covers all the things you need to go from markdown to a blog site out of the box. Since it’s plugins all the way down you can also rip out all the default plugins, and do something completely different with the lifecycle.

...

I like WaylonWalker’s project markata.

A plugins all the way down static site generator written in python. Plugins all the way down means that you can completely change the behavior of how it works by swapping plugins, installing new ones, or creating your own all in python.

functools.total_ordering makes adding all of six of the rich comparison operators to your custom classes much easier, and more likely that you remember all of them.

From the Docs: The class must define one of __lt__(), __le__(), __gt__(), or __ge__ In addition, the class should supply an __eq__() method.

one of these

and required to have this one

...

Check out ipython and their project ipython.

Official repository for IPython itself. Other repos in the IPython organization contain things like the website, documentation builds, etc.

If you’re into interesting projects, don’t miss out on asdf, created by asdf-vm.

Extendable version manager with support for Ruby, Node.js, Elixir, Erlang & more

Smoother Python with automatic imports | pyflyby

This is not a flaky works half the time kind of plugin, it’s a seriously smooth editing experience. I’ve just started using pyflyby, and it is solid so far. I have automatic imports on every save of a python file in neovim, and automatic imports on every command in ipython.

I can’t tell you how pumped I am for this, and how good its felt to use over the past few weeks. It’s glorious.

Listen to me rant on how great pyflyby is

...

Open files FAST from zsh | or bash if thats your thing

https://youtu.be/PQw_is7rQSw

I am often in a set of tmux splits flying back and forth, accidentally close my editor, so when I come back to that split and hit my keybinds to edit files I enter them into zsh rather than into nvim like I intended. Today I am going to sand off that rough edge and get as similar behavior to nvim as I can with a couple of aliases.

Make sure you check out the YouTube video to see all of my improvements.

...

How linux users install a text editor

In honor of the neovim 0.6.0 release, I decided to do a funny skit installing neovim, and fix up my install script in the process as part of my challenge to fix up my dotfiles. I ran into one snag where I was not updating the repo that I cloned. I moved it to the directory I now keep third-party git repos and set it to update with ansible.

https://youtu.be/64oKLphhBuo

The thing that took me the longest to realize was…. I had a path issue pointing me to an old install of the appimage over the fresh build, fixed that up and now we are on 0.7.0 nightly.

...

30 days dotfile ricing

https://youtu.be/Jq1Y48F_rOU

I am challenging myself to 30 days of dotfile ricing. I have been on linux desktop for a few months now and have a pretty good workflow going, I have the coarse edits done to my workflow, but it has some rough edges that need sanded down. It’s time to squash some of those little annoyances that still exist in my setup.

This is primarily going to be focused on productivity, but may have a few things to just look better. This will comprise heavily of aliases, zsh, and nvim config.

...

Waylon Walker

Husband, dad of two, and hobbyist builder of things on the internet.

When I’m not wrangling data pipeline platforms or building web platforms, you’ll find me gaming with my kids, making art, or skating around the neighborhood. Reliving my mechanical engineering days with my 3d printer. Winding down at the end of the day binge-watching Big Bang Theory with my wife.

I’m a Senior Software Engineer who specializes in data pipelines and Python-based web platforms. I help teams turn messy data into reliable systems that actually work.

...

Just Ask Ipython for help

We can’t all remember every single function signature out there, it’s just not possible. If you want to stay productive while coding without the temptation to hit YouTube or Twitter. Use the built in help. Here are 5 ways to get help without leaving your terminal.

https://youtu.be/TZrRAP-9UMk

In any python repl you can access the docstring of a function by calling for help.

...

2 min read

Hacktoberfest 2021?

Are you participating in Hacktoberfest 2021?

I got my start with open source with Hacktoberfest 2018. I remember being so nervous for those first pr’s. I have continued to participate every year, and it feels good to give back.

Something that it really did for me was to lower the hurdle to contribute regularly. I am not a huge contributor to open source. I am not necessarily a regular maintainer of any large project, but I do often raise issues when I see things as a user that would make things easier or more clear.

...

2 min read

I made a neovim plugin

I’ve slowly adding more and more lua functions into my neovim configuration, and recently I noticed a pattern for a class of functions that reach out to run shell commands that can be abstracted away.

https://youtu.be/8m5ipBuopPU

Check out the project readme for the most up to date details on the plugin itself.

...

kedro Virtual Environment

Avoid serious version conflict issues, and use a virtual environment anytime you are running python, here are three ways you can setup a kedro virtual environment.

https://youtu.be/ZSxc5VVCBhM

I prefer to use conda as my virtual environment manager of choice as it give me both the interpreter and the packages I install. I don’t have to rely on the system version of python or another tool to maintain python versions at all, I get everything in one tool.

...

Kedro Install

Kedro comes with an install command to install and manage all of your projects dependencies.

https://youtu.be/IWimEs-hHQg

You must start by having your kedro project either cloned down from an existing project or created from kedro new. Then activate your environment.

...

Kedro Git Init

Immediately after kedro new, before you start running kedro install or your first line of code the first thing you should always do after getting a new kedro template created is to git init.

https://youtu.be/IGba3ytf_6U

Its as simple as these three commands to get started.

...

Kedro New

https://youtu.be/uqiv5LAiJe0

Kedro new is simply a wrapper around the cookiecutter templating library. The kedro team maintains a ready made template that has everything you need for a kedro project. They also maintain a few kedro starters, which are very similar to the base template.

What is Kedro

...

What is Kedro

Kedro is an unopinionated Data Engineering framework that comes with a somewhat opinionated template. It gives the user a way to build pipelines that automatically take care of io through the use of abstract DataSets that the user specifies through Catalog entries. These Catalog entries are loaded, ran through a function, and saved by Nodes. The order that these Nodes are executed are determined by the Pipeline, which is a DAG. It’s the runner’s job to manage the execution of the Nodes.

https://youtu.be/Wf4rnFsaFFU

...

How I Kedro

https://youtu.be/bw5_FWDVRpU

I recently switched over to using Ubuntu, it works well pretty much out of the box for me. I am using gnome with a dark theme.

I am still using the built in default gnome terminal, it just works. It does all the things that I need it to do. It supports transparency renders my fonts and allows me to highlight things well.

...

3 min read

tmux show-messages

https://youtu.be/LLk94fKpGg4

As we push the limits of tmux further and further you are bound to end up in a situation where you are mashing down a hotkey and it’s just not doing what you want it to do, and you have no idea why.

show-messages is a tmux command that can be used to show what tmux is actually doing behind the scenes. This might highlight any hot key conflicts you might have in your ~/.tmux.conf.

...

1 min read

tmux ta

https://youtu.be/nT0FA1RNZEs

Now your creating, jumping, and killing sessions like a boss. You are slicing through projects with ease, let me show you one more thing that can be the cream on top of this silky smooth setup we have been working towards.

This script is simply my fork of Chris Toomey’s tat script straight out of his course. It helps us create or jump to project specific sessions with ease.

...

2 min read

tmux display-message

https://youtu.be/utfLA6L8o5s

You’ve got some long running tasks, and you’re trying to stay productive and knock tasks off that board, but you keep finding that your processes finish and you stay on other tasks for longer than you should. You were in the flow and just did not check back in on it. With display-message you can send yourself a notification when that long running task is complete.

Here is a snippet of display-message from the tmux man page. I rarely need to do anything other than just display message, but there are other flags for it.

...

1 min read

killing tmux

https://youtu.be/QWPyYx54JbE

Now it’s time to switch gears, we are onto a different part of our day and there are just too many sessions running and we need to clean up shop.

One viable option is to nuke the whole dang thing. I actually do this more than you might think.

...

2 min read

tmux has-session

https://youtu.be/XucVVgGmesM

I see you there, trying to script out your tmux layouts. Tryig to get each project setup just perfect with a script, but you keep stumbling over yourself with duplicate session error messages

The has-session tmux command is a handy tool to prevent this duplicate session error message when scripting your tmux layouts.

...

1 min read

tmux list-keys

https://youtu.be/Y1MYmL8ZolE

Tmux list keys can be a useful tool to help remind you of what kebindings you have setup. You can search for them and scroll just like in tmux copy-mode.

You can call list-keys from the command line but the interface is not very usable by itself. It might be nice to mix with grep or a pager in some circumstances.

...

1 min read

tmux status-bar

https://youtu.be/mvgM8UH11_U

The tmux status bar can be a handy tool to remind yourself where you are within tmux. It can also include a bunch of system information like battery status, cpu, mem, whatever you can get from the command line. Honestly I like to keep it minimal, and actually keep it turned off most of the time. I find that it helps a little bit for others to follow along if I keep it on in certain circumstances.

You can set a hotkey to show or hide the status bar.

...

2 min read

tmux source-file

https://youtu.be/dDq0depPrTs

So you have been tricking out that .tmux.conf, you’re looking for a silky smooth workflow that lets you fly through tmux with super speed, but every time you tweak out that .tmux.conf you have to restart your whole session. Not amymore,

Let’s add this to the bottom of our tmux.conf so that you can see everytime it gets sourced.

...

1 min read

tmux fzf session jumper

https://youtu.be/DkJ9rb85LC0

Quickly getting between tmux splits is critical skill for productivity. You can get by with next or prev session for awhile, but if you have more than about three session you need something a bit more targeted.

I have used this fzf one keybinding for quite awhile, honestly I did not make it up, and cannot remember where it came from. It will open up a session picker in a new full screen window.

...

1 min read

tmux next/prev session

https://youtu.be/8kZnjHPYnKU

Now that we are splitting up work into their own sessions, lets talk about how to navigate between them without the command line. Navigating sessions is what kept me using a too many splits and windows workflow for far too long. It was rough, I was always tripping over panes and windows until I got too frustrated and just ran tmux kill-server to start on a new blank slate.

bind -n M-P switch-client -p bind -n M-N switch-client -n

...

1 min read

tmux start application

https://youtu.be/c-a2Bnv_NJ0

Scripting tmux to open up specific applications can be intimidating your first time. It can be tricky to get it to start in the right directory. If you are trying to assign applictaions to a keybinding it can be easy to mess up and have weird things happen every time your ~/.tmux.conf gets sourced.

I used this one for a number of years to take a quick peek into my systems performance while a memory intensive task was running.

...

2 min read

tmux rename session

https://youtu.be/WRLRiQDjVIA

So you have been working on your tmux workflow, you’ve dropped a too many window workflow for scoping work that belongs together into separate sessions, but you cannot remember what session your work is in. If your diligent you have named your window when you created it, but sometimes its intent has changed or your were just plain too lazy at the time for the extra characters needed to name it. Don’t worry we can still give that session a descriptive name.

Let’s rename some sessions in the terminal.

...

1 min read

tmux targeted session

https://youtu.be/5KE7Il7SOEk

This is something that I made up but use every single day, this is what keeps much of what is on my blog or my teams private work wiki going. I have a few very important directories that I have assigned directly to a hotkey for fast session switching.

bind -n M-i new-session -A -s waylonwalker_com "cd ~/git/waylonwalker.com/ && nvim" bind i popup -E -h 95% -w 95% -x 100% "tmux new-session -A -s waylonwalker_com 'cd ~/git/waylonwalker.com/ && nvim'" bind -n M-I popup -E "tmux new-session -A -s waylonwalker_com 'cd ~/git/waylonwalker.com/ && nvim'"

...

tmux new-session

https://youtu.be/LbQNdCAUogE

This one starts a new chapter in our series that is going to open up a whole new set of workflow productivity options, understanding how the new-session command is a critical command in our adventure into tmux glory. This is going to open the door for some seriously game changing hotkeys and scripting.

# create a new session tmux new-session # create a new session detached tmux new-session -d # create a new session and name it tmux new-session -s me # create a new named session and attach to it if one exists tmux new-session -As me

1 min read

tmux detach

https://youtu.be/A1qx3tNKDdA

tmux detach is a handy tmux command that will quit your current session while keeping it running. The full name of the comamnd is detach-client, detach is a shorthand.

default keybinding

...

tmux attach

https://youtu.be/JQ0yDCVu44E

attach is one of the most useful features of tmux. If you have no interest in tmux for pane and window management, you should use tmux for this. It can be a life saver if you ever get disconnected from the host machine or accidently close your terminal you can connect right back into the session you were just in using attach.

tmux attach

this command will simply attach back to tmux if you are ever disconnected

...

tmux command line

https://youtu.be/SNu-4IrkjAs

So far we have covered a lot of tmux commands and how they map to keybindings but these same commands can be executed at the command line.

Let’s make a popup that displays our git status for 5s or until we close it manually. We can run the following command at the command line, in a split.

...

tmux copy-mode

https://youtu.be/-ypY_-VmBKk

tmux copy-mode is a tmux mode that lets you scroll, search, copy, and jump your way through a pane. There are a ton of keybindings for copy-mode, the main ones you will need to know are / for searching down ? for searching up, n for next item, space for starting a selection, and enter to copy the selection. Arrow keys will be used for navigation unless you have specified vi mode, then it will be hjkl.

Default keybinding to get into copy mode is prefix+[.

...

tmux join-pane

https://youtu.be/Vm5rRtcVXLw

Join-pane allows you to join panes that you have broken away from your window, or created in a different window to the window you want it in. As far as I know there is not a default keybinding for it.

Before you can join a pane you must first have a pane marked to join. Once you mark a pane, go back to the window you want to join it to and join-pane.

...

tmux break-pane

https://youtu.be/ICL609F2xnc

Break-pane is a handy tmux command when your layout gets too cramped and you want to just move a split into its own window. Calling break-pane does exactly that, it creates a new-window for you and moves your currently selected split into that window

Default key binding for break-pane

...

tmux zoom

https://youtu.be/Rn6mOarCQ-Y

Zooming into the current split in tmux is a valuable tool to give yourself some screen real estate. These days I am almost always presenting, streaming, or pairing up with a co-worker over a video call. Since I am always sharing my screen I am generally zoomed in to a level that is just a bit uncomfortable, so anytime I make a split it is really uncomfortable, being able to zoom into the split I am focused on is a big help, and also help anyone watching follow where I am currently working.

Default key bindings for zooming the current split

...

tmux new-window

https://youtu.be/YRPZBv-iYyE

New window as it sounds makes new windows in tmux. Windows are kind of like tabs. They are another screen within your sessions that you can name and make new panes in.

Default key bindings for creating and navigating windows in tmux.

...

tmux select-layout

https://youtu.be/F0mHnwTrNNc

When you get many splits going in tmux sometimes its time for a new layout. There are four layout strategies that I use, main-vertical, main-horizontal, even-vertical, even-horizontal. Almost always I am useing the main ones with mod plus a or mod plus shift a keybindings.

# Select Layouts #――――――――――――――――― bind -n M-a select-layout main-vertical bind -n M-A select-layout main-horizontal bind -n M-E select-layout even-vertical bind -n M-V select-layout even-horizontal

1 min read

tmux resize-panes

https://youtu.be/hpFYE2LU7xc

Resizing panes in tmux can be quite difficult in default tmux, I use a set of keybingings to help resize panes in the rare occasions that I do need just a bit more space. I set the keybinding to the same as my split navigation bindings but shifted. They are very vim like (h,j,k,l).

# resize panes #――――――――――――――――――――――――――――― bind -n M-H resize-pane -L 2 bind -n M-L resize-pane -R 2 bind -n M-K resize-pane -U 2 bind -n M-J resize-pane -D 2

Most often when I need to resize panes I just grab the edge of the pane with my mouse. Yes the mouse, its not that often that I actually need to change the size of a pane.

...

tmux choose-tree

https://youtu.be/79Y-kqAiMpw

Choose tree is a powerful tmux utility that provides a graphical interface to preview all sessions, windows, and panes, move between them kill them, move them and much more.

The default keybinding

...

tmux prefix

https://youtu.be/BMkpbfhbkKM

The prefix key is an essential part of tmux, by default all of tmux’s key-bindings sit behind a prefix. This prefix is very similar to vim’s leader key. It is common for folks to change the default C-b (control b) to C-a or if they are a vim user something to match their vim leader key.

set -g prefix C-Space bind Space send-prefix

A few of the essential default key-bindings.

...

tmux splitting panes

https://youtu.be/kzgyiHap1nQ

splitting panes is a core feature of tmux. It allows us to split the terminal vertically or horizontally into new panes.

bind -n M-s split-window -c '#{pane_current_path}' bind -n M-v split-window -h -c '#{pane_current_path}' bind -n M-X kill-pane

🗒️ note that ‘#{pane_current_path}‘will keep the split in the same directory as it’s parent, without this it will default to your home directory.

...

tmux last session

https://youtu.be/RB87EEnnMnU

An ultimate productivity key-binding in tmux is one to switch to the last session. I use this to quickly get between sessions really quick. Often I am working and need to lookup a quick note, or copy something into my notes, then get back to where I was quickly.

bind -n M-b switch-client -l

I think of this hub and spoke model, and use last-session to quickly drive it.

...

tmux floating popups

https://youtu.be/2ZqFDsJywt8

Tmux popups are actually floating windows that you can drag around the screen. They always open in the middle (by default) when you open them, no matter where you leave them.

Here are a couple of keybindings I use to open up popup windows.

...

Check out pysonDB by pysonDB. It’s a well-crafted project with great potential.

A Simple , ☁️ Lightweight , 💪 Efficent JSON based database for 🐍 Python. PysonDB-V2 has been released ⬇️

Incremental Versioned Datasets in Kedro

Kedro versioned datasets can be mixed with incremental and partitioned datasets to do some timeseries analysis on how our dataset changes over time. Kedro is a very extensible and composible framework, that allows us to build solutions from the individual components that it provides. This article is a great example of how you can combine these components in unique ways to achieve some powerful results with very little work.

What is Kedro

👆 Unsure what kedro is? Check out this post.

...

Just starred flake8 by PyCQA. It’s an exciting project with a lot to offer.

flake8 is a python tool that glues together pycodestyle, pyflakes, mccabe, and third-party plugins to check the style and quality of some python code.

If you’re into interesting projects, don’t miss out on textual, created by Textualize.

The lean application framework for Python. Build sophisticated user interfaces with a simple Python API. Run your apps in the terminal and a web browser.

Using Kedro In Scripts

With the latest releases of kedro 0.17.x, it is now possible to run kedro pipelines from within scripts. While I would not start a project with this technique, it will be a good tool to keep in my back pocket when I want to sprinkle in a bit of kedro goodness in existing projects.

What is Kedro

If your just learning about kedro check out this post walking through it

...

Silence Kedro Logs

Kedro can have a chatty logger. While this is super nice in production so see everything that happened during a pipeline run. This can be troublesome while trying to implement a cli extension with clean output.

First, how does one silence a python log? Python loggers can be retrieved by the logging module’s getLogger function. Then their log level can be changed. Much of kedro’s chattiness comes from INFO level logs. I don’t want to hear about anything for my current use case unless it’s essential, i.e., a failure. In this case, I set the log levels to ERROR as most errors should stop execution anyways.

Getting a python logger is straightforward if we know the name of the logger. The following block will grab the logger object for the logger currently registered under the name passed in.

...

Python Diskcahe is locked

Running multiple processes using the same diskcache object can cause issues with locks. As I was trying to setup a rich Live display for markata I ran into issues where each part could not nun simultaneusly. As I had followed the instructions from discache it was not directly aparant to me, so I had to make a simple example to experiment and play with at a small scale.

Minimum reporducible error is one of my superpowers in development. I do this very often to sus out what is really happening. My day to day work is processing data with python, I keep a number of very small data sets handy to break and fix. This helps separate complexities of the project and the problem.

Markata has a lot going on. It’s a plugins all the way down static site generator built in python. Trying to find the root cause through the layers of plugin and cli modules can be a pain, but in this case building a very simple minimum reporducible error was much easier.

...

3 min read

How I navigate tmux in 2021

In 2021 I changed the way I navigate between tmux sessions big time. Now I can create, kill, switch with ease, and generally keep work separated into logical groups.

Since making this post, I have made ~20 other posts in short form that all have a YouTube video to go along with them you can find them all on my tmux-playlist.

I took Chris’s tmux course in December 2020 and it was fantastic. Even as a seasoned tmux user, I learned quite a bit. Before the course, I was proficient in...

...

Trim unused git branches

Trim branches no longer on origin # git remote prune origin --dry-run git remote prune origin Find branches already merged # git checkout main # list remote branches that have already been merged into main git branch -r --merged # list local branches that have already been merged into main git branch --merged

What is if __name__ == "__main___", and how do I use it.

When a python module is called it is assigned the __name__ of __main__ otherwise if it’s imported it will be assigned the __name__ of the module.

Let’s create a module to play with __name__ a bit. We will call this module nodes.py. It is a module that we may want to run by it’self or import and use in other modules.

#!python # nodes.py if __name__ == "nodes": import sys import __main__ print(f"you have imported me {__name__} from {sys.modules['__main__'].__file__}") if __name__ == "__main__": print("you are running me as main")

I have set this module up to execute one of two if statements based on whether the module it’self is being ran or if the module is being imported.

...

3 min read

Create a Virtual File Gallery with Symlinks

Creating a directory that is a union of several directories can be achieved with a few symlinks at the command line.

Here is how I am creating a virtual directory of all my projects that is a combination of both work and not-work projects. I am creating symlinks for every directory under ~/work and ~/git.

rm -rf ~/projects mkdir ~/projects ln -sf ~/work/* ~/projects ln -sf ~/git/* ~/projects

⚠ Notice that first I am recreating the directory each time. This will ensure that any project that is deleted from their actual directory is removed from the virtual gallery.

...

Vim Wsl Clipboard

I’ve long used neovim from within windows wsl, and for far too long, I went without a proper way to get text out of it and into windows.

wsl can access clip.exe. You can do some cool things with it, such as cat a file into the clipboard, sending output from a command to the clipboard, or set an autocmd group in vim to send yank to the windows clipboard.

Let’s say you want to send a teammate the tail of a log file over chat. You can tail the file into clip.exe.

...

2 min read

Pytest capsys

Testing print/log statements in pytest can be a bit tricky, capsys makes it super easy, but I often struggle to find it.

capsys is a builtin pytest fixture that can be passed into any test to capture stdin/stdout. For a more comprehensive description check out the docs on capsys

Simply create a test function that accepts capsys as an argument and pytest will give you a capsys opject.

1 min read

Building Rich a Dev Server

Draft Post

I’ve really been digging @willmcgugan’s rich library for creating TUI like interfaces in python. I’ve only recently started to take full advantage of it.

I am working on a project in which I want to have a dev server running continuously in the background. I really like dev servers theat automatically chooose an unused port and list out the running pid so that I can kill it if I need to.

...

Site Down During Build

Recently I noticed a new netlify site of mine was down while I was checking to see if new content was live. Later found out this was consistent after each and every push the site would go gown as soon as I hit push, and would not come back until the build finished.

Do other Netlify sites go down during build???

Short Answer NO. All of my google fu lead me to believe I was alone and none of my other sites do this.

...

Kedro pipeline_registry.py

With the realease of kedro==0.17.2 came a new module in the project template pipeline_registry.py. Here are some notes that I learned while playing with this new module.

You should now have something that looks like this in your src/<package-name>/pipeline_registry.py.

"""Project pipelines.""" from typing import Dict from kedro.pipeline import Pipeline def register_pipelines() -> Dict[str, Pipeline]: """Register the project's pipelines. Returns: A mapping from a pipeline name to a ``Pipeline`` object. """ return {"__default__": Pipeline([])}

pipeline_registry only works in kedro>=0.17.2

...

Stand With Your Team

People who are quick to toss team members under a bus are not well trusted or highly thought of and it will lead to some toxic team dynamics.

While collaborating on any project there are going to be decisions made that aren’t necessarily your favorite, during a summer internship my mentor made some decisions that I was not on board with, but I accepted his wisdom and moved forward with little push back.

During a review, leadership showed interest in the option that I wanted to go towards. I was quick to jump up and say I told you so right then and there and pitch reasons why my idea was so much better.

...

Blogging For Me

I create this blog with one person in mind, me.

This is not completely selfish, as there are likely many others out there that think similarly to me. Everyone comes from different backgrounds and varying levels of experience. In no way do you need to be an expert to create content others will benefit from.

I am as accurate as possible. I don’t know everything, and If I waited for that to happen I would never post, or write at such a high level no one else (including me) would ever want to read.

...

3 min read

I recently discovered twint by twintproject, and it’s truly impressive.

An advanced Twitter scraping & OSINT tool written in Python that doesn’t use Twitter’s API, allowing you to scrape a user’s followers, following, Tweets and more while evading most API limitations.

Minimal Kedro Pipeline

How small can a minimum kedro pipeline ready to package be? I made one within 4 files that you can pip install. It’s only a total of 35 lines of python, 8 in setup.py and 27 in mini_kedro_pipeline.py.

📝 Note this is only a composable pipeline, not a full project, it does not contain a catalog or runner.

I have everything for this post hosted in this gihub repo, you can fork it, clone it, or just follow along.

...

Markdown Cli

This is a post that may be a work in progress for awhile, Its a collections of thoughts on managing my blog, but could be translated into anythiung that is just a collection of markdown.

My Content Strategy For 2021

I am making another push in 2021 to get my content out in the world and meeting users where they are. See how I plan to execute.

My content is written in markdown, all markdown. I find that markdown does a really great job at getting out of the way and letting ideas flow onto the page. I am never fussing with fonts and formatting while physically writing posts. Not that I don’t spend way more time than I need to tweak these things on my own personal site where everything gets posted.

Much of what I create is inside of short articles that get posted to my personal site waylonwalker.com. These will get cross-posted to

...

Quickly Edit Posts

Recently I automated starting new posts with a python script. Today I want to work on the next part that is editing those posts quickly.

Automating my Post Starter

Check out this post about setting up my posts with python 🐍

...

2 min read

Gitui is a blazing fast terminal git interface

Gitui is a terminal-based git user interface (TUI) that will change the way that you work with git. I have been a long-time user of the git cli, and it’s been hard to beat, mostly because there is nothing that keeps my fingers on the keyboard quite like it, except gitui which comes with some great ways to very quickly walk through a git project.

Go to their [releases]https://github.com/extrawurst/gitui/releases) page, download the latest build, and pop it on your PATH. I have the following stuffed away in some install scripts to get the latest version.

install latest release

...

2 min read

Kedro - My Data Is Not A Table

In python data science/engineering most of our data is in the form of some sort of table, typically a DataFrame from a library like pandas, spark, or dask.

These containers for data contain many convenient methods to manipulate table like data structures. Sometimes we leverage other data types, namely vanilla types like lists and dicts, or even numpy data types.

What is Kedro

...

Quickly Change Conda Env With Fzf

Changing conda environments is a bit verbose, I use a function with fzf that both lists environments and selects the one I want in one go.

I have used conda as a virtual environment tool for years now. I started using conda for its simplicity to install packages on windows, but now that has gotten so much better and it’s been years since I have run a conda install command. I’m sure that I could use a different environment manager, but it works for me and makes sense.

What environment manager do you use for python?

...

3 min read

Vim Replace Visual Star

Replacing text based on whats in the current search register is a quite handy tool that I use often. I believe I picked this tip up from Nick Janetakis, check out his YouTube channel for some amazing vim tips.

https://www.youtube.com/watch?v=fP_ckZ30gbs

If there is one thing that I Like most about vim it’s the ability to hack on it and make it work well for you.

...

2 min read

Minimal Python Package

What does it take to create an installable python package that can be hosted on pypi?

This post is somewhat inspired by the bottle framework, which is famously created as a single python module. Yes, a whole web framework is written in one file.

. ├── setup.py └── my_pipeline.py

setup.py #

from setuptools import setup setup( name="", version="0.1.0", py_modules=["my_pipeline", ], install_requires=["kedro"], ) 

name #

The name of the package can contain any letters, numbers, “_”, or “-”. Even if it’s for internal/personal consumption only I usually check for discrepancy with pypi so that you don’t run into conflicts.

...

2 min read

If Tmux

I do much of my work from tmux, I love it so much that I want to setup some functionality that puts me in tmux even if I didn’t ask for it.

Bash function to check if the shell is in a tmux session.

in_tmux () { if [ -n "$TMUX" ]; then return 0 else return 1 fi }

Using the bash function #

I often open up vim to do some quite edits, but before I know it I have several splits open and I need access to another shell utility, but I forgot to start in tmux. This function makes sure tht I start in tmux everytime.

...

Save Vim Macro

If you are like me, you have created a macro or two that is pure glory, and you forget how you made it after a day or so, or you immediately want to store it away as a custom keybinding. As with most things with vim, it’s easy to do once you understand it.

One of the earliest things we all learn to do in vim is to create macros, custom sets of functionality stored in a register that can be replayed later.

To create a macro, get into normal mode, then type q followed by a letter that you want to store the macro under.

...

3 min read
Live Substitution In Neovim

Live Substitution In Neovim

Replacing text in vim can be quite frustrating especially since it doesn’t have live feedback to what is changing. Today I was watching Josh Branchaud’s Vim-Unalphabet series on Youtuve and realized that his vim was doing this and I had to have it.

https://twitter.com/_WaylonWalker/status/1346081617199198210

I had to do a bit of searching and found a great post from vimcasts that shows exactly how to get the live search and replace highlighting using inccomand

...

Newsboat

Web browsers are a black hole of productivity. I try to use them as little as possible when it is time to focus. I try to use help, ?, or ?? with ipython, or –help at the command line as much as possible. What about that time I am trying to see what my online friends are posting on their sites? I used to used google reader quite heavily before that was taken down.

I am going to give a terminal rss reader a try for a bit and see how that goes for me. I have really struggled to get into an rss reader since google reader died.

I installed with the reccomended snap for Ubuntu.

...

Large Refactor At The Command Line

As projects grow patterns that worked early on break and we need to change things to make the project easier to work with, and more welcoming to new developers.

Before you start mucking up a project with wild commands at the terminal check that you have a super clean git status. We may make some mistakes and need a way to undo 100’s files and git makes it really easy if you start with a clean history.

git status

If we are ready to begin work we should see a response like this.

...

4 min read

Ipython-Config

I use my ipython terminal daily. It’s my go to way of running python most of the time. After you use it for a little bit you will probably want to setup a bit of your own configuration.

Activate your virtual environment of choice and pip install it. Any time you are running your project in a virtual environment, you will need to install ipython inside it to access those packages from ipython.

pip install ipython

You are using a virtual environment right? Virtual environments like venv or conda can save you a ton of pain down the road.

...

2 min read

Custom Ipython Prompt

I’ve grown tired of the standard ipython prompt as it doesn’t do much to give me any useful information. The default one gives out a line number that only seems to add anxiety as I am working on a simple problem and see that number grow to several hundred. I start to question my ability 🤦‍♂️.

If you already have an ipython config you can move on otherwise check out this post on creating an ipython config.

Ipython-Config

...

3 min read

Automating my Post Starter

One thing we all dread is mundane work of getting started, and all the hoops it takes to get going. This year I want to post more often and I am taking some steps towards making it easier for myself to just get started.

When I start a new post I need to cd into my blog directory, start neovim in a markdown file with a clever name, copy some frontmatter boilerplate, update the post date, add tags, a description, and a cover.

hot and fast

...

Windowing Python Lists

In python data science we often will reach for pandas a bit more than necessary. While pandas can save us so much there are times where there are alternatives that are much simpler. The itertoolsandmore-itertools` are full of cases of this.

This post is a walkthrough of me solving a problem with more-itertools rather than reaching for a for loop, or pandas.

I am working on a one-line-link expander for my blog. I ended up doing it, just by modifying the markdown with python. I first split the post into lines with content.split('\n'), then look to see if the line appears to be just a link. One more safety net that I wanted to add was to check if there was whitespace around the line, this could not simply be done in a list comprehension by itself. I need just a bit of knowledge of the surrounding lines, enter more-itertools.

...

1 min read

Adding Audio to my blog posts

This is episode 1 of the Waylon Walker Audio experience, posts from waylonwalker.com{.hoverlink} in audio form.

So I have had this idea for awhile to add audio to my blog posts. The idea partly comes from the aws blog, if you have ever been on their blog you will have noticed that they have a voiced by amazon polly section.

Honestly I don’t know this is all new to me and I dont have much to go off of. For now its a test that may or may not work out.

...

Expand One Line Links

I wanted a super simple way to cross-link blog posts that require as little effort as possible, yet still looks good in vanilla markdown in GitHub. I have been using a snippet that puts HTML into the markdown. While this works, it’s more manual/difficult for me does not look the best, and does not read well as

The new card should be fully automated to expand with title, description, and cover image. Bonus if I am able to attach a comment behind it.

If you can call it a card 🤣. This card was just an image wrapped in an anchor tag and a paragraph tag. I found this was the most consistent way to get an image narrower and centered in both GitHub and dev.to.

...

Find and Replace in the Terminal.

grepr # grepr() {grep -iRl &#34;$1&#34; | xargs sed -i &#34;s/$1/$2/g&#34;} ```bash grepr() {grep -iRl &#34;$1&#34; | xargs sed -i &#34;s/$1/$2/g&#34;} grepd # grepd() {grep -iRl &#34;$1&#34; | xargs sed -i &#34;/^$1/d&#34;} CocSearch # :CocSearch published: false -g *.md

Resume Tips

customize for the job Why are you a good fit? What will you bring to the role? Give real outcomes give real experience Stop tech vomiting if you link to GitHub Make a profile readme Guide me to your best work have some activity if you link to LinkedIn Provide some benefit that is not on your resume Have a logical flow of experience (dont make me hunt for past experience) Keep it under 2 pages Who you know. Reference real experience Deployed 12 data pipelines with over 500 nodes to process 200GB of data at a Fortune 100 company vs Knowledge of Data Engineering methodology with python EC2 Dont be so fluffy
1 min read
Codeit Bro Interview

Codeit Bro Interview

use this profile image

Please share your professional role as a data scientist? [Also feel free to share about your personal projects, publications, etc.]

I graduated with a Mechanical Engineering Degree 8 years ago. Much of my work early in my career was wrapped around analyzing larger datasets for my group to understand quality, drive changes to improve quality or prove that quality was already good.

...

7 min read

reasons-to-kedro

There are many reasons that you should be using kedro. If you are on a team of Data Scientists/Data Engineers processing DataFrames from many data sources should be considering a pipeline framework. Kedro is a great option that provides many benefits for teams to collaborate, develop, and deploy data pipelines

What is Kedro

Kedro makes it super easy to get started with their cli that utilizes cookiecutter under the hood.

...

Reasons to Kedro

Reasons to Kedro # collaboration Sharable catalog small nodes over monolithic notebooks catalog easily load anything without needing to run No need to write read/write code pipeline No need to keep execution order in your head easily run a slice of a pipeline plugins pip install make your own hooks flexible expandable cli Reasons Not to Kedro # Already utilizing another DAG framework Data is not in a widely supported format Micro short-lived project Large Project / Deadline Use a lower profile project to learn first Team not willing to change Need minimal dependencies God Project - kedro owns everything??
1 min read

What's New in Kedro 0.16.6

Kedro 0.16.6 is out! Let’s take a look through the release notes

This is really exciting to see more deployment options coming from the kedro team. It really shows the power of the framework. The power of some of these orchestrations options is incredible.

Most of them hinge on a sweet combination of the kedro cli, docker image, and the pipeline knowing your nodes dependencies.

...

A brain dump of stories

I started making stories as kind of a brain dump a few times per day and posting them to [LinkedIn](https://www.linkedin.com/in/waylonwalker/(https://www.linkedin.com/in/waylonwalker/). Here are the last 11 days of stories.

I store all the stories on my website with the hopes of doing something with them on my own platform eventually. For now it makes it easy to make these posts.

cd static/stories ls | xargs -I {} echo '![](https://waylonwalker.com/stories/{})'

Stories 10-10-2020 - 10-21-2020 #

1 min read

Fix git commit author

I was 20 commits into a hackoberfest PR when I suddenly realized they they all had my work email on them instead of my personal email 😱. This is the story of how I corrected my email address on 19 individual commits after already submitting for a PR.

stop the bleeding

Before anything else set the email correctly!

...

3 min read

Designing a "Router" for kedro

I released a router-like plugin for kedro back in April 2020. This was not the first design, the idea actually came from one of the QB folks who taught me kedro nearly a year before. We were assembling our pipelines with something called nodes_global. It worked fairly well but did have some issues around being set as a global variable.

But…

One thing in particular that it did not lend itself well to was being able to create a packagable pipeline that I could pip install and append into any of my existing pipelines. Something I am still trying to work out, maybe I don’t need this. I think I have it working for our internal pipelines and it seems like the way to go, but we don’t necessarily end up using it.

...

4 min read

Reclaim memory usage in Jupyter

Today I ran into an issue where we had a one-off script that just needed to work, but it was just chewing threw memory like nothing.

It started with a colleague asking me How do I clear the memory in a Jupyter notebook, these are the steps we took to debug the issue and free up some memory in their notebook.

How do I clear the memory in a Jupyter notebook?

...

3 min read

Strip Trailing Whitespace from Git projects

A common linting error thrown by various linters is for trailing whitespace. I most often use flake8. I generally have [pre-commit](https://waylonwalker.com/pre-commit-is-awesome hooks setup to strip this, but sometimes I run into situations where I jump into a project without it, and my editor lights up with errors. A simple fix is to run this one-liner.

bash

git grep -I --name-only -z -e '' | xargs -0 sed -i -e 's/[ \t]\+\(\r\?\)$/\1/'

...

Chrome Extensions I use

There are many useful chrome extensions out there. I probably have way too many installed, here are four that I am currently using.

This post was inspired from Chris over at daily-dev-tips

Love it or hate it passwords are hard to manage. Everyone needs a password manager to avoid the dreaded password reuse, and to be able to quickly rotate them with a service. I use lastpass, thus it’s browser extension is my most used extension.

...

2 min read

Creating Reusable Bash Scripts

Bash is a language that is quite useful for automation no matter what language you write in. Bash can do so many powerful system-level tasks. Even if you are on windows these days you are likely to come across bash inside a cloud VM, Continuous Integration, or even inside of docker.

I have three techniques that help me write more composable bash scripts.

Break scripts down into reusable components

...

Three things to Automate with Python using Pandas

Here are three things that I see my non programming counterparts doing every single day. These really sum up so much of what folks do within an office. So many of us dabble in or become power users of spreadsheets without knowing there is an alternative out there that can save us time, automate boring things, and allow us to open up our minds for the part that we add value, Thinking about the data.

Lets face it, stitching together spreadsheets is zero value add by itself, but if you can see something in the data and take action on it, this can be huge value add to your company. Learning just a bit of python will help focus more of your attention on “value add operations” and leave the mundane stuff to your computer.

I see this one all the time. One team gets a spreadsheet from another team once per month and they need to stich all the pieces together. Excel really opens the door for some nasty hidden bugs in your manually stiched together data. It also takes time out of your day...

...

4 min read

How to Install miniconda on linux (from the command line only)

miniconda is a python distribution from continuum. It’s a slimmed-down version of their very popular anaconda distribution. It comes with its own environment manager and has eased the install process for many that do not have a way to compile c-extensions. It made it much easier to install the data science stack on windows a few years ago. These days windows are much better than it was back then at compiling c-extensions. I still like its environment manager, which installs to a global directory rather than a local directory for your project.

Installing miniconda on Linux can be a bit tricky the first time you do it completely from the terminal. The following snippet will create a directory to install miniconda into, download the latest python 3 based install script for Linux 64 bit, run the install script, delete the install script, then add a conda initialize to your bash or zsh shell. After doing this you can restart your shell and conda will be ready to go.

...

How to crush amazing posts on DEV

This post was inspired by a comment I left on @dsteenman’s post.

{% post dsteenman/how-long-should-a-blogpost-be-2k6n %}

Most of the time I prefer short as I am more likely to read the whole thing. If its setup as a series I am more likely to work my way through the whole series in a matter of a few sessions. Just my preference

...

Black Tech Pipeline

I was particularly inspired by @chantastic episode 103 of the react podcast with @ParissAthena. They spoke about the black tech pipeline as well as Diversity, Equity, and Inclusion. Pariss is quite an inspiration. She has done so much work to create a better place for POC in tech. I like that not only is she helping them get jobs but acting as a mentor for their first few months on the job to make sure that they are able to find their place and fit in.

Based on an episode of react podcast.

🎙 Listen to the full episode.

...

Review of the git-auto-commit-action

It’s a really cool GitHub action that will automatically commit files changed during the action. I was using this to render a new readme based on a template.

Check out the repo for git-auto-commit-action.

It’s a really cool GitHub action that will automatically commit files changed during the action. I was using this to render a new readme based on a template.

...

2 min read

Integration testing with Python, TestProject.io, and GitHub Actions

As I continue to build out waylonwalker.com I sometimes run into some errors that are not caught because I do not have good testing implemented. I want to explore some integration testing options using GitHub’s actions.

Running integration tests will not prevent bugs from happening completely, but it will allow me to quickly spot them and rollback.

The very first thing that comes to my mind is anything that is loaded or ran client-side. Two things quickly came to mind here. I run gatsby so most of my content is statically rendered, and it yells at me if something isn’t as expected. For performance reasons I lazy load cards on my blogroll, loading all of the header images gets heavy and kills lighthouse (if anyone actually cares). I am also loading some...

...

8 min read

New Machine for developing Tests with TestProject.io

Today I setup a new machine on Digital Ocean to use with TestProject.io, Here are my installation notes.

apt update && apt upgrade -y apt install zsh chsh zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" curl -fsSL https://starship.rs/install.sh | bash echo 'eval "$(starship init zsh)"' >> ~/.zshrc # python sudo apt update sudo apt install python3-pip -y echo 'alias python=python3' >> ~/.zshrc echo 'alias pip=pip3' >> ~/.zshrc # pipx apt install python3-venv pip install pipx pipx install black pipx install shell-functools pip install ipython # docker sudo apt update sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt...

1 min read

🐍 Practice Python Online

When learning a new skill it’s important to practice along the way. In order for me to show up to practice I need to make it easy to show up. An easy way to show up to practice with python is to use an online repl. With these you can try out something quick. Sometimes I see snippets from blogs or tweets and I need to try the out for myself to really understand.

When learning a new skill it’s important to practice along the way. In order for me to show up to practice I need to make it easy to show up. An easy way to show up to practice with python is to use an online repl. With these, you can try out something quick. Sometimes I see snippets from blogs or tweets and I need to try them out for myself to really understand.

Here are three different options that I have used in the past to try out something at some various levels. I am sure there are plenty more, but these are three that I have tried. I am not covering all of them, because It’s been a while since I have used one other...

...

2 min read

Kedro Catalog

I am exploring a kedro catalog meta data hook, these are some notes about what I am thinking.

try pandas method -> try spark -> try dict/list -> none

Is there an easy way to create a nosql database in memory from a a list of dictionaries?

Edit On GitHub

I recently added a button to my blog, and subsequently my posts on DEV.to. It’s the best thing that I have done for it in a while. It makes it so easy to do quick edits.

I refer back to my old posts quite a bit, sometimes I find errors in them. Honestly most of the time its too much effort to load up my editor make the change and git add and git commit. It’s not much, but when I am referring to my own post generally I am just trying to get something done and don’t have time for that.

The slug that I am getting from gatsby is formatted as /blog/this-post/. Note the trailing slash and missing file extension, thats where the ${slug.slice(0, -1)}.md comes in.

...

2 min read

Why use a cms

When first learning to code its very common to hard code everything right into the code. This happens with most folks in just about any language. Whether its HTML or markdown for front end content, or even hardcoding parameters in our backend languages like python, or node.js.

Hard coding everything right into your code makes it really hard for non-technical collaborators to join. It makes it nearly impossible to hand websites off to clients without needing to come back for routine updates.

The cms generally come with a rich content editor that feels more like something most folks are used to. There are buttons for changing the font, font-size, adding images, bold, italics, etc.

...

3 min read

🐍 Parsing RSS feeds with Python

I am looking into a way to replace my google reader experience that I had back in 2013 before google took it from us. I am starting by learning how to parse feeds with python, and without much previous knowledge, it proved to be much easier than anticipated thanks to the feedparser library.

This is how I used python to parse rss and setup my own custom feed.

Install the feedparser library.

...

2 min read

Reader-2020

The input will be a yaml file containing a list of Items you want to stay up to date with. Inside each item will be a url, and weight.

email: max-entries: 10 recipients: - [email protected] markdown: max-entries: 100 output: - README.md json: max-entries: 1000 output: - feeds/feed.json rss: max-entries: 1000 output: - feeds/feed.xml html: max-entries: 100 output: index.html items: Waylon Walker: weight: 5 url: https://waylonwalker.com/rss.xml @_WaylonWalker: weight: 3 twitter: https://twitter.com/_waylonwalker DEV Waylon Walker: weight: 8 url: https://dev.to/waylonwalker Stack Overflow Kedro: weight: 5 url: https://stackoverflow.com/questions/tagged/kedro Kedro GitHub: weight: 4 url: https://github.com/kedro-org/kedro Kedro Pypi weight: 10 url: https://pypi.org/project/kedro/

Types #

  • rss feed (primary source)
  • youtube feed
  • Stack Overflow tags
  • GitHub...

    ...

1 min read

🤓 What's on your GitHub Profile

I ran this post on dev.to and got a great response of great examples, check it out.

dev.to whats-on-your-github-profile

The GitHub profile feature just went live for a subset of users. Simply creating a repo named after your username, and clicking share to Profile on the sidebar will create a custom profile that shows up just above your pinned projects.

...

🙋‍♂️ Can Anyone Explain Twitter Cards to me?

Can someone explain how or why twitter cards render differently from device to device? I do understand that twitter cards a built from meta tags, the full list can be found in their docs

Mobile Looks fine.

On Desktop it is not picking up the image.

...

How I Built My GitHub Profile

I ran a discussion on dev that collected quite a list of examples in the comment section. So many great calls to action, animations, memes, and weird tricks.

dev.to whats-on-your-github-profile

Waylon Walkers GitHub profile

...

SLIDES - understanding python \*args and \*\*kwargs

Python *args and **kwargs are super useful tools, that when used properly can make you code much simpler and easier to maintain. Large manual conversions from a dataset to function arguments can be packed and unpacked into lists or dictionaries. Beware though, this power can lead to some really unreadable/unusable code if done wrong.

I generally post these as a carousel on LinkedIn based on a full article. Let mw know what you think of it shown inside of a blog @_waylonwalker.

python args and kwargs

...

1 min read

Gracefully adopt kedro, the catalog

While using the catalog alone will not reap all of the benefits of the framework, it does get you and your project ready for the full framework eventually. For me the full benefit of the catalog comes when you combine it with the pipeline and dont even touch read/write steps at all.

Taking a step into kedro by adopting the catalog first will give you a way to organize all of your data loads in one place, and stop manually writing read/write code, which can be different for each data and storage type. You just don’t need to think about it.

“can be dropped into kedro later” Let’s talk a bit more about that

...

How to find things in your kedro catalog

kedro 0.16.2 just dropped last week with a long-awaited feature… catalog search! I went as far as monkey patching this into each of my projects. I work jump between a few really big projects that have tons of datasets. Being able to quickly search for what I need is so useful.

The kedro data catalog is a key component to the kedro framework. It handles all data loading and saving for you. It is configurable and hackable. Having all your data connections listed in one place make it so easy to pick your project up and move it to a completely new environment. That sweet imperative loading style saves so much read/write overhead. I can load all my data with a single command whether it’s in amazon s3, google cloud platform, or a local file.

Just like with most of these articles, I am going to create a conda environment so that I don’t break any existing projects and scaffold up a toy project to learn from.

...

My first eight years as a working professional.

This day 8 years ago I started my first day as a Mechanical Engineer. I am so grateful for this journey that I have been able to have. There is no way that I could have planned this journey from the beginning.

My initial career plans were down a completely different path. I have been very flexible in taking on a new career path. I have been eager to learn new things and respond to life changes that I never would have imagined.

Very severe chronic health issues from my family restricted my ability to travel to the facilities I served as a Mechanical Engineer. I was able to stay strong and make it work. But in the meantime, I was learning new skills that enabled me to be more effective remotely.

...

2 min read

Master No More

It’s been a long time coming. We use some very harsh language within tech so much sometimes that we become numb to it. It’s time to do my very small part in this movement and purge this language from my active repos starting with this blog right here.

Large Refactor At The Command Line

this post follows my method of refactoring code bases from the command line, read more about that in this article.

...

2 min read

Refactoring your blog urls

I just did a quick refactoring of my JAMStack blog urls. Some didn’t fit with my style, some had _ that I wanted to switch to -, and others were ridiculously long. I’ve been using forestry as my CMS, I write many of my posts there, and sometimes it picks some crazy file names (based on my titles). It was time to refactor.

Large Refactor At The Command Line

When refactorings similar to this get really big I often need to do some project wide find an replace, I usually do this right from the...

...

understanding python \*args and \*\*kwargs

Python *args and **kwargs are super useful tools, that when used properly can make you code much simpler and easier to maintain. Large manual conversions from a dataset to function arguments can be packed and unpacked into lists or dictionaries. Beware though, this power can lead to some really unreadable/unusable code if done wrong.

Python *args and **kwargs are super useful tools, that when used properly can make you code much simpler and easier to maintain. Large manual conversions from a dataset to function arguments can be packed and unpacked into lists or dictionaries. Beware though, this power can lead to some really unreadable/unusable code if done wrong.

*args are some magical syntax that will collect function arguments into a list, or unpack a list into individual arguments.

...

3 min read

pre-commit is awesome

I recently discovered the ✨ awesomeness that is pre-commit. I steered away from it for so long because it seemed like a big daunting thing to set up, but really it’s easy. It will automatically run checks for you. In some cases, it will even automatically fix them for you. Out of the box, it will do things like automatically trim extra whitespace, fix file endings, and ensure file sizes are not too large for git.

I recently discovered the ✨ awesomeness that is pre-commit. I steered away from it for so long because it seemed like a big daunting thing to set up, but really it’s easy. It will automatically run checks for you. In some cases, it will even automatically fix them for you. Out of the box, it will do things like automatically trim extra whitespace, fix file...

...

4 min read

Building kedro.dev

Follow along the Journey as I build out kedro.dev.

I have really enjoyed my own personal journey as I have started to build all of my data pipeline projects with the kedro framework. I want to start building a place to share resources with the community. I want to see this community grow and flourish. They say in front end web development if you are not using a framework you end up building one. That’s exactly what I was doing before I started using kedro. I want to build out a set of resources that this community can learn from and start to use the framework at their own pace without needing to develop their own from scratch.

Looking into the front end frameworks to see how they welcome their community. Much of my inspiration is from them, bringing lessons learned to data.

...

1 min read

Kedro Static Viz 0.3.0 is out with Hooks Support

kedro-static-viz is out with support for the newly released hooks feature. This means that you can have kedro-static-viz automatically deploy a full gatsby site before_pipeline_run keeping your visualization always up to date.

Even though it is a static site there is no functionality lost. The only thing that’s missing is the flask server. With kedro-static-viz you can deploy your visualization to a number of static hosting providers such as GitHub pages free of charge with wicked...

...

Create Configurable Kedro Hooks

There are two main ways to create kedro hooks, with modules and classes. Each one still uses the same verbiage as the function/method names.

Class hooks seem a bit special as they give you a way to configure them so that they are a bit more generally useful.

What is Kedro

...

3 min read

Brainstorming Kedro Hooks

This post is a 🧠 branstorming work in progress. I will likely use it as a storage location/brain dump of hook ideas.

If you are completely unsure what kedro is be sure to check out my what is kedro post

hooks are executed in reverse order of the hooks list.

...

3 min read

How to get Dev Comments from an article Url

I want to incorporate some of the wonderful comments, \U0001F495, \U0001F984, and \U0001F516’s that I have been getting on dev.to on my website. I have dabbled once or twice with no avail this time I am taking notes on my journey, so follow along and let’s get there together. By the end of this post, I will have a way to get comments from posts on the client-side thanks to the wonderfully open dev.to API.

I want to incorporate some of the wonderful comments, 💕, 🦄, and 🔖’s that I have been getting on dev.to on my website. I have dabbled once or twice with no avail this time I am taking notes on my journey, so follow along and let’s get there together. By the end of this post, I will have a way to get comments from posts on the client-side thanks to the wonderfully open dev.to API.

dev.to has an open API that allows us to easily get comments as 2 min read

Four github actions for your website

GitHub’s actions are a new GitHub feature that will trigger GitHub to spin up a virtual machine and run some tasks with some special access to your repo. It can interact with comments/issues, it can clone your repo, You can explicitly pass in secrets so that it can commit back to the repo or deploy to another service. The environment may be a Linux, windows, or even a mac machine. I believe this is wildly incredible for the open-source community, putting these tools in the same place that we are already collaborating is so convenient.

GitHub actions can give you confidence that your site is up and running, with the latest JavaScript packages, does not have broken links, and can even take screenshots of what your website looks like on different screen sizes and operating systems.

2 min read

Create Custom Kedro Dataset

Kedro provides an efficient way to build out data catalogs with their yaml api. It allows you to be very declaritive about loading and saving your data. For the most part you just need to tell Kedro what connector to use and its filepath. When running Kedro takes care of all of the read/write, you just reference the catalog key.

Under the hood there is an AbstractDataSet that each connector inherits from. It sets up a lot of the behind the scenes structure for us so that we dont have to. For the most part kedro has connectors for about anything that you want to load, csv, parquet, sql, json, from about anywhere, http, s3, localfile system are just some of the examples.

Here is a DataSet implementation from their docs. Here you can see the barebones example straight from the docs. Parameters from the yaml catalog will get passed in

Interrogate is a pretty awesome, brand new, cli for Python packages

As usual while listening to python bytes 181 I heard of a tool that I had to try out right away!

This thing is 🔥 hot off the press folks, we’re talking the first release only 3 weeks ago. Its something that the python community needed years ago, and it belongs in your CI today. I had tried several tools that tried to do docstring coverage in the past but they were a bit cumbersome and were quickly forgotten about. Not interrogate, its dead simple!

Nothing I have tried has come close to being this good

...

2 min read

drawing ascii boxes

When creating cli’s I often want some nice full-width character. I find it tough to find them, and when I do half the time it is an image or something that cannot be copied 👿.

I rarely get very complex with my semi-manual ASCII art. I can do 98% of what I need with bars and corners. Using some simple full-width characters can really give your cli a nice clean look.

I’d say 50% of what I need is just a full-width horizontal bar to give some visual flair or separation.

...

1 min read

creating the kedro-preflight hook

Kedro Hooks Intro - kedro hooks are an exciting upcoming feature of kedro 0.16.0. They allow you to hook into catalog_created,pipeline_run, and node_run(nouns). With a before, or after (adjective). This really reminds me of reacts lifecycle hooks, that let you hook into various state of react web components. This is going to make kedro so extendable by the community. I am super pumped to see what the community is able to do with this ability.

kedro hooks are an exciting upcoming feature of kedro 0.16.0. They allow you to hook into catalog_created,pipeline_run, and node_run(nouns). With a before, or after (adjective). This really reminds me of reacts lifecycle hooks, that let you hook into various state of react web components. This is going to make kedro so extendable by the community. I am super pumped to see what the community is...

...

📝 Kedro Preflight Notes

This is a very rough idea for a kedro package to prevent time lost to get partway through a pipeline run only to realize that you dont have access to data or resources.

📢 Announcing find-kedro

find-kedro is a small library to enhance your kedro experience. It looks through your modules to find kedro pipelines, nodes, and iterables (lists, sets, tuples) of nodes. It then assembles them into a dictionary of pipelines, each module will create a separate pipeline, and __default__ being a combination of all pipelines. This format is compatible with the kedro _create_pipelines format.

Build-Docs

kedro is a ✨ fantastic project that allows for super-fast prototyping of data pipelines, while yielding production-ready pipelines. find-kedro enhances this experience by adding a pytest like node/pipeline discovery eliminating the need to bubble up pipelines through modules.

...

3 min read

Explicit vs Implicit Returns in Javascript

Often when reading through javascript examples you will find some arrow functions use parentheses () while others use braces {}. This key difference is that parentheses will implicitly return the last statement while braces require an explicit return statement. It is important to understand the difference between them because it is likely that you will find code examples of both and trying to edit code written differently than you’re used to may have unintended consequences.

Arrow functions are one-liner functions in javascript that have two main syntactical ways to create the code block. with parentheses and braces. Let’s take a look at both ways of creating arrow functions so that when we come accross them in the wild it will all make sense.

Here is an example of an arrow function that will implicitly return the last statement without the return keyword. I believe that these are a bit more restricted in that you cannot set variables inside them. They are...

...

Twitter deepdives

Inspired by Chris Achard

Email course inspired by learn d3 in 5 days

1 min read

TIL: Bind arguments to dynamically generated lambdas in python

This past week I had a really weird bug in my kedro pipeline. For some reason data running through my pipeline was coming out completely made no sense, but if I manually request raw data outside of the pipeline it matched expectations.

NOTE While this story is about a kedro pipeline, it can be applied anywhere closures are put into an iterable.

After a few days of looking at it off and on, I pinpointed that it was all the way down in the raw layer. Right as data is coming off of the database. For this I already had existing sql files stored and a read_sql function to get the data so I opted to just set up the pipeline to utilize the existing code as much as possible, leaning on the

...

2 min read

python-deepwatch

Is it possible to deep watch a single python function for changes?

keeping track of a python functions hash is quite simple. There is a__hash__ method attached to every python function. Calling it will return a hash of the function. If the function changes the hash will change.

[ins] In [1]: def test(): ...: return "hello" [ins] In [2]: test.__hash__() Out[2]: 8760526380347 [ins] In [3]: test.__hash__() Out[3]: 8760526380347 [ins] In [4]: def test(): ...: return "hello world" [ins] In [5]: test.__hash__() Out[5]: 8760525617988 [ins] In [6]: def test(): ...: return "hello" [ins] In [7]: test.__hash__() Out[7]: 8760526380491

Using hashlib provides a consistent hash.

...

1 min read

Four Github Actions for Python

If you are developing python packages and using GitHub here are four actions that you can use today to automate your release workflow. Since python tools generally have such a simple cli I have opted to use the cli for most of these, that way I know exactly what is happening and have more control over it if I need.

If you are developing python packages and using GitHub here are four actions that you can use today to automate your release workflow. Since python tools generally have such a simple cli I have opted to use the cli for most of these, that way I know exactly what is happening and have more control over it if I need.

flake8 is pythons quintessential linting tool to ensure that your code is up to the standards that you have set for the project, and to help prevent hidden bugs. I am a heavy user of black and isort as well, but for ci flake8 is typically considered the gold standard. black and isort will help you automate many...

...

Variables names don't need their type

So often I see a variables type() inside of its name and it hurts me a little inside. Tell me I’m right or prove me wrong below.

Pandas DataFrames are probably the worst offender that I see

# bad sales_df = get_sales() # good sales = get_sales()

Sometimes vanilla structures too!

...

Send Emails with GitHub Actions

Here is one useful thing that you can do with GitHub actions no matter what language you use, send email. You might want to know right away when your ci passes. You might want to give your team a nice pat on the back when a new release is deployed. There might be subscribers wanting to see the latest release notes in their inbox as soon as the latest version is deployed. Whatever it is, its pretty easy to do with an action right out of the actions marketplace.

Here is a silly example that sends an email to yourself anytime someone stars your repo.

1 min read

What Are GitHub Actions

GitHub actions are an amazing tool that allows us to run code based on triggers inside of our repo. Their is a large and growing community of actions inside the marketplace to use with very little effort. Best of all they are free for public repositories, and private repos have a very generous free tier.

I have been diving deep into Github actions for about a month now and they are wicked good! They allow you to run any sort of arbitrary code based on events in your repo, webhooks, or schedules. They are very reasonably priced. The interface that GitHub hs developed for them is top-notch! It’s so good I have done 90% of my editing of them right from github.com.

some interaction to your repository triggers code to run.

...

5 min read

Getting Started with GitHub Actions

Github actions are written in configuration files using the YAML syntax. YAML is a superset of JSON. Most YAML can be expressed inline with JSON syntax. Similar to python YAML is whitespace driven by whitespace rather than brackets tags. The argument for using YAML for configuration files such as actions is that it is more human-readable and editable. It’s much easier to see the whitespace layout than it is to get closing brackets correct. For actions, I believe this is mostly true. I don’t see any use case to get past 3-5 indents, which is completely manageable.

Can I just say that I learned more than I realized about YAML by writing this article

In YAML or JSON, the most basic containers for data are arrays, a 1D list of things, and objects, for key-value pairs.

...

4 min read

Today I learned `git diff feature..main`

Today I learned how to diff between two branches.

git diff feature..main

Sometimes we get a little git add . && git commit -m "WIP" happy and mistakenly commit something that we just can’t figure out. This is a good way to figure out what the heck has changed on the current branch compared to any other branch.

Let’s create a new directory, initialize git and toss some content into a readme.

...

2 min read

DesktopECHO has done a fantastic job with xWSL. Highly recommend taking a look.

Installer script for Ubuntu 22.04 / 24.04 with XFCE 4.18 on WSL. Does not require hypervisor, container, or X11 server.

What is YOUR Advice for New Data Scientists

You dont have to start out as a git wizard with the cleanest possible commit history. At first dont let yourself get too wrapped up in it, the most important part is that you make commits. You will find needs for more advanced stuff later.

git add . git commit -m "FEAT added new function to calculate revenue by product family" git push

Get comfortable with this, then learn how to branch, rebase, stash, etc…

Get the job done. Keep it in small bite size pieces. Make readable function definitions and variable names. You will thank yourself for naming things well later. Readability counts more than performance in most cases of data science. If it gets the job done try not to over worry about things like performance. A few extra seconds to clean a dataset or build a model is not worth hours of your time. As you go you will have cases that performance is more critical and you will learn what to do from the start to avoid...

1 min read

Do You Hoist

I am working through Wes Bos’s beginnerjavascript.com/ I just hit module 18 on hoisting. It’s something that I always knew was there, Its not something I typically see used or use myself.

Do you have any use cases that you use hoising? Why? It seems like a really cool feature in any language that uses it, but I dont really notice it in use.

There are many articles that cover this in far more depth, but its the idea that variable declarations and functions are defined before they are executed. This means that it doesnt matter if you call a function before or after it is defined.

...

2 min read

What is Kedro

What is Kedro

This is my original what-is-kedro article. There is a brand new one

Kedro is an open source data pipeline framework. It provides guardrails to set your project up right from the start without needing to know deeply how to setup your own python library for data pipelining. It includes really great ways to manipulate catalogs and pipelines. This article will cover the 10K view of kedro, future articles will dive deper into each one.

...

Custom Scrollbar Design

Getting a custom scrollbar on your site makes it stand out a bit compared to the very plain stock one that are on most sites. This is how I set mine up on my gatsby site.

Inspired by Wes Bos’s new uses.tech I wanted a custom scrollbar on my personal site. I had tried to do it in the past, but gave up after it was not working.

Since uses.tech is open source I jumped on github, searched for scroll and found this 2 min read

2020 waylonwalker.com rebrand

Moving into 2020 I have been really leaning on using purple as my theme color everywhere more and more. Its time for an update to my personal site, not just because it feels plain, not just because the cover art I am using for dev.to doesn’t fit my current card layout, but because I feel inspired and I want to.

This is what we are working with. It has been my card design for at least a year now. Its not bad but, its a bit play, doesnt fit my new cover art style, and that date is not working over top of the cover art text.

I have been really into using a deep purple lately. It is a neutral color that does not get enough respect, i.e. it’s not used as frequently and kinda stands out when used.

...

4 min read

I just added react-headroom to my site

It was so easy to get a professional looking navbar with just 3 lines of code. This package seriously is so usable on mobile it is ridiculous. I found this package from day-4 of the 100 days of gatsby challenge. It is by the wonderful man who brought us gatsbyjs Kyle Mathews, so you know its gotta be good.

installation is easy

npm i react-headroom

Import Headroom #

There was no instructions...

...

2 min read

I finally fixed my Styled-Components in gatsby.js

I finally fixed my Styled-Components in gatsby.js. I am starting a redesign of my website. I have started cross posting to dev.to more regularly. With that I have been making more detailed cover images at the recommended 1000x420. These images get cut off on my own site, which is a bit ridiculous to have my own content not look right on my own site. But before we start a heavy redesign I have a small issue that has plagued the site for at least a year!

I have a small issue that has plagued the site for at least a year!

I have been using styled components in my gatsby.js site for about a year now. And it has been plagued by styled-components not being in the ssr causing some jank in the styles being loaded. You can see it in the lighthouse performance report below. It generally...

...

Should I switch to Zeit Now

I have happily had my personal site waylonwalker.com hosted on netlify for nearly 2 years now. In fact I have hosted about a dozen different toy projects to play with on there, 4 of which have gone far enough to get a custom domain name. They are fast to deploy and consistently do so on every git push to main.

I have recently started playing with zeit again. I really like their cli tool, its dead simple and makes sense. I tried the netlify one early on and dont think I really gave it much of a chance. I was able to backup a site we were modifying by saving everything locally (literally control+s) and running now in the command line.

While I was on the site I realized that when switching to gatsby v2 I had deployed it to now.sh while...

...

2 min read

git push without setting upstream

Finally after years of hand typing out a full git push --upstream my_really_long_and_descriptive_branch_name I found there is a setting to automatcally push to the current branch. More realisitically I just did a git push let git yell at me, and copying the suggestion.

git config --global push.default current

This one setting will now git push to the current branch without yelling at you that your upstream does not match your current branch. This helps me ship chnages faster as I am constantly chnaging projects and branches.

1 min read

Out of Space

This morning I logged into my machine and was nearly out of space

screenshot-2025-02-12T22-32-14-298Z.png

These are the commands that I often use to reclaim space. Its so easy to fill up small vm’s in the cloud, or in my case today let your dev machine go way too long without a good cleanup.

...

2 min read

simple click

cli tools are super handy and easy to add to your python libraries to supercharge them. Even if your library is not a cli tool there are a number of things that a cli can do to your library.

Things a cli can do to enhance your library.

🆚 print version 🕶 print readme 📝 print changelog 📃 print config ✏ change config 👩‍🎓 run a tutorial 🏗 scaffold a project with cookiecutter

...

Personal URL shortener with Netlify Redirects

I love using URL shorteners to easily share links without hitting character limits, but they loose their meaning. Services like bit.ly will save my links for me so that I can find them, but I would rather them to be easy to remember. https://bit.ly/2ruLwQz does not roll of the tongue so well.

I recently discovered a really cool feature of netlify that I have always looked past, _redirects. It is so simple cool and powerful, every netlify site should do this!

simply add a _redirects file to the root of your your published site with the following format. The trick I found with my gatsby site was that it needed to be in my static directory /static/_redirects, not root. Next you just put space separated links on...

...

cmd.exe tips

I spend a lot of my time at the terminal for my daily work, mostly in Linux or wsl. One big reason for using wsl over cmd.exe is the ease of walking through history that fzf provides. This week we had a windows bug in a cli and I was stuck in vanilla cmd.exe 😭

First off if you are stuck using cmd.exe, do yourself a favor and get cmder. It makes life just a bit easier. It is super confugurable and comes with several power ups that make it a bit more enjoyable than cmd.exe.

F7 - Scroll through history

...

2 min read

What is something you should have learned or understood earlier?

Mine is the python debugger. I was a long holdout thinking that print statements were sufficient. That was untill I started having errors crop up in functions that took minutes to run. The thing that I most notably wish I would have known about is post_mortem.

[ins] In [4]: def repeater(msg, repeats=1): ...: "repeats messages {repeats} number of times" ...: print(f'{msg}\n' * repeats) [ins] In [5]: repeater('hi', 3) hi hi hi [ins] In [6]: repeater('hi', 'a') --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-6-0ec595774c81> in <module> ----> 1 repeater('hi', 'a') <ipython-input-4-530890de75cd> in repeater(msg, repeats) 1 def repeater(msg, repeats=1): 2 "repeats messages {repeats} number of times" ----> 3 print(f'{msg}\n' * repeats) 4

Debug with...

...

1 min read

Supercharge Zsh Startup

I have been using oh-my-zsh successfully for about 2 years now. But lately my startup time has been really bothersome. It has grown to the point where it was taking about 5.5s to startup a shell! This is ok if I am going to spend some time in here for awhile and do some work that benefits from all of the autocompletions, plugins, and shortcuts that oh-my-zsh brings. But to only jump in to run a handful of commands is infuriating.

I believe the real issue is io speed on wsl. I have some remote servers with similar configs that are 10x faster or more, loading in 100s of milliseconds rather than seconds. Sourcing all of the individual plugin files are just too much for it.

Quick side note: your zsh config is controled by your ~/.zshrc file. This file can source other files, load plugins, or run literally anything.

...

Keep Location List Closed

Vim’s (neovim in my case) location list can provide some very useful information while developing. Mine gives me information about linting and type checking errors with fairly little config. Generally, it sits nicely at the bottom of the screen and barely affects me. Other times, especially while zoomed way in during a presentation, it just gets in the way.

Location List eating up the screen while I am zoomed in and trying to live code

Through some google search I found the culprit was syntastic. It has an auto_loc_list feature. We can turn it off by setting syntastic_auto_loc_list=0.

...

1 min read

SqlAlchemy Models

Make a connection # from sqlalchemy import create_engine def get_engine(): return create_engine(&#34;sqlite:///mode_examples.sqlite&#34;) Make a session # from sqlalchemy.orm import sessionmaker def get_session(): con = get_engine() Base.bind = con Base.metadata.create_all() Session = sessionmaker(bind=con) session = Session() return session Make a Base Class # from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() Base.metadata.bind = get_engine() Make your First Model # class User(Base): __tablename__ = &#34;users&#34; username = Column('username', Text()) firstname = Column('firstname', Text()) lastname = Column('lastname', Text()) Make your own Base Class to inherit From # class MyBaseHelper: def to_dict(self): return {k: v for k, v in self.__dict__.items() if k[0] != &#34;_&#34;} def update(self, **attrs): for key, value in attrs.items(): if hasattr(self, key): setattr(self, key, value) Use the Custom Base Class # class User(Base, MyBaseHelper):...
1 min read

I came across blocks from blocks, and it’s packed with great features and ideas.

A JSX-based page builder for creating beautiful websites without writing code

Building Cli apps in Python

Click primarily takes two forms of inputs Options and arguments. I think of options as keyword argument and arguments as regular positional arguments.

**From the Docs

To get the Python argument name, the chosen name is converted to lower case, up to two dashes are removed as the prefix, and other dashes are converted to underscores.

...

1 min read

Kedro

See all of my kedro related posts in [[ tag/kedro ]].

I am tweeting out most of these snippets as I add them, you can find them all here #kedrotips.

Below are some quick snippets/notes for when using kedro to build data pipelines. So far I am just compiling snippets. Eventually I will create several posts on kedro. These are mostly things that I use In my everyday with kedro. Some are a bit more essoteric. Some are helpful when writing production code, some are useful more usefule for exploration.

...

Just Use Pathlib

Pathlib is an amazing cross-platform path tool.

from pathlib import Path

Create path object #

Current Directory

cwd = Path('.').absolute()

Users Home Directory

...

1 min read

Custom Python Exceptions

Custom Exceptions # class ProjectNameError(NameError): pass class UserNameError(NameError): pass class CondaEnvironmentError(RuntimeError): pass class BucketNotDefinedError(NameError): pass
1 min read

Filtering Pandas

Good for method chaining, i.e. adding more methods or filters without assigning a new variable.

# is skus.query('AVAILABILITY == " AVAILABLE"') # is not skus.query('AVAILABILITY != " AVAILABLE"')

masking #

general purpose, this is probably the most common method you see in training/examples

# is skus[skus['AVAILABILITY'] == 'AVAILABLE'] # is not skus[~skus['AVAILABILITY'] == 'AVAILABLE']

isin #

capable of including multiple strings to include

...

Digital Ocean

I love digital ocean for it’s simplicity and its commitment to open source.

1 min read

Quick Progress Bars in python using TQDM

tqdm is one of my favorite general purpose utility libraries in python. It allows me to see progress of multipart processes as they happen. I really like this for when I am developing something that takes some amount of time and I am unsure of performance. It allows me to be patient when the process is going well and will finish in sufficient time, and allows me to 💥 kill it and find a way to make it perform better if it will not finish in sufficient time.

for more gifs like these follow me on twitter @waylonwalker

Add a simple Progress bar!

...

1 min read

Clean up Your Data Science with Named Tuples

If you are a regular listener of TalkPython or PythonBytes you have hear Michael Kennedy talk about Named Tuples many times, but what are they and how do they fit into my data science workflow.

As you graduate your scripts into modules and libraries you might start to notice that you need to pass a lot of data around to all of the functions that you have created. For example if you are running some analysis utilizing sales, inventory, and pricing data. You may need to calculate total revenue, inventory on hand. You may need to pass these data sets into various models to drive production or pricing based on predicted volumes.

Here we setup functions that can load data from the sales database. Assume that we also have similar...

...

Background Tasks in Python for Data Science

This post is intended as an extension/update from background tasks in python. I started using background the week that Kenneth Reitz released it. It takes away so much boilerplate from running background tasks that I use it in more places than I probably should. After taking a look at that post today, I wanted to put a better data science example in here to help folks get started.

This post is intended as an extension/update from background tasks in python. I started using...

...

📝 Bash Notes

Bash is super powerful.

Show Remaining Space on Drives

df -h

show largest files in current directory

...

Autoreload in Ipython

I have used %autoreload for several years now with great success and 🔥 rapid reloads. It allows me to move super fast when developing libraries and modules. They have made some great updates this year that allows class modules to be automatically be updated.

🔥 Blazing Fast

💥 Keeps me in the comfort of my text editor

...

3 min read

I recently discovered arrow by apache, and it’s truly impressive.

Apache Arrow is the universal columnar format and multi-language toolbox for fast data interchange and in-memory analytics

Keyboard Driven VSCode

Throw that mouse Away its time to setup some keyboard shortcuts.

These sortcuts were the baseline for switching from tmux/vim to vscode. Most folks posts I was able to find gave great tips on replacing vim, but very few have focused on the hackability of tmux. tmux allows me to rapidly fire up a workspace, create new windows and splits. Then When I switch tasks I can leave that workspace open and and jump right back in later exactly where I left off. There is nothing quite like it. The shortcuts listed here make the transition a bit better. The worst thing I found when using vscode at first was no way to switch between the terminal and editor without the mouse. This first set of keybindings solve that issue.

The worst thing I found when using vscode at first was no way to switch between the terminal and editor without the mouse.

...

If you’re into interesting projects, don’t miss out on vim-flog, created by rbong.

A blazingly fast, stunningly beautiful, exceptionally powerful git branch viewer for Vim/Neovim.

Realistic Git Workflow

My git workflow based on real life. Its not always clean and simple.

sometimes things get messy

pull 👉 branch 👉 format 👉 work👉 add 👉 commit 👉 pull 👉 rebase 👉 push

...

7 min read

Just starred kedro by kedro-org. It’s an exciting project with a lot to offer.

Kedro is a toolbox for production-ready data science. It uses software engineering best practices to help you create data engineering and data science pipelines that are reproducible, maintainable, and modular.

Forestry.io

Testing out forestry.io

I still ♥️ your product dont be

forestry is simple

...

3 min read
Rewrite History with Git

Rewrite History with Git

git reset -- <file>

rage unstage to wipte out history of staged commit

git reset --hard <file>

Undo file #

  • rage quit
  • git reset HEAD~n
    • removes modifications
    • keeps hitsory of changes and undoes them
  • git checkout HEAD~n –
    • keeps modifications

      removes history

      ...

1 min read

It's not all about winning

This is my story into data science.

I am addicted to the process of learning and improving my skills nearly to a fault. The reason I say nearly is because my addiction is fueled with results. I crave the output of my work enhance the work of others. I jump with joy as I see users gain insights they could have never imagined before. My mouth starts watering as I see their boring repetitive data mining activites be completed in a matter of seconds, opening up their mind to focus on their expertise. The day I stop learning will be the day that I start looking for another career path.

It’s not all about winning.

...

I recently discovered vimade by TaDaa, and it’s truly impressive.

Vimade let’s you dim, fade, tint, animate, and customize colors in your windows and buffers for (Neo)vim

Update Git User

This morning I log into my VCS and check activity on my projects to find that someone else has been very active on my projects fo the last few weeks. I quicklyhover over the missing avatar to find that It’s Me. What’s wrong here, why do I look like two different people throughout the day! upon further investigation I see the issue. while setting up a new terminal environment I mistyped my email address by one character. After much searching and a few failed attempts I was able to fix it by following an article no longer available (2021) from https://help.github.com/articles.

Clone the repo, note it must be a --bare clone.

git clone --bare https://github.com/user/repo.git cd...

...

1 min read

2019 goals

The year of intenionality

This is a follow up to my previous post 2018-retrospective

This year I will become more productive, by intensionally working on a well thought out plan, learning the right technologies, and leave behind a positive legacy.

...

5 min read

Check out engineer-man and their project youtube.

Code from the Engineer Man YouTube channel. Please do not submit pull requests, they will be ignored/closed. The code in the repo needs to remain as it was in the video.

2018 Retrospective

2018 was a year of many ups and downs, and learning to deal with a whole new set of problems professionally and at home. In 2018 I logged in to my first Linux system, setup my own webserver, data pipelines, database. I learned to use react and d3. Stepped up my python, javascript, and sql.

At home the doctor appointments keep piling in. While I am learning to deal with it all there were several times throughout the year that I was very overwhelmed with everything and broke down.

Here are the goals I had listed out for 2018 and how I faired at completing them.

...

5 min read

Do More of What Brings You Joy

Today I want to take some time to talk about the things that make me happy in my work environment. This is completely free-flow off the cuff, but are things that I do that make me happy, not having them would definitely be a deal breaker for me .

A positive work atmosphere goes a long ways. We all have enough negativity going on in our lives that is out of our control accepting any negativity in the workplace is a no go for me. There was a point in which I was suffering a lot of negativity at work. This began to trickle into every part of life, and it became hard to see positivity anywhere. My wife not only noticed this, but put a polite request in for change. It was definitely a low point and she could tell tell that my work life was not helping anything.

Throw out the negativity - courtesy 3 min read

feather by wesm is a game-changer in its space. Excited to see how it evolves.

Feather: fast, interoperable binary data frame storage for Python, R, and more powered by Apache Arrow

The work on sharp by lovell.

High performance Node.js image processing, the fastest module to resize JPEG, PNG, WebP, AVIF and TIFF images. Uses the libvips library.

D3 Day 5

select rowid, key, raw, store_time, expire_time, access_time, access_count, tag, size, mode, filename from Cache where key=‘e3cd37c97980ab2c’; ’e3cd37c97980ab2c’ ’e3cd37c97980ab2c' select rowid, key, raw, store_time, expire_time, access_time, access_count, tag, size, mode, filename from Cache where key=‘c14050404a107d5e’;

For what we are creating in these posts d3 is way overkill and very verbose, but I need to start somewhere! These are just stepping stones into real custom visualizations that cannot be done in any other tool today. I still cannot explain how excited I am to say “I created that in d3!!!”

3 min read
D3 Day 4

D3 Day 4

For what we are creating in these posts d3 is way overkill and very verbose, but I need to start somewhere! These are just stepping stones into real custom visualizations that cannot be done in any other tool today. I still cannot explain how excited I am to say “I created that in d3!!!”

Today I will be learning about d3 scales, and adding them to the bar chart that we created yesterday. Follow along as I try to create something interesting.

maybe a few days ago…. give me a break I have a lot of other priorities

...

5 min read
D3 Day 3

D3 Day 3

I recently subscribed to Ben Clinkinbeard’s learn D3.js in 5 days, and am currently on day 3. I read through the first 2 days, and felt fairly comfortable with selecting elements, so I did not follow along on the first two days. I probably should have, but there are only so many hours in the day.

D3 is the ubiquitous dynamic visualization library for building custom interactive visualizations on the web. It is a bit low level, and more verbose than many other libraries that build upon it, but if you want full control D3 is the way to go. I have used a few libraries built upon d3 in the past and have been very happy with the results. For now I want to start learning a bit about how d3 works. I know that learning it is going to take a long time, so I want to start working on some simple examples now in order to build my understanding so that I can learn quickly when I am ready to dive in. If I never decide I need to take the deep dive into d3, I think understanding how it works will...

...

4 min read

FlexBox

I recently finished up the flexbox-zombies course to learn more about flexbox, and to become proficient with it. I can truly say that this course has changed the way that I create layouts. Flexbox is very intuitive now. What this course does really well at is explaining the concepts and hitting you with a ton of examples that you can work through really quickly.

A clip from the final round against Dave

Flexbox requires a wrapper container to work I will refer to this as the flex container, and the items in that container as items.

...

6 min read

Vim Notes

norcalli/neovim-plugin

python-lsp/python-lsp-server

I have gone quite awhile without using c and instead using d. The reason that I started using c is because it automatically places you into insert mode. This not only saves me one keystroke for commands such as diwi is now ciw, but it also works with the repeat . command!!! This is huge. When refactoring a document I had been creating a macro to change one word to another, using...

...

2 min read

I recently discovered tqdm by tqdm, and it’s truly impressive.

⚡ A Fast, Extensible Progress Bar for Python and CLI

I recently discovered pandas by pandas-dev, and it’s truly impressive.

Flexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more