My Setup

I am a software engineer by nature, and I focus on building tools for other developers, both for my employer and for personal, open source projects. I work full-time remote, and spend most of my time on a Mac, but I also support developers on every major OS.

In my free time I play a lot of video games, on a variety of platforms, but I have strong opinions about which ones are “best”. I have done my best to keep gaming-specific items in a separate section.

I’m grateful and privileged to be well employed and capable of buying quality gear. I appreciate that not everyone can afford such luxuries. I hope that someday the world will have enough social safety nets and universal benefits that everyone could have the same opportunities. #unionize

Continue reading »

Meta Tech Podcast #57 - Writing and Linting Python at Scale

I joined Pascal Hartig on the Meta Tech Podcast, episode #57, to talk about Fixit, the new open source linter I’ve been working on, how and where Python is used at Meta, and how the Python Language Foundation team supports thousands of engineers, data scientists, AI and ML researchers, and anyone else who uses Python to get their work done.

You can find the episode in your podcast app of choice, or listen right here:

Episode photo, of Pascal and me laughing

Fixit 2: Meta’s Next-Generation Auto-Fixing Linter

Let’s talk about my newest open source project, built as part of my effort to improve the linting ecosystem at Meta:

This year, we have been building a new linter, Fixit 2, designed from the ground up to make developers more efficient and capable, both in open source projects and the diverse landscape of our internal monorepo. At Meta, we are using Fixit 2 with a few early adopters, and plan to roll it out to the rest of our monorepo soon. But any developer can use it to perform auto-fixing more efficiently and make faster improvements to their own codebases.

Something I don’t get to talk about enough is just how much I truly appreciate the ability to spend my time at Meta solving problems with open source, and that I can share my work with the rest of the world. Fixit is the third open source project that I’ve had the privilege of releasing at Meta, and I believe Fixit makes it easier than ever before to build new lint rules for Python, a powerful tool for any Python team.

Writing a new lint rule can be done with less than a dozen lines of code, and test cases are defined inline. You can even place it right next to the code that it will be linting:

# teambread/rules/
import fixit
import libcst

class HollywoodName(fixit.LintRule):
    VALID = [...] # no lint errors here
    INVALID = [...] # bad code samples here
    def visit_SimpleString(self, node: libcst.SimpleString):
        if node.value in ('"Paul"', "'Paul'"):
  , "It's underbaked!")

Unlike other new linters on the market, Fixit is uniquely focused on reducing the barriers to writing high quality, auto-fixing lint rules in pure Python, without needing to learn Rust or any other language. We believe that having targeted lint rules with auto-fixes is key to improving developer productivity even more than having the fastest possible linter:

When running Fixit 2 with auto-fixing lint rules, any code that triggers the lint rule is an opportunity to get an automatic replacement, improving the codebase with less effort from the developer. Applied more broadly, Fixit 2 can even be used as a tool to enact sweeping codemods against a large codebase while leaving a lint rule in place to handle any matching code in the future.

Fixit 2 is already available on PyPI. You can pip install fixit and start using it with zero configuration.

We have a roadmap with plans for future improvements and features, and a rich set of documentation and user guides to help you get started with Fixit 2 in your own projects or repositories.

My Name is Amethyst

My name is Amethyst.

I am a trans woman — wife, cat mom, daughter, and sister. This is who I am.

  • You can call me “Amy” if you’d like.
  • Please use she/they pronouns when referring to me.
  • Please do not use my old name, even when talking about past me or past events.
  • Please do not ask personal questions about my transition.

I started this journey over four years ago, but the difficult parts have only just begun. I greatly appreciate all of your love and support.

Thank you! 💜

Talk @ PyCon US 2022: Open Source on Easy Mode

My PyCon talk “Open Source on Easy Mode” is available to watch on YouTube, but I made a bold decision this year to give my talk using an iPad.

It turned out to actually be “PyCon Talk on Hard Mode” instead, because nothing went right.

It’s March, and I’m writing my talk. I care enough about style, typography, and legibility that I need tight control over fonts and themes. I lean heavily on Keynote and Adobe Fonts, with screenshots of oversized 42pt type in my editor of choice to get the best results.

And because I’m never good at extemporaneous speaking, I write a full script ahead of time, and keep that script in the speaker notes, so that in the worst case, I can fall back to orator mode. This all means I need tight control over the device that I’m presenting from.

But the only laptop I have is my employer’s, where installing fonts is complicated and a grey area that would require mixing my personal Adobe account with professional work tools. Every other device I own is a desktop, tablet, or phone.

Even more, I’ve never liked having to bring a big bag and heavy laptop just to give a presentation. Carrying four pounds of gear around all day sucks, and I’d much prefer something small and light enough to fit in my everyday bag.

That’s when I get The Idea:

“Why not give the talk using my iPad Mini?”

Modern iOS includes Keynote, and I can use the Adobe app to install my fonts system-wide, just like on my Mac, and Keynote can use them perfectly fine.

I pulled out my USB-C HDMI dongle, and while normally the iPad just mirrors the device over HDMI, Keynote will actually show the slides at full screen over HDMI, while showing the presenter notes on the iPad itself, just like a laptop. It would even render 16:9 when presenting!

I double check on my monitor’s input stats, and it’s outputting a 1440p signal. This might actually work!

It can’t be this easy, right? Am I crazy?

Seriously considering giving my PyCon talk using just an iPad and leaving my laptop at home. 👀

— Amethyst Reese ✊🏳️‍🌈🏳️‍⚧️ (@n7cmdr) March 29, 2022

I tried it with other monitors and my TV, and it seemed flawless. I did full dry runs using my iPad, and even paired my trackpad and keyboard to the iPad and edited the rest of the talk on the iPad. I was convinced I wouldn’t need my laptop.

A week before the event, I committed.

We fly to SLC, and I’m continuing to practice—and edit—my talk on the iPad. The morning of the talk, I immediately head to the green room and test my setup.

No issues.

This is actually happening!

I come back after lunch. The volunteer walks me to the room I’m presenting in.

I say hi to the staff, drop off my bag, get mic’ed up, walk up to the podium, plug in HDMI, trigger Keynote, and …

The A/V system is only rendering my slides on the left half of the screen, squashed into the wrong aspect ratio.

It’s OK, we’ll just unplug and re-plug.

But no matter what I or the A/V staff do, my slides won’t show up correctly.

We delay the start of the talk; people are still filing in bit by bit. The host tries to lighten the mood and asks me a couple filler questions to stall for time.

Time flies while we’re desperately waiting to see if this can get fixed. Before I know it, it’s about 8 minutes past the original start time, and the host asks if I just want to get started anyways.

I say yes, because bad slides are at least better than no slides—or no talk.

Now, my topic was intentionally broad in scope, and I had a lot to cover. I had already planned to talk fast to get through everything. During rehearsals, I cut content so that I could consistently finish at almost exactly the 30 minute time slot.

But now I’m already behind.

I had Keynote set up to show me a timer, so I would know how I was doing on time. Ten minutes into the talk, and the host is already showing me the “15 minutes left” card. I’m talking as fast as I can, but also stumbling under the pressure. I’ve gone from speaking to reading.

At 13 minutes, an A/V expert manages to fix the output of my slides, but it’s too late for the demo of “thx” that I was the most excited to share. I wouldn’t find out that they were fixed until much later. Nothing mattered if I couldn’t finish the talk.

Moments later and they show me the “10 minutes left” card. They’re not giving me the full half hour. I start dropping phrases or sentences where I can to make up. I don’t think I’ve ever talked this fast in my life.

At 18 minutes, they give me the “5 minute warning”.

I make it to the final section (well ahead of my original expected pace, mind you) and get the STOP card. I power through 8 slides in 40 seconds, but the “ums” return as I have to make it all up on the spot.

I close out the talk with a total runtime of just about 26 minutes.

The polite applause starts, and I manage to get myself off stage with a shred of dignity in tact. As they’re removing the mic, I thank and apologize to the A/V crew for causing so many problems. 😅

I find out that—for reasons I will never understand—the iPad was only negotiating a resolution of 1080i (interlacing!) instead of the 1080p that their system was expecting.

Why 1080i? Because technology!

And why did that break the A/V layout? No idea.

But thankfully, even after my mediocre delivery, the smashed slides, and flickering output, there were still folks that stopped by to say hello, compliment my talk, and ask questions. Sadly, my brain was toast, so I have little memory of who they were or what we talked about. 😓

I don’t know if I’ll have the opportunity to give this talk again in the future, but I’m planning to re-record it at home soon. Maybe I can talk at a more reasonable pace, and actually make it through with all of my content in one piece.

But there’s one thing I know I’m doing the next time a talk gets selected for PyCon, or any of the wonderful regional conferences I love attending:

I’m using my iPad to present! 💪

Talk Python #304 - asyncio all the things with Omnilib

I joined Michael Kennedy on the excellent Talk Python podcast, episode #304, last week to chat about the Omnilib Project, an organization of open source packages I started, and how they fit into the modern world of Python and AsyncIO. We also discuss how I got started in programming and Python, with a rare glimpse into just how nerdy I was as a child. 😅

Listen in Overcast, any podcast player, or right here:

Talk @ North Bay Python 2019: What is a Coroutine Anyway?

Back in 2019–remember the before times?–I gave a talk at North Bay Python 2019 on the topics of coroutines, AsyncIO, and how they work. It’s a crazy journey from bytecode and runtime instructions to building our own terrible event loop in pure Python using nothing but generators and tears. Enjoy!

And if that was too slow, don’t miss the shorter rendition of this talk that I gave at PyCascades 2020, right before COVID ruined everything.

I Am a Gender Fluid Person

I am a gender fluid person. My preferred pronouns are they/them.

This is difficult for me to say publicly. I’ve been trying to find the right time and the right words for over a year now.

Most of my life, I’ve known deep down that I didn’t fit into the traditional male gender role or expectations, even if I didn’t understand what that meant. I was often insulted, ridiculed, or harassed on a regular basis for being myself. I learned through trial by error how to “blend in”, and suppressed other emotions or behaviors for fear of how I would be perceived by everyone else. There wasn’t a lot of introspection involved–just reactions to external judgement. Without the vast array of media that’s now become available to everyone these days, I don’t know that I could have fully understood who I was even if I’d tried. I just didn’t have the conceptual framework or cognitive tools necessary to unpack notions of gender roles, let alone to analyze how they affected me or my own position within them.

But now I do, and I’ve become more aware of who I’ve been all along. The past few years have been a slow awakening and acknowledgement of how I feel and what truly makes me feel happy. It’s complicated, and I don’t claim to have a full definition of who I am, but I like to believe it includes some combination of courage, femininity, intelligence, empathy, and emotional strength. I’ve started to embrace this in what I wear and how I express myself as a person. I’ve bought and worn more “women’s” clothes, shoes, and accessories in the past two years than traditional “masculine” items, and it’s been absolutely liberating. Some of my closest coworkers, friends, and family have seen a small number of these over the past couple years, but I suspect most have not realized what they were seeing, because they only see what I’ve been willing–or felt safe enough–to share with the rest of the world.

I live in daily fear that expressing my true self in public may result in uncomfortable, dangerous, or even deadly consequences. Transgender, non-binary, and queer people face incredible risk in our society, just trying to live as who we are. As we become more visible in society, the number of hate crimes being committed against us is increasing. Even in progressive areas, I’ve witnessed name calling and harassment of queer people by bigots who thrive on intimidation and violence. This is absolutely unacceptable in our society, but it “works”; fear is an effective tactic. I’ve refused to wear overtly feminine clothes in public, because no matter how many allies I have in this world, it only takes one asshole to ruin–or end–my life, and I can’t know who they are until it’s too late.

Coming out here won’t change that. I already expect to see harassment–or at least be treated differently–by those who read this. I’m prepared to delete comments, and block people online or in real life, that refuse to accept me for who I am. Being visibly queer will most likely carry a stigma and risk for the rest of my life, but maybe it will also let me be more comfortable around those that do accept me, and that alone will be worth it to me. I don’t know if I’ll ever feel safe being myself in public, but I’m fortunate to now have a full-time remote position at one of the most diverse and accepting companies I’ve ever seen, increasing the time I can spend with my best friend, being the person I’ve always been. Over time, I’m sure that how I express myself will change and adapt as I learn more about myself and what makes me happy. I hope that some day I can feel safe enough to share more of my authentic self in public as well.

I’m truly thankful to have an amazing best friend, wife, and soul mate in Ember, who truly accepts and embraces me for who I am. She is, and always will be, the love of my life. At every step of this journey, she has been my rock and my guiding star, and I will never be able to express just how much it means to have her support.

I would also like to thank my friends, coworkers, and every other visible queer person I know that took these steps before me, so that I can more easily understand who I am and who I want to be.

Talk @ PyCon AU 2018: Refactoring Code with the Standard Library

A week ago today, I gave a talk at PyCon Australia in Sydney. I discussed refactoring in Python, and how to build refactoring tools using nothing but the standard library, building up from concepts to syntax trees to how the lib2to3 module works. The talk finished with the announcement of the open source refactoring framework I built at Facebook, Bowler, which I built using those same concepts. I really appreciated the questions from the audience and in the halls afterwards, and we really enjoyed our time in Sydney. Thanks to everyone that made PyCon so great!

Talk @ PyCon US 2018: Thinking Outside the GIL

This past Friday, I presented a talk at PyCon US 2018 – the first time I’ve been fortunate enough to attend. The talk was focused on achieving high performance from modern Python services through the use of AsyncIO and the multiprocessing modules. The turnout was better than I could have ever expected, and I was really happy to hear from everyone that stopped by the Facebook booth to ask questions, discuss Facebook engineering practices, or even just say “hello”. Thank you to everyone who made my first PyCon amazing!

Interview: PyDev of the Week

This week, I was interviewed by Mike Driscoll of Mouse vs Python for their “PyDev of the Week” series, focusing on developers in the Python community.

A short quote, and timely announcement:

I’m currently preparing a talk for PyCon 2018 on using asyncio with multiprocessing for highly-parallel monitoring and/or scraping workloads. To go with this talk, I’m working on some simple example code that I hope to publish on Github. This will be my first major conference talk, so I’m both excited and absolutely terrified! 😅

I’m looking forward to giving that talk, and will post a video here afterwards!

Elite Dangerous

It’s no secret that I’m a huge fan of space, video games, or video games set in space. I was a very early backer of Star Citizen, and am still eagerly awaiting the release of the persistent universe. But I also backed Elite: Dangerous as well, and although the initial scope was far more limited than Star Citizen’s, Elite has already seen a “1.0” release, and I’ve been playing it an awful lot, all the way up from the first beta.

And damn, it’s good!

Voyager 1, found in the Sol system, ~2M Ls out
Voyager 1, found in the Sol system, ~2M Ls out

The discipline and focus of the team at Frontier Development has produced one of the most polished space sim games I’ve ever played, and while there are plenty of gaps in features compared to the competition, everything that’s there is done so well that I continue to be impressed every time I get in that cockpit and launch into the void.

After putting dozens of hours into the final release, I’ve gathered a few notes here that will hopefully help others in their journies to the stars. I will attempt to keep this up to date for as long as I’m playing the game.

Continue reading »


When I was in elementary school, I discovered a series of books in the library that detailed, in glorious full page color, photos of the outer solar system as captured by Voyager 1 and Voyager 2 on their epic journeys to places never before explored by humanity. I was so stunned and enthralled at the thoughts of visiting those distant worlds; it indeed captured my imagination, and continues to inspire me even now, two decades after I first learned of their amazing quests.

Jupiter's Great Red Spot, as photographed by Voyager 1
Jupiter’s Great Red Spot, as photographed by Voyager 1.

I’ve spent countless hours dreaming of visiting the planets and stars of our universe: in games like Wing Commander, Freespace, Freelancer, Mass Effect, and X3, exploring fictional galaxies, and in Orbiter Sim, recreating my own journeys to the planets and moons of our own solar system. I can’t wait for Star Citizen and X Rebirth to give me further ways to escape the confines of Earth and experience worlds that I will never be able to visit otherwise.

Volcanic eruption on Io, as photographed by Voyager 1
Volcanic eruption on Io, as photographed by Voyager 1

And I have NASA to thank for inspiring so many of these wonderful outlets, from the Mercury, Gemini, and Apollo projects that took us to the Moon, the Voyager missions for showing us just how beautiful our own back yard really is, to the Mars rovers for exploring our closest neighbor, and to future NASA missions like New Horizons that are leading the way towards understanding our tiny place in this vast universe.

The Voyager probe.
The Voyager probe.

Today, it was finally confirmed that Voyager 1 has indeed crossed the boundary of the heliosphere and forever left our solar system behind.


I simply find it incredible that not only is Voyager still working after four decades of exceptional service, but that it’s still capable of aiming its antennas at Earth, sending a coherent signal using only 23W of power, and actually sending useful data back to us. That alone is a hugely amazing achievement, and I think everyone at NASA should be eternally proud of their accomplishment. The fact that we now have even more data points regarding the boundaries of our solar system is just pure icing on top of that cake, and I congratulate everyone involved in the project.

If you asked me what my favorite spacecraft is, fictional or not, it wouldn’t be the Enterprise, the Millenium Falcon, the Normandy, or even the Apollo rockets; it would be Voyager. And it will forever hold a special place in my heart.

So thank you, NASA. Thank you.

Android is Better

Paul Stamatiou, on falling in love with Android:

I set out to write an article about how I feel Android provides unique affordances that create a unique cohesive mobile experience (more on that below) rather than talking openness, features and apps. However, the more time I spent living with Android it became obvious that being able to do anything and suit a variety of needs is a pillar of the Android experience.

I was trying to find out why Android felt so remarkably different to use, beyond aesthetics. I found there are a few pieces that help contribute to this magical user experience: the global back button, intents and Google Now.

Delight. It’s what designers strive to produce in the experiences they craft. Google Now has hit the nail on the head. I can’t even count the number of times friends have pulled out their phone to show me the smart things Google Now did for them.

Using Android feels like one fluid experience.

And it just keeps getting better and better!

Say "Yes" to JavaScript

Armin Ronacher, on Firefox’s removal of the option to disable Javascript:

My immediate response to change of removing the switch was: “Thank god, that should have happened ages ago”.

You don’t get extra privacy by disabling JavaScript. I can fully track you even without JavaScript. At the same time I can enhance your browser experience through better written JavaScript code that allows me to do things with your browser that plain HTML does not allow.

If you’re really paranoid about your privacy, use Firefox, enable the Do Not Track flag in your options, enable click to play for plugins like Flash or Silverlight, and install the Ghostery and Adblock extensions. Anything else is just going to break the web at your own expense.