<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>fairscan.org</title>
  <subtitle>Browse aymeric&#39;s, an independent, searchable archive of readable snapshots from followed feeds, preserved in Git with aggr.</subtitle>
  <id>https://aggr.aymericbeaumet.com/sources/fairscan.org/</id>
  <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/sources/fairscan.org/"/>
  <link rel="self" type="application/atom+xml" href="https://aggr.aymericbeaumet.com/sources/fairscan.org/atom.xml"/>
  <updated>2026-10-13T13:44:47+00:00</updated>
  <author>
    <name>aymeric&#39;s</name>
  </author>
  <generator version="2.0.0" uri="https://github.com/aymericbeaumet/aggr">aggr</generator>
  <entry>
    <id>urn:aggr:item:e0d120a099251e51a644333417fe65bea1aeafd0</id>
    <title type="text">Did Ente Locker copy my code without attribution?</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/lobste-rs/2026-10-13-did-ente-locker-copy-my-code-without-attribution/"/>
    <link rel="via" type="text/html" href="https://fairscan.org/blog/did-ente-locker-copy-my-code-without-attribution/"/>
    <published>2026-10-13T13:44:47+00:00</published>
    <updated>2026-10-13T13:44:47+00:00</updated>
    <author>
      <name>fairscan.org via tusharhero</name>
    </author>
    <category term="news"/>
    <category term="law"/>
    <source>
      <title>Lobsters: Top Stories of the Past Week</title>
    </source>
    <summary type="text">Comments</summary>
    <content type="html">&lt;p&gt;The last blog post I wrote explained &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://fairscan.org/blog/open-source-and-gpl/&quot;&gt;why I chose to make FairScan open source&lt;/a&gt;. In particular, I said I knew there was a risk when I published FairScan&#39;s code and I was ready to accept it. I didn&#39;t expect to face that reality so soon.&lt;/p&gt;
&lt;h2&gt;What happened to me over the past few weeks&lt;/h2&gt;
&lt;p&gt;I had never heard of Ente before September 16. On that day, I received an email from one of their engineers. The message thanked me for FairScan and announced that the Ente Locker app now used FairScan&#39;s segmentation model as part of a new document scanning feature. It referred to a blog post that credited FairScan&#39;s model and claimed that &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://fairscan.org/blog/did-ente-locker-copy-my-code-without-attribution/from-scratch.webp&quot;&gt;Ente &amp;quot;wrote the image processing around it from scratch&amp;quot;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I had put significant effort into FairScan&#39;s image processing so I was curious to see how Ente solved the same problems. What I found is that multiple image-processing implementations appeared to be almost direct translations of FairScan&#39;s implementations from Kotlin to Rust.&lt;/p&gt;
&lt;p&gt;I replied by email on September 17. The engineer quickly answered that their blog post &amp;quot;could have been better phrased&amp;quot;, and that it was reworded. I could see that &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://ente.com/blog/locker-document-scanner/&quot;&gt;the new version&lt;/a&gt; replaced the &amp;quot;from scratch&amp;quot; claim with something rather vague and still insisted on the segmentation model.&lt;/p&gt;
&lt;p&gt;The same day, I sent a list of links to compare FairScan and Ente&#39;s code. I mentioned that I couldn&#39;t find any attribution to FairScan in the Ente repository.&lt;/p&gt;
&lt;p&gt;On September 21, I received a reply from the same engineer that those were &amp;quot;fairly standard image-processing methods&amp;quot; and that the code had been subsequently fully rewritten. In their repository, I found &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/ente/ente/pull/13053&quot;&gt;a pull request affecting more than 6,000 lines&lt;/a&gt;. Of course, it cannot change the code that was distributed in Locker 1.0.9.&lt;/p&gt;
&lt;p&gt;On the same day, I sent an email to &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://ente.com/contact/&quot;&gt;copyright@ente.com&lt;/a&gt; to ask for the company&#39;s view on this. As of October 12, I still haven&#39;t received an answer.&lt;/p&gt;
&lt;p&gt;On September 29, I published &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://mastodon.social/@pynicolas/117352788210310140&quot;&gt;a post&lt;/a&gt; on Mastodon linking to &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://gist.github.com/pynicolas/e018ef84464a2cf7949fa453e41cfead&quot;&gt;a GitHub gist where I documented this timeline as well as code similarities&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Standard methods or direct translation?&lt;/h2&gt;
&lt;p&gt;Feel free to have a look at the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://gist.github.com/pynicolas/e018ef84464a2cf7949fa453e41cfead#code-comparison&quot;&gt;code comparisons&lt;/a&gt; in the gist linked above and form your own opinion, even if you&#39;re not a developer. You can use the &amp;quot;split view&amp;quot; of your browser for side-by-side comparisons. Here&#39;s an example:&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://fairscan.org/blog/did-ente-locker-copy-my-code-without-attribution/comparison.webp&quot;&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://fairscan.org/blog/did-ente-locker-copy-my-code-without-attribution/comparison.webp&quot; alt=&quot;&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the implementations I compared, I found the following similarities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The same overall structure&lt;/li&gt;
&lt;li&gt;The same algorithms&lt;/li&gt;
&lt;li&gt;The same names for functions and variables&lt;/li&gt;
&lt;li&gt;The same hard-coded values&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To me, it looks like an almost direct translation from Kotlin to Rust. There are differences but they&#39;re not easy to spot.&lt;/p&gt;
&lt;p&gt;Of course, I have a special position about this code. I wrote it, so I know where it comes from. I know it&#39;s the result of a lot of effort:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I researched existing techniques like multi-scale Retinex, single view metrology, or gray world white balance.&lt;/li&gt;
&lt;li&gt;I assembled &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://fairscan.org/blog/the-heart-of-fairscan-image-processing-pipeline-explained/&quot;&gt;an image pipeline&lt;/a&gt; that fits the segmentation model.&lt;/li&gt;
&lt;li&gt;I started with some simple techniques (such as Douglas Peucker) that I later replaced.&lt;/li&gt;
&lt;li&gt;I developed &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://fairscan.org/blog/where-to-cut-automatic-document-cropping/&quot;&gt;my own algorithm to approximate a quad based on contour orientation&lt;/a&gt; (which is probably not optimal).&lt;/li&gt;
&lt;li&gt;I had to make choices about &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://fairscan.org/blog/what-s-a-good-scan/&quot;&gt;what a scan should look like&lt;/a&gt;: not all apps make the same choices.&lt;/li&gt;
&lt;li&gt;I tested the behavior of my implementations and their parameter values &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://fairscan.org/blog/color-detection-data-driven/&quot;&gt;on hundreds of images&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I fixed many bugs in my implementations.&lt;/li&gt;
&lt;li&gt;I wrote blog posts about some of the numerous iterations I made, illustrating my trial and error process.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How can that be called &amp;quot;standard methods&amp;quot;? I would like to know where similar code can be found because it would have saved me a lot of work. Actually, if it already existed, I would probably not have started FairScan.&lt;/p&gt;
&lt;h2&gt;Silence discourages me&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ente has not acknowledged the code similarities as an issue&lt;/strong&gt;, publicly or privately. In response to my comparisons, the engineer described the code as &amp;quot;fairly standard image-processing methods&amp;quot;, but this didn&#39;t address the similarities I had pointed out. If there&#39;s no problem, why did they rewrite more than 6,000 lines in 3 days after my email? Why don&#39;t they answer my questions?&lt;/p&gt;
&lt;p&gt;Here&#39;s the key: if Ente&#39;s code was derived from FairScan in a way that makes it subject to the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/pynicolas/FairScan/blob/main/LICENSE&quot;&gt;GPL&lt;/a&gt;, its distribution raises questions about compliance with that license.&lt;/p&gt;
&lt;p&gt;Should I take legal action? That&#39;s not what I want for FairScan. But I also don&#39;t want this issue to remain unaddressed, leaving others to form their opinion based on Ente&#39;s public statements alone.&lt;/p&gt;
&lt;p&gt;Ente widely promoted the new feature on social media and platforms such as Reddit. &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://lnkd.in/p/eTpnkpNu&quot;&gt;Its CEO praised Locker publicly with these words: &amp;quot;Best opensource document scanner I&#39;ve ever used&amp;quot;.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On my side, I&#39;ve been very careful until now. I initially communicated only privately with Ente. When I published a Mastodon post, it was very factual: I didn&#39;t make spectacular accusations and maybe because of that, there were almost no reactions.&lt;/p&gt;
&lt;p&gt;I suspect very few people know about this situation. From the outside, Ente can continue promoting its scanning feature without having to address the concerns I&#39;ve raised. The issue remains unresolved and Ente can continue ignoring me.&lt;/p&gt;
&lt;p&gt;The fact that almost no one reacted is discouraging to me. Over the past few weeks, I&#39;ve spent more time thinking about this than working on the rest of FairScan. It probably doesn&#39;t deserve it but I simply can&#39;t accept that situation. What&#39;s the point of open-source transparency and accountability?&lt;/p&gt;
&lt;p&gt;I&#39;d genuinely like to hear from other developers who have looked at these comparisons. Do these similarities suggest that Ente&#39;s code was derived from FairScan? &lt;strong&gt;I would be grateful to anyone who can share an independent perspective on this case.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Open source doesn&#39;t equal respect&lt;/h2&gt;
&lt;p&gt;This episode makes me take another look at my position about open source.&lt;/p&gt;
&lt;p&gt;FairScan is my attempt to make a respectful app: an app that is both &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://fairscan.org/blog/a-respectful-app/&quot;&gt;respectful to its users&lt;/a&gt; and respectful in the way it&#39;s made. I think it&#39;s now clearer to me that those two aspects don&#39;t necessarily go together. I still believe that open source is one of the best ways users have to assess whether an app can be trusted (caveat: it can still contain &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://f-droid.org/docs/Anti-Features/&quot;&gt;anti-features&lt;/a&gt;). However, it&#39;s perfectly possible to make an open source app in a disrespectful way, for example by copy-pasting code without acknowledging its origins.&lt;/p&gt;
&lt;p&gt;Yes, the risk I identified before publishing my code is real. In fact, any open source code can be copied without attribution. I knew that closed-source software could incorporate open-source code without complying with its license, and that proving such a violation could be difficult. Maybe I accepted this risk because I cannot know when it actually happens. What I didn&#39;t consider was that open-source software could do the same, and that in that case, I could see it with my own eyes.&lt;/p&gt;
&lt;p&gt;I knew that other projects could reuse FairScan&#39;s code even if they don&#39;t share my vision, but I did expect that the origins of the code would be acknowledged honestly.&lt;/p&gt;
&lt;p&gt;What happened is something I wasn&#39;t ready for. I put a lot of myself into FairScan, perhaps too much: seeing my work dismissed as if it had no value is very hard not to take personally. Today, this makes me question my motivation to contribute to open-source software.&lt;/p&gt;
</content>
  </entry>
</feed>
