RSSAmplifier

Blog

Evan Todd

Recent content on Evan Todd

etodd.ioRSS feed ↗151 posts

Latest posts

Passkeys Are Too Hard

On my quest to speed-run all the wrong ways to authenticate users , I decided to implement passkeys. TL;DR: WebAuthn is engineered to handle complex, paranoid enterprise use cases. I don’t think it will fully replace passwords until there’s a simplified API for grug-brained developers such as myself. Conditional UI Originally, WebAuthn required a separate button to trigger the login…

More Magic Link Pitfalls

Folks kindly responded with some criticism of my list of magic link pitfalls . So let’s talk about some more pitfalls! Magic links are annoying This was by far the most common sentiment: “just give me a username and password”. I’m 99% sure this criticism comes from tech-savvy developers, so I’ll rephrase this as: “just give me a way to login with my password…

Magic Link Pitfalls

Recently I was surprised to discover that there are several bad ways to do magic links. The basic idea is: a user hits “login”, enters their email address, and receives an email that allows them to login without a password. What could possibly go wrong? I work in security, so I already knew a few best practices I would need to implement: The link should have a short expiration The link…

Should I Switch From Git to Jujutsu

Jujutsu is a new version control system that is backward-compatible with Git. All the cool kids are raving about it. In this article I will try to help you decide whether it’s worth investigating. If you use git rebase , the answer to this article’s question is probably yes . You will mostly likely love Jujutsu. Proceed to Part Two . Do not pass Go. Do not collect two hundred dollars.…

Treat Your Humans Better Than Your Agents

Folks are starting to figure out what kind of environment AI agents need to be productive . The gist is: Agents need clear guidelines in a markdown file at the root of the repository explaining how to contribute to the project. Agents need a clean, isolated, reproducible environment in which they can run tests and go wild without breaking stuff and getting stuck. If the environments are…

Zero to One Hundred Thousand Tests

When I started at StrongDM five years ago (woah), we had zero automated tests. Last year we had 50,000 tests . Today, around 70% of our code is covered by over 100,000 tests, most of which run on every pull request. What follows is my personal opinion about what constitutes a “good” automated test based on my observation of this colossal increase in test coverage. The goal is not to…

Catch Your Dream

When I was young, my dad had a Power Macintosh 6500 and a copy of a game called MechWarrior 2: 31st Century Combat. By my estimation, it was not very good. It was slow and boring and I mostly got confused and died. However. It had the absolute coolest intro cinematic of all time. It still gives me goosebumps. After the intro and a minute or two of listening to the 12X CD-ROM drive spin, I had to…

The start of a game development journal

I am starting a journal for my game development work because I spend a lot of development time thinking and staring into space, and those thoughts don’t always make it into the game. I need an outlet to direct those thoughts and hopefully make them more useful. The project I am working on is also personal and necessarily relates to my feelings about life and art and God, and I need a place to…

The Identity Problem

Disclaimer: views expressed are my own and are not endorsed by my employer. It’s a famous joke that naming things is one of the hardest problems in computer science . I think this alludes to a fundamental truth behind so many of the problems I encounter every day as a software engineer. Let me ruin the joke and reword it a bit. The hardest problem in computer science is deciding whether two…

Waiting on Tests

Disclaimer: views expressed are my own and are not endorsed by my employer. In 2019 we had roughly zero automated tests at StrongDM . We did manual quality assurance testing on every release. Today we have 56,343 tests. Anecdotally, the rate of bugs and failures has not decreased by a commensurate amount. Instead I think it correlates with focused efforts we’ve made at various times to…

Making Games

In March 2018, I had been a full-time indie game developer for four years. My heroes were Jonathan Blow, Lucas Pope, and Robyn and Rand Miller. I had 2,500 Twitter followers, an ambitious title under my belt with thousands of sales, and a free office in a hip coworking space near downtown Columbus, generously provided by some friends at a local game studio. I distinctly remember wondering why…

There and Back Again: GraphQL at strongDM

This post originally appeared on the strongDM engineering blog . Once upon a time, strongDM had no dedicated frontend engineers. We backend engineers dipped our toes in the React frontend as infrequently as possible. It relied on dusty, bespoke, private REST endpoints that returned schema-less JSON blobs. We let these languish while we built a shiny new public API with code-generated SDKs in five…

How to Exfiltrate Code from Bitbucket

Every year or so, something compels me to start over with a fresh OS image. Most recently, that something was an unfortunate water bottle incident. Once again, I need to pull down my digital life from the internet. The code and assets for this blog currently live in a 500 MB Git repository, which was hosted on Bitbucket until earlier today. Let's try cloning it! evantodd@HW-0063 ~ % git clone…

The Poor Man's Netcode

The more you know about a given topic, the more you realize that no one knows anything. For some reason (why God, why?) my topic of choice is game development. Everyone in that field agrees: don't add networked multiplayer to an existing game, you drunken clown. Well, I did it anyway because I hate myself. Somehow it turned out great. None of us know anything. Problem #1: assets My first question…

The Poor Man's 3D Camera

Each of us have our own giants to face. This is a story about one of my giants. Something I never imagined could make a grown man cry, until it did. A 3D camera. No one can face your giants for you. This is a story, not a walkthrough. Expect no useful information. For that I recommend 50 Game Camera Mistakes by thatgamecompany's John Nesky. His job title is literally "camera designer".

Thirteen Years of Bad Game Code

Alone on a Friday night, in need of some inspiration, you decide to relive some of your past programming conquests. The old archive hard drive slowly spins up, and the source code of the glory days scrolls by... Oh no. This is not at all what you expected. Were things really this bad? Why did no one tell you? Why were you like this? Is it even possible to have that many gotos in a single function?…

The Poor Man's Voice Acting

Allow me to regale you with an exciting tale: the birth of a janky dialogue and voice system. I have a JSON file with all the localized strings in my game, like this: { 'danger' : 'Danger' , 'level' : 'Level %d' , ... } A preprocessor takes this and generates a header file with integer constants for each string, like this: namespace strings { const int danger = 0 ; const int level = 1 ; // ... }…

The Poor Man's Threading Architecture

The game industry hit Peak Advice Blog a while ago. Every day I read skim ten articles telling me how to live. Fear not! I would never give you useful advice. This series is about me writing bad code and you laughing at my pain. First Contact Say you have some voxels which occasionally get modified. You regenerate their geometry like so: voxel.Regenerate(); Because you are a masochist, you want to…

Ludum Dare 34 Postmortem

Friday 21:15 Fifteen minutes after the theme announcement, my friend Ben Homan walks through my front door. Not really my front door, I'm just a subletter. But this is a first. Normally he ignores our instructions to walk in without knocking. The first time, he texted me from the driveway. 21:30 Jesse Kooner walks in, also unannounced, bearing frozen pizza. Before he can even kick his shoes off, I…

One Weird Trick to Write Better Code

Developers hate him! We'll cover some standard tips and tricks here, but we're not really interested in those. We're looking for the One Weird Trick to rule them all. Hopefully each trick we encounter brings us closer to coding Mecca. In the beginning The first video game I ever wrote was called Ninja Wars. Yes, that is an HTML table of images. I changed the src attribute to move stuff around.

The Poor Man's Postmortem - Lemma

The big secret of our industry is, we don't actually enjoy making games. We slave away in obscurity for years in anticipation of one glorious day. Not release day, no. The day we can finally write a postmortem full of pretentious anecdotes, bad jokes, and unsolicited advice. Well I just finished a game, and doggone it, I am going to exercise my inalienable rights as a developer. Lemma is immersive…

The Poor Man's Character Controller

Let's say that, like so many of us, you want to make a surreal voxel-based first-person parkour game. You're trying to figure out a production schedule. What will take the longest? Graphics? Sound? Level design? I bet it will be the character controller. And I bet it will take 4½ years. Why? In running/jumping games, player movement is paramount. It takes forever to nail the right feeling. Each…

Screenshot Saturday 213

It's the end of February and this game is supposed to be content-complete. In a sense, it actually is. All the levels are done. Twenty in all. I thought this month would never end! Just so you know, there are sixty of those lights and I had to hook up each one individually. It fell just barely beneath the "worth it to automate" threshold . Don't look too closely at this next one, it's a bit…

The Poor Man's Voxel Engine

This is not a tutorial. It's a story. A Voxel Odyssey. The story starts with 19 year old me in a dorm room next to the Ohio State stadium. I don't have the repo from this stage of development (SVN at the time), but I remember the process clearly. Photo by Kristen Sutton XNA 4 comes out in September 2010 . I immediately dive in. This turns out to be a poor life decision.

Screenshot Saturday 211

Last Saturday we had the Short North gallery hop . Hundreds of people came through our gallery to see art. The guys helped me set up the Oculus and a projector on the wall. Sometimes I had to go out and pull people in, but most of the time, there was a line. My favorite customer by far was this kid: He jumped right in and played like a pro. The mother (recording video) was super supportive and…

Screenshot Saturday 210

I finished last week's map. It has some spinny things. Then I made this week's map. Who knew purple and green could look so... not terrible? Anyway, this puts me ahead of schedule. There are three levels remaining. My goal is to for the game to be playable from start to finish by the end of February. It's ambitious, but I'm confident I can do it!

Screenshot Saturday 209

This week was crazy productive. I finished last week's level, finished another level, which looks like this: ...which also included some story-related writing and scripting, and actually started working on NEXT week's level, which looks like this: I seem to be on a purple streak lately. Actually, purple may rise unintentionally to be the most prominent color in the game. Also, this last level is…

Screenshot Saturday 208

This week's level is not quite done yet, but I have an excuse! Power was out at the incubator for two days, and the internet didn't come up fully until just yesterday. Still, the level should be done some time this weekend and is already looking pretty good. I finalized the promotional graphics and published the game to Steam in "coming soon" mode . I'm incredibly grateful to Sam Gebhardt for…

Achilles

This past weekend I participated in the CivicHacks "Game Jam for Good". The goal was to raise awareness of the global water crisis and ultimately promote PackH2O , a Columbus-based startup that designs water backpacks for developing water-stressed regions. The jam lasted 48 hours. My entry is called "Achilles". Achilles is a multiplayer text-based simulation. You the player must manage a village…

Screenshot Saturday 207

Records continue to be broken. This week's map was actually done on Wednesday! Although most of Lemma is a strange hybrid of natural and alien-looking architecture, my design calls for a few "industrial / man-made" themed maps. For story reasons, and also because I just want to parkour through a skyscraper. So on Monday I asked Twitter this question: Would people be upset if I do a few levels in…

Screenshot Saturday 206

I moved my office into an incubator / art gallery this week. The move is mostly for my own sanity. Turns out, working alone in your apartment for 9 months isn't the most fun in the world. It's a Herculean effort just to stay motivated. I also lost all semblance of a disciplined sleep schedule. Productivity has been great since the move, and I'm back on a normal sleep schedule. Having people around…

Screenshot Saturday 205

For the first time in the history of Lemma, I'm actually keeping up with my self-assigned pace of one new level per week. These past two weeks I made two more frost levels. The plan calls for one more frost level, then it's on to the other two biomes. Both of these levels have interesting quirks and unique features. They're probably too tough right now, but I'm scheduling plenty of time to…

Screenshot Saturday 203

Big update this week! My voxel renderer now has the capability to overlay everything with any texture I want. I'm using it on a new set of interconnected winter levels. This way I don't have to manually come up with a frosty version of each texture. Without giving away too much, this week I built a new system that has implications for both puzzle solving and movement mechanics.

Screenshot Saturday 202

I've come to several realizations this week. Lemma is going to be good, but not great. I have to accept my limitations and finish the thing to the best of my ability. Lemma is more of an experience than a traditional video game. With these two ideas in mind, I am focusing the next few months on making Lemma the least frustrating, most enjoyable experience I can. So I'm trying to come up with…

New blog, new app, new screenshots

Lots of stuff going on this week. New dev blog First off, my website got a much-needed overhaul. The horrible slowness of Wordpress.com was driving me nuts, so I switched to a custom-built site. I used Jekyll , which is a static site generator. It spits out a bunch of HTML files which you can upload to a server, as opposed to Wordpress, which generates fresh HTML every time someone loads your…

Screenshot Saturday 199

"Level design for days" has been my motto for several months now, and this week is no different. Behold, new challenge levels! These are timed, bite-sized maps with simple goals that can be completed in under a minute. They're the kind of things you can create in the level editor and share on Steam. I need to find a new texture for that garish green material. Lots of other things are happening,…

grepr - 7DFPS 2014

I survived 7DFPS , barely. Here are some fascinating statistics: Days to create an FPS: 7 Hours spent: 93 Levels built: 5 Lines of code written: 2313 Hours to spare before deadline: 2 Functioning brain cells remaining: approximately 4 I'm happy with the result, though. Jack did a great job on the audio as usual, although at the last minute I had to throw in some clunky placeholder sfxr sounds.…

7dfps work in progress

I'm participating in 7dfps this year, which means I'm making an FPS game in 7 days. Here's what I've got so far: In Soviet Russia, you are bullet. In my 7dfps entry, moving and shooting are the same thing. Here's my favorite form of humor: physics glitches. Here's me getting killed: Here's a better shot of the city: Lots to do still.

Screenshot Saturday 196

This past weekend I exhibited Lemma at the Ohio Game Dev Expo . It was an awesome time. Extra Life raised over $9,000 for charity (yes, it is in fact over 9000). The Oculus Rift was a huge hit! I worked on various improvements right up to the expo. First, some new textures for moving platforms and doors: This is the first texture I've created that has any kind of directional meaning. The reason is…

Screenshot Saturday 194

Just a quick update this week to confirm that I am in fact alive. The iOS contract game is just about done. I'm pretty happy with it. Now it's back to work on Lemma: I'll be running a booth, speaking, and participating in a panel at the Ohio Game Dev Expo next weekend! Come on out and hang with us!

Shaders: How Do They Work?

Yesterday I gave a talk at Dev Workshop Conf introducing the basic concepts of vertex and fragment shaders. Unfortunately I don't have a video, just this one potato picture: It's probably for the best, because Chrome locked up on me halfway through. The slide deck is pretty cool though. It includes over 20 interactive WebGL samples, complete with source code. Check it out and let me know what you…

Screenshot Saturday 190

Well friends, Lemma is still on pause while I do some contract work. I also have only a few slides done for my shader presentation next week. This whole month is crazy. But I thought I'd hijack this dev blog to show you the game I'm working on, because it's starting to look kinda cool! It's a top-down iOS survival shooter designed as a sort of franchise tie-in. The budget is pretty low so most of…

Screenshot Saturday 188

I'm taking September off to work for some clients, so Lemma is temporarily on the back-burner. HOWEVER. Wednesday night a certain something arrived in the mail. I immediately tried it out with Half-Life 2 and was shocked at the massive improvement over DK1. I was so impressed that I've spent pretty much every waking minute since then trying to get it working in Lemma. Current status? It's very,…

Screenshot Saturday 185

Hello friends. Yesterday I finished the 5th level! It took much longer than anticipated because it's actually 10 separate maps connected together. It includes some simple but hopefully interesting puzzle mechanics. It also advances the story through notes and several text conversations scattered throughout. It's hard to see in screenshots, but I added a subtle cloud shadow effect as well. It…

Screenshot Saturday 184

This week was a lot of level design. I'm working on a group of "fractured" but interconnected worlds that the player has to progress through. Here's a screenshot: Here's the thread where I got that rock texture. It's a gold mine with a bunch of totally free diffuse, specular, normal, and even displacement maps. Unfortunately that's all I have time to talk about today. Thanks for reading!

Screenshot Saturday 183

I hit a milestone today. Three of the four levels so far in Lemma (Rain, Dawn, and Forest) have undergone at least one massive redesign in their short lifetimes. This week I finally gave the same treatment to the fourth level, Monolith. It is aptly named. Let me try to convey just how monolithic this level is now. This is a perfect example of my patent-pending Design by Trial and Error™ process.

Screenshot Saturday 182

What's that you say? You didn't even notice the absence of Screenshot Saturday last week? How convenient. Let's pretend it never happened. Or rather, pretend that it did. Whatever. MGDS was a huge success! There was almost always a line to play the game, and I got a ton of useful feedback. Here are some pictures: Most of the feedback was related to level design. I came home with a phone full of…

New trailer!

Gearing up for Midwest Game Developers Summit this weekend. Tune in next week for my first expo post-mortem. In the mean time, the old trailer was looking woefully outdated, so here's a brand new one!

Screenshot Saturday 178

Small update. This week was bug fixes and more improvements to the level editor (more on that here) . In other news, we were grateful to get some coverage from Monday Night Indie ! Unfortunately the stream highlighted some pretty major issues with the tutorial, so... Brand new level design! That's it for this week. Thanks for reading.

Screenshot Saturday 177

Our animator Antonio has been hard at work on new animations. Check it out! Guys, the level editor is really close to being done. Here's some cool features: You can link entities together. For example, you can have a door open when the player enters a trigger volume. Or have a light turn on. Or both. The UI now displays buttons for all available commands at any given moment, and their keyboard…