CRUDGEON Updates! January 22, 2026
CRUDGEON was updated. It's very useful and even more useful now.
I wrote about CRUDGEON (always stylized all uppercase :) ) when I first created it 8 or so years ago. It initially had a few things going against it, namely I had assumed in some ways that it would be generating C# code. You can also take a look at the history of it in the commits!
I wanted to use it for Go projects. I had considered making an “app builder” app that can be configured with modules etc, but then I thought about it and with only some major breaking changes, I could use CRUDGEON!
I only use it on one commercial project and I work from home, so I could spend some time to update it to use any new conventions that I create. There are still a few things that would suggest that the target is C#, but I took care of a lot of it. I had started doing that idly as I don't usually lock myself in like that.
The first thing I changed is the syntax for the source files. There's a long story there but originally I had the syntax reflect C# properties because I was working against an old WSDL web service where Visual Studio generated code for the WSDL and I was using CRUDGEON against the generated code. That WSDL service went away about 4 years ago but the syntax remained. Until last night!
Before:
public int PropertyName { get; set; }
After
int PropertyName
That's it. I was also letting the config define the syntax, but I went away from that. For instance, there's no “DateTime” in Go, but now the syntax to add a date property is the same no matter what. I was also parsing generics and list types, but now the syntax to define a collection is a Go slice style, and nullable as well is pointer syntax
Before:
public List<string> MyList { get; set; }
public Nullable<DateTime> Date { get; set; }
After:
string[] MyList
DateTime* Date
There are flags as well, that syntax hasn't changed.
There was also a concept of “interface” which could be used to generate interfaces and then concrete types for each type. That was totally stripped out. It's not needed. I stripped it all out of the commercial project, updated a few things, and it's working again. I am running it in a UAT environment to make sure there are no issues, but it should be fine. That was a big commit though for 2am on a Wednesday morning!
There were other changes, but those are the big ones. Like being able to provide a namespace for each “generation” because in Go now, I'm not generating SQL files, but different aspects of the application, and they all needed their own “namespace” (package in Go). Like a data access package, a handlers package, etc.
Generally, I've also moved some reusable things I did in my latest web project to their own packages so I can reference them. They are small. Go doesn't mind copying and pasting code. It's a valid methodology to writing code. But I just thought it would help with making this “app builder” app to have simple code generated and just reference a git repo.
The good news was that after I made all of these changes, the data object classes were the only things that changed! It didn't affect any SQL. That made me feel more comfortable getting it brought into the latest code immediately.
That's probably it for now. I have a lot of work to do! But a lot less now that I can generate a lot of it :) Happy coding!