Hacker News new | past | comments | ask | show | jobs | submit login
[flagged] Ask HN: How do you protect your open-source side projects from copycats?
14 points by rKarpinski on Nov 28, 2023 | hide | past | favorite | 34 comments
Hi HN!

10 days ago I did a Show HN post about a Chrome extension to speed up YouTube ads, which was open sourced under MIT license.

A member of HN who is also the admin of a developer community saw & commented on the project. Rather than support it as a contributor, they functionally copied it, created their own Chrome Web Store posting and shared it on r/webdev with zero acknowledgement or inclusion of the original MIT license.

I've documented in detail the whole experience.[1]

They now have an order of magnitude more traction with 10k+ users.

Although I'm happy that our project now has contributors it's hard not to think any work we do won't just continue to be copied.

Any advice would be appreciated.

[1] https://github.com/rkk3/ad-accelerator/blob/main/lessons_post.md_post.md




Probably not the first time he's taken credit for someone else's idea. This quote from him in the subreddit is pretty funny. "Lots of discussion and outroar lately about Chrome and YouTube forcing ads on users via blocking ad-blockers. It led me to thinking about how I could address the problem with my existing skills." His 'particular set of skills' of taking ideas from HN and passing them off as his own.


First you look at the MIT license (https://opensource.org/license/mit/): "Copyright <YEAR> <COPYRIGHT HOLDER>

"The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software."

Assuming the full license (I omitted about 892 characters) were in the original the derivative work omitting the original notice violates the license. In USA, you register your copyrighted work and can sue for statutory damages.

Patent protects an original idea (reduced to practice) and one precept is that the idea got independently used only after it was disclosed to the public. Obtaining a patent from the PTO is not a trivial matter and then you can sue for your lost profits, damages based on the defendant's profits, or prohibit use by anyone. All of this assumes you really care.


As I said in my large comment, there is no violation, because the work is my own. And this person has nothing. But some other fancy words come to mine such as slander, libel, and defamation.

I’ve shared all my source code


Most MIT licensed projects don't get any attention, and none of them make money. Consider your project an outlying success.


Considering it a success and walking away is probably the healthiest thing to do. But does the license even matter when they didn't comply with it?


No. Isn't that obvious? Even a draconian software license, which MIT's is decidedly not, requires a paid legal team for enforcement.


Agreed, was just rhetorically asking because you mentioned projects with the license


See my response in this thread. There are always 2 sides to a story.


LOL @ "functionally copied" it. Are you trying to claim the idea as an original invention?

The MIT license is for the code artifact; if you want to control the IDEA you'd need much stronger measures like a patent.


A little harsh, but what terminology would you use?

It's a small project with few LOC that they had access to and based off of. Sure they didn't just c/p but it wasn't that much more than just changing a few variable names.


How do you know this was actually copied from your code? Is there a link that I've missed to a source for the Chrome version?


They did say "I obviously probably had your idea in the back of my mind when I wrote my code". I included more details in the referenced post.

But the source is not a 1:1 copy, they functionally copied it. Although the source is very similar and derivative.


They "probably" had your idea in the back of their mind for 10 days, and didn't remember that?

Document their timeline, versus the timeline you made and continue to make your updates.

Is there a feature you could add? Like muting the sped up ads? If you can demonstrate an "echo" of features, that'll go a long ways to proving your position.

But can you do anything about it? Not really, unless you hire a lawyer in their jurisdiction.

I had this problem back in Y2K when someone was stealing my work and not attributing it to me. They even stole the history portion, and simply cut/replaced with their name, using the exact same wording. But all I could do was annoy the hell out of them until they stopped. I actually found the customer they were dealing it off to, and informed them, using the wayback machine to prove that everything in their docs was actually my material. That finally put an end to their shenanigans.


> They "probably" had your idea in the back of their mind for 10 days, and didn't remember that?

That was just a cheeky response they gave me after I reached out on Sunday (8 days after my post).

> Document their timeline, versus the timeline you made and continue to make your updates.

They first posted theirs 4 days after my Show HN which went viral on r/webdev. I assumed they had just come to it on their own and I didn't realize they had seen & commented on my work until Sunday (8 days after the Show HN).

I mention this in the referenced post https://github.com/rkk3/ad-accelerator/blob/main/lessons_pos...

>Is there a feature you could add? Like muting the sped up ads?

Muting the ads was in the original. But in terms of another feature another member of the community contributed a PR that adds support for Hulu.


I wonder if there's another site, video streaming or otherwise, that could benefit from this sped-up ad treatment.

You can outcompete with power features (which is the Linux vs Windows tactic), and watch for them to suddenly get something similar in the back of their minds again.

It's unfortunate, but literally without a fully fledged legal department, your options are at street level only.


No. They can’t do anything, because they are a liar, I have shared my side of the story, all my code.

But speaking of legal action. I think of the terms: slander, libel, defamation, misleading and false accusations, and harassment.


Well it sounds like you don't want people to be able to copy your ideas. Probably releasing them under a free license isn't the way to stop that.

May I ask what your motivations are for open sourcing it at all?

Also I don't want to seem like I'm defending their actions, and I don't think any other commenters here are - copying your idea, directly or not, and then responding the way they did, is very toxic. But, unfortunately, this is the 'risk' one has to accept when open sourcing stuff.


You are seeing their victim complex side of the story. They hide the fact that they and another have been harassing me, sharing my information, and this all started with PUBLIC accusations in a public forum I run and have run happily for months - with many happy members who would stand by me.

They had the option to message me privately - they did not take that option


I'm operating with the information I have :) Feel free to share your side


Shared in above large comment. Wasn’t showing up before for some reason


I did give them a 1 star review under my own name on the Chrome Web-Store saying the following:

"I obviously probably had your idea in the back of my mind" Is what this extensions creator said when I told them it hurt my feelings they didn't even mention that they based it off of my free open source project & extension I had shared days earlier (that they commented on).


> Well it sounds like you don't want people to be able to copy your ideas. Probably releasing them under a free license isn't the way to stop that.

I wouldn't have minded at all if they had given me a shoutout, which is all the license requires.


Yeah that's fair. I doubt it, but I wonder if Google would take it down, provided it actually is violating the license. I suspect, as others point out, you have little actual recourse without at least 1 lawyer.

Ah well. It's a compliment in a way ;) Anyway I hope this doesn't discourage you from writing more free software in the future


They don’t. And to shut them up I’ve released my own code EVERYWHERE. I made a proper somewhat angry response elsewhere in this thread - but how do you not get mad when you’re being repetitively accused of something you didn’t do by someone


Would you mind linking to that code? I haven't seen a link to it anywhere


I left a large comment on this thread


It was not. They have 0 proof but all the time in the world to spread my name everywhere and accuse me of this


Here is a seemingly counterintuitive idea. Can you partner with them? Together your team could be unbeatable. You provide the engineering, they provide the marketing.

As you point out they have an order of magnitude more users. Evidently they have some skills in marketing and distribution.


> As you point out they have an order of magnitude more users. So they have some skills in marketing and distribution.

My posting hit the front page of HN and got thousands of users. Thats how they saw it & commented on it. They shared it with r/webdev which was a larger community and so got more traction. Unfortunately I didn't realize they were directly copying me until Sunday - I thought they just came to it on their own.

> Can you partner with them?

They were super hostile when I approached them.


> which was open sourced under MIT license

This seems like the main mistake. Try AGPLv3 instead.


Yes MIT is a very permissible license, the only requirement is to include it & you can do practically anything. But they didn't even do that so I'm not sure how a different license would help?


Perhaps MIT is known as "do whatever you want" license among ordinary people, so another license would force them to think before touching it.


This guy again. I’m getting REALLY sick of this guy. I’m the person that made the code, this guy and one other have been harassing me on every platform I’m on accusing me of “stealing” his MIT licensed code in public forums. First it was Discord to a server of 1000 people. Then it was spam messages to all these people in the server. Then it was reddit. Then it was the chrome web store. Now it’s also HackerNews and GitHub! 1. I told you I was probably inspired by the idea. I make extensions daily, I always comment on and take inspiration from extensions and others ideas! But I was mostly inspired by the constant discussions about YouTube and adblockers all over the media. Your idea is not unique! You did not discover this method! 2. I already make tons of extensions, this is super low hanging fruit - so I made it. To figure out the basic functionality took 1 minute of investigating the DOM in YouTube. Inspect element of the video player, look at its properties, notice the playback rate property, toggle it, that’s it. 3. I wrote my own code because it’s as simple as setting the video playback rate to 16, doesn’t take a rocket scientist. I did not need to copy your code. It’s simple as hell. Anyone with half a brain cell would figure it out in 5 minutes. I even share my code below. 4. If I copied your code, why was my first iteration a bookmarklet and not an extension?! A bookmarklet which I mention in the original post, that I also shared with users in other forums I’m in. So tell me why I would bother with a bookmarklet if I could just copy your code as you said? THE SAID BOOKMARKLET CODE: javascript:(function(){ function clickButton() { const button = document.querySelector('#skip-button\\:5 > span > button'); if (button) { button.click(); } } function adjustPlaybackForAds(target) { if (target.classList.contains('ad-showing') || target.classList.contains('ad-interrupting')) { const video = document.querySelector('video'); if (video) video.playbackRate = 16; } }

    function waitForVideoAndObserve() {
        const video = document.querySelector('video');
        if (video) {
            video.playbackRate = 16;
            video.autoplay = true;
            video.muted = true;

            const player = document.querySelector('ytd-player #movie_player[aria-label="YouTube Video Player"]');
            if (player) {
                const observer = new MutationObserver(mutations => {
                    mutations.forEach(mutation => {
                        if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
                            clickButton();
                            adjustPlaybackForAds(mutation.target);
                        }
                    });
                });
                observer.observe(player, { attributes: true });
            }
        } else {
            setTimeout(waitForVideoAndObserve, 500);
        }
    }

    waitForVideoAndObserve();
})(); 4. Hard work. What a joke, this took me 4 hours tops to convert from idea to bookmarklet to extension . It’s about 60 lines of code in a content script that a monkey could write! I’m that monkey! And it only took that long because I had to keep pinging YouTube to get an ad to play! Wait for video element, then increase playback and mute! That’s it! Yet you are under the impression this is some arcane knowledge that must be copied to be believed. 5. I actually DID look at your code after thesr accusations appeared, I even posted both our code in the server for others to come to their own conclusions! Additionally you use background scripts and content scripts - I just use a content script because … why would you even need a background script? You don’t. 5. You are discussing legal advice - cute. Now HARASSMENT and slander, those are legal discussions 6. You and the other user who have been harassing me have been doing so with alt accounts, across platforms, now harassment does fall under legal eyes. Yes i have begun taking action on this. 7. This guy thought telling me my real name would scare me and all this stuff about “karma”. Ooo clever. He just got it from the license text by reverse engineering my extension, but it was meant to scare me. Yet he is the one with the very public profile and VERY easy to find information. 8. And then this guy and the other person started a defamation campaign against me on all these platforms, going so far as spamming every user on the server I run, that I put hard work into growing. 9. I also just looked at your “lessons”. I noticed we use completely different methods for detecting ads, and on completely different elements. Add to that, you set the playbackRate to 10, I set it to 16, copied? 10. And now to add to the fire you are continuing to slander me and share my usernames in this lessons thing on GitHub! Should the prior art extensions who were already doing this exact function also be complaining against you? I'll even share MY source code just to get this person to shut the fuck up and claiming all this crap: // content-script.js (function () { function clickSkipButton(player) { const skipButton = player.querySelector( ".ytp-ad-skip-button-modern.ytp-button" ); if (skipButton) { skipButton.click(); } } function adjustVideoPlayback(player, isAdPlaying) { const video = player.querySelector("video"); if (video) { if (isAdPlaying) { video.playbackRate = 16; // Speed up the video video.muted = true; // Mute the video } } }

  function observerCallback(mutations, observer) {
    for (const mutation of mutations) {
      if (
        mutation.type === "attributes" &&
        mutation.attributeName === "class"
      ) {
        const player = mutation.target;
        const isAdPlaying =
          player.classList.contains("ad-showing") ||
          player.classList.contains("ad-interrupting");
        adjustVideoPlayback(player, isAdPlaying);
      }

      if (mutation.type === "childList" && mutation.addedNodes.length) {
        clickSkipButton(mutation.target);
      }
    }
  }

  function setupObserver() {
    const player = document.querySelector("#movie_player");
    if (player) {
      const observer = new MutationObserver(observerCallback);
      observer.observe(player, {
        attributes: true,
        childList: true,
        subtree: true,
      });

      // Initial checks
      const isAdPlaying =
        player.classList.contains("ad-showing") ||
        player.classList.contains("ad-interrupting");
      adjustVideoPlayback(player, isAdPlaying);
      clickSkipButton(player);
    } else {
      setTimeout(setupObserver, 50);
    }
  }

  setupObserver();
})();


Do you have any evidence of harassment or doxxing? You come off as very aggressive in your comments, but that’s understandable if you’ve actually been harassed.

I think this could have been avoided entirely if you had given a shoutout to OP. It doesn’t seem like you copied their code, but it does seem like you were inspired by their idea. Open-source software is built on collaboration and recognition. Give credit where credit is due, even if it’s just a small credit.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: