Response to coolstar's Claim

As of a few days ago, coolstar and his friends have decided to start claiming, publicly, that I stole code from his "ThemeLib" project for use in WinterBoard. ThemeLib is under the GPL license and WinterBoard is under LGPL. The claim is that I took code from ThemeLib and put it in WinterBoard, which would not be allowed.

-> @isklikas: The open source Anemone code licensed with GPL v3, was copy pasted into WinterBoard that's GPL v1, something that's illegal

-> @coolstarorg: @isklikas s/Anemone/ThemeLib

-> @coolstarorg: TL License TL Code

The truth is that I did not use any of coolstar's code, nor did I base my code on his code. This kind of code licensing issue is something I pay keen attention to, and I have been known to call others out on such issues in the past. In this case, not even a single line of code in WinterBoard is from coolstar.

The code in question is in relation to the theming of .car files for iOS 7 and 8. This is a feature that has been requested for WinterBoard for a long time, and is something I had hoped someone in the community would step up to help with. In the end, I ended up offering to pay thekirbylover to help.

Helping with WinterBoard

To be clear: in such a situation, what I really need is just "basic research". In this case, what is most useful is for someone to not attempt to contribute a patch to WinterBoard, but instead build a minimal viable "this is how it can be done", something that often can be described in one sentence: "hook this function". (This is documented on the WinterBoard page of the iPhoneDevWiki.)

It did not seem like thekirbylover was actually working on this (I think he was quite busy with school, as well as a few other projects), and in the meantime alexzielenski offered to help. He explained to me how the asset managers in UIKit generally work, and offered suggestions on where to best put hooks. He also pointed me at a tool called Equinox from a developer named Matchstic.

With thekirbylover, we talked to Matchstic, and he said that I could use his work for WinterBoard. However, the hook used by Equinox was somewhat obscure, and the description from alexzielenski seemed "overly complicated". Essentially, none of this work actually "felt right". So far, I had not yet looked at the matter myself.

Release of ThemeLib

It was at this point that coolstar seems to have decided that this was "his moment": that he could take advantage of how WinterBoard had not yet been updated to build an audience for his own project and prove he is smarter than everyone else, including (and especially) me. This is not the first time coolstar has decided to take this path, rather than working with existing project maintainers :(.

In so doing, he developed a new extension called ThemeLib, which hooked into WinterBoard itself to "add" functionality to it; in the process, he was on #winterboard (a channel on my IRC server for the discussion of WinterBoard development), complaining about how he felt my code architecture was wrong :(.

Thinking that he was only interested in providing things I considered to be "out of scope" for WinterBoard, I tried to help by telling him how WinterBoard was designed to be used by external projects "adding features" to it; sadly, he decided to ignore all of that advice and instead shoddily reimplemented WinterBoard's theme lookup :/.

Purpose of Open Source

While I was trying to figure out what kinds of conflicts this would cause, I realized he had added support for .car files. Seeing this, I was incredibly disappointed: rather than help, he decided to compete for seemingly no good reason other than that he wanted to make certain that all of the credit and control was his own.

Now, this isn't the first time I've had to deal with this sort of thing: honestly, I am really sour on many of the ideals of open source community from having worked so long on these iOS projects, as to my mind the most important part of open source is working together: "hey, I saw you had issues with this thing, can I help?".

Almost all of the time, the help that is needed is not "I need a patch" or even "I need code", it is just "I need to know how this would be done". If nothing else: I'm the person who is going to be dealing with this code in another five years, while you probably contribute a few lines and move on; when I integrate your idea, I need to do so in a way that fits my mental model of the code.

Lack of Contributions

In truth, I have received very little help for any of the open source projects I maintain. Most of what I get for it has been pain :(. Some people claim that my code is difficult to compile, and that is why they don't contribute, but again: the key part is saying "hey, I saw you had issues with this thing, can I help?".

I will also say that I have on occasion gone out of my way to use public tooling. A great example of this is the iOS Safe Mode extension, which I ported to use Theos. Rather than actually talk to me about how to fix it for iOS 7, parrotgeek1 wrote an extension hacking on top that I then had to understand the separate ramifications of :/.

I also went out of my way to make Veency easy to compile, also using Theos (which actually made my iOS 8 port slower, due to Theos's lack of flexibility). Veency actually has received some third-party help, but only because there are a few projects (from mringwald, ashikase, and rpetrich) that had initially been bootstrapped due to Veency being open source: I think they feel "they owe me".

However, in practice, contributions from these third parties tend to be cryptic and minimal: I think only rpetrich's help was crucial, and it was probably five minutes of his time. The only true third-party who has contributed in any meaningful way to Veency has been Cykey, and that is because I've been paying him to do so.

Random Demotivation

Otherwise, despite there being entire companies built on top of Veency (ones that do automated testing), Veency is still effectively just "SaurikIT and the people it can hire to work on the project". These companies seriously sometimes send me e-mails asking "why isn't this updated yet", as if I work for them :/.

Though, the most demotivating thing I get as thanks for having released all of this code are critiques of my coding style. Despite the fact that I swear people are trying to open my code in tools that seem barely more powerful than notepad, they complain that I often don't use many source code files (I instead use folds: I <3 folds).

On now not one but two occasions, someone has posted a massive pastie listing all the ways in which my code "sucks", though most of the time it is because they don't know what the code actually does. The first, in 2009, was chpwn (who, after two weeks of argument, finally decided to help with Cydia: Cydia is now awesome thanks to him).

WinterBoard Changelog

And now, more recently, coolstar, complaining about WinterBoard. Which brings us back to his claim, and a critique of my own. I point out in the WinterBoard changelog that a ton of people are responsible for helping with the various things that get added to it, because I like making people feel included in the process.

Most of the time, all I am actually thanking people for is providing a bug report with a crash log: I get so few actual bug reports with crash logs for WinterBoard that the most important thing anyone can do to help the project is take the time to say "hey, this isn't working, here is the debug data that might help".

In this case, I listed a number of people as helping with the car file support in the update to WinterBoard, which was effectively "everyone vaguely involved". I continued to list thekirbylover, Matchstic, and alexzielenski, even though all I really learned from any of them was "here there be dragons". I added Surenix, as he had a suggested feature.

Why coolstar is Listed

I also listed coolstar, because I did learn something from him: that it was possible to get by hooking only _UIAssetManager, a class that is way up in the high-level Objective-C code (where there was still useful information as to what was being loaded), when everyone else had been telling me I needed to hook lower in the object model.

That is all I learned from coolstar's work: that that hook was actually sufficient. None of his actual code was useful, as all of it was just an attempt to reimplement the WinterBoard themed image lookup logic. At this point, you could try to claim that I took exactly one line of code from him... only... I didn't even do that :/.

In fact, none of coolstar's technique was actually useful: he took a shotgun approach hooking every single method that even looked remotely relevant in _UIAssetManager, even though most of these functions called each other. If I actually had to hook all five of those functions, I would have agreed "we need to hook lower, not here".

What Got Done

So, I instead reversed out the call flow of _UIAssetManager myself, and determined that there was actually a good place to hook: a place that coolstar in fact hadn't hooked himself because he didn't realize that it was a better place to attack the problem. I didn't use a single line of coolstar's logic.

(Since having made his claim, coolstar has adopted the slightly more elaborate technique from WinterBoard, which uses an associated object to keep track of the loaded bundle to support iOS 7, and cleaned up his code to use the single hook I found and am using in WinterBoard.)

I then sat around for a day pulling apart every major version of UIKit (yes, going back through to iOS 2) to draw a map of how all of the different functions I have ever been interested in hooking call each other, to find the most compelling locations to hook and redo parts of WinterBoard. (This research is in my project code as text files.)

When I then provided a thanks to coolstar in the end, it was really me trying to extend an olive branch: it was me acknowledging that coolstar could be helpful, and attempting to give him some credit for having done it; essentially, I was trying to be polite in the hope that in the future he would help.

The "Revolución"

However, now coolstar is claiming I stole his code. As far as I can tell, this is coming up because coolstar seems to be involved in the development of a replacement for WinterBoard for "iMods" (the group of people who seem to mostly at this point be "everyone who hates saurik"). The thread on Twitter started with comments from the iMods "Head of Development" with the hashtag #VivaLaRevolucion :/.

@isklikas: Can't say more, but a change is coming ;) #BringItOn #FeelingMotivated :) #TheCommunityShifts

@isklikas: So yeah, if you hadn't already got it, that previous tweet was about @saurik. #VivaLaRevolucion :P

@isklikas: Join @iMods1, join and embrace the change :) #VivaLaRevolucion #TheCommunityShifts :D

At some point, I think one begins to question why I so adamantly maintain some of these projects as open source: the people who seem to benefit most from WinterBoard being open source are the people who want to see me and all of my projects (including WinterBoard) fail, which can't be good for WinterBoard :/.