Plain is headed towards 1.0! Subscribe for development updates →

Goodbye Bolt, Hello Plain

Development update by @davegaeddert • 2024-07-08

Well, boltframework.dev is now plainframework.com!

My primary goal now for Plain (previously Bolt) is pushing towards a 1.0 release that people can actually trust. The only person I really expect to use the framework right now is myself — because I can seamlessly make big changes and keep up with them.

One of the biggest items blocking 1.0 was the name, and now I've got that part out of the way.

Why not "Bolt"?

I really liked where Bolt was headed, but there are two primary reasons for moving away from it.

The first is that Bolt is a super common name in software! It’s a nice, short word that’s easy to say, type, and spell. I liked my interpretation of it (a physical bolt — hardware, not lightning!), but ultimately the name is pretty generic and shows up everywhere.

The second is that I was never going to get pypi.org/project/bolt/. I've had good luck just "asking nicely" in the past, but it was clear that this one is too established. There are also a lot of bolt-{pkg} packages which would conflict with other names I wanted.

There’s a broader issue of how to publish a "namespace" of packages (maybe PyPI will support this eventually?), and I considered two alternatives to PyPI entirely:

  1. Running a custom index (which I’ve done before but is really intended for pypi mirrors, in my understanding).
  2. Installing straight from github.com (what I was doing previously).

In the end, it just makes more sense to stake your ground on pypi.org.

Not critical, but I also couldn't ever get a great domain. I felt ok about boltframework.dev, but I've used .dev for other things and it always feels clunky. For a while I was using boltpython.com, but ended up dropping it to avoid any trademark questions with "python".

Anyway, I pushed ahead with the name Bolt over a year ago, knowing the name could be changed and that I’d probably need to eventually...

Why "Plain"?

I think plain.com set me down this path originally. At first, it was just one of many places I got design inspiration from. But when I decided to look for a new framework name, I kept coming back to the word itself for a few reasons...

Probably the biggest is what the word "plain" implies. I want to steer the framework towards having official, simple solutions for common problems (i.e. just use your database for your queue) vs offering endless support for the long tail. A big motivation in forking Django was actually to remove all kinds of stuff I didn't want. There's more to do, but a fork is a safe place to make serious API changes without worrying about backwards compatibility — these changes are almost always in the name of simplicity.

The principle of keeping things "Plain" goes beyond code though. Don't know how to design this part of the UI? Docs? API? CLI? Keep it plain. Don't overcomplicate it.

Importantly, this doesn't mean that it takes no effort. Making something clear and simple can often take more effort, and harder decisions, than adding, and adding, and adding...

Another reason I like Plain is because of Kansas. Did you know Django was started in Lawrence, Kansas? I live in Kansas and I've always liked this fact. For me, Plain is a subtle nod to Django's roots and the Great Plains — a place I really enjoy. The Midwest can build software too.

Lastly, Plain is a pretty unique name. I already pointed out plain.com (and yes, I did look up their trademarks), but that's really the only "plain" that I'm aware of in our world. When I saw that plainframework.com was available, I jumped on it. It's nice to have a .com.

But no, I don't have pypi.org/project/plain/ yet. I'm in conversation with the owner of the current package, but as of today, I'm moving forward regardless. I think that I have a decent shot at getting the name and will be using plainframework in the meantime.

Technical details

Ok, so technically you can now install the core package with:

pip install plainframework

I don't expect this to be done manually very often (the starter kits are the way to go), but I'm comfortable with the name if it has to stay that way.

The ecosystem of packages will be plain.{pkg}. So:

pip install plain.auth

Plain uses PEP 420 (implicit namespace packages), so this is the literal import path in your Python code too.

from plain.auth import login

When installing from PyPI, the . can actually be substituted with a - if you prefer.

pip install plain-auth

You might see Poetry convert this automatically. The . can be a little annoying in TOML because you have to quote it...

[tool.poetry.dependencies]
python = "~3.11"
plainframework = "<1.0.0"
"plain.models" = "<1.0.0"
"plain.cache" = "<1.0.0"
"plain.tailwind" = "<1.0.0"
"plain.htmx" = "<1.0.0"

All of the plain.{pkg} names I wanted were available on PyPI, except for plain.db. It looks fairly active so I just went ahead and renamed plain.db to plain.models.