Merenda is a new pure Nim GUI framework based on OpenStep and Cocoa with a splash of QT!
It's already implements a substantial amount of the core functionality of OpenStep and Cocoa. I've decided to release it now that I've got the core MVC patterns from Cocoa/OpenStep implemented. It's not a one-to-one implementation, but generally the APIs try to follow Cocoa's design. Though cleaned up to take advantage of Nim's stronger type system than Objective-C.
For example here's the table demo showing a table view backed by a data model:

Overall Merenda is based on several years of working on and experimenting with GUIs. I worked Figuro and was happy with many aspects of it. However the object model ran into limitations when building more complex widgets.
Merenda solves this by adopting Cocoa's dynamic methods and protocols. These are provided by Sigils. The ability for objects to adopt protocols at runtime enables implementing the rich behavior and functionality seen in Cocoa and iOS.
The implementation of this is called NimKit, mirroring Cocoa's AppKit. NimKit ships the core controls needed for desktop-style interfaces:
It's been my hobby work the last few months. I've been building and testing all of these, item by item!
Then there's features unique to Merenda such as theming its theming engine. I'm aiming to support a CSS subset for this for live theming.


Here's the quick sample:
import merenda/nimkit
import sigils/selectors
let
app = sharedApplication()
window = newWindow("Counter", frame = initRect(100, 100, 320, 220))
root = newView()
layout = newStackView(laVertical)
label = newStatusLabel("Clicked 0 times")
button = newButton("Click")
clickAction = actionSelector("counterClicked")
var clicks = 0
proc onClick(sender: DynamicAgent) =
if not sender.isNil:
inc clicks
label.text = "Clicked " & $clicks & " times"
button.target = newActionTarget(clickAction, onClick)
button.action = clickAction
layout.spacing = 12.0
layout.alignment = svaFill
layout.addArrangedSubview(label, button)
root.addSubview(layout)
layout.pinEdges(
toGuide = root.contentLayoutGuide(insets(44.0, 44.0, 0.0, 44.0)),
edges = {leLeft, leTop, leRight},
)
window.setContentView(root)
discard window.selectNextKeyView()
app.addWindow(window)
window.makeKeyAndOrderFront()
app.run() Nope! :P Okay, I do plan make an editor widget with either synedit or Moe. Maybe both.
I've already switched over Neonim GUI to Merenda so it can handle full text editor style rendering with the mono font text at high FPS.
It'd also be easy to make a cross-platform terminal emulator too. Though harfbuzz + Merenda still needs some work before I do that.