After Kite raised $4 million in venture capital funds in 2016, TechCrunch described it as a tool that “wants to be every developer’s pair-programming buddy.” The app is a sort of grammar-checker for code that Python developers can use as a plugin in their coding software.

TechCrunch said the San Francisco startup’s founder, Adam Smith, was ”still figuring out its business model” at the time. “He promises that the basic product, though, will always be available for free,” the article said.

One year after that article was published, developers began noticing something: Kite had quietly injected promotional content and data-tracking functionality into open-source apps the company previously had no affiliation with. The discoveries of those injections, and Kite’s initial refusal to roll them back, led to backlash from programmers who felt the company’s actions undermined the open-source community.

The series of events that led Kite to engage in these practices started with a clever idea to market the company’s products and build its user base. Early-stage startups backed by venture capital face enormous pressure to grow quickly, and to prove that growth to their investors. This is a story about a company that, in the face of such pressure, turned a smart marketing tactic into one its audience perceived as unscrupulous. Developers saw the promotional injections, which forced Kite content into their coding apps, as unwanted advertising, and saw the data-tracking as an invasion of privacy.

“This is not cool at all,” wrote one developer last April, in a comment thread on GitHub where users were discussing the promotional injection. “Kind of crazy that anyone would think this is okay.”

“This has given me a very negative opinion of Kite,” wrote another.

Kite’s unorthodox marketing endeavors began in late 2016, when the team had just finished two and a half years of development on the app’s core functionality. Their favorite feature in the app, according to Smith, was its ability to intelligently make suggestions about how to finish writing a bit of code as a programmer types—similar to how smartphones suggest words as you tap out texts. Kite had implemented the features in its plugins for code-editing apps, but the team wanted to find ways to get their software in front of more developers.

“We were like, OK, well, what else is out there, you know, and how do they reach people?” Smith said in a phone interview. “And we saw this Atom package called autocomplete-python.”

The autocomplete-python package is an open-source plugin for Atom, the popular code-editing software made by GitHub. When a programmer installs the plugin, it provides code suggestions as they type, just the thing Kite was built to do. But unlike Kite’s plugins, autocomplete-python had a large built-in user base; it’s a popular add-on among Python developers who use Atom and has, to date, been downloaded nearly a million times.

After testing autocomplete-python using Kite as its engine, Smith said, it ran faster than it did on the engine it was currently using.

“And so it kind of just seemed like, OK, well, this is an open-source thing; the developer for autocomplete-python probably just wants the best completion experience for his users,” Smith said. “We got into a conversation with him and that’s kind of how it started.”

Here, Kite took an unusual step. Although autocomplete-python is an open-source piece of software with publicly-accessible code that anyone can freely copy, reuse, and distribute, Kite purchased the plugin from the programmer who originally developed it. What Kite was buying, of course, was not the package’s freely available code, but its ubiquity among Kite’s target audience.

“The way that we structured it, it was structured as kind of an acquisition,” Smith said.

After the acquisition, Kite developers got to work integrating their completion engine into the plugin. They added a screen that asks users whether they want to enable Kite or use Jedi, the open-source completion engine the package had previously used by default. The Kite option was displayed prominently, listing all of its features, while the Jedi option was deemphasized and described as “lower accuracy” and “less complete.”

GitHub The autocomplete-python setup screen

And although it was certainly no secret that autocomplete-python now supported Kite, Kite didn’t announce that it had bought the plugin, nor did the plugin’s original developer, Dmitry Sadovnychyi. There was no mention of the new ownership in the new setup screens or in the package’s repository on GitHub. To a user installing autocomplete-python, it may have appeared that developers unaffiliated with Kite were endorsing it as the better option.

When users did choose Kite, they were asked to create an account on its website, and at that point were “definitely considered to be active users,” Smith said over the phone. Daily active users, of course, is a key metric for any new tech startup that has a slew of investors to impress, and now anyone who used Kite in Atom through autocomplete-python counted as one of those users. That was an apparent boon for Kite, and for the first few months, the integration seemed to be a major success.

“The next thought was, like, wow,” Smith said. “This is just kind of a match made in heaven and was great for us, great for the autocomplete-python users. And then we were thinking, OK, well, how can we expand this out from here?”

The team at Kite set its sights on atom-minimap, an Atom plugin that gives programmers a zoomed-out view of the code they’re working on, positioned next to the scroll bar, making it easier to jump from one section of the code to another. The plugin is generally considered essential among developers who use Atom. To date, it’s been downloaded nearly 4 million times, meaning millions of programmers look at it for many hours every day. That’s the kind of real estate tech brands thirst for, arguably more effective than any ad space one could buy from Google or Facebook.

“We weren’t sure initially how we would integrate Kite’s offering, our core offering, into minimap,” Smith said. But it seemed like we could maybe figure something out.”

Kite approached the developer of atom-minimap, Cédric Néhémie, and offered him the same kind of acquisition deal it had offered the creator of autocomplete-python. Néhémie accepted, and after further discussions, Kite hired him to help integrate Kite into atom-minimap, and to assist in improving Kite’s own plugin for Atom.

Then, last April, Néhémie added a new feature to atom-minimap that would activate when a developer opened a Python script in Atom: at the bottom of the minimap itself, links to relevant documentation on Kite’s website would appear. The code behind the new feature is visible to the public because atom-minimap is an open-source package; the developer titled the code change “Implement kite promotion.”

It wasn’t long before the large community of developers who use and contribute to atom-minimap took notice. A week after Néhémie added the new code, a user opened the previously mentioned issue to the GitHub repository where the atom-minimap code lives, asking for an option to disable the Kite content.

“As I understand the function of this package,” another user replied, “it should not even be in there at all.”

Throughout the day, similar comments from annoyed programmers poured in.

“Time for adblock for atom,” wrote one developer.

“If this advertisement is still here on Monday morning I’m uninstalling Atom,” wrote another.

“It should not even be in there at all.”

On May 3, a week after the initial request to disable the promotion was made, a representative from Kite who had never contributed code to the atom-minimap project appeared in the thread. He said they’d added the ability to turn off the Kite links, but that they would not turn them off by default, as some commenters had requested.

“We have decided to leave the feature as opt-out since many users have found it useful,” he wrote. The statement drew even more ire from commenters, one saying the idea that “many users” had found the feature “helpful” was “ad tricks 101.”

Commenters also wondered why this Kite employee, Juan Lozano, had responded to the issue instead of Néhémie. As the creator of atom-minimap, his silence was conspicuous.

The complaints in the GitHub thread continued, building into something of a frenzy. Atom’s community manager stepped in a week after Lozano’s comment to try to smooth things over, but was met with more thumbs-downs than thumbs-ups in the emoji reactions to his comment. Lozano chimed in again later that day, thanking everyone again for their feedback, but still refusing to disable the Kite links by default.

“Seriously, at this point, do you still think that keeping this is the best course of action ?” one user wrote in response to Lozano. “There is not a single comment on this issue supporting the addition (except yours).”

Then, a few days later, someone opened a new issue on the GitHub repository where autocomplete-python is hosted, titled “Specify the current project owner and relations with Kite.”

The user who posted the issue pointed out that Dmitry Sadovnychyi, the creator of autocomplete-python, no longer seemed to be working on the plugin, and that Kite employees appeared to have taken it over. One of those employees, the user noted, was Néhémie, the creator of atom-minimap, who continued to remain absent from the controversy already building around that plugin.

“Kite is not mentioned anywhere in the README,” the user wrote. “Please share the nature and circumstances of the apparent maintainer transition taking place, and specify how does it relate to Kite and its employees.”

Sadovnychyi quickly responded to the issue, but did not disclose that he had sold autocomplete-python to Kite.

“For me Kite seemed to be like an interesting *optional* integration for python completions, so I did gave [sic] them the access since I don’t have much time implementing another completions provider by myself,” he wrote. “It seems like it didn’t go as smooth as I expected, they did introduce some bugs and some questionable choices, but most of bugs are already fixed.”

“Many of us feel the autocomplete-python package is being overtaken by the Kite team,” the original poster responded, “and the popularity of this plugin is being used to promote their service.”

Other developers began pointing out the new autocomplete-python setup screen, that emphasized Kite’s engine over the open-source one the plugin had originally used.

“To be fair,” one commenter wrote, “if negative language is allowed in the choice dialogue it should also highlight the downsides of Kite: Uploads your files and data to internet (vulnerable, closed source, privacy disabled).”

“I wonder,” wrote another commenter, “don’t Kite have its own package for Atom? Why hijack all the good open and free choices in the ecosystem?”

Users were growing increasingly wary about the cloud-based, closed-source nature of Kite. In order to offer the best possible coding suggestions through autocomplete-python, Kite pulls scripts from the Atom editor to its servers and evaluates them in real time with machine-learning algorithms. Kite was always transparent about this, indeed touting it as a cool feature, but users had concerns about privacy, the potential for Kite to track their coding habits, and the possibility for proprietary code to end up on Kite’s servers. There was also the fact that Kite’s core functionality is closed-source, which didn’t help to dispel these concerns, and some felt that integrating this proprietary system with open-source packages was inappropriate.

“Why hijack all the good open and free choices in the ecosystem?”

As Smith watched the two threads build into full-on outrage over his company’s tactics, he hoped he could still salvage the situation without giving in to the demands of the community.

“There are times, many times, on GitHub threads where someone will disagree with the maintainer of the project,” Smith said over the phone. “And it could just be over some, you know, obscure technical detail, and it’s like they’re not going to come to an agreement on it. The maintainer decides a certain thing, and that helps kind of move things forward. And so I think for any given open-source project you can kind of twist yourself into a pretzel trying to please everybody and it’s just not very practical. And so I think what you have to do instead is, rather than try to make everyone happy, you try to make the best product decision possible.”

Smith believed Kite would still be able to “wow” the users of atom-minimap with new features his team had planned, and also noted that the issue threads on GitHub were not the company’s top priority at the time. The plugins the company had acquired were, after all, growth investments, not Kite’s core products.

“There are 2,000 different things you can work on on any given day, and you get to work on like maybe 20 of them,” Smith said. “And so most things in an early stage startup kind of get dropped on the floor. And oftentimes that’s OK.”

Smith now believes that in this case, however, it was not OK.

The back-and-forth continued on both comment threads through May and June, and in early July, a developer copied the atom-minimap plugin to a new repository, removed Kite’s promotional injection, and named the new package atom-minimap-plus. With open source code, it’s easy to copy or “fork” a package and make some changes to it. The hard part is getting people to adopt an alternative to a package like atom-minimap that already has millions of users. In this case, though, the community was behind the new package, and news of the fork quickly spread to sites like Reddit and Hacker News.

The developer who forked atom-minimap into atom-minimap-plus, Ryan Leckey, said in an email he took action because months had gone by since the original issue was posted, and Kite had still not provided a meaningful response.

“Kite played this completely wrong,” Leckey said. If Kite had focused its energy on improving and updating its own plugins, he added, “it could have good publicity and great adoption.”

News of the fork continued to spread, putting further pressure on Kite to give in to the developers’ demands. On July 19, Néhémie finally appeared in the atom-minimap issue thread.

“Firstly,” he said, “I must apologize for not replying on this thread before. I’m not good when it comes to communication skills and this kind of crisis management has created me a huge stress. That might sound lame, but it’s sadly true, we’re not all equal when it comes to stress management, and I’m really bad at that.”

He said that Kite would remove all of the changes it had made to atom-minimap.

“The next release will no longer show anything,” he said. “I’ll also make sure that the relation between Kite and the minimap package are as clear as possible. I’ve been an employee at Kite for over half a year now and this plugin is now officially maintained by Kite.”

The decision came too late to avoid media attention, however, and stories about the controversy were published in The Outline and The Register a few days after Néhémie posted his note. The articles prompted further outrage on Reddit and Hacker News, and a blog post from Smith in which he attempted to apologize and explain what had happened.

“Unfortunately,” he wrote, “while trying to make programmers’ lives a little less complicated, we instead made them more complicated. For that we apologize.”

In addition to removing the links from atom-minimap, Smith said in the post, Kite had also given Ryan Leckey, the developer who’d created the atom-minimap-plus fork, full access to the original plugin on GitHub. (Leckey said in an email that atom-minimap-plus is therefore “no longer necessary.”) And in the autcomplete-python setup screens, the Jedi option was given equal emphasis to Kite.

That appeared to be the end of the story. But five days later, a developer posted a note on a forum for Sublime Text, another popular code-editing app, saying that the app’s third most popular plugin was ”apparently sending data to the startup Kite.”

Kite, it turned out, had made a deal with the developers of a Sublime Text plugin called SidebarEnhancemants. But rather than integrating its code-completion services or injecting promotions into it, Kite was anonymously collecting data from anyone who used the plugin. The data being collected included the coding languages users were writing in, how much time they spent writing code, and lists of other plugins they had installed. This appeared to be Kite’s most unscrupulous act yet, and inflamed the existing fears over the company’s data collection practices.

Smith quickly replied to the thread.

“Hi everyone, member of Kite here,” he wrote. “The SideBarEnhancements telemetry was originally added to gather data around what programming languages we should support next. We will ask Tito, the maintainer, to remove it.”

The original poster asked why Kite had gone out of its way to remain anonymous, and pointed out that some of the data Kite had been collecting could have included proprietary code or even sensitive access keys.

“The truth is we didn’t remember,” Smith replied. “This was done the better part of a year ago and we haven’t looked at it in a while.”

“The truth is we didn’t remember.”

Over the phone, Smith confirmed that Kite had acquired SideBarEnhancements the same way it had acquired the other packages. When asked how he possibly could have forgotten about a product his company had acquired, especially after being dragged through the mud over similar practices, Smith acknowledged that the notion was hard to believe.

“I’ve asked myself that about 200 times in the last 48 hours,” he said. “I remember briefly thinking about the SidebarEnhancements plugin last week, thinking, ‘Oh yeah, we didn’t do any integrations there, we’re fine.’ And that was the extent of my thinking.”

Asked whether Kite had acquired or injected code into any other open-source plugins, Smith said it had not. Kite is now divesting away from the open-source packages, he said, or at least the features the community didn’t like. Looking back, Smith now believes he should have taken these steps sooner.

“My incorrect assumption was that no matter what you’re going to do, people are going to complain about it or someone’s going to complain about it,” he said. “But if, like, 10 or 20 people are complaining about it—you know, vocally—I should try to listen more carefully.”

And although Kite has addressed most of the community’s primary concerns, the fact that Kite owns autocomplete-python is still not reflected in the plugin’s documents or setup screens, and some developers remain dubious over the company’s remaining integration with the package. In an email, Sadovnychyi said he’s been repeatedly asked to remove Kite from the plugin altogether, but said he “cannot do that.” He added: “Fork is always a solution in open source.”

Indeed, a Kite-free fork of autocomplete-python has already sprung up.