Saturday, May 31, 2025

Monthly Recap - 2025-04 April

April was a very busy month with a lot of big things going on, both in my professional life and in personal projects. Especially in my daily job, I was finally able to achieve significant milestones of which I am very proud. Although I did not have much time for studies, I also accomplished some important things in my coding projects. Here is a short summary.


Achievements

Open Source Champion

Beginning late last year, I am a local Open Source Champion in my company. Although I had a lot of onboarding to do, and it took a long time to pick up traction in the position (in great part because it is only a side activity in my job, expected to take only about 10% of my working time), this month it was finally announced that both me and another colleague would act as champions of this topic in our location, through official channels.

Open Source is a topic that I have always been very passionate about - from the very first time I joined my current company (back in 2018), I fought to stay in the "open" part of it, and to incentivize the usage of open software whenever possible. When I left the company (December of 2020), this was still a difficult position, but when returning (June 2024), I found a much more mature and progressive mindset in the company. So it was a huge pleasure, and a validation of so many years of hard work, to be able to get into this role. As an Open Source champion, my goal is to foster the usage of open source technology, clarify any questions about the company's guidelines and policies about the topic, and to help in building a strong community dedicated to this in my location.

The official announcement could not have been better: we announced it while delivering a talk about the topic in the local instance of the largest internal conference focused on development topics in the company!


Innoweeks

April saw the start of the yearly edition of an innovation event that I am very fond of: the Innoweeks. I had participated twice in this event, in 2019 and in 2024. In both occasions, I was able to meet and work with brilliant colleagues from different areas of the company, which was an amazing boost to my own self-development. I always participated in the developer role.

In this year's edition, I will be participating as a dev lead, a new role which carries much more responsibility from the one I am used to. This will be an exciting opportunity to be more involved with the high level decisions of the project, and to help steer the development team into their best version.


LLP releases

Local Language Practice (LLP) is a desktop application to practice languages through a roleplay conversation with a local LLM model. It is the third project in my First Steps Into AI Engineering series. I have written a blog post about it, Project: Local Language Practice (LLP). I had been working on it since January, and in April I was finally able to make its first release. These were the releases of LLP in April:

  • 1.0.0: Initial version, containing roleplay chat with a default scene and translation feature.
  • 1.1.0: Added feature to load custom practice scenes.


Next First Steps Into AI Engineering project

After releasing LLP, I was able to start working on the fourth and final project of the First Step Into AI Engineering series. I have been working on this series since May of last year, so it is very exciting to be so close to finishing all I had planned for it!

I plan to release this final project in May, and will give more details soon.


Downpoints

No progress on personal studies

I have long been unable to do much progress on my hobby personal studies. In April, unfortunately I was also unable to do any progress on my career personal studies.

Although it is sad to not be able to progress on anything in my personal studies habit, this time it really is for a good cause: the Open Source presentation I mentioned earlier, together with the Innoweeks work and personal projects development has filled all of my (pseudo-)free time. I expect to be able to get back to this in May.


Plans for next month

Finish First Steps Into AI Engineering series

In May, I expect to finish the final project I have for the First Steps Into AI Engineering series, which I started in April. This will be a truly major milestone for me, as I have been working on this series for about a year now and have learned an immense amount from it!

By finishing the series, I will switch to invest more time in studying what other people have been putting out in terms of content about generative AI and developing with it. Now that a few years have gone by since the initial boom of the field, there has been enough time for us as a group to get a grip on it and start organizing our thoughts and practices a little bit, so I am excited to see how other people have been seeing this.


Innoweeks

May will be a very busy month (as usual), especially due to the Innoweeks final stretch. I fully expect to spend several nights working feverishly in new features and bug fixing for the project, in order to have a good and fully functional live demo for the final presentation.


Restart personal habits

Finally, I intend to get back to full steam on my personal habits in May. After a very, very tough, busy and exhausting stretch since the start of this year (mainly from my day job activities, with the added factor of Innoweeks), I have a couple of weeks of vacations scheduled. I expect to invest the first few days in full recovery mode, resting and sleeping a whole damn lot! But then I expect to have at least one full week to get back to my normal routine, returning to habits (such as book studies, gym, etc.) that I have had to leave in the background for a while this year.

While I have learned and achieved a lot since January, I really feel it is time to get back to a healthy and sustainable routine. The second part of May will be fully dedicated to reconnecting with myself and the life I chose to live.

Project: LLP (Local Language Practice)

Description

Local Language Practice (LLP) is a desktop application to practice languages through a chat roleplay with local Large Language Models (LLMs).

I wrote a sketch version of it around May of 2024, and released an official version in April 16th, 2025.

The application assumes you have an LLM server running on your machine (this is a deliberate choice), by default on port 8080 but that is configurable. There are two main features in the application, both present in the main view: a chat between two characters (the human user acting as one, with the LLM acting as the other) in a particular language and widgets for translating to-and-from between that language and English. The default scene is a conversation between two robots in a futuristic world, but custom scenes can also be imported to be played out. As of the first released version, the supported languages are French, German, Portuguese and Spanish.

I developed LLP as a tool for personal usage, following closely my particular flow for practicing languages. Although it is not intended for use by a general audience, I expected it to be functional and useful from the start, and not merely a proof of concept.


Context

I developed LLP as I was exploring how to build systems using generative AI technologies for the first time. I blogged about the set of 4 projects that came out of this exercise in my post entitled "First Steps Into AI Engineering". LLP was the third of these 4, and the first to work with more than one chat context.

As described in the post just mentioned, for LLP I wanted to write most of the code myself, without relying too much on frameworks, so as to get a better feeling about working with these models. It is also intentional to explore only open and local AI models, as it is my intention to find out how far can we go working only with models that can be fully personal and owned by its users.


Highlights

LLP was the first of the First Steps Into AI Engineering projects that I originally intended as an useful application. While JenAI eventually became my main way of interacting with LLMs, at first it was going to be just a proof of concept to learn how to handle conversation state - LLP, on the contrary, was planned from the start to automate one of my personal flows for learning languages. This made the entire development process very satisfying, as with each new part implemented I was able to really see the benefits it added. It also made working with user stories and a project board to track development very intuitive and fruitful. While previously I have used LLMs to generate user stories (SnakeJS in particular), this time I found it more efficient to just write them myself, as I had a very good idea of everything I wanted in the application and how to communicate that.

The flow I wanted to automate with the application is the one I use to bridge the gap between self-contained lessons and real-world usage, when learning languages. While I appreciate and enjoy doing lessons, both in applications such as Duolingo and in more traditional textbook format, I find that by themselves they do not really prepare one to actually use the language being studied in real scenarios. So I tend to complement them with other forms of practicing the language, such as listening to music with lyrics in that language, or reading books written in it. More recently, with LLMs becoming really powerful and popular, I started using the frontier models (as they tend to be much more reliable for multilanguage usage) to simulate conversation in the languages I study, as a way to get a more immersive practice - it has proved to be quite effective. While the conversation is the biggest part of this practice, I find it useful to also have separate tabs open with translation tools, in which I can paste any part of the conversation which I do not feel confident about (either in understanding or in creating) and immediately get a translation. I designed LLP so that I could have both these things in the same view, so that I would never need to leave it for the entire practice session.

A delightful challenge in this project was crafting the prompts to get the LLM to behave exactly as expected for each process. While the conversation one was the closest to what I had done in the past, especially with JenAI, it also had the nuance of needing to stay in the specific language being practiced, and of staying coherent with the AI character while also understanding it should act as a tool for language practice. It took some iterations to get the conversation prompts right, but a combination of a system prompt setting up the scene and the task, and a new system prompt (injected and removed from the conversation history as needed) right before each response did the trick reasonably well. The prompt for the translation process had to be more specific and less open ended than the conversation one, and I was able to leverage my learnings from working on Chargen when crafting it. One of the tricks I have been finding very useful to get LLM models to generate outputs in a specific format, even when they were not specifically trained for that, is to just tell them in the prompt that their response will be piped directly to an automated system that will process it, without any human being involved - this alone seems to prevent most models from adding unnecessary explanations or deviating from the specified format, in my experience.

I am very fond of the feature for loading custom scenes, as it provides a way to explore unique settings without needing to change the source code and generating a new release. Since I consider myself the only audience for the application for now, I am happy to keep it based on manually customizing JSON files, instead of creating a separate custom creator app or feature inside LLP for this - it might change in the future, if I decide to make a more widely appealing version of the application.


Future Expansions

Saving session state

The main feature I am considering to add is the ability of saving practice sessions with the conversation history to be loaded later. The application already has the capability to load custom scenes, but they always start the conversation from scratch. Being able to save a conversation to continue at a later time should be very useful (as I have already seen with JenAI). I am not sure when I will have more time to work on this, though.

Using industry standard request framework

Another change I would like to do is replacing the custom logic to interact with the LLM server, which I have been reusing and slightly tweaking and improving between each project of this series, with a more industry standard one. While the classes I have been using have been great for me as a learning tool, and have not so far caused any major issues, for LLP in specific they are problematic: they constantly break when using any slightly more complex character (such as accented versions of vowels), which led me to create helper sanitizing functions to just remove any problematic character and replace it with a safer version whenever possible. For English-only conversations, this approach works - but for practicing other languages it messes up the specifics of the language quite bad. Most non-English languages have a heavy usage of non-ASCII characters, and learning them with an application that just ignores these characters is obviously a bad idea. I am looking for alternatives, and in special for Spring AI as a good replacement to enhance this.

Adding new languages

Adding new languages is also something I will quite probably do in the future, mostly whenever I decide to pick up another language to learn. I have decided to hard code the supported languages in the application, and I do not intend to change this in the future. Given that I consider myself the only audience for the app, coding a new one whenever I need to is a much smaller hassle than making the list dynamic in the first place.

Generally usable version with another framework

Of all projects in the First Steps Into AI Engineering series, I see LLP as the most potentially useful for a large audience. However, I do not think that an application built on top of Swing is viable for a modern public, in 2025. So, one of the things I might do in the future (although I am not currently seeing this as a priority) is to create a new application with the same features as LLP, but coded in a more modern framework (probably with a different, more frontend-friendly language as well). This would give me an opportunity to recreate several parts of the application in a more abstract and dynamic manner.

Custom scene creator

Finally, the last expansion that I imagine for LLP would be a system (either in-app or as a separate project) to create custom scenes. Currently, this depends on manually editing JSON files - which is perfectly fine for me, but would be irritating for anyone else. If I decide to create a version for general use, this will definitely be in scope, but for now I do not have plans to implement it.


Setup

LLP was the first of the First Steps Into AI Engineering projects that I wrote from the start with the intention of using as a portfolio project. Although I started this series as a space for exploration and learning, over time the projects acquired a level of scope and complexity that made me elevate them into more serious projects (although still not intended for a general audience). Due to this, I configured all of the foundations I use for portfolio projects.

I use Github Actions to generate a new release for LLP whenever new code is pushed into the main branch and alters relevant core files of the project.

I have a changelog file, a file with guidelines about contributing and an architecture.md file (an idea I adapted from this great article), beyond the usual readme file as documentation.

I also included automated tests for everything except the UI code. As of version 1.1.0, all non-UI packages had more than 75% method test coverage. I made extensive use of Test-Driven Development (TDD) for the development of the project.


Links

Source code: Github

Executable: Releases


Thursday, May 1, 2025

Monthly Recap - 2025-03 March

March came with a slight improvement in my work on personal projects. Although I still had to work overtime several days, and had to skip working on personal projects due to that, I was able to get more done this month. Here is a short summary.


Achievements

JenAI

JenAI is a CLI frontend for chatting with local LLMs that I have been developing (and using) since last year (I wrote about it in a previous blog entry). Every now and then a new model comes up that requires changes, usually because it very heavily uses a problematic character or special token that needs to have special treatment to not break requests. That was the case with Google's gemma3, which is actually one of the best open and local models of the current generation.

In order to support gemma3, I released two new version of JenAI in March: 1.7.2 and 1.7.3, both with some minor adjustments in the sanitization logic to prevent gemma3's quirks breaking everything.

Despite being a very simple application, and not being targeted at anyone else but myself, JenAI has become my go-to choice for daily interaction with LLMs. The beauty of building your own tools!


Finished The Captain Class

Since the start of this year, I had been working through the book The Captain Class as part of my personal studies habit. I was able to finish the book in March.

The Captain Class turned out to be a great food for thought about leadership. Although I do not agree one hundred percent with everything the book says, I found even the parts that I disagreed with, or that did not seem totally accurate, to be very intriguing and to lead to some deep thoughts about the topic. I saw a strong correlation between the Captain ideal the book talks about (mostly derived out of analysis of sports teams) with the professional role of the Scrum Master.

I would like to write a full review of the book in the near future, though I am unsure how soon I will have time to work on this.


Downpoints

No progress on hobby studies

March was yet another month in which I wasn't able to put any time in a hobby book, for the personal studies habit. Since I finished the last one, in December, I have not yet even chosen the next. Hopefully around the middle of the year I will be able to organize my time, have less extra hours of work, and then pick things up again for this, but for now it remains an unfortunately paused part of my routine.


Plans for next month

Innoweeks

April will have the start of the Innoweeks event. This is a hackaton-style event that my company holds every year, in which employees get together with customers to come up with an innovative solution to a real problem in only a few weeks.

I participated in the 2019 and 2024 editions, and I will participate again this year. Now, as a dev lead, which will be a new experience for me. I am very excited for this!


Finish third project on First Steps Into AI Engineering series

I have been working for a while now on the third project for my First Steps Into AI Engineering series, and during March I was able to make good progress but not reach a state in which I felt comfortable releasing an initial version of the project. This should be feasible in April.


Start last project of First Steps Into AI Engineering series

After releasing the third project of the previously mentioned series, I intend to immediately start working on the fourth and last project. It should be a simple one, but it is one that I have not yet sketched out (the other 3 already had a functional sketch I could use as a basis while developing). I will share more details once I have released it, but I don't expect to spend more than 3-4 weeks in the development of this one.


Monthly Recap - 2025-07 - July

July was completely a vacation month. I took a month off of work before switching areas inside the company, and used this opportunity to als...