3991 stories
·
4 followers

Attack of the Vibe Coded Photoshop Clones

1 Share

Over the last several months I have been tracking AI guys trying to create vibe coded clones of popular apps, especially Adobe’s apps which have always been the most pirated apps since the 90s.

  1. There are now about a dozen vibe coded attempts to clone Photoshop and some other Adobe apps, not including dozens of forks of them. People like this aren't just openly copying Adobe's apps. It's Microsoft, Avid, Autodesk and whoever else is in their sights next including game devs big and small.

  2. Automated or semi-automated cloning to steal revenue away from developers isn’t new. In the early 2000s when Google released Adsense hundreds of Adsense filled spam sites sprung up and cluttered the search engines. If your own site ever had a popular page or article, bots would clone your pages and republish your content on spam sites, stealing traffic away from you. That’s the same unethical and spammy behaviour we are seeing today when AI guys vibe-clone a copy of your apps.

  3. Directly stealing the look and feel of a product but changing the name is what the counterfeit goods market does. This is the same thing but in software.

  4. The amount being spent in AI tokens (API costs) is in the thousands of dollars per project. The largest attempt to vibe clone Adobe’s apps has over 70 devs at the time of writing (update: 165 now, it is rising daily) using Claude to submit 100s of pull requests per day. The amount they are spending on tokens must be over $50,000 in the last two weeks. I will not name this project and don’t want to give them traffic that they do not deserve. Those dozens of devs will be spamming all the social media platforms with their alt accounts anyway.

  5. Yet despite this not one of these vibe coded projects has been able to create a brush engine that matches Photoshop’s brush engine. The performance of their brushes collapses once the canvas size is over 8K x 8K pixels. Photoshop’s brushes work smoothly even when you’re working with 100 megapixel images out of a Hasselblad or Phase One camera. If you’re trying to build a Photoshop competitor in the year 2026 you should be building the engine first and then adding all the advanced features on top later, not the other way around. Unless your intention is just to generate headlines and promote an AI business.

    In the Photoshop clone that is getting the most attention, on the billboard size canvas test above Copy/Paste and the Undo stack is extremely slow and momentarily freezes the application each time. This is basic stuff that decent software developers had working well 25 years ago when we had single core computers and nowhere close to 1GB of memory. If you can't get decent performance today on multicore multi gigahertz computers with many gigabytes of memory you or your AI are not doing a good job.

  6. Those defending the poor performance of vibe coded apps have parroted the famous lines AI guys used in the past - “It is only days old” and “this is the worst it gets”. They make the mistake of equating human app development time with generative AI development time (hundreds of times faster). A vibe coded app is, in human hours, not only a few days old but closer to two or three years old. If a brush engine or transform tool works badly after the human equivalent of three years of development that is a demonstration of bad planning or an AI model not doing a good job.

  7. Brush performance aside, each of these projects struggle with 100% file format compatibility and lossless image editing. Image previews while applying filters are downscaled to low res previews to maintain usable speed. Colour profile rendering and soft proofing is hit and miss. Support for the vast number of colour profiles and print profiles is bare. On some platforms many common fonts aren’t available because they require licensing. So instead of innovating and pushing forward they have successfully rewinded the clock back to 1996 when there was a lack of industry standardisation, compatibility and quality.

  8. They’re spending minimum $2K to vibe code a Photoshop competitor when Affinity Photo is free and Photoshop costs $200 a year. Not very smart economics.

  9. They rant and claim the era of subscription software is finished, but they are subscribed to AI services and AI software. The amount they are paying to AI companies is far higher than the cost of Adobe, Autodesk, Canva or Maxxon applications, and the result is barely usable vibe coded apps that will need to be continually maintained at high cost.

  10. Vibe coders brag about their app binaries being much smaller than Adobe’s app binaries, as if that has something to do with the quality of the code. It does not. Application code (which is just text) takes up very little disk space in any application. What takes up the most amount of disk space are the frameworks, libraries, models and media assets an app ships with. The more advanced and capable an app is the larger it will become. But the size on disk is largely irrelevant in the age of terabyte+ size disks. The size of an app in memory, the app’s performance and its stability are how you judge the quality of an application.

  11. Continuing from the last point, they and internet commentors have often made claims that Adobe’s apps have “bloat” in them, but if you ask them to qualify what they mean by bloat they cannot. They will revert to application binary size again. These are mostly people who have no knowledge of programming and parrot each other. An app either has good quality code that performs well or it doesn’t. An app can have tons of redundant functions in it but functions do not run unless they are called by a tool.

  12. Whether software is vibe coded or not, open source software has rarely challenged commercial software. Krita has been around for years and is a decent application, but Clip Studio Paint’s subscriptions earn Celsys millions of dollars a year. Nobody is giving up Clip Studio Paint for software that has rough edges. Blender is a fantastic application, but expensive high end apps like Maya are still the 3D animation applications of choice for larger studios and commercial productions.

    In a 2026 survey of 150 CG production companies in Japan, when asked for their main 3D animation suite 58% named Maya, 17% 3ds Max, 12% Blender, and 7% Cinema 4D. The picture is similar elsewhere.

    Commercial apps innovate and lead. Open source apps like Blender follow the lead. Innovation costs a lot of money. Clip Paint Studio, Maya, 3ds Max and Cinema 4D, btw, are all subscription applications. But because those apps aren’t in demand by pirates Autodesk has not experienced the hate and bullying campaigns that Adobe has received.

  13. And when it comes to customer support things become even sadder looking. One or two guys in a Discord chatroom cannot support a global user base, especially when those two guys are hunting for underage children to speak to on Discord (yes, I have seen what vibe coders do).

Here we see Photoshop versus a vibe-cloned copy of Photoshop. We test brush stroke performance on a billboard-size canvas with the brush set to 1000 pixels size. Photoshop handles this with no issue. Its commercial competitors struggle to match brush performance. The vibe-coded clones perform the worst (basically unusable).

The saddest part in all this is how it feeds into the ignorance and online hate campaign against Adobe that we have seen in the last 5 or so years. Some have labelled it ‘Adobe derangement syndrome’, but whatever it is it is a mix of stock market manipulation (some admit it) and anger that Photoshop has been getting harder to pirate ever since cloud services were integrated into Adobe’s application suite.

An example above of the kind of misinformation spreading low-lifes that infest Reddit and LinkedIn.

We should clear the air here. Subscription software exists when cloud services and cloud compute are integrated into a software suite. It is the only way to pay for the running costs at wide scale. If you remove these modern services there is limited progress in software development. You'll have to move all high cost compute locally which is impractical because most users cannot afford a high end workstation GPU or cloud server.

Instead of hurling hate speech and bile at thousands of software engineers who lead innovation at large companies (Adobe, Autodesk, Maxxon, Celsys, and others), show them some gratitude for their efforts. They are the engineers who innovate and everyone else follows. Just because they work at a big company doesn't mean they are committing human rights abuses. We have a generation brainwashed by envy and hate instead of urging everyone to be greater and bigger.

If some people have an issue with companies being large, they now have the tools to compete against them. But instead of vibe cloning poor quality rip offs why not build new original creative applications around fresh ideas that have never been tried before?

But then again, vibe cloned piracy is a demotivating force. It ruins the incentive to create. Why create new original apps and games if someone comes along and rips you off?

You’re giving yourself too much credit Brandon. There are dozens of people in your GitHub repo and they are all subscribed to a chatbot that is doing almost all the coding after being fed screenshots of Adobe’s apps.

Read the whole story
emrox
21 minutes ago
reply
Hamburg, Germany
Share this story
Delete

Jev and System One Models: Calibration Beats Accuracy

1 Share

Last week TypeSafe AI released Jev, which it calls the first “System One model”: a model that does not chat, does not write, and does not reason step by step. It answers structured questions about an input, in a single forward pass, with a probability attached to every answer. Most of the coverage has focused on speed. I think the more interesting claim is the one about calibration, because calibration is the thing that has quietly limited every production classifier I have shipped, including the one in my COMPSAC paper.

This post is my attempt to work out what Jev actually changes, where it fits in a real ML stack, and how I intend to test the claim rather than take it on faith.

What Jev is, without the marketingLink to section: What Jev is, without the marketing

Jev is built around three ideas, per TypeSafe’s launch post:

  1. Non-autoregressive output. A normal LLM produces its answer one token at a time, and each token depends on the last. Jev emits the entire structured answer at once. That is where the speed comes from: TypeSafe quotes 70–500 ms end to end and “40x–200x faster” than frontier LLMs on equivalent tasks.1
  2. Typed questions, not prompts. You send a state (text, structured data, or a message history) and a set of questions. Each question is one of three types: choice (pick from a set, get a probability per option), score (rate against ordered levels, get a continuous score and distribution), or noul (a yes/no, returned as the probability the statement is true).2 Every question in a request is evaluated in parallel, so adding questions barely changes latency.
  3. Training for calibration. The model is trained with what TypeSafe calls reinforcement learning for calibrated decisions (RLCD). The stated goal is “epistemically honest probabilities” rather than the human-preference or verifiable-reward objectives that chat models are tuned on.1

The constraints are just as important as the features. Jev cannot generate free text. A choice question supports at most 255 options. There is no image input yet. Pricing is $0.042 per million input tokens with output tokens free, and access is currently by waitlist.1

So it is not a smaller GPT. It is closer to a very fast, very general tabular classifier that reads unstructured input and returns a typed decision with a confidence you are meant to be able to trust.

Why calibration, not accuracy, is the real bottleneckLink to section: Why calibration, not accuracy, is the real bottleneck

Here is the part of my own paper I keep coming back to. We predicted whether a pull request would be merged, using only signals available at submission time. Random Forest hit an F1 of 0.958. The majority-class baseline, which says “merged” to everything, hit 0.957. The number that actually separated a useful model from a useless one was ROC-AUC: 0.676 for the forest versus 0.500 for the baseline. And even at that, we wrote plainly that the models “should not be treated as perfectly calibrated probability models” and were fit for triage, not for automated accept/reject decisions.3

That is not a quirk of one dataset. It is the normal shape of a production classifier:

  • Accuracy saturates early. On imbalanced problems, most of the available accuracy is free. The hard part is the ranking and the confidence.
  • Downstream logic needs probabilities, not labels. “Route this order to manual review if the model is less than 80% sure” only works if 80% means 80%. If the model says 0.95 on things that are right 70% of the time, every threshold you set is a lie.
  • Miscalibration is invisible in the usual metrics. F1, accuracy, even AUC are all threshold or rank metrics. A model can have a fine AUC and terrible calibration, and you will not know until the business rule built on top of it starts misfiring.

The standard fixes are post-hoc: Platt scaling, isotonic regression, temperature scaling. They work, but they are another fitted component that drifts when the data does. What Jev is claiming, if I read it correctly, is that the probabilities come out of the model already honest, because honesty was the training objective. If that holds on tasks outside TypeSafe’s own benchmarks, it removes a whole layer of glue from production ML systems.

That “if” is the entire question, and it is testable.

Where a System One model fits in a real stackLink to section: Where a System One model fits in a real stack

I work on ML inside a wholesale distribution business. Almost none of it is chat. Most of it is small, repeated decisions that sit between two systems:

DecisionTodayWhy it is annoyingDoes Jev’s shape fit?
Is this inbound order an exception that needs a human?Rules plus a small classifierRules rot; retraining the classifier is a projectYes: a noul with a threshold
Which regulatory product category does this new SKU belong to?Keyword rules, manual cleanupVendor descriptions are messy free textYes, if categories fit in 255 choices
How urgent is this customer support message?Nothing, or an LLM call that takes secondsLatency and cost make it hard to run on every messageYes: a score over ordered levels
Which delivery route should absorb this late order?Constraint solverNot a classification problem at allNo
Write the customer-facing note explaining a substitutionLLMNeeds generated textNo

The pattern is clear. Anywhere I have an LLM doing a job that is really classification wearing a chat costume, a System One model is a plausible replacement with two orders of magnitude less latency and cost. Anywhere I have hand-written rules that keep breaking because the input is free text, it is a plausible replacement for the rules. Anywhere the job is generation or optimization, it is the wrong tool and TypeSafe says so themselves.

The ERP integration story is also attractive. A model that returns {"is_exception": 0.93} in 100 ms can sit inside a request path. An LLM that returns a paragraph in four seconds has to sit beside it in a queue. That difference decides whether ML is a feature or a batch job.

The claims I am not ready to accept yetLink to section: The claims I am not ready to accept yet

A few things in the launch material deserve a skeptical reading.

“Zero hallucination.” What TypeSafe can guarantee is that the output type is always valid: you asked for one of five categories, you get one of five categories, with probabilities that sum to one. That is real and useful, and LLM structured-output modes only approximate it. But it says nothing about whether the chosen category is right. A confidently wrong answer in a valid schema is still a wrong answer. The honest framing is “zero schema errors,” and calibration is what has to cover the rest.

Calibration on whose distribution? A model can be well calibrated on its training and benchmark distribution and drift badly on yours. Calibration is a property of a model and a dataset. The only number I will trust is one measured on my data.

The comparison baseline. “200x faster than an LLM on classification” is true and also a bit unfair, because the right baseline for many of these tasks is not an LLM. It is a gradient-boosted tree on engineered features, which is also sub-millisecond and free. The interesting comparison is three-way: classical tabular model, LLM-as-classifier, and Jev, on the same task, on accuracy, ranking, calibration, latency and cost.

The experiment I want to runLink to section: The experiment I want to run

I have exactly the right testbed already built: the PR acceptance pipeline from my paper. It is leakage-aware, it has fixed 5-fold splits, and it has a published tree-model baseline with a known calibration weakness. Here is the design.

Task. Same as RQ1 in the paper: given a PR at submission time, predict merged vs. closed without merge. The Jev state will be the PR title, body, and the same submission-time metadata and diff statistics the trees see, serialized as text. Nothing that appears after submission (comments, CI, later commits) goes into the state. The leakage rules do not relax because the model is new.

Questions. One noul: “This pull request will be merged.” Optionally one choice over the task-intent tags (fix, feature, refactor, docs) to see whether Jev’s own reading of intent agrees with our keyword rules.

Baselines. The paper’s Random Forest (400 trees), the same forest with isotonic calibration fitted in-fold, and a frontier LLM asked the same question with structured output.

Metrics. Ranking and calibration, not just F1:

  • ROC-AUC, so the result is comparable to the paper.
  • Brier score, the mean squared error of the probability against the outcome:

  • Expected calibration error, binning predictions by confidence and measuring how far each bin’s accuracy is from its stated confidence:

  • A reliability diagram per model, because a single ECE number hides where a model is over- or under-confident.
  • Median and p95 latency, and cost per 1,000 PRs.

What would change my mind. If Jev matches the forest’s AUC and beats the calibrated forest on Brier and ECE, without any post-hoc fitting, then the calibration claim is real on a distribution TypeSafe never saw, and I would start moving classification-shaped LLM calls at work onto it. If it beats the uncalibrated forest but not the calibrated one, then it is a convenience, not a capability. If its AUC is materially lower, the speed does not matter.

I will publish the numbers either way, and I will link them from here.

What I would tell a team todayLink to section: What I would tell a team today

If you are deciding whether to care about Jev right now, my advice is:

  1. Inventory your LLM calls. Tag each one as generate or decide. The decide ones are candidates. In my experience that is most of them.
  2. Measure calibration on what you already have. Compute Brier and ECE for your current classifiers. If they are bad, you have a problem Jev might solve. If they are fine, you mostly have a latency and cost question.
  3. Do not skip the classical baseline. A gradient-boosted tree on decent features is the bar. Any new model has to beat it on your data, with your leakage rules, or it is not an upgrade.
  4. Treat “calibrated” as a hypothesis. Test it on your distribution before a business rule depends on it.

The idea behind System One models is sound: most of the decisions software needs from ML are small, structured, and latency-sensitive, and a chat model is a strange tool for them. Whether Jev delivers on the calibration promise is an empirical question. I have the dataset to answer it, and I intend to.

Further readingLink to section: Further reading

If you have Jev access and a labeled classification dataset with a known calibration problem, I would like to compare notes. My contact details are on the homepage.

  1. TypeSafe AI, Introducing System One Models & Jev, September 2026. Latency, speedup, pricing, cardinality and modality limits are quoted from that post and are the vendor’s claims. ↩ ↩2 ↩3

  2. LangChain, Building a harness with Jev, September 2026, which documents the state/questions request shape and the choice, score and noul question types. ↩

  3. K. Pansuriya, E. Ghorbani, D. Singh, E. A. AlOmar. Predicting Acceptance and Review Effort in Human and Agent Pull Requests. IEEE COMPSAC 2026. arXiv:2607.12057. Table II reports RF F1 0.958 / AUC 0.676 and the majority baseline F1 0.957 / AUC 0.500. ↩

Read the whole story
emrox
17 days ago
reply
Hamburg, Germany
Share this story
Delete

Encoding transparent videos that work in Safari, Chrome and Firefox

1 Share

TERHECH.DE #web technologies #blender #ffmpeg

Quick note on how to create a transparent video that works in Safari and in Chrome using FFmpeg and Blender

● Feb 2, 2025 № 646 1 min read 291 words

I recently changed the style of this blog and included the video that you can see in the top right corner.

For posterity (should I change the design again), here it is:

The video contains an alpha channel and getting this to work in Safari (and non-Safari browsers) was a bit tricky so I’m keeping it here for future reference.

The video

The video is exported from Blender as a series of png frames with alpha channgel. Lets say to /tmp/frames/%04d.png.

Chrome et al

Supporting Chrome and Firefox is easy, we can generate a webm video with alpha channel:

ffmpeg -i /tmp/frames/%04d.png -c:v libvpx-vp9 -b:v 0 -crf 25 -pix_fmt yuva420p webm.webm

Safari

Safari does not support webm with alpha channels, so we have to do something different. Thankfully, Apple added support for HEVC with alpha channels to Safari some time ago. So we can do that. Creating these is a bit more work. First, we need to create the image sequence to an Apple ProRes video.

ffmpeg -framerate 25 -i /tmp/frames/%04d.png -vf "scale=iw/2:ih/2" -c:v prores_ks -pix_fmt yuva444p10le -alpha_bits 16 -profile:v 4444 -f mov prores.mov

(The -vf "scale=iw/2:ih/2" is optional and used to scale the video down 2x)

Next, we need to convert this to a HEVC video with alpha channel. I was not able to do this with ffmpeg, but there’s a way to do this with the macOS Finder. Right click the just-created prores.mov file in Finder and select Services -> Encode Selected Video Files.

A new dialog will appear

Finder dialog

Select HEVC 1080p (or a higher resolution if needed), Preserve Transparency and then Continue.

HTML

Embedding the two videos in HTML is straightforward.

<video autoplay loop muted playsinline width="240" height="200">
  <source src="/img/ben-safari.mov" type="video/mp4;codecs=hvc1" />
  <source src="/img/ben-rest.webm" type="video/webm" />
</video>
Read the whole story
emrox
17 days ago
reply
Hamburg, Germany
Share this story
Delete

Trade

4 Comments and 12 Shares
"You legs may have a comparative advantage at running, but we arms have a competitive advantage at swinging hammers, so unless you accept that we're the dominant limbs and stop hogging the oxygen, that running advantage won't be around for long."
Read the whole story
emrox
18 days ago
reply
Hamburg, Germany
Share this story
Delete
4 public comments
SimonHova
42 days ago
reply
Finally we are able to close the political cartoon deficit that has been open since Smoot-Hawley.
Greenlawn, NY
satadru
46 days ago
reply
Sigh...
New York, NY
cjheinz
46 days ago
reply
More, please.
Lexington, KY; Naples, FL
alt_text_bot
46 days ago
reply
"You legs may have a comparative advantage at running, but we arms have a competitive advantage at swinging hammers, so unless you accept that we're the dominant limbs and stop hogging the oxygen, that running advantage won't be around for long."
Pylgrimm
46 days ago
"But you need us for getting around!" "Well, you need us MORE to swing a hammer." How many times in our life you think swinging a hammer is going to be more relevant than moving freely??" "There you have it, my fellow upperbodians, how uppity these lowerbodians can get after weak policies have allowed them to do whatever they want all these years! We tried to be nice and just do the right thing, but I see the only way forward is putting the fear of god in them and any other limbs or organs that refuse to admit our supremacy!" *replaces hammer with saw*

Semaphore

2 Comments and 3 Shares
The speed of light in air is 50% faster than in fiber, but it's a challenge to get the arms to move fast enough to realize the latency advantage.
Read the whole story
emrox
18 days ago
reply
Hamburg, Germany
Share this story
Delete
2 public comments
rraszews
34 days ago
reply
At my office we used to suggest building a cross-domain solution consisting of a printer, a scanner, and a shredder.
Columbia, MD
alt_text_bot
34 days ago
reply
The speed of light in air is 50% faster than in fiber, but it's a challenge to get the arms to move fast enough to realize the latency advantage.

New in Chrome 154: iframes that automatically resize themselves to their content

1 Share

~

Chrome 154 adds support for responsively-sized iframes, letting an <iframe> size itself based on the intrinsic size of its embedded document. This is perfect for seamlessly embedding third-party comment widgets, varying-height social media embeds, or any other type of embed that uses an <iframe>.

~

# The Code

To make this work there is a two-way opt-in:

  • The embedder (e.g. index.html) needs to set the frame-sizing CSS property with a value of auto, content-height, or content-width (or its logical variants) on the iframe.
  • The document loaded in the <iframe> (e.g. iframe.html) needs to include a meta tag to indicate that it’s OK to communicate its size the parent embedder.

In code:

/* In styles.css for index.html */
iframe {
  frame-sizing: content-height;
  width: 100%;
}
<!-- In the iframe.html’s head -->
<meta name="responsive-embedded-sizing" content="allow-origins=*">

The content’s size is communicated from the embedded document after page load. To communicate a new size, the document in the frame must call window.requestResize();

Use allow-origins to limit which origins the document communicates its size info to.

~

# Demo

Here’s a demo that contains a form which is an <iframe>. Whenever you go to a next step of the form, the <iframe> resizes itself to its contents … if your browser suppports frame-sizing that is.

Because the iframe resizes itself, the form is seamlessly embedded, without any scrollbar appearing at all.

~

# Browser Support

💡 Although this post was originally published in September 2026, the list below is constantly being updated. Last update: September 26, 2026.

Support for responsively size iframes is this:

Chromium (Blink)

✅ Supported in Chrome 154

Firefox (Gecko)

❌ No Support. There is no bug tracking this yet.

Safari (WebKit)

❌ No Support. There is no bug tracking this yet.

~

# Learn More

Get all the details about responsive iframes on developer.chrome.com, in this article I co-authored: Responsive iframes in Chrome 154 →

~

🔥 Like what you see? Want to stay in the loop? Here's how:

I can also be found on 𝕏 Twitter and 🐘 Mastodon but only post there sporadically.

Read the whole story
emrox
19 days ago
reply
Hamburg, Germany
Share this story
Delete
Next Page of Stories