<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="https://tilde.club//~twinbfield//styles/feed.xslt" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>twinbfield</title>
  <subtitle>Thoughts on retro computing, free software, and niche corners of the Internet.</subtitle>
  <link href="https://tilde.club/~twinbfield/feed.xml" rel="self" />
  <link href="https://tilde.club/~twinbfield/" />
  <updated>2026-07-09T02:00:00Z</updated>
  <id>https://tilde.club/~twinbfield/</id>
  <author>
    <name>twinbfield</name>
  </author>
  <entry>
    <title>Software-defined radio and the idyllic beauty of the electromagnetic spectrum</title>
    <link href="https://tilde.club/~twinbfield/posts/software-defined-radio/" />
    <updated>2026-07-09T02:00:00Z</updated>
    <id>https://tilde.club/~twinbfield/posts/software-defined-radio/</id>
    <content type="html">&lt;p&gt;We take for granted the level of interconnectedness we share with the world. The Internet is no longer the source of inspiration it used to be. We&#39;ve largely moved on from the era of design inspired by a global village-style utopia that dominated tech design in the late 90s and early 2000s, (including, for example, the Frutiger Aero design language that inspires this site&#39;s looks). Near-instantaneous connection on a global scale had become more of a monolithic presence, mirrored by the rise of social media platforms and tech giants like Meta, Google, and Apple and demonstrated in the more minimalist and functional design of the 2010s.&lt;/p&gt;
&lt;p&gt;But have you ever stopped to think about the physical processes that enable that level of communication? All of the wireless technologies connecting us use radio signals. WiFi, Bluetooth, 5G phone signals, GPS - they are all just different patterns of frequencies occupying portions of the electromagnetic spectrum. If you want to explore the radio spectrum and open a vast network of communications, you can easily do it using something called a software-defined radio (SDR). These are USB receivers the size of a thumb drive that you connect to an antenna - you can get a complete kit for about $50. A software-defined radio can connect you with a near-instantaneous network of worldwide communication - free of charge, free from censorship, free from any platform.&lt;/p&gt;
&lt;p&gt;I want to point out that some of the best signals worth accessing are from amateur radio hobbyists (AKA ham radio). Now, when someone says &amp;quot;ham radio&amp;quot;, I immediately think of a bunch of old men sitting around microphones complaining about doctors appointments. And sure, there&#39;s some validity to that stereotype - listen in on a random conversation happening on the voice bands and more often than not they&#39;re talking about the weather, their health, or their equipment. But if you stay with me, I think you&#39;ll find that there&#39;s a lot more than the stereotype suggests with amateur radio. It&#39;s accessible, and it&#39;s worldwide. You don&#39;t need to be licensed in order to listen in (though you do need a license to transmit). Amateur transmissions can&#39;t be encrypted (though they can be encoded, e.g. with Morse code), so you can see anything your antenna can catch. Amateur radio gets a decent chunk of the highly-valued electromagnetic spectrum, and I seriously underestimated the variety of activity going on in the air.&lt;/p&gt;
&lt;p&gt;First, then I&#39;ll give a brief overview of how you can set this up for yourself or even access someone else&#39;s setup via the Internet for free, and then I&#39;ll highlight some specific examples of what&#39;s out there.&lt;/p&gt;
&lt;h2 id=&quot;the-setup&quot; tabindex=&quot;-1&quot;&gt;The setup &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/software-defined-radio/#the-setup&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;Using someone else&#39;s radio&lt;/h3&gt;
&lt;p&gt;This is the simplest solution, and it&#39;s free. Many enthusiasts make their radios available to the Internet, and there&#39;s usually a web interface that will allow you to sweep different frequencies and decode different types of transmissions. I suggest looking on &lt;a href=&quot;https://rx-tx.info/map-sdr-points&quot;&gt;rx-tx.info/map-sdr-points&lt;/a&gt;, &lt;a href=&quot;https://www.receiverbook.de/&quot;&gt;receiverbook.de&lt;/a&gt;, and &lt;a href=&quot;http://websdr.org/&quot;&gt;websdr.org&lt;/a&gt;.   They support different ranges of frequencies depending on the antenna - for long-distance communication, try the HF (&amp;quot;high frequency&amp;quot;) band around 3-30 MHz. Local communications, broadcast FM radio and TV signals are in the VHF (&amp;quot;very high frequency&amp;quot;) band around 30-300 MHz. Signals like GPS, WiFi, walkie-talkies, and other close-range radio services occur on the UHF (&amp;quot;ultra high frequency&amp;quot;) band in 300-3000 MHz.&lt;/p&gt;
&lt;h3&gt;Setting up your own radio&lt;/h3&gt;
&lt;p&gt;You can order a software-defined radio dongle in a kit for about $50. I bought an RTL-SDR v4 from &lt;a href=&quot;https://www.rtl-sdr.com/&quot;&gt;RTL-SDR&lt;/a&gt;, though I think this brand and model is becoming difficult to source in the US. If you buy a kit, it might come with a pair of rabbit-ear antennas. Usually, these are good for use within the VHF and UHF bands.&lt;/p&gt;
&lt;p&gt;If you want to catch long-distance signals, you&#39;ll need an HF antenna. The easiest setup is a &lt;a href=&quot;https://www.hamuniverse.com/randomwireantennalengths.html&quot;&gt;random wire antenna&lt;/a&gt; - literally a length of wire with a length chosen so that it&#39;s not too resonant on any single frequency. I strung 35.5 feet of 14 gauge copper wire around the edge of my ceiling (any wire from the hardware store will do) and connected it into a 9:1 balun, which is an electronic circuit that will make the impedance of your antenna appropriate for the software-defined radio dongle. Instead of grounding the other side of the balun into my apartment&#39;s noisy ground, I laid another 10 feet of copper wire on the floor, called a counterpoise. This antenna would probably do much better outside where there&#39;s not as much electromagnetic noise, but in an apartment, it works just fine for my purposes.&lt;/p&gt;
&lt;p&gt;No matter which antenna you use, you can use something like &lt;a href=&quot;https://www.sdrpp.org/&quot;&gt;SDR++&lt;/a&gt; to access the signal on your computer. If you want to decode a digital mode, you will need to pipe the sound into a different program. An alternative is &lt;a href=&quot;https://www.openwebrx.de/&quot;&gt;OpenWebRX+&lt;/a&gt;, which can provide a web interface with all of the decoding programs for common digital modes, and it&#39;s easy to host - I run mine on a Raspberry Pi!&lt;/p&gt;
&lt;h2 id=&quot;what&#39;s-out-there%3F&quot; tabindex=&quot;-1&quot;&gt;What&#39;s out there? &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/software-defined-radio/#what&#39;s-out-there%3F&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Scroll around on the spectrogram you see, called the waterfall. Some programs like OpenWebRX+ will label specific frequencies of interest, and even pull up decoding programs for digital modes if you click on them.&lt;/p&gt;
&lt;h3&gt;Broadcast radio and TV&lt;/h3&gt;
&lt;p&gt;Maybe this is obvious, but you can see broadcast FM and AM radio on the waterfall. These are great to test your setup - you can receive FM radio on ANY antenna. Your software should provide an AM or FM mode. Play with the bandwidth and any denoise/squelch features that your software might provide. People have even reverse-engineered &lt;a href=&quot;https://www.rtl-sdr.com/decoding-and-listening-to-hd-radio-nrsc-5-with-an-rtl-sdr/&quot;&gt;HD Radio&lt;/a&gt; if you want to listen to extra channels from one station. On the HF bands, you can also checkout shortwave radio. With the rise of Internet radio stations and music streaming, shortwave stations are not as popular as they used to be, but it requires no Internet access and can be received worldwide.&lt;/p&gt;
&lt;p&gt;TV signals are also sent over the air on the VHF/UHF frequencies, though the channels are all over the place. Unfortunately, the bandwidth of my software-defined radio dongles is not high enough to decode TV, but yours might be!&lt;/p&gt;
&lt;h3&gt;Amateur radio - voice modes&lt;/h3&gt;
&lt;p&gt;This is what you think of when you think of ham radio. There&#39;s probably someone calling &amp;quot;CQ&amp;quot; searching for contacts around the 20m band (about 14 MHz) if you scroll around. Use the USB or &amp;quot;upper sideband&amp;quot; modulation mode, adjust the center frequency and bandwidth, and you should be able to hear someone talking!&lt;/p&gt;
&lt;p&gt;If you are interested in hearing what&#39;s going on locally, you&#39;ll likely want to tune into a repeater. These are regional towers that retransmit received signals on specific frequencies. Multiple towers may be linked together. Find one close to your antenna&#39;s location on &lt;a href=&quot;https://www.repeaterbook.com/repeaters/index.php&quot;&gt;Repeater Book&lt;/a&gt;. These will be somewhere in the VHF/UHF range, and FM modulation is more typical. Check if there&#39;s a regular meeting for this repeater, called a &lt;a href=&quot;https://www.netfinder.radio/&quot;&gt;net&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Amateur radio - digital modes&lt;/h3&gt;
&lt;p&gt;Digital modes are really powerful and efficient, as they can compress information and include checksums to ensure accurate reception. One of the most commonly used across several bands is FT8. On 20m, check out 14.075 MHz using an FT8 decoder like the one included in OpenWebRX+ or &lt;a href=&quot;https://wsjtx.github.io/wsjtx/index.html&quot;&gt;WSJT-X&lt;/a&gt;. These send extremely minimal information - typically, just someone&#39;s call sign, who they are responding to, and a 4-letter &lt;a href=&quot;https://en.wikipedia.org/wiki/Maidenhead_Locator_System&quot;&gt;Maidenhead grid locator&lt;/a&gt; that describes their location on the globe.&lt;/p&gt;
&lt;p&gt;FT8 is very resilient - you could practically catch these signals on a fork if you hold it high enough. OpenWebRX+ will even map out signals you receive - I&#39;m able to receive signals from Russia and Saudi Arabia on my noisy random wire. Once, I received a signal from Antarctica, and after triple-checking the call sign, sure enough, it was from a German research station!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tilde.club/~twinbfield/assets/posts/ft8_map.png&quot; alt=&quot;Map of FT8 signals received in Europe and Russia&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Amateur radio - SSTV images&lt;/h3&gt;
&lt;p&gt;One of my favorite signals to receive is slow-scan TV or SSTV. These are images that take a minute or two to receive. You can find them on 20m at 14.230 MHz, but satellites and the International Space Station will occassionally send them on the VHF bands. Like FT8, these need a program to decode them. The first time I got one of these signals to decode, I let out a scream that can only be described as the noise Lucille Bluth makes on Arrested Development when Gene Parmesan does a reveal. Here&#39;s an example of a signal I&#39;ve received on my antenna, though image quality varies a lot for me based on the noise floor in my apartment.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tilde.club/~twinbfield/assets/posts/sstv_example.jpg&quot; alt=&quot;SSTV image of a bee labeled &amp;quot;CQSSTV KG5JJ&amp;quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Time and weather&lt;/h3&gt;
&lt;p&gt;You can hear the weather on a local frequency on the VHF bands using FM! Check out the &lt;a href=&quot;https://www.weather.gov/nwr/station_listing&quot;&gt;NOAA Weather Radio&lt;/a&gt; stations for your local frequency. The &lt;a href=&quot;https://www.nist.gov/pml/time-and-frequency-division/time-services/nist-radio-stations&quot;&gt;NIST radio stations&lt;/a&gt; send out time information and clicks every second.&lt;/p&gt;
&lt;h3&gt;Mysterious signals&lt;/h3&gt;
&lt;p&gt;Not all signals on the waterfall are something meaningful - it could just be your washing machine inducing some currents on your antenna! But figuring out mystery signals can send you down the rabbit hole. For instance, you can check out a very cryptic Russian station called &lt;a href=&quot;https://en.wikipedia.org/wiki/UVB-76&quot;&gt;the Buzzer&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what&#39;s-next%3F&quot; tabindex=&quot;-1&quot;&gt;What&#39;s next? &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/software-defined-radio/#what&#39;s-next%3F&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I suppose the next step is to participate in the conversation. Maybe I&#39;ll sit for an amateur radio exam and get licensed one of these days. I don&#39;t have the funds for a fancy setup, but hams are creative - a halfway decent transceiver and two Slinkies can transmit a signal even from inside a house.&lt;/p&gt;
&lt;p&gt;There&#39;s something about the radio that keeps bringing me back. Sure, I have an electrical engineering degree, so something about the signal processing and electronics piques my interest, but there&#39;s something more fundamental. These signals are flying around us all the time. Can you tell that someone from Quebec is saying hi to someone in Sonora? There&#39;s a picture of a frog someone took on vacation flying by - can you catch it?&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Theremin 1 - Ultrasonic sensor</title>
    <link href="https://tilde.club/~twinbfield/posts/ultrasonic-theremin/" />
    <updated>2026-06-14T19:21:00Z</updated>
    <id>https://tilde.club/~twinbfield/posts/ultrasonic-theremin/</id>
    <content type="html">&lt;p&gt;There is a wonderfully ethereal instrument called the &lt;a href=&quot;https://en.wikipedia.org/wiki/Theremin&quot;&gt;theremin&lt;/a&gt; that is played without touching anything. Built using two antennas (one for volume and one for pitch), it creates a synthesized wave that sounds otherwordly:&lt;/p&gt;
&lt;p&gt;&lt;audio controls=&quot;&quot;&gt;&lt;source src=&quot;https://upload.wikimedia.org/wikipedia/commons/a/a3/Epro_theremin_middle_bach.ogg&quot; type=&quot;audio/mpeg&quot;&gt;Your browser does not support the audio element.&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;The original instrument is designed as a large capacitive sensor. As the distance between your hand and a charged conductor changes, it changes the frequency of an oscillating circuit. However, since the 1920s when the theremin was invented, there are many different ways to create a theremin that incorporate modern sensors and microcontrollers. &lt;a href=&quot;http://www.thereminworld.com/&quot;&gt;Theremin World&lt;/a&gt; has dozens of designs.&lt;/p&gt;
&lt;p&gt;In this next series of posts, I want to explore three theremin designs. First, I will use an Arduino and an ultrasonic sensor to measure distance and produce a pitch-only theremin. In future posts, I hope to create a &amp;quot;true&amp;quot; theremin based on capacitive sensing, and finally one using circuits only with no microcontroller (if I am brave enough).&lt;/p&gt;
&lt;h2 id=&quot;materials-and-design&quot; tabindex=&quot;-1&quot;&gt;Materials and design &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/ultrasonic-theremin/#materials-and-design&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For this project, we need the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Arduino (I used an Uno)&lt;/li&gt;
&lt;li&gt;HC-SR04 ultrasonic sensor&lt;/li&gt;
&lt;li&gt;3W 8Ω speaker&lt;/li&gt;
&lt;li&gt;LM386 amplifier board (not just the raw LM386 chip)&lt;/li&gt;
&lt;li&gt;Various jumper cables and a breadboard&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You could easily substitute the type of speaker or amplifier board. When we wire everything together, we need to make sure that the speaker is connected ONLY to the amplifier so we don&#39;t accidentally pull a ton of current on the Arduino. Here&#39;s the schematic:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tilde.club/~twinbfield/assets/posts/theremin_ultrasonic_schematic.jpg&quot; alt=&quot;Ultrasonic theremin schematic&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;testing-the-ultrasonic-sensor&quot; tabindex=&quot;-1&quot;&gt;Testing the ultrasonic sensor &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/ultrasonic-theremin/#testing-the-ultrasonic-sensor&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, I made a quick script to get the distance from the ultrasonic sensor. I&#39;m summarizing info from &lt;a href=&quot;https://projecthub.arduino.cc/lucasfernando/ultrasonic-sensor-with-arduino-complete-guide-284faf&quot;&gt;another tutorial&lt;/a&gt;, but the ultrasonic sensor sends out a pulse on the trigger pin, and you can read how long it takes for the pulse to return. Then, the distance from the sensor to your hand is the time multiplied by the speed of sound over two (since the wave traveled there and back).&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// See https://projecthub.arduino.cc/lucasfernando/ultrasonic-sensor-with-arduino-complete-guide-284faf&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; TRIG_PIN &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; ECHO_PIN &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; timing &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; distance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt; buffer&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;pinMode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ECHO_PIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; INPUT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;pinMode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;TRIG_PIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; OUTPUT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;digitalWrite&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;TRIG_PIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; LOW&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  Serial&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9600&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;loop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Send a pulse and measure the timing&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;digitalWrite&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;TRIG_PIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; HIGH&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;delay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;digitalWrite&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;TRIG_PIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; LOW&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  timing &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pulseIn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ECHO_PIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; HIGH&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  distance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;timing &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.034&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  Serial&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Distance: &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  Serial&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;distance&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;making-the-theremin-sing&quot; tabindex=&quot;-1&quot;&gt;Making the theremin sing &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/ultrasonic-theremin/#making-the-theremin-sing&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now, we can set up the theremin entirely. To synthesize a sound on the speaker, we use &lt;a href=&quot;https://sensorium.github.io/Mozzi/&quot;&gt;Mozzi&lt;/a&gt;, which allows us to take advantage of the pulse width modulation available on pin 9.&lt;/p&gt;
&lt;p&gt;To avoid blocking the audio synthesis, we put all of the logic in the &lt;code&gt;updateControl&lt;/code&gt; function. We also provide a moving average for the pitch and the volume so that there isn&#39;t awkward clipping and noise in the output.&lt;/p&gt;
&lt;pre class=&quot;language-c&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;define&lt;/span&gt; &lt;span class=&quot;token macro-name&quot;&gt;MOZZI_CONTROL_RATE&lt;/span&gt; &lt;span class=&quot;token expression&quot;&gt;&lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;Mozzi.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;Oscil.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;tables/sin2048_int8.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;RollingAverage.h&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; TRIG_PIN &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; ECHO_PIN &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt; ECHO_TIMEOUT &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; LOW_FREQ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;220&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// A3&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; HIGH_FREQ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;880&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// A5&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; MAX_DIST &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// cm&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; MIN_DIST &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// cm&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; timing &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; distance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; freq &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; freq_avg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; volume_avg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; volume &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

Oscil &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;SIN2048_NUM_CELLS&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; MOZZI_AUDIO_RATE&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;aSin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SIN2048_DATA&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
RollingAverage &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; kAverage_freq&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Average across 16&lt;/span&gt;
RollingAverage &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; kAverage_vol&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;startMozzi&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  aSin&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setFreq&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;LOW_FREQ&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;pinMode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ECHO_PIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; INPUT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;pinMode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;TRIG_PIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; OUTPUT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;token function&quot;&gt;digitalWrite&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;TRIG_PIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; LOW&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  Serial&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;115200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;updateControl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// Send a pulse and measure the timing&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;digitalWrite&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;TRIG_PIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; HIGH&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;delayMicroseconds&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;digitalWrite&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;TRIG_PIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; LOW&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  timing &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pulseIn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ECHO_PIN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; HIGH&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ECHO_TIMEOUT&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  distance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;timing &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.0343&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  
  &lt;span class=&quot;token comment&quot;&gt;// Map onto frequencies&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; volume&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;distance &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; MIN_DIST&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    volume &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    volume &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;float&lt;/span&gt; freq &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;distance &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; MIN_DIST&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;MAX_DIST &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; MIN_DIST&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;HIGH_FREQ &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; LOW_FREQ&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; LOW_FREQ&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  freq_avg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; kAverage_freq&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;freq&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  volume_avg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; kAverage_vol&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;volume&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

  aSin&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;setFreq&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;freq_avg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

AudioOutput &lt;span class=&quot;token function&quot;&gt;updateAudio&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; MonoOutput&lt;span class=&quot;token operator&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from8Bit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;aSin&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; volume_avg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;loop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;audioHook&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Loading this onto our board, we can produce a sound! The potentiometer on the LM386 amplifier can help control the volume.&lt;/p&gt;
&lt;p&gt;&lt;audio controls=&quot;&quot;&gt;&lt;source src=&quot;https://tilde.club/~twinbfield/assets/posts/theremin_ultrasonic_sound.mp3&quot; type=&quot;audio/mpeg&quot;&gt;Your browser does not support the audio element.&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;Very nice! Now, as a musician, this instrument overall is... okay. I could probably improve the synthesis - it&#39;s a bit laggy with the averages, and it&#39;s a bit sensitive when the sensor doesn&#39;t detect your hand. Stay tuned for the second design, based on capacitive sensing with an antenna!&lt;/p&gt;
&lt;h3&gt;License&lt;/h3&gt;
&lt;p&gt;The schematic was created with Fritzing. The &lt;a href=&quot;https://tilde.club/~twinbfield/assets/posts/lm386_breadboard.svg&quot;&gt;LM386 amplifier schematic&lt;/a&gt; was modified from the &lt;a href=&quot;https://github.com/adafruit/Fritzing-Library/&quot;&gt;Arduino library&lt;/a&gt;. Both are released under &lt;a href=&quot;http://creativecommons.org/licenses/by-sa/3.0/&quot;&gt;CC BY-SA 3.0&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Evennia cheat sheet</title>
    <link href="https://tilde.club/~twinbfield/posts/evennia-cheatsheet/" />
    <updated>2026-05-26T02:47:00Z</updated>
    <id>https://tilde.club/~twinbfield/posts/evennia-cheatsheet/</id>
    <content type="html">&lt;p&gt;I&#39;m creating a &lt;a href=&quot;https://en.wikipedia.org/wiki/Multi-user_dungeon&quot;&gt;MUD&lt;/a&gt; using &lt;a href=&quot;https://www.evennia.com/&quot;&gt;Evennia&lt;/a&gt;, a Python framework that is super powerful and extendable. I couldn&#39;t find a great cheat sheet online, so here&#39;s some notes from their tutorial series. I will update this as I go, and I may end up typesetting this into a PDF.&lt;/p&gt;
&lt;h1&gt;Evennia commands&lt;/h1&gt;
&lt;p&gt;These commands are done through the Evennia shell (i.e., through a MUD client). Typically, &lt;code&gt;items&lt;/code&gt; can include &lt;code&gt;me&lt;/code&gt; for oneself, &lt;code&gt;here&lt;/code&gt; for the current location, or a database reference number like &lt;code&gt;#8&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;basic-interaction&quot; tabindex=&quot;-1&quot;&gt;Basic interaction &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/evennia-cheatsheet/#basic-interaction&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Get help&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;help [item]&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Look around&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;look [item]&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get detailed information&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;examine [item]&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pick up item&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;get [item]&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;See inventory&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;inventory&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use a named exit&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;exit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Move to a location&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;teleport &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;location&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global search for something&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;find &amp;lt;item/location/exit...&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;creating-items&quot; tabindex=&quot;-1&quot;&gt;Creating items &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/evennia-cheatsheet/#creating-items&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Create an item (and drop it)&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;create[/drop] &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;[:&amp;lt;typeclass]&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add synonyms&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;name &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;alias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;[;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;alias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;...]&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add descriptions&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;desc &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;details&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Move item to a location&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;teleport &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;location&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete item&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;destroy &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;item&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set attribute&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;set/&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;attribute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;creating-locations&quot; tabindex=&quot;-1&quot;&gt;Creating locations &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/evennia-cheatsheet/#creating-locations&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Add a named location from here&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;dig &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;location&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;exitname&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;[;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;alias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;...]&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add a cardinal direction&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;tunnel &amp;lt;n[orth]/s/e/w/nw/.../in/out/up/down&amp;gt; = &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;[;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;alias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;...]&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open from here to a previous location&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;open &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;exitname&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;[;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;alias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;...] = &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;location&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;administration&quot; tabindex=&quot;-1&quot;&gt;Administration &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/evennia-cheatsheet/#administration&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Temporarily decrease/restore permissions&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;quell/unquell&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add help entry&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;sethelp &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;entryname&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;details&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reload world and code&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;reload&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;locks-and-permissions&quot; tabindex=&quot;-1&quot;&gt;Locks and permissions &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/evennia-cheatsheet/#locks-and-permissions&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lockfuncs can be defined in &lt;code&gt;server/conf/lockfuncs.py&lt;/code&gt;. See &lt;a href=&quot;https://www.evennia.com/docs/latest/Components/Locks.html#valid-access-types&quot;&gt;Evennia&#39;s list of access_types&lt;/a&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Add/remove lock&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;lock[/del] &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;lockstring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lockstring format&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;accesstype&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;: [NOT] lockfunc() [[AND/OR] [NOT] lockfunc() ...]&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add/remove account permissions&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;perm/account[/del] &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;permission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Account levels&lt;/td&gt;
&lt;td&gt;Guest, Player, Helper, Builder, Admin, Developer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add/remove object permissions&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;perm[/del] &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;object&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt; = &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;permission&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;Python commands&lt;/h1&gt;
&lt;p&gt;These commands can be used in the interactive Python shell (&lt;code&gt;py&lt;/code&gt; within a MUD client) or through a Python script.&lt;/p&gt;
&lt;h2 id=&quot;creating-things&quot; tabindex=&quot;-1&quot;&gt;Creating things &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/evennia-cheatsheet/#creating-things&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Create a character, room, exit, or object&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;evennia&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;create_object&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;typeclass&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; key&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;database_key&amp;gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;location&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;permissions&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;locks&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;attributes&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Store persistent object values&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;db&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;key&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creating an account, channel, or script&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;evennia&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;create_&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;account&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;channel&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object location&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;location&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object contents&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contents&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exit destination&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;exit&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;destination&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add tags&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tags&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;add&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;&amp;lt;tag&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; category&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;&amp;lt;category&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;creating-commands&quot; tabindex=&quot;-1&quot;&gt;Creating commands &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/evennia-cheatsheet/#creating-commands&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name of command&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Command&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;key&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Command function&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Command&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;func&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Argument string provided to command&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Command&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;args&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Help function for command&lt;/td&gt;
&lt;td&gt;Defined in docstring of &lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Command&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message command caller&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Command&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;&amp;lt;msg&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add command to a commandset&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;add&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Command&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; in &lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;CmdSet&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;at_cmdset_creation&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remove command from a commandset&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;remove&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Command&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt; in &lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;CmdSet&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;at_cmdset_creation&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;searching&quot; tabindex=&quot;-1&quot;&gt;Searching &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/evennia-cheatsheet/#searching&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;See the &lt;a href=&quot;https://www.evennia.com/docs/latest/Howtos/Beginner-Tutorial/Part1/Beginner-Tutorial-Django-queries.html&quot;&gt;Evennia docs on Django queries&lt;/a&gt; for an explanation on how powerful and flexible Django queries can be.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Global search for an object&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;evennia&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;search_object&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;&amp;lt;name&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search for an object relative to caller&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;search&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;&amp;lt;name&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search by tag&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;evennia&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;search_tag&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;&amp;lt;tag&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search by location&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;evennia&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;search_object&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;&amp;lt;name&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; candidate&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;location&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;contents&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search by attribute&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;evennia&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;search_object&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;&amp;lt;name&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; attribute_name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;&amp;lt;attribute&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search by typeclass&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;evennia&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;search_object&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;&amp;lt;name&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; typeclass&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;&amp;lt;typeclass&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search by Django query&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Typeclass&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;objects&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;get&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;exclude&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;db_key&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;&amp;lt;name&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search by Django query (incl. subclasses)&lt;/td&gt;
&lt;td&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Typeclass&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;objects&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;all_family&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;filter_family&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;get_family&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;exclude_family&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;db_key&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;quot;&amp;lt;name&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;Directories&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Directory&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;commands/&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td&gt;Commands and command sets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;server/&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td&gt;Server files, see settings at &lt;code&gt;server/conf/settings.py&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;typeclasses/&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td&gt;Templates for accounts, characters, scripts, rooms, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;web/&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td&gt;Website and webclient files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;pre class=&quot;language-markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;world/&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td&gt;Misc. files, useful for user-defined build scripts and modules&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content>
  </entry>
  <entry>
    <title>How to start a blog</title>
    <link href="https://tilde.club/~twinbfield/posts/how-to-start-a-blog/" />
    <updated>2026-05-24T19:00:00Z</updated>
    <id>https://tilde.club/~twinbfield/posts/how-to-start-a-blog/</id>
    <content type="html">&lt;p&gt;I&#39;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.&lt;/p&gt;
&lt;h2 id=&quot;1.-getting-a-website-running&quot; tabindex=&quot;-1&quot;&gt;1. Getting a website running &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/how-to-start-a-blog/#1.-getting-a-website-running&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To start out, let&#39;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 &lt;strong&gt;hosted&lt;/strong&gt; somewhere (i.e., a publicly-accessible server on the Internet stores your content). Second, there must be a &lt;strong&gt;domain name&lt;/strong&gt; like google.com or tilde.club that is registered and points to wherever your site is hosted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It&#39;s not necessary to spend money to do either of these things.&lt;/strong&gt; There are many services that will offer free hosting for your website if your website is &lt;strong&gt;static&lt;/strong&gt; 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, &lt;a href=&quot;https://docs.github.com/en/pages&quot;&gt;GitHub Pages&lt;/a&gt; hosts many static sites that look like &lt;code&gt;&amp;lt;something&amp;gt;.github.io&lt;/code&gt; - take a look at &lt;a href=&quot;https://netflix.github.io/&quot;&gt;netflix.github.io&lt;/a&gt;. If you want something that looks like &lt;code&gt;example.com&lt;/code&gt;, 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.&lt;/p&gt;
&lt;p&gt;Now, that&#39;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 &lt;a href=&quot;https://bearblog.dev&quot;&gt;bearblog.dev&lt;/a&gt; or &lt;a href=&quot;https://i.haza.website/&quot;&gt;i.haza.website&lt;/a&gt;. &lt;a href=&quot;https://wordpress.com/&quot;&gt;Wordpress.com&lt;/a&gt; and &lt;a href=&quot;https://blogger.com&quot;&gt;blogger.com&lt;/a&gt; are some of the big names in blogging software, too. &lt;a href=&quot;https://substack.com/&quot;&gt;Substack&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;If you want a bit more control over your site and how it looks, I recommend looking into static site generators like &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt; and &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;. 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&#39;t know how to use GitHub or a command line, it&#39;s probably best to avoid these for now.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;tl;dr - Find a free blog host that uses a graphical interface. I like &lt;a href=&quot;https://bearblog.dev&quot;&gt;bearblog.dev&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;2.-connecting-to-the-blogosphere&quot; tabindex=&quot;-1&quot;&gt;2. Connecting to the blogosphere &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/how-to-start-a-blog/#2.-connecting-to-the-blogosphere&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In my opinion, your website is not a blog until you give people a way to follow your blog. In the &lt;strong&gt;blogosphere&lt;/strong&gt;, 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 &lt;strong&gt;feed readers&lt;/strong&gt; 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:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tilde.club/~twinbfield/assets/rss.png&quot; alt=&quot;Syndication symbol&quot;&gt;&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;example.com/feed.xml&lt;/code&gt; 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&#39;ve used &lt;a href=&quot;https://feedly.com&quot;&gt;Feedly&lt;/a&gt; and
&lt;a href=&quot;https://github.com/yang991178/fluent-reader&quot;&gt;Fluent Reader&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Another cool way of connecting with the blogosphere is connecting to a &lt;a href=&quot;https://en.wikipedia.org/wiki/Webring&quot;&gt;webring&lt;/a&gt;. These were popular back on the early Internet, and it&#39;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 &lt;a href=&quot;https://petrapixel.neocities.org/coding/webring-list&quot;&gt;this aggregator&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;?via=&lt;/code&gt; to a &lt;a href=&quot;https://www.utilities-online.info/urlencode/&quot;&gt;url-encoded&lt;/a&gt; version of your URL:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;center&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Begin Combo Crew Webring Badge --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://webri.ng/webring/combocrew/next?via=https%3A%2F%2Ftilde.club%2F~twinbfield&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://tilde.club/~twinbfield/assets/combo_crew_88x31_blue.png&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;88&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;31&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Combo Crew Webring&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- End Combo Crew Webring Badge --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;center&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(You can replace the color on the PNG link. Options are red, orange, yellow, darkgreen, lightgreen, blue, pink, and purple.)&lt;/p&gt;
&lt;p&gt;Then, message me the URL of your site, and I&#39;ll add it to the webring. The 88x31 button should take you to the next site in the webring.&lt;/p&gt;
&lt;center&gt;
&lt;!-- Begin Combo Crew Webring Badge --&gt;
&lt;a href=&quot;https://webri.ng/webring/combocrew/next?via=https%3A%2F%2Ftilde.club%2F~twinbfield&quot;&gt;
&lt;img src=&quot;https://tilde.club/~twinbfield/assets/combo_crew_88x31_blue.png&quot; border=&quot;0&quot; width=&quot;88&quot; height=&quot;31&quot; alt=&quot;Combo Crew Webring&quot;&gt;
&lt;/a&gt;
&lt;!-- End Combo Crew Webring Badge --&gt;
&lt;/center&gt;
&lt;blockquote&gt;
&lt;p&gt;tl;dr - Make sure you have a link to an RSS or Atom feed so people can follow your blog.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;3.-what&#39;s-next%3F&quot; tabindex=&quot;-1&quot;&gt;3. What&#39;s next? &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/how-to-start-a-blog/#3.-what&#39;s-next%3F&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now, you can post! For Combo Crew specifically, we&#39;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 &amp;quot;About&amp;quot; page or an &amp;quot;Interests&amp;quot; page to orient people on your site. Link to other videos, sites, and posts you like with a &lt;a href=&quot;https://blogroll.org/&quot;&gt;blogroll&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://giscus.app/&quot;&gt;Giscus&lt;/a&gt; and &lt;a href=&quot;https://buttondown.com/blog/what-is-a-webmention&quot;&gt;Webmentions&lt;/a&gt; for ideas). The &lt;a href=&quot;https://indieweb.org/&quot;&gt;IndieWeb&lt;/a&gt; has tons of ideas on how to use your site as your online identity. For example, you can use &lt;a href=&quot;https://brid.gy/&quot;&gt;Bridgy&lt;/a&gt; and &lt;a href=&quot;https://fed.brid.gy/&quot;&gt;Bridgy Fed&lt;/a&gt; to have posts from your site automatically syndicated out to social media and pull comments/likes back in to your site.&lt;/p&gt;
&lt;p&gt;There&#39;s also some more niche and lively communities to explore. For example, &lt;a href=&quot;https://tilde.club&quot;&gt;tilde.club&lt;/a&gt; where this site is hosted, is what&#39;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 &lt;a href=&quot;https://sdf.org&quot;&gt;sdf.org&lt;/a&gt; and &lt;a href=&quot;https://freeshell.de&quot;&gt;freeshell.de&lt;/a&gt; require verification by physically mailing something to an address. There&#39;s also &lt;a href=&quot;https://neocities.org/&quot;&gt;Neocities&lt;/a&gt; and &lt;a href=&quot;https://32bit.cafe&quot;&gt;32bit.cafe&lt;/a&gt; that aim to support people in creating personal websites, often with very artistic and retro theming.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;tl;dr - Post! Tinker! Explore! Decorate! Design! &lt;a href=&quot;https://goodinternetmagazine.com/build-the-web-you-want-to-see/&quot;&gt;Build the web you want to see&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;
</content>
  </entry>
  <entry>
    <title>How I&#39;ve set up a password manager, and why you should too</title>
    <link href="https://tilde.club/~twinbfield/posts/password-manager/" />
    <updated>2025-10-09T00:00:00Z</updated>
    <id>https://tilde.club/~twinbfield/posts/password-manager/</id>
    <content type="html">&lt;h2 id=&quot;the-need-for-password-managers&quot; tabindex=&quot;-1&quot;&gt;The need for password managers &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/password-manager/#the-need-for-password-managers&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Humans are extremely predictable. For example, when asked for a random number, a &lt;a href=&quot;https://doi.org/10.1037/0096-1523.2.2.291&quot;&gt;study&lt;/a&gt; showed that most people will choose seven. If you take a look at &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_the_most_common_passwords&quot;&gt;Wikipedia&#39;s compilation of most commonly used passwords&lt;/a&gt;, the top contenders are pitifully predictable. Passwords like &amp;quot;123456&amp;quot;, &amp;quot;iloveyou&amp;quot;, &amp;quot;qwerty&amp;quot;, and yes, even &amp;quot;password&amp;quot; are still common in the year 2025. We are understandably tired, and no one wants to remember a million passwords for a million applications.&lt;/p&gt;
&lt;p&gt;More and more sites and applications are aware of this issue. We&#39;ve seen a huge rise in sites using &lt;a href=&quot;https://oauth.net/2/&quot;&gt;OAuth&lt;/a&gt;, 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&#39;s own domain with &lt;a href=&quot;https://indieweb.org/IndieAuth&quot;&gt;IndieAuth&lt;/a&gt;, this practice is not yet widespread, though I am interested in looking more into it.&lt;/p&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;Web-based password managers like NordPass and LastPass offer a temptingly convenient solution, but these password managers also place trust in a corporate entity&#39;s security practices, potentially for a fee. While handy, &lt;a href=&quot;https://www.forbes.com/sites/daveywinder/2023/03/03/why-you-should-stop-using-lastpass-after-new-hack-method-update/?sh=79b0f4bd28fc&quot;&gt;multiple security incidents at LastPass&lt;/a&gt; encouraged me to find a better solution.&lt;/p&gt;
&lt;h2 id=&quot;my-solution-with-keepassxc&quot; tabindex=&quot;-1&quot;&gt;My solution with KeePassXC &lt;a class=&quot;heading-anchor&quot; href=&quot;https://tilde.club/~twinbfield/posts/password-manager/#my-solution-with-keepassxc&quot; aria-hidden=&quot;true&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I use &lt;a href=&quot;https://keepassxc.org/&quot;&gt;KeePassXC&lt;/a&gt; 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&#39;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&#39;t cover details here, but I will provide an overview of what I&#39;ve found works for me.&lt;/p&gt;
&lt;p&gt;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&#39;t need to remember the password, just the master password for the database!&lt;/p&gt;
&lt;p&gt;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&#39;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.&lt;/p&gt;
&lt;p&gt;In order to have my database available across multiple devices, I store the encrypted database on Google Drive, though I&#39;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 &amp;quot;Use alternative saving method&amp;quot; and &amp;quot;Directly write to database file&amp;quot; on your KeePassXC settings if you are syncing through Google Drive. Otherwise, I found Keepassium doesn&#39;t update to the newest version of the database and points to the recently deleted version.&lt;/p&gt;
&lt;p&gt;One warning is that you &lt;strong&gt;must&lt;/strong&gt; 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&#39;t be very secure!&lt;/p&gt;
&lt;p&gt;I hope you consider using a password manager!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Introduction</title>
    <link href="https://tilde.club/~twinbfield/posts/intro/" />
    <updated>2025-09-10T00:00:00Z</updated>
    <id>https://tilde.club/~twinbfield/posts/intro/</id>
    <content type="html">&lt;p&gt;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 &lt;a href=&quot;https://aboutfeeds.com/&quot;&gt;feed aggregator&lt;/a&gt; to get updates.&lt;/p&gt;
&lt;p&gt;I plan to use this site to experiment as well. As of writing, I&#39;m currently hosted on &lt;a href=&quot;https://tilde.club/&quot;&gt;tilde.club&lt;/a&gt;. I also want to try providing content over other protocols like &lt;a href=&quot;https://en.wikipedia.org/wiki/Gopher_(protocol)&quot;&gt;Gopher&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Gemini_(protocol)&quot;&gt;Gemini&lt;/a&gt;. You can check out some of my previous tinkering outcomes - there&#39;s mini games I&#39;ve made posted under &lt;a href=&quot;https://tilde.club/~twinbfield/demos&quot;&gt;Demos and Games&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For the technically interested, this site uses the &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;11ty&lt;/a&gt; site generator with a fairly barebones template I have been putting together. I&#39;ve chosen to release content that I have generated on this website under the &lt;a href=&quot;https://creativecommons.org/licenses/by/4.0/&quot;&gt;CC BY 4.0&lt;/a&gt; license.&lt;/p&gt;
&lt;p&gt;I&#39;m working on a solution for comments. Stay tuned!&lt;/p&gt;
</content>
  </entry>
</feed>