Header image for a Keyhole Software article by Austin Powell about using LLMs and AI-assisted discovery to understand, document, and modernize a legacy Delphi application. The image highlights transforming a "black box" system into a documented architecture blueprint and delivering a modernization project in approximately half the original timeline.

How We Used LLMs to Understand and Modernize a Legacy Delphi Application

Austin Powell .NET, Agentic AI & AI-Accelerated Development, All Industries, Articles, Artificial Intelligence, Modernization Leave a Comment

Many legacy modernization projects start with a simple question: what does this thing actually do?

In this project, we were modernizing a decades-old Delphi application with limited documentation, no meaningful test coverage, engineers long since moved on, and significant unknowns about the environment in which it operated.

Modernizing legacy systems is challenging, particularly when documentation is limited and system knowledge has been lost over time. When LLMs and AI are applied thoughtfully, they can help teams understand legacy systems faster and reduce modernization risk.

This article focuses on how we used LLMs to understand, document, and de-risk an unfamiliar legacy system before modernization began. Once the application was understood and the architecture was defined, the team leveraged AI-assisted development workflows to accelerate the Delphi-to-.NET rewrite itself. Evan Sanning shares that side of the project in his companion article, How We Used LLMs to Rewrite a Legacy Delphi Application in C#.

synopsis image of delphi to .net ai code conversion delivered 40% faster than deadline

How We Used LLMs to Rewrite a Legacy Delphi Application in C#

Evan Sanning .NET, Agentic AI & AI-Accelerated Development, All Industries, Articles, Artificial Intelligence, Generative AI & LLMs, Modernization Leave a Comment

We rewrote a legacy Delphi (Object Pascal) application into a .NET C# service worker in three months, beating a five-month deadline for a client in the healthcare software space.

Here’s what actually made that possible and the pitfalls we hit using LLMs along the way.

Flutter vs. .NET MAUI for AI: Which Framework Wins?

Keyhole Software .NET, Articles, Artificial Intelligence, Flutter, Mobile 1 Comment

Are you developing an AI-powered application but unsure whether Flutter or .NET MAUI is the right framework for your project? The decision you make can significantly impact performance, scalability, and development efficiency, so itโ€™s essential to choose wisely. Both Flutter and .NET MAUI offer strong cross-platform development capabilities, but they have distinct differences when it comes to AI model support, …

Blazor Server in .NET 6 - Part 5 HttpClient

Blazor Server in .NET 6 – Part Five

Ryan Flachman .NET, Articles, Blazor, Blazor Server in .NET 6 Series, C#, Development Technologies & Tools, Tutorial Leave a Comment

In the final part of the Blazor Server in .NET 6 blog series, we covered how to use data binding and dropdowns with lists and enums. This included a short introduction to setting up an HttpService, making a get call to the API, and viewing the results as a string. For further clarity, I also included a demonstration on how to add an HttpService that uses the built-in .NET HttpClient class to make calls to the D&D 5e API!

Finally, I presented a way to add a dropdown with the available race options that our character can choose from. That concludes my five-part educational series on Blazor Server in .NET 6. I hope you enjoyed it, and learned a little something you can take with you. Thanks for tuning in!

Blazor Server in .NET 6 - Part Four - Blazor Components

Blazor Server in .NET 6 – Part Four

Ryan Flachman .NET, Articles, Blazor, Blazor Server in .NET 6 Series, C#, Development Technologies & Tools, Tutorial Leave a Comment

In Part 4 of the Keyhole Blazor Server in .NET 6 series, we covered adding events in our Blazor components. In sum, I demonstrated how to add a service that contains the events that components can listen to with methods to notify when to invoke our events.

After that, we added that service to the BaseComponent. The section is complete with adding the new character to our list of current characters in storage in order to notify all listening components of this event.

I hope youโ€™re enjoying working with Blazor as much as I do so far. See you in part 5, the final part of the blog series, for how to use dropdowns and data binding using both lists and enums!