Hello, everyone,
At a time when the use of LLMs is polarizing society (there are those who use them often, those who are fiercely against them, and ultimately very few people in between
), I thought it would be interesting and honest to share my humble view on the subject, as a maintainer of modest open-source software (CImg and G’MIC), and how LLMs are influencing/have influenced my development activities.
Above all, I’d like to share my personal experience on the subject, and, most importantly, I don’t want to preach! (everyone is entitled to their own opinion, and we should let others have theirs as well).
As you may know, I am the founder of the G’MIC project (in 2008), and I am currently its lead developer and maintainer. G’MIC’s codebase currently consists of about 200,000 lines of code, including all the code for the various user interfaces (CLI, G’MIC-Qt, etc.), the standard library functions, and contributions from the gmic-community.
Let’s just say it right away: that’s a lot of lines of code for a single person to maintain in his spare time.
So, to make a long story short: yes, I’ve already used LLMs to help me develop G’MIC.
I’ll explain in detail below how I used them and for which parts of the project.
My use of LLMs for G’MIC is obviously fairly recent (I’d say about one year or so), since that’s roughly when I’ve started to find them useful.
Since the G’MIC project began in 2008 (a time when LLMs didn’t even exist), it’s clear that the vast majority of the project was not vibe-coded by LLMs (just in case you had any doubts about that!
).
1. Project Core
Here, what I call the project core consists of the C++ code for the G’MIC language interpreter, the implementation of all its operators (the G’MIC Standard Library stdlib, which is all written in G’MIC language), and the implementation of the underlying C++ image processing library CImg.
This is, of course, the most critical and complex part of the project (and the oldest as well), so I already had a quite solid codebase for this part, even one year ago.
So here, I mainly used LLMs for code review: I let the LLMs (primarily Claude, ChatGPT, Mistral, and Gemini) analyze the tens of thousands of lines of code that make up this part and provide me with suggestions for improvements or bug fixes.
Note that I didn’t use an AI agent to do the fixes automatically, I preferred to review each suggestion myself and decide whether or not the proposal is worth (and write the fix by hand when necessary). LLMs are quite good in analyzing correctness of C++ code, so I have to say that, I’ve indeed been able to fix quite a few bugs between G’MIC versions 3 and 4. It was a long and tedious process (reviewing code suggestions done by LLMs for 10 to 12 hours a day for one entire week, I can attest that it’s exhausting!).
But I can also attest to the results: in practice, these suggestions from LLMs (sometimes far-fetched, sometimes brilliant) allowed me to make the G’MIC core codebase more robust and optimized, and to do so much faster than if I’d had to do this reviewing job entirely “by hand” (I wouldn’t have had the courage to do that in practice with such a large number of lines of code). That’s a fact.
But clearly, it wasn’t at all a “hands-off” job!
2. G’MIC filters
I’ve also tried programming new filters for the G’MIC-Qt (so written directly them in the G’MIC language) using LLMs, though I have to say I’ve had very little success doing so until this week.
Although the G’MIC language has a fairly comprehensive reference documentation, it remains a niche language with very few code examples available online, so it makes sense that LLMs aren’t very effective at writing G’MIC code. What’s more, the language has evolved quite a bit over the past 18 years, so the language syntax from 10 years ago isn’t supported anymore. And all the LLMs I was testing still tended to mix the syntaxes of different versions of G’MIC, which obviously didn’t work.
In short, I’ve never really managed to extract functional and useful G’MIC code (even with some reworking) from an LLM…
…That is, until this week, when I ran a funny experiment: I generated the entire G’MIC reference documentation as an ASCII file named gmic_reference.txt, and attached it to an initial prompt for Gemini (this taking like 100K tokens in the prompt), asking it to program a G’MIC filter while forgetting everything it already knew about G’MIC and relying solely on the language description in that attached reference documentation. And lo and behold, this significantly improved the quality of the generated G’MIC code.
That’s actually how I implemented the filter Rendering / Chladni Figures, which has been just added in the G’MIC-Qt plug-in a few days ago.
To be clear, it didn’t work right away, but it did after just a few iterations (2 or 3 additional prompts).
This filter is simple enough that I could implement it myself and, more importantly, I could review the code generated by Gemini to understand what it did and improve it if necessary (and it definitely needed some work!). In the end, I rewrote about half of the filter’s code to make it cleaner, but this is the first time an LLM has been able to generate a filter from scratch (at least for me) that was functional. I’d say, it is an interesting step!
Then I tried to keep working in that direction for a few days, and with the help of Gemini and Claude, I managed to develop a second filter, with significant assistance from LLMs, namely the Rendering / Cosmic Nebula filter.
Once again, I was pretty helpful as a human coder in cleaning up, improving, and debugging the code, but the LLMs helped me establish a solid foundation for developing this new filter (and clearly saved me time).
To sum up, developing these two filters wasn’t exactly a walk in the park: it took quite a few rounds of back-and-forth with the LLMs just to get something functional.
So I naturally thought that this back-and-forth could be handled by an AI agent, and I installed one on my PC yesterday (kilo) For the LLM, it uses an open-source DeepSeek-4 model, so it’s clearly less capable in terms of reasoning than what Gemini, Claude, or ChatGPT offer, but it allowed me to see how it works and to start creating an agent specialization dedicated to implementing G’MIC functions.
So far, nothing concrete has come of it, but I’ll continue my testing, and I’m hopeful that this agent can help me in some way to quickly prototype new filters. Just as with I’ve done with G’MIC-core, I want to have the final say on the code anyway, to make it as clean, robust, and efficient as possible. I definitely don’t want to put just anything generated by the LLM into the G’MIC stdlib. I haven’t worked on it nonstop for more than 18 years just to ruin it overnight with pure AI slop without verifying the quality of the generated code!
3. All the extras
I’ve also made quite a bit of use of LLMs for all the “extras” that are part of developing a project like G’MIC: setting up build systems (Makefile and CMake), writing Bash scripts (for the creation of the binary packages, for example), configuring the various virtual machines I use to compile binary packages, writing code for HTML pages, and so on. I have to admit that all of this involves technologies and languages I’m not really interested in and thus I don’t fully master (seriously, who wants to master the syntax of Makefiles or CMakeList.txt files? ), and here, LLMs have also been very helpful to me, improving my configuration files with syntax magic I couldn’t even think of!
4. Final thoughts
To sum up, I’d say that in my situation, as a solo developer working on a relatively large project and striving to make it as easy to install as possible, LLMs have been a huge help in many aspects! Most importantly, they’ve helped me optimize the time I spend on development tasks I don’t necessarily enjoy (“extras”, code reviews), leaving me more time for the development work that really interests me (image processing operators).
My impression is that these technologies will soon make it easier to create truly functional, high-quality G’MIC filters by potentially anyone, developer or not. And in a way, that’s a good thing: one of the initial G’MIC’s goals was to serve as a software platform for developers to create/share/distribute image filters. Now that anyone can potentially become a G’MIC filter developer with some LLM help, why not taking advantage of the good ideas these people might have to enrich the framework with new interesting filters (provided they are of sufficiently high quality, of course).
Other than that, yes, I’m aware of the concerning environmental impact of this technology. For my part, I use LLMs to perform tasks that I consider important enough for developing my open-source projects, tasks that save me a lot of time on aspects that can be a bit tedious (and that I couldn’t do in a reasonnable time without the help LLMs provide, let’s be clear). But I think the key is to strike a balance between the environmental cost and the value/utility of the output generated by these LLMs. But it’s very subjective, indeed (is it important to be able to generate images of kittens in underwear yodeling? I’m not sure about this).
So, that was a recap of my experience, which I hope will help you understand why and how LLMs are used in the development of G’MIC!








