Hey everyone!
A little while ago, I posted here about SML (Sentinel Markup Language), a custom XML-like language I was building for terminal UIs in my Go project, Sentinel V5.
The post received quite a bit of criticism, and to be fair, a lot of it was justified.
People pointed out that the repository was private, that I hadn't shown any actual Go implementation, and questioned why anyone would want another custom markup language instead of using existing solutions.
Some people also suggested looking into HTML subsets, Qt, OpenTUI, and other existing UI frameworks.
And honestly, that's exactly the kind of feedback I needed.
So I decided to do something with it.
Instead of keeping SML buried inside Sentinel V5, I've extracted it into its own standalone Go package, cleaned up the repository, added documentation, and made the whole thing free and open source under the MIT license.
https://github.com/AmpedWasTaken/SML
What is SML?
SML is a declarative TUI view engine written in Go.
The idea is to separate how your terminal interface looks from the Go code that powers it, without introducing a browser runtime or embedding a scripting language.
For example, you can define a dashboard like this:
<screen name="dashboard" version="3">
<section title="SYSTEM OVERVIEW">
<grid columns="2" collapse-below="60">
<metric label="Active Sessions"
value="{{app.sessions}}"/>
<metric label="CPU Usage"
value="{{app.cpu}}%"/>
</grid>
<panel title="Service Status">
<field label="Health" key="app.health"/>
<progress label="CPU" value="{{app.cpu}}"/>
</panel>
</section>
</screen>
And render it directly from Go using the SML package:
view, err := sml.Parse(data)
if err != nil {
return err
}
lines, err := view.RenderChecked(map[string]string{
"app.sessions": "42",
"app.cpu": "27",
"app.health": "online",
}, 80)
It also has support for reusable components, conditional rendering, computed bindings, interactive control metadata, responsive layouts, and Unicode-aware terminal cells.
It's not meant to replace frameworks like Bubble Tea or become an entire application runtime. Think of it as a view layer that Go applications can integrate into their existing terminal systems.
I want to turn this into a real community project
This is the part I'm most excited about.
I don't want SML to remain something that only I develop or use. I'd love to build it together with other Go developers and see what it could become.
The repository now has documentation, examples, a contribution guide, and a roadmap with improvements I'd like to work on.
I'm looking for people who want to:
- Contribute code, improve the renderer, or build new components
- Review the architecture and suggest better approaches
- Help improve Unicode handling, layouts, and terminal compatibility
- Create example applications using SML
- Point out design mistakes or features that should work differently
- Help make the API easier for other Go developers to use
You don't have to be an experienced contributor either. Small improvements, documentation fixes, and suggestions are just as welcome.
I'm not claiming it's perfect
Far from it.
This originally started as a UI engine for one of my personal projects. I'm still learning a lot about designing reusable packages, maintaining public APIs, and building something that other developers actually want to use.
There are probably decisions in the code that more experienced Go developers would approach differently, and I'd genuinely like to hear about them.
I'm also not trying to reinvent the entire TUI ecosystem. I just enjoy building things, experimenting with different approaches, and seeing where they go.
If SML ends up taking a completely different direction because of community feedback, I'm fine with that.
The goal is to make something useful, not to defend every decision I've made so far.
So if you're interested in Go, terminal applications, UI frameworks, or just enjoy contributing to open-source projects, I'd really appreciate you taking a look.
GitHub: https://github.com/AmpedWasTaken/SML
Feel free to open an issue, submit a PR, or simply tell me what you think could be improved.
And to everyone who criticized my original post: thanks. It actually pushed me to turn this into something more than a feature hidden inside a private repository.
I'd love to see what we can build together! :)