Tempest Status Update (April 2023)

08 Apr 2023

Time for this month’s Tempest status update. Highlights:

Grain Creation

Last month I reported that it was now possible to create grains, but that there were a couple limitations that still needed to be addressed. Those have since been fixed; grain creation works as expected for all cases.

UI Improvements

I made a number of small improvements to the UI.

For starters, we do a better job of picking a title for a new grain; the first pass at this feature just called all new grains “Untitled grain,” which is unhelpful. We now do “Untitled <appTame> <nounPhrase>,” as Sandstorm does.

In the process of doing this I discovered that if the app manifest’s Action.nounPhrase field is empty (as it is for some very old apps), Sandstorm will jump through some hoops to come up with a suitable value based on older, deprecated fields. I’m not going to implement this for Tempest; instead if nounPhrase is not set it defaults to grain. There are only a couple apps that this affects, the most notable one being Davros, for which Jake has already opened a pull request to fix the issue.

Also, there’s a close button for open grains, and a number of styling improvements.

Email Login

Tempest now supports email login! It works much the same way it does in Sandstorm: punch in an email address and it will mail you a token/link.

For now, SMTP configuration happens via environment variables, as described in the README. In the future we’ll have a UI for configuration which can handle this as well as other things.


I’ve taken the first steps towards internationalizing Tempest. Specifically, I wrote a small package to parametrize the UI code over a locale object, so instead of doing:

"Hello, " + name

You now write:

l10n.Fmt("Hello, %0", name)

…where l10n is an object that you’ll pass around as a parameter.

We still need to build out some machinery for extracting all the strings to be translated, actually picking a locale, and some other things, but this means that when we’re ready to do that we won’t also have to hunt down every UI string and change each call site to be translatable, as we did when Sandstorm was first internationalized.

App Installation

Finally, and most excitingly, the basic machinery is in place to install apps. This includes logic for unpacking and validating an spk (which is available as part of a general-purpose Go package, under pkg/exp/spk in the repo), as well as Cap’n Proto APIs for feeding an spk to the server and getting back a reference to the installed package (which can then be used to create grains).

It isn’t integrated into the UI yet, and it needs more robust testing, but this is a major milestone.