454 karma · joined July 30, 2016
The project was initially conceived as “vim for music”. All of Typebeat is controlled by the 30 main character keys on the computer keyboard. The result is a workflow that’s a little tricky to learn but fast to use once mastered. (So I suppose I nailed the vim experience in that regard.) If you’d like to see how I use it at top speed, you can check out this 2-minute jam I made recently:
A few years ago, I spent my free time building a Haskell BEAM codegen library, and that was by far the best resource I found. I noted some other projects that helped me understand things here: https://github.com/kofigumbs/codec-beam#acknowledgements
If I'm incorrectly co-opting some open source nomenclature, I'd love if someone could let me know. As I said in the issue linked above, I do need to update the purchase website to bring that language more inline with what's on GitHub.
What I'm excited about most with 2.0 is that Multi is a proper macOS app itself, with a UI for creating other apps. That makes the install process much simpler (it's a normal .dmg) and streamlines future updates (install the new Multi "runtime" app and that's it—no need to update each of your generated apps manually).
There are a bunch of other improvements listed on the release page[1]. I'll keep an eye on this thread and answer any questions I can!
[0]: https://8thlight.com/blog/kofi-gumbs/2017/05/02/core-erlang....
Happy to answer any questions or discuss any feedback!
A "bespoke backend, going to assembly directly" does not preclude the option of integrating with an Erlang/Elixir project. In fact, I think that you could do so via ports or NIFs in such a way that the caller wouldn't know the difference. I think of the Erlang JSON libarary, jiffy. It's largely implemented in C for performance, but the language it's written in doesn't seem to matter in practice. As long as there is an easy way to integrate it into your Erlang/Elixir project.
I think an "Elm on the server" solution would work much the same way. Focused on making a clean integration point—then choose whatever implementation leads to the most performant and reliable artifact.