Indiana Jones and the Great Circle

Indiana Jones and the Great Circle title screen

I finally caught up to 2024 and finished playing Indiana Jones and the Great Circle to 100%. I had been putting off starting the game for some time because I’m really not much of a gamer, and I find it oddly difficult to internalize new game control schemes and menu systems. But once I finally picked up the controller, it didn’t take long to get acquainted with the intuitive grip and whip system, and I’m so glad I did, because this game is really something special.

Look and Feel

MachineGames did a fantastic job at matching the feel of the source material. The levels are dense with detail, the typography looks just right, and there are both first person in-game and third person cutscene references to the films’ cinematic choices at every turn. Most notably, the use of hard contrasting light and shadow appears fairly often while exploring. Following along with the game’s story feels like enjoying a lost installment from the original trilogy, which is a bar I didn’t expect it to clear going in.

A spotlight casts Indy's shadow on the wall Carefully placed spotlights and torches regularly cast Indy’s recognizable shadow.

Light shines across Indy's eyes as he thinks Light reveals Indy’s eyes when he’s making a connection or solving a puzzle.

Welcome to Sukhothai screen Open Kapitalen and Eurostile Extended welcome you to new regions and lend film authenticity.

Choosing a mostly first-person adventure also seemed like a big development risk. For an iconic character like Indiana Jones, it’s definitely a choice to not show him for large swaths of the game. To make it convincing, they had to lean hard into what it would be like to be Indiana Jones. So much would revolve around what you can do with your hands and whip and items. Therefore, that in-game system had to feel very comfortable to use and be pretty extensive. I had played a few previous Indiana Jones (and of course, Tomb Raider) games which were all third person, so going in, I thought first person would be weird or off-putting, but this game does it so well that I now prefer it over third person or over-the-shoulder views.

The developers clearly spent a lot of time studying the films. They picked up so many of Indy’s smirks, quirks, and mannerisms, and when combined with Troy Baker’s shockingly accurate voiceover work, you’d be surprised to learn it wasn’t voiced by and motion captured from Harrison Ford himself. The humor from the films is also ever present and used to great effect. Even beyond the dialogue, the yells, grunts, and exclamations all sound so perfect, capturing Indy’s intonation well.

What really put it over the top for me, though, is the music and sound. The game features a lovely and familiar score, threading John Williams’ original themes through new material in a way that sounds completely organic and unforced, rather than just quoting the Raiders March and calling it a day. Sound effects are also very much on point, with whip, punch, and gunfire having the signature cracks, thuds, and pops that seem right out of the films.

There are a few behind-the-scenes videos that go deep into all of this, and I watched them with a big stupid grin on my face. Hearing the development team talk about watching the films together, cataloging the core details that had to be right, and obsessing over everything clearly paid off.

It’s also just a gorgeous game. The id Tech 7 engine looks incredible on modern devices, rendering lighting and geometry in more detail than I’m used to in games (again, I don’t play a ton of games). The amount of just stuff to see in the levels is impressive. I can’t even imagine how long it took to set-dress all these areas. Notably, many of these items can be used as weapons or distractions, including wrenches, frying pans, mops, and bottles.

Indiana Jones turns to think, revealing his adventure companion Gina behind him Just marvel at the level of detail achieved here: The fine individual hair, the wear on the seams of the leather jacket, the distressed fur felt on the fedora, and the specular highlights on the sclera of the eyes.

Looking through a town and down the main river in Sukhothai Every region has loads to explore, little sub-plots to follow, and NPCs going about their business. Some casually relay details or hints towards as-yet-unsolved puzzles.

Gameplay

The game heavily encourages you to lean on Indy’s punch and whip maneuvers rather than using his revolver. Ammo isn’t something to be spent carelessly. Rather, you save it for the moments when you get into a jam that’s larger than you can otherwise take on. But the cost of using a loud weapon is that nearby enemies will overhear it, blow the whistle on you, and rally reinforcements, so you need to pick and choose your battles carefully rather than playing it like a run-and-gun first person shooter. While not a stealth game, climbing, disguise, distraction, and a healthy dose of hand-to-hand combat will get you further than running headlong into battle. Certain classes of enemies will also see through your various disguises and similarly call attention to you, so you need to be aware of who’s nearby.

Looking down from atop a scaffold, reloading Attention to detail is everywhere in this game. Here, the number of remaining shots in the heads-up display corresponds to the number of visibly unfired rounds in the revolver. The reload animation has Indy individually pluck out spent rounds and replace them, rotating the cylinder for each.

The game balances exploration, discovery, collection, puzzle solving, and storytelling well. I rarely found myself spending too much time doing any one of those activities. The puzzles aren’t particularly difficult, with key items often just in adjacent crawlspaces, but they’re also not too simple. They feel calibrated to make you think, but aren’t so onerous that they impede advancing the story.

Along the way, you pick up money, bandages, food, local maps, and books that expand your capabilities. The books are the game’s skill system, where you can improve your abilities like reducing reloading time, increasing damage dealt against enemies, or boosting climb and run stamina, and finding them is a nice reward for exploration. Once learned, they make future encounters progressively more achievable and boost your confidence to take swings at more aggressive confrontations. Indy is a scholar and a problem-solver first, so getting better at the job through research feels like the right approach.

A view of the menu system listing Adventure Books that boost combat skills Acquiring and reading Adventure Books boosts combat, survival, brawling, etc.

Indiana Jones' Pause menu Even the Pause menu looks like it belongs. Also, hey, it’s me: I’m mac_minded on PlayStation and Mac Minded on Xbox.

That Belongs in a Museum

The Order of Giants DLC is a worthwhile addition, though it left me wanting even more time in this world. What MachineGames accomplished here is astounding. Licensed games based on beloved properties like Indiana Jones have a history of often getting surface details right but missing what actually made the source material work. This one didn’t miss. It understood what Indiana Jones is about well enough to make a game that genuinely belongs on the same shelf as the films. I don’t know if it will happen, but I would very much love a sequel.

Using uv with RedHat Python Images

When deploying web apps, I use containers almost exclusively. Containerization lets you package up everything your app needs and ship all of it to a container runtime in a single archive. While it has some drawbacks, it’s still a significant net improvement over web app deployment methods that pre-date it.

I use uv to install dependencies into a container image, but I typically don’t want to create a Python virtualenv within the container because then there are two levels of isolation to contend with. Just the container alone is sufficient. However, I still want all the benefits of using uv, particularly the specific tree of dependency versions and their hashes listed in the uv.lock file. For this reason, I configure uv to install the listed dependencies into the container’s “system” Python at install time, rather than a virtualenv .venv/ directory:

FROM registry.redhat.io/rhel9/python-312:latest

WORKDIR /opt/app-root/src

# Use the "system" Python for uv (the container's)
ENV UV_SYSTEM_PYTHON=1
ENV UV_PROJECT_ENVIRONMENT=/opt/app-root

# Install uv
RUN pip install --upgrade pip==26.0.1 && pip install --upgrade uv==0.11.4

# Copy only dependency files first to cache the dependency installation as its own container image layer.
# --active: prefer the environment specified by VIRTUAL_ENV (in the upstream RedHat Python base image)
# --frozen: treat the versions in uv.lock as the source of truth and skips updating the lockfile
# --no-dev: skip dev dependencies, since this is a non-development environment
# --compile-bytecode: compile Python files to .pyc files to trade CI build time for faster container start time
# --no-python-downloads disables automatic downloads of Python so we use the container's
COPY pyproject.toml uv.lock .
RUN uv sync --active --frozen --no-dev --compile-bytecode --no-python-downloads

# Copy the rest of the codebase in a separate layer
COPY . .

CMD ["granian", "app:app"]

Those options will use uv to install dependencies into the container-provided Python environment at /opt/app-root/ in the Python image rather than creating a new virtualenv at /opt/app-root/src/.venv/. With this, you can omit uv run ... from container commands, cron jobs, etc. Opening a shell into this container will drop you into a place where the dependencies are installed and readily available without having to activate a virtualenv, prefix tool invocations with uv run, or specify a container ENTRYPOINT).

Push Notifications with Brrr

iOS developer Simon Støvring recently launched Brrr, a convenient and low-friction web service and corresponding iOS app deliver push notifications to your iOS devices using only an HTTP request. In this way, it can integrate with almost any service or device that is internet-connected. Options allow you to customize the notification content, alert sound, destination URL, image, and more.

Brrr fills the particular niche of when you want a quick notification from a script, a cron job, or home automation trigger without building your own push notification infrastructure. It’s not the first app of its kind to do this, but it does so very simply. And at $9.99/year, it’s very reasonably priced for what it does.

A Decade and Counting

In 2023, I shared this anecdote at the Pixar Anniversary Awards celebration for people who reached 10 years of employment:

I was late on my first day at Pixar. I’m not one of those perpetually-late-to-everything people. I pride myself on being on time or earlier for events. But on my first day at Pixar in the summer of 2013, I wildly underestimated how long it would take to get from the North Bay to Emeryville during morning rush hour traffic.

As the minutes ticked over my scheduled orientation start time, my palms were starting to sweat against the steering wheel. Cars were barely inching along, and the time kept getting later and later. Soon, the recruiter I had been working with started calling and urgently asking, “Are you still coming?”, and I swore that I was indeed still on my way and it would just be a little longer. Taking a risk, I swerved into the carpool lane for the last mile or so and I arrived “only” 40 minutes late and bolted into the Steve Jobs Building. Graciously, they rushed me over to the theater to catch up with everyone else to watch a screening of Party Central at what seemed like maximum volume, which was a hell of a way to kick start a morning.

So, I want to thank my recruiter for not turning me away when I finally arrived, and want to thank everyone at Pixar for being such a truly wonderful group of people. I love working with all of you and look forward to the next decade. I promise I’ll be on time.

It’s been a few years since that ceremony, and Pixar continues to be a place that inspires me to do my best work. The care and enthusiasm everyone pours into their particular craft is, I hope, evident in our body of work.

What inspires me to do my best work? A few things I’ve identified over the years.

The first and most important, I think, is being given the authority and autonomy to gather requirements for, design, engineer, and ship tools that help people get their job done. These tools provide users with more time to focus on doing creative work rather than wrangling minutiae, and it’s rewarding to be able to turn an idea into a released product without a bunch of red tape.

Working alongside people who genuinely give a damn about their work is also crucial, particularly people will give honest critical feedback when my own work isn’t up to par. We hold each other’s standards high, and do so with respect, where the goal is to lift up the work and not drag the other person down. And very often the best technical solutions win because the right answer, once someone speaks it into the room, is clear to all involved and we move forward in agreement.

There’s also the proximity to the actual creative work. I’m not working at a generic enterprise software shop or a big tech company whose users are scattered out in the world. The end users of the tools I create are animators, producers, production staff, and so on. When my tools work well, it ripples into a film, even though I’m not among those who touch the film’s pixels directly.

Finally, there’s the constraint of a specific, known audience.1 Building for co-workers is different from building for “users.” I know many of them by name. That specificity tends to produce more considered work than if I’m building for an abstraction. And the feedback I get about the work is everywhere, from conversations in Slack to spontaneous “Hey, wouldn’t it be cool if…?” spitballing in the lunch line.

None of this is a recipe, and I’m not sure it’s replicable. These are conditions I largely stumbled into, often by luck and the kindness of others, and only later learned to recognize as what was making the work feel meaningful. After more than decade in, I’m still here, which probably says something about how rare that is to find.


  1. Building for a specific audience is also convenient and beneficial from a technical standpoint because the target devices are a much more limited and homogenous set, for example, modern “evergreen” browsers and Apple platforms. I can therefore take advantage of new features and APIs quite readily, and more quickly deprecate and remove cruft. 

Going Electric

I am done with gasoline and I’m never going back. Early last year, I sold my gasoline-powered car and went all in on an electric vehicle. I skipped right over hybrids, which I viewed as being burdened with the additional complexity of having to haul around two sources of locomotion. I figured that if I was going to try something new, I should just make the switch and not try to hedge against the new thing at the cost of added complexity and maintenance. Electric vehicles are well enough established (particularly in California) that there was little reason to avoid making the jump, and I’m so glad I made the switch.

After checking out everything from the large F-150 Lightning down to a petite little Chevy Bolt, I settled on a used 2022 Volkswagen ID.4 which had just come off lease. With only about 20,000 miles on the odometer, it was still very much like new. But the fact that it was previously a lease meant it was likely handled carefully, and the fact that it was now used meant it was extremely affordable for an EV at a time when EVs are often more expensive than gas vehicles. I ended up paying about $25,000 for it, and that felt like a steal for what I got.

This being my first EV, I was initially a little bit wary about going electric, but now that I have a year’s worth of daily-driver experience with the technology, it’s so crystal clear to me that this is the future of vehicles and that the internal combustion engine’s best days are behind it. It feels like a seismic shift both in the way I drive and use energy.

Like most EVs, the ID.4 has some really great features. The very first difference you notice is the instant acceleration. You start moving the moment you press the pedal. The best way to describe it is like the difference between pre-iPhone touchscreens which often struggled to keep up with the movement of your finger, whereas the iPhone made the screen contents feel like they moved directly with your finger. EV acceleration feels tactile and direct, rather than propagated through a buffer delay. Because it’s electric, the ID.4 moves so smoothly and quietly that it really feels like a much more expensive luxury car. It also has a tight turning radius and can thus easily achieve a 180 degree turn-around inside the width of a narrow street without having to perform a multi-point turn.

I was coming from a 2009 Toyota Corolla base trim, so many of the features of the ID.4 are just the current state of vehicles made within the last decade and not EV exclusives, but are nonetheless delightful to have, including:

  • Illuminated exterior and (RGB) interior handles
  • Comfortable heated seats
  • Heated steering wheel
  • Remote climate control
  • Back up camera
  • Side mirror lane occupancy indicators
  • Built-in USB-C ports
  • Apple CarPlay

CarPlay, in particular, was a must-have. The Chevy dealer tried to convince me that GM’s Bluetooth solution was still very good, but I wasn’t having that at all. The ID.4 also has walk-up unlock, walk-away lock, and auto-enters Park, so I never really think about what mode the car is in: I walk up (it unlocks), I get in, buckle, drive somewhere, stop, unbuckle (it enters Park), then I just get out and walk away (it locks). I never have to think about turning it on or off myself, making for a frictionless experience.

The ID.4 has two drive modes, “D” and “B”. D mode (the default Drive mode) makes the car drive much more like gas car, with the ability to coast for longer distances and do little regenerative braking. But toggle into B mode and the car behaves more like its true EV self, doing more aggressive regenerative braking when you ease off the accelerator pedal, allowing you to recover some electricity while cornering or going downhill. It took a short few days before B mode was far and away my preferred mode, making the D mode (and thus the behavior of gas cars) feel almost slippery by comparison.

The major consideration when choosing an EV is how and when you’ll charge the battery. Chargers are popping up in more and more places, but you very likely spend a lot of time not driving with the car parked somewhere for hours at a time. That’s probably the best time and place to charge. A couple years ago, we installed a modest home solar and battery storage system, and adding a home EV charger (Level 2 @ 220V 40A) charger later was a straightforward addition. While I could have achieved sufficient charging without any special charger using a regular household plug (Level 1 @ 110V 15-20A), the Level 2 home charger makes filling up my car only take a few hours and is easily done while I’m sleeping or working from home while the sun is shining on the solar panels. Powering my car is now effectively free using energy from the sun instead of disposable energy from oil. I can plug in at convenient times and almost always have a “full tank” ready to go without having to consider the gas station on the way home since my home is the station. And so is my work. And the grocery store. Almost every destination has something available or nearby, but having a sufficient charger at home is what really puts “range anxiety” fears to rest.

On the interior, one of the compelling reasons for choosing the ID.4 was its minimalist, unadorned heads-up display. The dashboard user interface is big, bright, and clear, with simple numerals for the speed, flanked by cruise control and next-turn instructions (which can use the built-in navigation or CarPlay). This approach was not true for the Kia Niro, which had a fake analog speedometer needle and gradients and shadows abound.

ID.4 Dashboard

There are a few things that could be better, though:

  • The steering wheel and center console use touch controls, and while they’re not easy to press accidentally, they do require you to look away from the road to adjust. In my Corolla, I could adjust the heat mode, fan speed, and temperature by feel alone, and that felt safer. VW is, thankfully, moving away from touch controls in future models.
  • Remote climate control sometimes takes a minute or more to respond. I never had this feature at all before, though, so any availability was still a welcome feature.
  • Wireless CarPlay is convenient, but a little laggy and skips occasionally. This might just be wireless CarPlay’s fault and not VW’s. Wired CarPlay via USB-C works reliably, is very responsive, and charges my phone faster than the available Qi charger (and with less heat).
  • I wish the VW app had a web app counterpart. How hard could this be, given they already have an app?

Minor gripes aside, none of these are dealbreakers. Overall, the ID.4 is a competitively priced EV that was, for me, a great entry into the world of electric vehicles. My experience so far has been extremely positive, and if it were totaled, I would buy one again in a heartbeat. I’m never buying a gasoline-powered anything again.

Mastodon