Feed

Evennia cheat sheet

Here's a cheatsheet for Evennia, a Python MUD framework.

I'm creating a MUD using Evennia, a Python framework that is super powerful and extendable. I couldn't find a great cheat sheet online, so here's some notes from their tutorial series. I will update this as I go, and I may end up typesetting this into a PDF.

Evennia commands

These commands are done through the Evennia shell (i.e., through a MUD client). Typically, items can include me for oneself, here for the current location, or a database reference number like #8.

Basic interaction

Operation Code
Get help
help [item]
Look around
look [item]
Get detailed information
examine [item]
Pick up item
get [item]
See inventory
inventory
Use a named exit
<exit>
Move to a location
teleport <location>
Global search for something
find <item/location/exit...>

Creating items

Operation Code
Create an item (and drop it)
create[/drop] <item>[:<typeclass]
Add synonyms
name <item> = <alias>[;<alias>...]
Add descriptions
desc <item> = <details>
Move item to a location
teleport <item> = <location>
Delete item
destroy <item>
Set attribute
set/<attribute> = <name>

Creating locations

Operation Code
Add a named location from here
dig <location> = <exitname>[;<alias>...]
Add a cardinal direction
tunnel <n[orth]/s/e/w/nw/.../in/out/up/down> = <name>[;<alias>...]
Open from here to a previous location
open <exitname>[;<alias>...] = <location>

Administration

Operation Code
Temporarily decrease/restore permissions
quell/unquell
Add help entry
sethelp <entryname> = <details>
Reload world and code
reload

Locks and permissions

Lockfuncs can be defined in server/conf/lockfuncs.py. See Evennia's list of access_types.

Operation Code
Add/remove lock
lock[/del] <object> = <lockstring>
Lockstring format
<accesstype>: [NOT] lockfunc() [[AND/OR] [NOT] lockfunc() ...]
Add/remove account permissions
perm/account[/del] <user> = <permission>
Account levels Guest, Player, Helper, Builder, Admin, Developer
Add/remove object permissions
perm[/del] <object> = <permission>

Python commands

These commands can be used in the interactive Python shell (py within a MUD client) or through a Python script.

Creating things

Operation Code
Create a character, room, exit, or object
evennia.create_object('<typeclass>', key='<database_key>', [location=...,] [permissions=...,] [locks=...,] [attributes=...,])
Store persistent object values
<object>.db.<key> = ...
Creating an account, channel, or script
evennia.create_<account/channel/script>(...)
Object location
<object>.location
Object contents
<object>.contents
Exit destination
<exit>.destination
Add tags
<object>.tags.add("<tag>"[, category="<category>"])

Creating commands

Operation Code
Name of command
<Command>.key
Command function
<Command>.func()
Argument string provided to command
<Command>.args
Help function for command Defined in docstring of
<Command>
Message command caller
<Command>.msg("<msg>")
Add command to a commandset
self.add(Command)
in
<CmdSet>.at_cmdset_creation()
Remove command from a commandset
self.remove(Command)
in
<CmdSet>.at_cmdset_creation()

Searching

See the Evennia docs on Django queries for an explanation on how powerful and flexible Django queries can be.

Operation Code
Global search for an object
evennia.search_object("<name>")[0]
Search for an object relative to caller
<object>.search("<name>")
Search by tag
evennia.search_tag("<tag>")
Search by location
evennia.search_object("<name>", candidate=<location>.contents)
Search by attribute
evennia.search_object("<name>", attribute_name="<attribute>")
Search by typeclass
evennia.search_object("<name>", typeclass="<typeclass>")
Search by Django query
<Typeclass>.objects.<all/filter/get/exclude(db_key="<name>")>
Search by Django query (incl. subclasses)
<Typeclass>.objects.<all_family/filter_family/get_family/exclude_family(db_key="<name>")>

Directories

Directory Description
commands/
Commands and command sets
server/
Server files, see settings at server/conf/settings.py
typeclasses/
Templates for accounts, characters, scripts, rooms, etc.
web/
Website and webclient files
world/
Misc. files, useful for user-defined build scripts and modules

How to start a blog

I'm starting a webring, so I'm sharing instructions for my friends to get started.

I'm starting a webring with some friends called the Combo Crew, so I put together this guide on how to start a blog and connect it to the ring.

1. Getting a website running

To start out, let's clarify something about running a website. There are two things that must happen for a website to appear on the Internet: first, you must have your website hosted somewhere (i.e., a publicly-accessible server on the Internet stores your content). Second, there must be a domain name like google.com or tilde.club that is registered and points to wherever your site is hosted.

It's not necessary to spend money to do either of these things. There are many services that will offer free hosting for your website if your website is static and only serves content like images and text and does not involve any server-side scripting. Many of these sites will also give you a free subdomain for your site. For example, GitHub Pages hosts many static sites that look like <something>.github.io - take a look at netflix.github.io. If you want something that looks like example.com, you need to buy a domain name. Buying and registering a domain name is going to be out of scope for this blog post, but know that it costs about $12-$20 USD/year, though having a domain name allows your identity and site to be independent of any specific host if you want to swap around.

Now, that's all great, but how do you actually go about building your website? Here, you have a couple options depending on your website host. If you want to avoid messing with HTML or CSS, go with a blog host that allows you to post using a graphical interface. I recommend looking at bearblog.dev or i.haza.website. Wordpress.com and blogger.com are some of the big names in blogging software, too. Substack can even work as a blog. Just note that some of these more user-friendly options lock some options behind a paywall, such as connecting your site to a registered domain name.

If you want a bit more control over your site and how it looks, I recommend looking into static site generators like Eleventy and Jekyll. These are programs that build your site by Markdown posts with reusable templates. There are endless, beautiful templates that people have created for you to use, along with great tutorials. This option can, however, be a bit more technical - though AI can help clarify how to use or generate templates. If you don't know how to use GitHub or a command line, it's probably best to avoid these for now.

tl;dr - Find a free blog host that uses a graphical interface. I like bearblog.dev.

2. Connecting to the blogosphere

In my opinion, your website is not a blog until you give people a way to follow your blog. In the blogosphere, the most common solution is something called an RSS feed or an Atom feed. These are sidecar files that list all of your posts and some important metadata. Software called feed readers can poll all of the feeds that you follow and provide you with all of the most recent updates. RSS/Atom feeds are decentralized, unlike social media. These feeds are usually indicated by a syndication symbol:

Syndication symbol

Usually, whatever software you are using to write a blog will generate an RSS feed or Atom feed automatically, and it should have the link somewhere on the front page. Usually, the feed is stored at example.com/feed.xml or something similar. If you are using a blogging software with a graphical interface, check the documentation to make sure they provide a feed. If you are using a static site generator, typically a plugin will generate a feed for you. People follow your blog by putting the link to the feed into their feed reader. If you want to try following blogs using a feed reader, I've used Feedly and Fluent Reader.

Another cool way of connecting with the blogosphere is connecting to a webring. These were popular back on the early Internet, and it's basically just a linked list of sites on a related topic. They are becoming increasingly popular again as people reconnect with personal websites. For example, check out all of the webrings on this aggregator.

By way of example, the Combo Crew has an invite-only webring. To join the webring, you put this HTML code somewhere on your front page. Replace the ?via= to a url-encoded version of your URL:

<center>
<!-- Begin Combo Crew Webring Badge -->
<a href="https://webri.ng/webring/combocrew/next?via=https%3A%2F%2Ftilde.club%2F~twinbfield">
<img src="https://tilde.club/~twinbfield/assets/combo_crew_88x31_blue.png" border="0" width="88" height="31" alt="Combo Crew Webring" />
</a>
<!-- End Combo Crew Webring Badge -->
</center>

(You can replace the color on the PNG link. Options are red, orange, yellow, darkgreen, lightgreen, blue, pink, and purple.)

Then, message me the URL of your site, and I'll add it to the webring. The 88x31 button should take you to the next site in the webring.

Combo Crew Webring

tl;dr - Make sure you have a link to an RSS or Atom feed so people can follow your blog.

3. What's next?

Now, you can post! For Combo Crew specifically, we're looking at starting something like a blog carnival, where someone hosts a theme and writes a summary post aggregating (and linking to) the individual blog posts. Consider adding top-level pages like an "About" page or an "Interests" page to orient people on your site. Link to other videos, sites, and posts you like with a blogroll.

If you are technically inclined, you may enjoy tinkering with your website. For example, you may want to add a comment system if your blog does not already support it (see Giscus and Webmentions for ideas). The IndieWeb has tons of ideas on how to use your site as your online identity. For example, you can use Bridgy and Bridgy Fed to have posts from your site automatically syndicated out to social media and pull comments/likes back in to your site.

There's also some more niche and lively communities to explore. For example, tilde.club where this site is hosted, is what's called a pubnix, meaning the community exists on a shared Unix server. Pubnixes typically offer free web hosting along with different protocols like Gemini and Gopher, and the ability to do some light server-side scripting. Some tilde-style pubnixes offer open sign-ups, while others like sdf.org and freeshell.de require verification by physically mailing something to an address. There's also Neocities and 32bit.cafe that aim to support people in creating personal websites, often with very artistic and retro theming.

tl;dr - Post! Tinker! Explore! Decorate! Design! Build the web you want to see!


How I've set up a password manager, and why you should too

One password to rule them all, one password to find them, one password to bring them all and in the darkness bind them.

The need for password managers

Humans are extremely predictable. For example, when asked for a random number, a study showed that most people will choose seven. If you take a look at Wikipedia's compilation of most commonly used passwords, the top contenders are pitifully predictable. Passwords like "123456", "iloveyou", "qwerty", and yes, even "password" are still common in the year 2025. We are understandably tired, and no one wants to remember a million passwords for a million applications.

More and more sites and applications are aware of this issue. We've seen a huge rise in sites using OAuth, where sites can delegate authorization to an authority like Google or GitHub, allowing third parties to verify identity without seeing the password. These are great, but they leave the responsibility for your credentials tied to a specific authority. While there is a push for federating the OAuth authority to one's own domain with IndieAuth, this practice is not yet widespread, though I am interested in looking more into it.

Another solution is using a password manager, where you access a database containing all your passwords using one strong master password. Many people should be used to the password managers that come built in to smartphones. These are convenient, but not very portable to multiple devices, especially outside of the corporate ecosystem containing the manager (cough, cough Apple passwords).

Web-based password managers like NordPass and LastPass offer a temptingly convenient solution, but these password managers also place trust in a corporate entity's security practices, potentially for a fee. While handy, multiple security incidents at LastPass encouraged me to find a better solution.

My solution with KeePassXC

I use KeePassXC to manage my passwords. You create a database, choose a strong master password to memorize, and you can store all of your passwords in an encrypted database. I chose KeePassXC so I can access my database from a similar client on macOS, Windows, and Linux. And, it's available as free software (as in price and as in freedom)! There are many tutorials available online that are much more thorough, so I won't cover details here, but I will provide an overview of what I've found works for me.

KeePassXC can generate extremely strong and long passwords (even including extended ASCII symbols that no sane person would type into a password box). You won't need to remember the password, just the master password for the database!

KeePassXC can also integrate into your browser. There is an extension for Firefox and Chrome (and Edge) that will integrate the passwords automatically into password fields on web pages. I've hooked it up to the fingerprint reader on my laptop so I can open the database with my fingerprint. You can use a key file or hardware key if you are feeling the need to be particularly secure.

In order to have my database available across multiple devices, I store the encrypted database on Google Drive, though I'm in the process of looking for a different place to store my files on the cloud. I can even set it up on my iPhone using Keepassium, though notably this app is not free software, and free users are limited to a single database. A tip if you use this method: make sure to check the "Use alternative saving method" and "Directly write to database file" on your KeePassXC settings if you are syncing through Google Drive. Otherwise, I found Keepassium doesn't update to the newest version of the database and points to the recently deleted version.

One warning is that you must remember your master password. If you forget the master password, the database is completely irretrievable. If there were another way to get the database unlocked, it wouldn't be very secure!

I hope you consider using a password manager!


Introduction

Welcome to the space where I explore niche corners of the Internet.

Welcome! My name is twinbfield. This is a space where I explore retro computing and niche corners of the Internet. I aim for posts to be quick, text-focused reads over extended explorations. Consider adding this site to your feed aggregator to get updates.

I plan to use this site to experiment as well. As of writing, I'm currently hosted on tilde.club. I also want to try providing content over other protocols like Gopher and Gemini. You can check out some of my previous tinkering outcomes - there's mini games I've made posted under Demos and Games.

For the technically interested, this site uses the 11ty site generator with a fairly barebones template I have been putting together. I've chosen to release content that I have generated on this website under the CC BY 4.0 license.

I'm working on a solution for comments. Stay tuned!