My Kunekune piglet, Charles Junior. Because Medium appears to require a photo preview.

UPDATE 2/17: Added backup tweets from former Angular Team members Caitlyn Potter and Rob Eisenberg.

Update 2/18: Added backup tweet from former Angular Team member Marcy Sutton.

On Friday, I tweeted something that I should have spoken up about years ago.

I waited this long to speak up because I, like many others, have held out hope that things would get better on the Angular team, and that the problematic people could be reformed. I was naive, and time’s run out. There are many in the community, inside and outside the Angular team, who have had similar experiences and conclusions as me, but have not felt safe to come forward. I don’t feel safe either, and I fully expect consequences for speaking up. But I feel an obligation to speak up on behalf of myself, and more importantly, those who have less privilege and have more to lose if they dare to criticize members of the Angular team.

I’ve heard from several friends on the Angular team that they feel my tweets calling out the toxic culture on the team were an attack on the whole team. I fully empathize with that, and I’ve felt the same way when past team members like Rob Eisenberg spoke publicly with their criticism of the team. I remember reading Rob’s post and feeling betrayed at the time, but also agreeing with (almost) everything he said. I now appreciate what Rob did, even though it didn’t change anything internally.

I regret that my Tweet left the community to wonder “which Angular team members is the beard guy talking about?!” I want to reiterate that the Angular team is full of amazing people. No one on the team is evil. I also don’t think the team’s problems boil down to a single person. Since I’ve left the team 3 years ago, many friends who’ve stayed on have made me believe the problem has spread, so I challenge all current members of the Angular team to evaluate ways in which you might be perpetrating toxic behaviors, or enabling abusive behavior in others on the team.

There’s also a mixed experience of people on the team, those who clearly experience and recognize the deep long-term problems on the team, and those who think it’s a little toxic maybe, but no more toxic than other teams. “Nobody’s perfect.” No one from the team who’s reached out to me has said it’s a healthy environment, even those who reached out to take issue with my tweet. Maybe there are some who’ve never felt worthless or ashamed of their shortcomings on the Angular team, and I’m happy for them! All I ask of those team members is to listen to the experience of others around you, and resist the urge to explain it away. Consider that your colleagues, myself included, might not be making these experiences up, or misinterpreting every situation.

My Experience

I’m going to share a little bit of my experience on the Angular team, which has a lot in common with many other people who left the Angular team (or are still on it). I don’t want to write this, but I want to clear as much confusion as I can, and most importantly, I want to remove the shield of superficial kindness and positivity that folks on the team have been able to hide behind all these years. Several people who’ve seen my tweet have told me they’re worried that the team might try to blacklist me or my company from the Angular community, which in and of itself shows just how much insiders know the lengths that certain people will go to in order to protect the image of themselves and the Angular team.

This is a long story because it’s hard to understand a toxic environment from just an example or two, you have to see the full arc. Even with the examples I share, it might still be hard to grasp. It’s just one person’s story, but it’s not unique.

Jeff the Noogler

When I joined Google in April 2013, Brad Green was my manager. Brad had recruited me to join the team because he liked the way I thought about developer experience, as I’d demonstrated in a project I worked on with two friends prior to joining Google, deployd.com. Brad and I would meet for our 1:1s and coordinate what projects I should work on, in addition to my regular team duties of fixing AngularJS bugs, preparing for releases, triaging Github issues, helping other teams at Google with Angular, etc. But even though Brad and I agreed on priorities of what the highest impact items I could take on were, I didn’t have much autonomy to see those projects through as I expected.

Back then, the daily routine for myself and other individual contributors on the team was to come in, get to work, and get as much done as we could before Igor would interrupt and tell each of us what we’d actually be doing that day. I asked Brad during my 1:1 how I should manage the projects he and I were working on together, while every day I was getting different orders to take care of whatever Igor decided was best for me to work on that day. I quickly learned that Igor, despite being just a Tech Lead with no management authority, was the one really calling the shots on the Angular team. And by “calling the shots”, I mean he controlled nearly everything that each team member would do every day.

Well, not everyone. There were people Igor trusted and respected, or who were peers or superiors in the organization chart, whom Igor didn’t have much direct authority over. Because of the power dynamics, or their personal friendship with Igor, these people would over time be unable, or unwilling, to fully understand or empathize with what myself and others on the team would share about our experiences, when we had the courage to share.

Fitting In

For someone who highly values personal autonomy, being micromanaged was a hard thing for me to get used to, but being the new guy on a team of 5 people, I was eager to show my value to the team and go with the flow. And it was clear that Igor was the one to please if you wanted to have a pleasant time on the team.

Jeff’s First Angular Team Meeting!

My first meeting on the team was exciting, because one of the agenda items was to talk about how to communicate what AngularJS is to people who’d come to our booth at Google I/O (or some other upcoming conference). I had some experience with some mature open source projects before, and had some insights to share about communicating with developers. When we started discussing how to position the framework, I suggested that since most users are coming from other libraries or frameworks, we should communicate Angular’s philosophies to them in terms that they could relate to libraries or frameworks they already know. But before I could even get out one sentence, Igor interrupted me and said, “We don’t bash other frameworks.” Then without missing a beat, and without allowing me to follow-up, he went on to explain to the rest of the team what things to say, and what things not to say when talking about Angular. I looked around to Brad, Misko and others on the team to see if they noticed how rude he’d just been, but no one seemed to think it was odd. To his credit, it was efficient. We didn’t have to think about it or discuss it. He probably wrote a doc with the approved talking points, because he REALLY wants the team to stick to script. It might sound like not a big deal to be sidelined in team meetings, or to be talked over as if you weren’t even speaking, but this is just one of many manifestations of a million micro aggressions that occurred on a daily basis on the Angular team.

I don’t remember a single team meeting where there WASN’T an incident of one of the tech leads talking over someone mid-sentence to completely dismiss what they were saying (often without actually understanding what was being said) and move on without further discussion. If you’re on the team, you might have gotten used to this. But look for it in your interactions, or think back to recent meetings.

The Porn Server (a.k.a. Jeff’s First Project)

After a couple of weeks of orientation, my first official Google project was,… to move angularjs.org off of a “porn server”, a server that was hosting some porn sites, and of course angularjs.org — the Porn of JavaScript Frameworks™? Seemed like a good idea to me, and I was happy to take it on because it gave me the opportunity to learn some new things like nginx and the then-new Google Cloud Platform. As part of the effort, I also got to be one of the first dogfooders of the new Protractor e2e testing tool that Julie Ralph at Google had created. I created several e2e tests to make sure the docs site was working correctly, and health checks that would run every 15 minutes or so from our Jenkins machine.

In a few weeks, everything had been transitioned to the new environment on Google Cloud Platform, and my first project was done! But at some point after that, the health checks started failing because of a code change on docs.angularjs.org, so I chatted with Igor about it, and we decided to temporarily disable them because we had something higher priority to take care of and couldn’t get to it right away. I’m not sure how long the health checks were disabled, but some day shortly after, the docs site went down for an hour or so without any of us realizing it, because of the disabled health checks.

I was embarrassed by the downtime, and Igor was furious. He asked me why the tests didn’t catch it, and I explained I’d disabled them as we’d discussed, and hadn’t yet gotten to fix the tests, so hadn’t turned it back on. So in front of Misko, Vojta, and maybe a couple of other team members (plus everyone within earshot in our open floor plan), Igor loudly and angrily told me all the ways I’d fucked this up, denying he ever knew they were disabled, and storming over to Brad Green’s desk to ask him to go for a jog (where Igor and Brad would often have their 1:1s).

I figured I was about to be fired, just a couple months after moving from Arizona to California to join the team. While I was being reprimanded, I remember looking at Misko and Vojta, expecting one of them to defend me or at least object to how I was being treated, but they both glanced at me and just looked back at their computers as if nothing was happening. They must’ve either thought that was a reasonable and proportionate response, or not wanted to confront Igor about his behavior. I wanted to just get outta there and go home, but I had to fix the health checks right away then put on a happy face to host the Angular Mountain View meetup with a couple hundred attendees. I couldn’t believe I was watching the guy who’d just berated me in front of my colleagues a couple hours earlier, now smile, laugh and mingle with the meetup attendees as if life was great.

Jeff’s First Postmortem

Since our docs site being down for an hour seemed like a huge deal, the next day I wrote an apologetic email to Brad, Igor, Misko and the other few people on the Angular team, then wrote up a full postmortem on exactly what happened, and what I was doing to fix it. I felt like I’d let the team down, and wanted nothing more than to fit in and be accepted at that point. So I put my projects on hold and decided to focus on doing whatever Igor asked every day, and make sure I did it well. And actually, giving up on my own projects and doing what was asked of me made me happier. I felt like I had Igor’s approval, and at least enough respect to trust me with the odds and ends that no one else had time for. As an aside, I love well-constructed postmortems, and still use them when I screw something up.

Stranger Things

As I got more acquainted with the team, I noticed more things that felt off to me. One uncomfortable thing was the implicit “code of positivity” on the team. After all, everyone in the community knows us as the “You Can Sit With Us” team! There was a sort of assumption or pressure on the team to always act as if everything was great, even internally. If you can’t frame something positively, don’t say it. Or if you don’t have a solution, don’t complain.

There are certain issues that are impossible to frame positively, so rather than try to figure out the accepted way of bringing up uncomfortable issues, we all maintained the status quo. One effect of this is that people who are struggling on the team will see that everyone else is happy and in alignment with the leadership. “Obviously something is wrong with me, or they’re out of place if I’m not happy and in agreement.” Coincidentally, soon after we’d been having some design discussions in which myself and a couple of others had pushed back a lot on ideas we didn’t agree with, Igor had emerged with an Angular Community Communication Guidelines with advice to “be positive” or “provide constructive feedback” and not say “I hate this”.

Mandated Behavioral Masking is Ableism

In a team with mutual respect and trust, a team should be able to express how they feel about something, even if it’s not easy to say or hear, as long as it’s done respectfully. I tell Victor Savkin I hate something at least once a day! It’s an especially hard ask for people with mental issues like Autism Spectrum Disorder to have to put that much thought into rephrasing your intent in a way that meats some arbitrary social rule…but I digress. I was pretty proud that this sentence felt written just for me:

Be authentic. If you are nerdy, emotional, quirky, or funny that’s ok, as long as you don’t break the other principles in this doc. Don’t fake stuff (people will find out sooner or later)

I read that as, “people who joke all the time are phony and will be found out sooner or later.” But maybe I’m just flattering myself :). In time, Igor’s distrust of me would become more apparent. I don’t want to dwell too much on the doc, but this line is pretty bold:

In any communication on GitHub or elsewhere public, you communicate on behalf of the team

And that line is treated literally. If something you tweet doesn’t match the tone or narrative, you’re gonna get an email, or a public reprimand right there on Twitter. Maybe it’s just me, but I’m surprised people outside the Angular team haven’t commented on how Draconian this whole doc and policy are. Either no one knows it exists, no one has actually read it, or I’m crazy. The doc is meant to protect the team’s reputation more than foster truly healthy community.

Invincible Positivity

Given the context of that week, I felt personally attacked by that doc, but it would sound crazy if I told someone else on the team he was targeting me. And it wasn’t worth speaking up in opposition of “positivity” because, who doesn’t want positivity? And who would dare be against a doc about such an important topic as healthy communication in a community?

I minded my own business. I kept working the same way as I always had, trying to work on high impact work but making room to accommodate Igor’s requests. Even though the team had grown, and I loved my colleagues, I still felt like I didn’t belong on the team, and most days I still worried that Igor would find a way to get me removed from the Angular team one way or another. But I figured I was the only one on the team who felt that way, so I just kept it to myself.

The Audit

But then one day our team participated in a team audit and anonymous survey that would help assess areas the team could improve. And to my surprise, the top problem selected by members of the team: psychological safety. In other words, people on the team didn’t feel safe to be their true selves. When the results were reviewed with the team, I remember one of the leaders explaining that it’s probably just the team experiencing pressure before a big release or big conference. But other team members voiced some real criticism, and some of their own psychological safety issues. I was glad to see that it wasn’t just me who experienced the team this way, but apparently the majority of the team. Despite the leadership not seeming to grasp the actual issues on the team, It seemed like the team was starting a healthy dialog about some tough issues.

Taking Action

I wasn’t sure how to fix the issues, but I scheduled a meeting with folks who facilitated the audit of the team to see what I could do to help fix the issues. They had a lot of good insights on the negative effects of the team’s culture, but weren’t able to do much to help solve the issue, because their team only had resources to help teams identify areas for improvement, not to help teams solve issues. It was up to the team’s leadership to look at the results and figure out an action plan (if any). But how does that work if leadership is, at worst, the source of the toxicity, and at best, unable to fully understand the issues because of power dynamics and friendships?

I met with my HR business partner, and also with Jules Kremer — a recent addition to our team — to try to figure out some action items. Even though Jules was recent, she had a rocky start with Igor, and was motivated to fix this. After some time, Igor grew to respect her, and later joked about how he was skeptical of when Brad brought her to the team, and didn’t understand why Brad thought she was a necessary addition.

Change Can Wait

Jules and I had a lot of other urgent things on our plates, and really had no idea how to address the issues brought up from the audit, so we had to defer any action plan until after we got through some key releases/conferences/whatever. Eventually, we all forgot about the survey and kept going without any real changes. The deeper we got into developing Angular 2, and the longer it took us to release Angular 2, the more tense things got on the team, and the tighter Igor’s control became of all aspects of the team’s daily work. Some people — people whom Igor trusted and respected — seemed to have more autonomy on the team. But myself and others would usually have to step away from our primary framework responsibilities to take care of things that might be distracting to the people working on important parts of the framework, like the compiler.

At some point, I convinced Brad that we weren’t giving enough priority to things other than the compiler (state management, routing, mobile performance, etc), and he agreed to let myself, Alex Rickabaugh, Brian Ford, and a couple of other folks to start a sub team called the “App Excellence” team where we could collaborate on making a great cohesive development experience for the things developers care about outside of the core of Angular 2.

App Excellence Team (Take 1)

The App Excellence team was a self-organizing sub-team, with daily standups to discuss what each of us were doing, and how we could integrate or collaborate so we could make sure the things we were building worked together, and had consistent philosophies. This was when Angular 2 was pretty early, and a lot of best practices had yet to be determined. Then one day, Igor came to our daily stand-up, and took over, telling each of us what we should be doing as part of the App Excellence effort. So the App Excellence team was effectively now just “whatever Igor says”, like the rest of the framework. Pretty soon after that, we just canceled the daily standup and stopped calling ourselves the App Excellence team.

Jeff’s Defeat

As Angular 2 chugged along, and the pressure on the team from inside and outside increased, the tightening of control continued. Many contributors on the team were treated as nothing more than robots to execute the leadership’s decisions. I personally felt belittled, disrespected, and de-valued by Igor on a daily basis, maybe more so than anyone else on the team. At some point in late 2015, after having several mild panic attacks, and as it got harder and harder to force myself to get out of my car and walk into the office each day, I decided to give up and I wrote Brad Green an email.

I told Brad my mental health was the worst it’s ever been, that Igor and I just don’t work well together, and I was going to move on to another team at Google, or quit if I couldn’t find anything. To be fair, there were more issues I brought up in that email, and other people who I thought were going to burn out the team with their tactics for getting people to get things done, but I felt most of my personal frustration stemmed from my relationship with Igor. Google had been my dream job since I’d gotten started in tech, but I was so defeated, anxious, and depressed that it would be better for me to leave with no plan than to stick around any longer. Brad was sympathetic, and met with me to talk more about it. It seemed like he understood the severity of what I and others on the team were experiencing, and how pervasive the issues were. But his solution was to have a talk with me and Igor to hash through the issues.

Brad and Igor were close friends, so it was hard for me to even write my resignation email saying that Igor was making the team an unwelcoming place for myself, and I assumed others. And because of that friendship, and because Brad was Igor’s boss, I don’t think Brad was able to see that Igor had some real personality issues that were hurting the team in ways that wouldn’t be resolved by a 1:1 meeting between myself and a person who has no respect for me, and has repeatedly demeaned, belittled, and humiliated me. I told Brad I’d try to prepare myself and have that meeting, but I never pursued it because the thought of it filled me with dread. Aside from wanting to help us resolve our differences, Brad said he’d work with me to carve out something that would give me more insulation from Igor. That eventually turned into a new sub team of Angular that I would lead, the Angular Mobile Team.

The Angular Mobile Team (Take 2)

I think the Angular Mobile Team officially started at the end of 2015, and was just myself and Alex Rickabaugh at the start. Alex and I had already been working together on building the new data-oriented features in Angular 2. Check out our first co-presentation (and Alex’s first talk ever!) from ng-vegas of all the cool stuff we’d already started working on before carving out the mobile team:

When we chartered the Angular Mobile team, we wanted to make mobile a first class use case for Angular. The biggest thing we wanted to tackle was performance, notably startup performance. Angular 2 was massive bundle sizes, especially in the days before Ahead of Time compilation existed. So we set out to find what optimizations could be made outside of the core of the framework core, while the core team worked on ways to make Angular smaller.

Angular Mobile Toolkit

We decided the best course of action was to team up with the newly-formed Angular CLI team, and build mobile-specific tooling called the “Angular Mobile Toolkit.” We also collaborated with Addy Osmani on the Chrome team to make Progressive Web Apps the focus of our efforts. The Firebase team was also in the process of going all in on mobile, so we partnered with them to make first class Firebase support for hosting and push messaging for Angular apps by Google I/O.

I brought in some outside help to help us tackle the ambitious roadmap we’d set out to get full PWA support in Angular CLI by the time we got to ng-conf in a few months. That’s when Rob Wormald came onboard, along with Jason Teplitz, who had interned on the Angular team the previous summer.

I was also able to snag a small office where the four of us could work with hopefully minimal disruption or distraction from the rest of the team. We all worked really hard, and by ng-conf, Alex Rickabaugh and I presented why we think PWAs are a great idea (which I still believe they are!), and how we had just landed support for any Angular developer to create a PWA complete with a pre-rendered app shell, functioning service worker with advanced static asset caching, and an app manifest, just by passing the “--mobile” flag when creating a new Angular app. I was really proud of the work we’d done to make a super easy developer experience to do something that would make your app a much better experience for users. We even had a magician, Rody Haddad on stage to help introduce our ng-conf talk!

And soon following ng-conf, we launched the beta of AngularFire 2 in time for Rob Wormald and Alex Rickabaugh to present at Google I/O!

Our ragtag team was getting things done. People had individual ownership, responsibility, and accountability, and we had clear goals to work toward. And we were slowly re-building bridges with other parts of Google that had been burned in the past.

No Buy-In

But even though our team was making progress solving important real-world issues, I hadn’t done the hard work of convincing the team leadership that our efforts were important or valid. I’d assumed the leadership agreed that our work was important, because the decree from Brad Green when starting into Angular 2 was “mobile mobile mobile.” And while the tech leads would say they agree it’s important, the fact is that Igor and Misko tend to think about most problems in terms of template compilation, view bindings, and rendering. No matter what the consumers of Angular are saying is important to them, the solution is always to change the templating system, or write a new renderer, or make the compiler better. That’s probably an exaggeration, but it certainly felt that way when I was on the team, and sounds like it’s still how their minds work. And it’s totally okay if your mind is geared toward a certain discipline or domain of a problem, as long as you have the humility to really listen to your team and community to understand what’s important to them, and where time and energy would be best spent. I didn’t think it was that important for the other tech leads to buy in to what we were doing, as long as Brad shielded us from disruption from them (narrator: he was wrong).

Theodore Destruction

Despite leadership’s disinterest in our work, we were able to make great progress, and the community seemed to be really excited about the work we were doing to make Progressive Web Apps possible (and easy) with Angular. But come August, it was time for me to take about 6 weeks of paternity leave for my forthcoming baby, Theodore. Before I went on paternity leave, the Angular CLI team and the mobile team were starting plans to move to webpack as the underlying bundler/builder instead of Broccoli, which I was in support of (even though I loved Broccoli!) I was hoping to have some time to contribute to the webpack migration so the --mobile flag would continue working the same, but turns out taking care of 2 kids, a baby who spent the first 10 days of his life in the ICU, and a mom recovering from a C-section took more time and energy than I anticipated :).

I trusted everyone would work together to get done what they could while I was gone. But while I was out, there had been a hard deadline set for the final release of Angular 2 for mid-September, and folks who were working on the mobile team got pulled in to taking care of last-minute things before the release, while the Angular CLI team continued moving forward with the webpack migration to be ready for the Angular 2 release. Unfortunately in this shuffle, no one was able to finish migrating any part of the Angular Mobile Toolkit to webpack. So community members who wanted to use the latest Angular CLI were confused why the --mobile flag was no longer supported.

When I came back from leave, the team had just released Angular 2.0.0, and I found out the Angular Mobile Toolkit had been erased from Angular CLI. The Angular CLI team didn’t want to have to remove it, and neither did the Angular Mobile team, but it wasn’t important enough of an effort to fix before the Angular 2.0.0 release. I empathized with the push to get things out the door, and wanted to help get the toolkit restored as quickly as I could. It turned out to be a lot harder than I thought, and a lot of things had to be done in the CLI itself to make it possible, so it was gonna be a while to restore the mobile toolkit experience that developers had gotten accustomed to. So people who’d already built apps with beta versions of Angular 2 with Service Workers and app shell pre-rendering, just had to go back to not having those, or wire it up some other way.

Jeff’s 2nd Defeat

In addition to requiring more time to rework all of the tooling, there were other higher priority things that needed to be taken care of following the GA release of Angular 2. I felt like the only success I’d ever experienced on the team, had been wiped away because the team leadership didn’t see the Angular Mobile Toolkit, or Progressive Web Apps, as important enough. It was around this time that I started thinking about leaving the Angular team, and probably leaving Google altogether. I realize that might sound petty to leave a job just because my project got canceled. But this was after over three years of feeling like less-than-nothing on the team, and finally doing something with high impact for the community, only to see it erased while I was on leave. And to be fair, I don’t know the conversations that happened internally to decide that the new CLI should be released before the Angular Mobile Toolkit was ready, and I don’t know who made the call. All that was clear was that no one in leadership thought it was important enough to prioritize.

What Happens Next

I talked with my wife and we decided I had to leave the Angular team. I loved my friends on the team, and all my friends in the Angular community, and I didn’t want to leave all that behind. So I started entertaining the idea of doing Angular consulting. It seemed like there was a good market for specialized Angular consulting, but my wife thought it would be bad for my mental health to stay connected to the Angular team. But I thought leaving the Angular team would make Igor happy, and would release me from his grip.

A Comrade

It so happened that my friend on the team, Victor Savkin was planning to leave Google so he could move away from the Bay Area and back to Toronto. Victor and I always enjoyed collaborating on the team, so we figured we might as well give it a shot to start something together! As soon as we decided we wanted to commit to it, we met with Brad Green to tell him we were leaving to do Angular consulting. Brad thought I was kidding when I broke the news, but Victor told him I was serious. Then Brad told us how excited he was for us, and that he was glad he got to keep working with us. The feeling was mutual, and we were relieved that it sounded like Brad was supportive. But I forgot that Brad didn’t actually run the Angular team.

A few weeks later, on our last day in the office, the team went with me and Victor to lunch off campus to send us off and wish us luck. Igor couldn’t make the lunch, which wasn’t that surprising because he has a lot of meetings (and a lot of responsibility). But I remember working those final weeks on the team, and that final day, seeing Igor working at his desk without acknowledging that we were leaving, or saying goodbye to either of us.

I’d heard from others on the team that Igor was angry that we were leaving to start an Angular consulting company, and that he thought it was not right. But he never expressed that to either of us.

We’d been planning to contribute to Angular when we left the team, particularly since it was December, we had no clients yet, and we didn’t expect to land any significant contracts before the holidays. I was planning to work with others on the team to continue rewriting the Angular Universal libraries.

Jeff and Victor Cut Out

On the weekend after I left Google, I got an email from Github, telling me that I’d been removed from all Angular repositories. I didn’t understand why I’d be removed, but I emailed Brad to ask him why, and also ask him if we could be restored as contributors since many non-Googlers with way fewer contributions than us were still committers on Angular repositories. His response was understandable:

Oh right. That’s an automatic thing that happens when you leave. I still need to meet with the other leads to discuss this, but I do really want you guys to be able to contribute as you have been.

I was less optimistic now about getting our contributor status restored, but figured we could still contribute without having committer rights on anything. I asked Brad if we could at least be added to the calendar event for the weekly Angular contributors meeting, which includes the Angular team and external contributors. The answer was that we had to earn our way back to being considered contributors, that our prior contributions weren’t enough (which is funny, given that Victor was the all-time top contributor to Angular at the time). But we accepted those criteria, since we both had projects we planned to keep contributing to anyway.

Birth of Nrwl

The Tuesday after we left Google, we announced that we’d started a new company to provide support for teams using Angular: Nrwl.io. The reception from the community was overwhelming, and we felt affirmed that the community saw this new company as a win for Angular (and I’m proud of how the team has proven to be a force for good in the community over the past 3 years).

After things settled a bit after our launch, I reached out to the folks on the team that I was planning to collaborate with, so we could figure out a plan to finish the rewrite. But after some discussions and meetings about the design and next steps, one of my colleagues told me that the team decided that all work would be done internally. There wasn’t much more explanation about why, or who made the decision. But now there was no way for me to maintain my contributor status so I could be a part of the weekly meetings, and continue to help maintaining the tools and libraries I’d been helping with.

A few months later I was on a plane to ng-conf, and Igor happened to be sitting next to me. I’m not sure if it was his decision to cut me out of the projects I was contributing to back in December, but when I told him how busy we were now at Nrwl, he laughed and joked about knowing that when I left the team, I was crazy to think I’d have time to contribute to Angular. By that point I’d already accepted that I was an outsider now, and the only meaningful contributions I could make to Angular would have to be outside of the repositories controlled by the Angular team. Fortunately, just a few months later, we’d launch Nx, which is now used by countless Angular teams around the world. #ShamelessPlug

Jeff’s Recovery

It wasn’t so bad to be cut out of Angular. While it had the potential to make me irrelevant and harm my career and the success of Nrwl, it was personally therapeutic to have some more space between myself and…all that. Being cut off from Angular was kind of like being kicked out of a cult. Once I was totally on the outside, everything about my experience on the team started making sense. My whole time on the team, I’d chalked up all of my anguish on the team as me just not being a good fit for the team, or having incompatible personalities with Igor. But then more people from the Angular team past and present shared their own experiences with me, and it sounded just like mine. Since everyone on the team had happy, shiny, kind personas, it was really hard to believe that anyone, especially the leaders, would do anything to harm members of the team, even unintentionally. Many of us trying to understand our misery while on the team ended up concluding that the problem was completely ourselves. When we compared our experiences, it was obvious that the common theme was the people who made our experience difficult. That’s not to say we don’t all bring our own issues to our working relationships; I’m pretty aware of my own issues that can make me difficult to work with if not managed!

Life Goes On

For the most part, in 2017 and 2018, my paths didn’t cross a whole lot with the Angular team, except for hanging out with my friends on the team, and collaborating on a few smaller efforts with different members of the team. I’d even gone on a walk with Jules at Google where she talked about all the self-improvements Igor had made to address behaviors that had been raised by myself and other team members over the years. This gave me hope that the team was now a healthier environment than when I was there. I thought maybe it was a good time to try to mend my relationship with Igor.

The Dinner

In February of 2019, I was planning a dinner in Mountain View for many of my clients and friends who would be in town for the Enterprise Angular Summit at Google. I’d done the same dinner a year before, and it was a lot of fun. I invited several friends from the Angular team, and decided to extend an invite to Igor as well, as an olive branch of sorts. Something worth knowing is that I’m not allowed to attend the actual summit, since my presence as a sales person/consultant could make folks uncomfortable, and could be seen as unfair to other consultants who would love to be there (a decision I actually agree with, and respect Stephen Fluin for caring about fairness and comfort of attendees). Even though I agree with it, I’ve always jokingly given Stephen a hard time about it. At the dinner, when my friends would ask me if I was going to be at the event, I would joke about being banned, and told them to give Stephen a hard time the next day by asking “Where’s Jeff?” At some point in the evening, Igor came over to talk with me and ask if we could chat sometime during the summit. I smiled and told Igor that I was banned because I was a consultant. Igor seemed concerned, and thought there must be a mistake, but he just didn’t know about the no-consultants policy.

The next morning, I felt kinda bad that I’d told my friends to give Stephen a hard time, so I sent Stephen a message apologizing in advance, and acknowledged it was unprofessional (I also sent notes to my friends to ask them not to make the joke). Stephen was gracious about it and said thanks for the note, but told me that Igor was upset about it. So I sent an email to Stephen and Igor:

Hey Stephen and Igor, Thanks for the help inviting folks to the dinner last night, and I also wanted to apologize for creating confusion about my lack of participation in the summit. I joked to Igor about Stephen not letting me at the summit, but I want to be clear that I agree that it’s best to keep it a consultant-free atmosphere. I also realize my joking at Stephen’s expense is unprofessional, so I apologize to you, Stephen. I’ll do better. Have a great summit!

But it’d been so long since I worked for Igor, that I forgot how upset he gets when he’s embarrassed. His reply caught me off guard.

Thank you for the apology, can you please help me understand your plan for apologizing to the attendees that overhead our conversations? There were lots of people around that were surprised by it. Also what would you like to do about the email message you sent to all the attendees that implied in an awkward way that you were not going to join the summit due to unspecified reasons, causing further confusion:

Screenshot of my email and a reply from my friend who was attending the summit.

There are times for jokes, and then there are times for being responsible, and I fear that you might have mixed up the two in this case. I feel this way mainly because reputation of many people and even companies and projects is at stake here. And the only company that benefits from this “outrage” is Nrwl. I applaud your marketing tactics, but I (and I’m likely not alone) feel betrayed and mislead on several levels due to what happened in the last 24 hours.

The gentleman from that email screenshot is my friend Youssef, who was obviously joking (hence the smiley face right after his question), but Igor assumed Youssef was a confused attendee.

Igor and I had only talked for maybe 30 seconds total at the dinner, but it was enough for him to determine that I’d plotted a conspiracy to betray and mislead him and others so that Nrwl somehow would benefit from the “outrage”? Once again, I gave Igor the benefit of the doubt, and assumed I’d caused more harm than I could see, so I emailed most of the attendees to apologize for making jokes about Stephen not inviting me. I also emailed or called several members of the Angular team to apologize and let them know I regretted mocking the team’s policy of having no consultants at the event. Of everyone I talked to, the only one actually upset by my joking was Igor. Others from the team were confused why he was making such a big deal out of it.

Jeff Tries to Make Amends

I wanted to resolve the situation, but given the lack of mutual trust between us, I decided it’d be best to set up a meeting with myself, Igor, and Brad Green to act as the Igor<->Jeff translator and mediator. My main concern was that Igor thought I had manufactured this situation in order to benefit Nrwl at the Angular team’s expense. I wanted a chance to hear why Igor would believe such sinister motives on my part, and hopefully come to some common understanding, so we could continue a professional relationship. I proposed we have a phone call to discuss, and I even offered to fly out to California to meet with them because I thought it was so important. Igor responded being open to meeting, but had this to say:

It’s actually ironic, because as you likely remember when I approached you as I was leaving the pub, I said that I wanted to have a chat with you. The main goal of that chat was supposed to be sorting out this trust issue you are mentioning in a different context. I approached you with good faith and hope to make things better, just to be subjected to your very inappropriate “prank” that made Stephen, Angular and by extension me, look bad in the eyes of people who witnessed it, and people you emailed next morning. Combine that with the seemingly promotional tweet that got a lot of attention in the community (partly because I foolishly retweeted it), and you might understand why I feel like Angular and I were being taken advantage of here.

The “promotional tweet” he mentioned was this picture of the group at dinner

I assumed it was obvious that the event was a Nrwl-sponsored event, especially since the calendar event was called “Nrwl preAngularInTheEnterpriseSummit Dinner!” I think it’s fair to say the tweet was promotional since it acknowledged that Nrwl sponsored the dinner. But in no way does the tweet “take advantage of” the Angular team. The Angular team participates in all sorts of dinners and events hosted by other consulting companies, but for some reason me posting a photo of a Nrwl dinner was exploitative.

Nevertheless I still wanted to meet and get to the bottom of his accusations. So I replied and asked what times would work for Brad and Igor the week of March 18th. Neither of them replied.

A Rift in Angular Leadership

From chatting with others on the team at that time, it sounded like there had been a rift between Igor and Brad, and that Igor had actually been rallying team members against Brad, to make it seem that Brad was the source of all things wrong with the team and the project. Brad is an amazing person, and is one of the most truly (not superficially) kind people I know. He’s still human, but I find it hard to believe that Brad had suddenly become Everything Wrong With The Team™ in the years since I’d left Google. But Brad has always been responsive to emails in the past, especially when it comes to interpersonal issues. Maybe the rift between Brad and Igor is why Brad chose not to reply to our email thread to set up a meeting.

Ng-Conf 2019 and Beyond

At ng-conf, Igor and I ran into each other at the evening party. He suggested we should get together to chat sometime at the conference, and I agreed. I don’t think either of us followed up to actually schedule the chat. I was going to, but was advised by trusted friends that it wouldn’t do either of us any good, especially without someone to mediate. I was content to just keep a healthy distance between us.

A couple of months after our exchange, on May 30, 2019, Brad announced he’d be leaving Google and leaving the team he’d poured his life into for almost a decade

I never thought I’d see the day that Brad moved on. I’m not suggesting that Igor pushed Brad out, but he was pretty much celebrating a new dawn for Angular privately with different team members, and telling them how much better things would be now without Brad holding them back. I’m pretty sure no one else on the team bought that narrative.

With Brad gone, I was concerned for what the Angular team would become without a proper check on Igor’s control, especially with things getting more tense with the long-promised Angular Ivy that was taking a lot longer to get done, and was having a lot more technical issues than anticipated. These pressures are what I’ve always seen push Igor into full “command and control” mode, which I knew would be bad for the team’s mental health. And sure enough, I started seeing more extremely talented people leave the team, or leave Google altogether. I’m not going to bring any of those folks into this conversation, but from folks I talked to during that time, it sounded like the team was in worse shape than ever. It made me sad, and angry. A couple of former Angular team members who have spoken up publicly in response to my original tweet to say I’m not alone are Ben Lesh, Hans Larsen, and Thomas Burleson.

There are lots more stories I’ve witnessed firsthand (it’s been painful to re-read some journal entries), and more that my friends have shared with me, but I can’t share for their own privacy. Nobody wants to be seen as badmouthing a former employer. And some people could still be harmed by members of the Angular team (myself probably more so than anyone else).

I regret standing by and allowing this unhealthy environment to persist and negatively impact so many people I care about over the years. And I regret not speaking up more to warn people who would join the team, but I always assumed no one would take me seriously, and would join the team anyway. When I recently saw how other toxic people in the community had been protected by so many people keeping their violations secret, I started realizing I needed to call out problematic behavior when I see it, even if it puts me at risk.

This Sounds Like a Personal Matter with Igor

It’s true that most of my examples are with Igor. And since my tweet, Igor has already started spreading the narrative that this is just a conflict between two people. He wants people to think he’s concerned about our relationship, in order to deflect the conversation away from the fact that my experience is not unique. He and others may challenge me for speaking publicly, and say that this conversation should be resolved privately, for the sake of the community. Private conversations, strict communication guidelines, and secrecy have done nothing but silence dissenters and allow this toxic environment to persist for at least 7 years.

I’m not interested in mending my own relationship with Igor; I need distance from him. I wish him the best from afar.

Delusions

So why would anyone stay on a team that seems so unhealthy? Delusion. The delusion that things will get better, or that everyone is willing and capable of seeing and addressing their own personality flaws. The whole time I was on the team, there was always something on the horizon that seemed like it might fix the team. Re-orgs with new VPs, Google HR interventions, the possibility of autonomous subteams. But at some point, you realize that nothing has changed, and none of the symptoms will go away if you don’t fix the source of the problem.

What Should Angular Management Do?

I want what’s best for everyone involved, even Igor. I’ve been off the team for three years. I know what the problems were then, and I know they still exist now, but I don’t have the full picture. What I do believe is that the Angular team cannot be healthy if problematic people remain on the team in any capacity. Even stripping management or tech lead responsibilities to move people to individual contributor roles still leaves them on the team with people they’ve caused harm, and where they can continue to cause harm in any role. A big blocker is that Angular is governed in such a way that if certain people were moved to a different team at Google, the project would implode. It’s up to management to decide what they want to believe about the team’s culture, and what the best course of action for the team and community are. I’m happy to have dialog with Angular team management if they want my input.

The Future of the Angular Framework

Addressing team safety and health are one thing, but then there’s the question of the evolution and viability of the framework itself. If I REALLY had my druthers, I would ask Google to consider moving control of Angular to a foundation and establish a governance structure that includes the perspectives and contributions from people inside and outside of Google to decide the direction of the framework and community. Moving in this direction would make the project (mostly) immune to Google’s shifting priorities, and the risks of relying so much on one or two people to guide such a critical ecosystem. But I haven’t seen any indication that Google is interested in this route. A guy can dream.