
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>muffinlabs.com</title>
  <subtitle>the website of cass mitchell</subtitle>
  <link href="https://muffinlabs.com/atom.xml" rel="self" />
  <link href="https://muffinlabs.com/" />
  <id>https://muffinlabs.com/</id>
  <updated>2025-11-24T00:00:00Z</updated>
  <author>
    <name>Cass Mitchell</name>
  </author>
  <entry>
    <title>some recent livecoding</title>
    <link href="https://muffinlabs.com/posts/2025/11/24/11-24-some-recent-livecoding/" />
    <updated>Z</updated>
    <id>https://muffinlabs.com/posts/2025/11/24/11-24-some-recent-livecoding/</id>
    <content type="html">&lt;p&gt;There was a 24-hour &lt;a href=&quot;https://eulerroom.com/&quot;&gt;live code stream for Palestine&lt;/a&gt; starting this past Friday. I ended up performing in two 15-minute slots, one &lt;a href=&quot;https://www.youtube.com/watch?v=ol2Dq4Q2Q8c&quot;&gt;Friday night&lt;/a&gt; and one randomly on &lt;a href=&quot;https://www.youtube.com/watch?v=EBb5wWGtPPg&quot;&gt;Saturday morning&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Friday one was my first real-ish live coding session in front of more than a handful of people, so I was pretty nervous. I had a lot of adrenaline and made some big mistakes (probably no one will care except me) but it felt really great. It was my first time performing music in front of other people at all since I was playing the saxophone in 8th grade:&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/ol2Dq4Q2Q8c?si=RQXhY_ga3YVxa_Y9&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;I thought that would be it, but I happened to notice that there was an open slot on Saturday morning, so I jumped on that
and performed again. I felt a lot more relaxed for this one:&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/EBb5wWGtPPg?si=l3h3YX2Nn1j-D9cr&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;I hope to do more of this! There&#39;s not much of a scene I know of in Western MA but I guess we&#39;ll see.&lt;/p&gt;
&lt;p&gt;If you&#39;re reading this and are up for it, please consider doing something to support the Palestinian people, whether that&#39;s donating money, engaging with the BDS movement, or even just raising awareness. The violence still hasn&#39;t stopped in Gaza, and things weren&#39;t great before October 7th anyway.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>feedsin.space updates</title>
    <link href="https://muffinlabs.com/posts/2025/11/14/11-14-feedsin-space-updates/" />
    <updated>Z</updated>
    <id>https://muffinlabs.com/posts/2025/11/14/11-14-feedsin-space-updates/</id>
    <content type="html">&lt;p&gt;A spent awhile porting &lt;a href=&quot;https://feedsin.space/&quot;&gt;feedsin.space&lt;/a&gt; from
rust to node and deployed it about a week ago. I did it for a couple of reasons.
First, as much as I like rust, it&#39;s a lot easier to iterate on things in node.
Second, I wanted to play around with &lt;a href=&quot;https://fedify.dev/&quot;&gt;Fedify&lt;/a&gt;.
It&#39;s in active development and it&#39;s going to make it a lot easier to do things
like implement quote boosts. It&#39;s also got a bunch of logic for smartly
delivering to inboxes, handle message queuring, things like that. I&#39;ve been
experiencing a lot of pain around stuff like that with the old rust code, and
implementing the logic from scratch is a super drag.&lt;/p&gt;
&lt;p&gt;Anyway, the code is &lt;a href=&quot;https://codeberg.org/muffinista/feedsin-space&quot;&gt;over
on codeberg&lt;/a&gt;, and the old code is still on &lt;a href=&quot;https://github.com/muffinista/rust-rss-to-fedi/&quot;&gt;github&lt;/a&gt; if anyone
wants that.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>looptober</title>
    <link href="https://muffinlabs.com/posts/2025/11/09/11-09-looptober/" />
    <updated>2025-11-09T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2025/11/09/11-09-looptober/</id>
    <content type="html">
&lt;p class=&quot;wrapped&quot;&gt;
I spent some time last month participating in &lt;a href=&quot;https://mastodon.social/tags/looptober&quot;&gt;looptober&lt;/a&gt;, a project
where you generate a short bit of looped music every month. I used &lt;a href=&quot;https://strudel.cc/workshop/getting-started/&quot;&gt;Strudel&lt;/a&gt; to write my pieces. Strudel is a JavaScript/Web-based tool for live coding music.
&lt;/p&gt;
&lt;p class=&quot;wrapped&quot;&gt;
I took a class on &lt;a href=&quot;https://sfpc.study/sessions/summer-25/decoding-live-coding&quot;&gt;live coding&lt;/a&gt; at SFPC this 
past summer and &lt;b&gt;really&lt;/b&gt; enjoyed it. I&#39;ve been playing with Strudel ever since, and so looptober was a good 
opportunity to focus on using it with a specific goal in mind.
&lt;/p&gt;
&lt;p class=&quot;wrapped&quot;&gt;
  There&#39;s definitely a range of quality here, there&#39;s some pieces I like a lot, some that are ok, and some that are pretty blah. I also really like the evolution of a piece of live-coded music, which is lacking here. But there&#39;s some good snippets in here for sure. I&#39;ve included a video of each song playing and a link to the Strudel script as well.
&lt;/p&gt;
&lt;ul class=&quot;looptober&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#1st&quot;&gt;1st&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#2nd&quot;&gt;2nd&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#5th&quot;&gt;5th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#6th&quot;&gt;6th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#7th&quot;&gt;7th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#8th&quot;&gt;8th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#10th&quot;&gt;10th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#12th&quot;&gt;12th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#13th&quot;&gt;13th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#14th&quot;&gt;14th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#15th&quot;&gt;15th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#16th&quot;&gt;16th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#20th&quot;&gt;20th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#22th&quot;&gt;22th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#24th&quot;&gt;24th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#26th&quot;&gt;26th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#27th&quot;&gt;27th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#29th&quot;&gt;29th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://muffinlabs.com/posts/2025/11/09/11-09-looptober/#31st&quot;&gt;31st&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;section class=&quot;looptober&quot;&gt;&lt;article id=&quot;1st&quot;&gt;
    &lt;h1&gt;1st&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-01.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAxMCAxIDIwMjUKLy8gQGJ5IG11ZmZpbmlzdGEKCnNldGNwbSgxMjAvNCkKCiQ6IHMoIjxbMjIwIFsyMjAgMjAwXV0gWzIwMCAyMjAgMjAwIDIwMF0%2BIikuc291bmQoInN1cGVyc2F3IikuZmFzdCg0KS5yb29tKCIuMiIpCiQ6IHMoImJkIikuZmFzdCg0KS5tYXNrKCI8IC0geCB4IHggeCB4IHg%2BIikKJDogcygiY3AgfiIpLmxhdGUoIjAuNXwxIikuZmFzdCg0KS5tYXNrKCI8IC0gLSB4IHggeCB4IHggeD4iKS5nYWluKDAuNCkKJDogcygiaGgiKS5ldWNsaWQoIjw1IDUgNSA1IDc%2BIiwgOCkKCiQ6IG5vdGUoIjwwIDEgMiEyIDM%2BIi5waWNrKFsiZyBhIiwgImUgZiBkIGQiLCAiZiBnIGYgZyIgLCAiZyBjIl0pKQogIC5mYXN0KDIpCiAgLm1hc2soIjwgLSAtIC0geCB4IHggeCB4IHggeCB4IC0%2BIikKICAuZ2FpbigyLjQpCg%3D%3D&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;First day, first loop. This one is pretty simple.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAxMCAxIDIwMjUKLy8gQGJ5IG11ZmZpbmlzdGEKCnNldGNwbSgxMjAvNCkKCiQ6IHMoIjxbMjIwIFsyMjAgMjAwXV0gWzIwMCAyMjAgMjAwIDIwMF0%2BIikuc291bmQoInN1cGVyc2F3IikuZmFzdCg0KS5yb29tKCIuMiIpCiQ6IHMoImJkIikuZmFzdCg0KS5tYXNrKCI8IC0geCB4IHggeCB4IHg%2BIikKJDogcygiY3AgfiIpLmxhdGUoIjAuNXwxIikuZmFzdCg0KS5tYXNrKCI8IC0gLSB4IHggeCB4IHggeD4iKS5nYWluKDAuNCkKJDogcygiaGgiKS5ldWNsaWQoIjw1IDUgNSA1IDc%2BIiwgOCkKCiQ6IG5vdGUoIjwwIDEgMiEyIDM%2BIi5waWNrKFsiZyBhIiwgImUgZiBkIGQiLCAiZiBnIGYgZyIgLCAiZyBjIl0pKQogIC5mYXN0KDIpCiAgLm1hc2soIjwgLSAtIC0geCB4IHggeCB4IHggeCB4IC0%2BIikKICAuZ2FpbigyLjQpCg%3D%3D&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;2nd&quot;&gt;
    &lt;h1&gt;2nd&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-02.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#c2FtcGxlcygnZ2l0aHViOm11ZmZpbmlzdGEvc2FtcGxlcycpCgpjb25zdCBjaGFuY2UgPSAwLjEKCmNvbnN0IGcxID0gc2xpZGVyKDEyMDAsIDAsIDEyMDApCmNvbnN0IGcyID0gc2xpZGVyKDIwMDAsIDAsIDIwMDApCmNvbnN0IGczID0gc2xpZGVyKDEsIDAsIDEuMCkKCiQ6IHMoImx0KjgiKS5iYW5rKCJyb2xhbmR0cjgwOCIpLmdhaW4oIjEuNCIpLmR1Y2soMikKCiQ6IHMoImJsb29wLzQiKQogIC5zbG93KDIpCiAgLnNjcnViKGlyYW5kKDE2KS5kaXYoMTYpLnNlZyg4KS5yaWIoMTUsIDIpKQogIC5yb29tKCIzIikKICAucm9vbXNpemUoIjIiKQogIC5jb21wcmVzc29yKCItMjA6MjA6MTA6LjAwMjouMDIiKQogIC5nYWluKDAuOCkKICAubHBmKGcxKQoKJDogcygiY3B8aGgiKS5ldWNsaWQoMywgOCkuZ2FpbigiMC44IikubHBmKGcyKQokOiBzKCJjcCoxNj8iKS5nYWluKCIwLjIiKS5scGYoZzIpCiQ6IHMoImdtX2Nob2lyX2FhaHMiKS5ub3RlKCI8YSBlIGY%2BIikuZ2FpbigiMC44Iikub3JiaXQoMikubHBmKGcyKQoKIAokOiBzKCJ1bmxlc3MiKQogIC5ub3RlKCIzNCIpCiAgLmdhaW4oMC4xKQogIC5zb21ldGltZXNCeSgwLjA1LCB4PT54LmdhaW4oZzMpKQogIC5zbG93KDEuMCkKICAuY3J1c2goIjw1IDQgNSAzPiIpCiAgLmZpdCgpCgo%3D&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;I started messing around with using OBS to record these, and originally just recorded my whole screen, video feedback and all, which I actually enjoyed a lot. This piece is pretty messy, I sampled Seal&#39;s &amp;quot;Crazy&amp;quot; and sort of just messed around with it. For a lot of these loops I tried to get pretty close to something that was good without spending hours and hours refining.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#c2FtcGxlcygnZ2l0aHViOm11ZmZpbmlzdGEvc2FtcGxlcycpCgpjb25zdCBjaGFuY2UgPSAwLjEKCmNvbnN0IGcxID0gc2xpZGVyKDEyMDAsIDAsIDEyMDApCmNvbnN0IGcyID0gc2xpZGVyKDIwMDAsIDAsIDIwMDApCmNvbnN0IGczID0gc2xpZGVyKDEsIDAsIDEuMCkKCiQ6IHMoImx0KjgiKS5iYW5rKCJyb2xhbmR0cjgwOCIpLmdhaW4oIjEuNCIpLmR1Y2soMikKCiQ6IHMoImJsb29wLzQiKQogIC5zbG93KDIpCiAgLnNjcnViKGlyYW5kKDE2KS5kaXYoMTYpLnNlZyg4KS5yaWIoMTUsIDIpKQogIC5yb29tKCIzIikKICAucm9vbXNpemUoIjIiKQogIC5jb21wcmVzc29yKCItMjA6MjA6MTA6LjAwMjouMDIiKQogIC5nYWluKDAuOCkKICAubHBmKGcxKQoKJDogcygiY3B8aGgiKS5ldWNsaWQoMywgOCkuZ2FpbigiMC44IikubHBmKGcyKQokOiBzKCJjcCoxNj8iKS5nYWluKCIwLjIiKS5scGYoZzIpCiQ6IHMoImdtX2Nob2lyX2FhaHMiKS5ub3RlKCI8YSBlIGY%2BIikuZ2FpbigiMC44Iikub3JiaXQoMikubHBmKGcyKQoKIAokOiBzKCJ1bmxlc3MiKQogIC5ub3RlKCIzNCIpCiAgLmdhaW4oMC4xKQogIC5zb21ldGltZXNCeSgwLjA1LCB4PT54LmdhaW4oZzMpKQogIC5zbG93KDEuMCkKICAuY3J1c2goIjw1IDQgNSAzPiIpCiAgLmZpdCgpCgo%3D&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;5th&quot;&gt;
    &lt;h1&gt;5th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-05.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciA1Cgpjb25zdCBudW1zID0gIjwxIDIgMyAzIDQgNSAxIDIgMyA0IDQgNT4iIAokOiBzKCJiZCo4IikubihudW1zKS5yb29tKCI8MiA0IDIgMiAyIDQgNj4iKS5yc2l6ZSgxKS5jb2xvcigncmVkJykuc2NvcGUoKQokOiBzKCJiZCoxNj8iKS5uKG51bXMpLnNjb3BlKCkKJDogcygiYmQqMzI%2FIikubihudW1zKS5waGFzZXIoMSkuc2NvcGUoKQoKCiQ6IGFycmFuZ2UoCiAgIFs0LCAiYTMgYTMgYTMgYTIgYTIgYTMgYTQgYTMgYTQgYTMiXSwKICAgWzIsICJhMiBhMiBhMyBhMiBiMiBjMyBjMyBhMyBhNCBhMyBhMiBhMiBhMyBhMiBhMiBhMyBhNCBhMyBhNCBhMyJdCikubm90ZSgpCiAgLnMoIjx6X25vaXNlKjQgel9ub2lzZSo0IHpfbm9pc2UqNCB6X25vaXNlKjg%2BIikKICAucm9vbSgiMiIpCiAgLmxwZigiPDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMjAwIDIwMCAyMDA%2BIikKICAubHBkKCI8LjUgLjI1PiIpCiAgLnBoYXNlcigiPDEgMiAyIDY%2BIikKICAuc2NvcGUoKQoK&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;I&#39;d been listening to a huge excavator with attached jackhammer hack away at slate for a day or two when I made this.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciA1Cgpjb25zdCBudW1zID0gIjwxIDIgMyAzIDQgNSAxIDIgMyA0IDQgNT4iIAokOiBzKCJiZCo4IikubihudW1zKS5yb29tKCI8MiA0IDIgMiAyIDQgNj4iKS5yc2l6ZSgxKS5jb2xvcigncmVkJykuc2NvcGUoKQokOiBzKCJiZCoxNj8iKS5uKG51bXMpLnNjb3BlKCkKJDogcygiYmQqMzI%2FIikubihudW1zKS5waGFzZXIoMSkuc2NvcGUoKQoKCiQ6IGFycmFuZ2UoCiAgIFs0LCAiYTMgYTMgYTMgYTIgYTIgYTMgYTQgYTMgYTQgYTMiXSwKICAgWzIsICJhMiBhMiBhMyBhMiBiMiBjMyBjMyBhMyBhNCBhMyBhMiBhMiBhMyBhMiBhMiBhMyBhNCBhMyBhNCBhMyJdCikubm90ZSgpCiAgLnMoIjx6X25vaXNlKjQgel9ub2lzZSo0IHpfbm9pc2UqNCB6X25vaXNlKjg%2BIikKICAucm9vbSgiMiIpCiAgLmxwZigiPDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMjAwIDIwMCAyMDA%2BIikKICAubHBkKCI8LjUgLjI1PiIpCiAgLnBoYXNlcigiPDEgMiAyIDY%2BIikKICAuc2NvcGUoKQoK&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;6th&quot;&gt;
    &lt;h1&gt;6th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-06.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDA2CgokOiBzKCI8YmQ6MTU%2BIikuYmFuaygicm9sYW5kdHI4MDgiKS5nYWluKCIyLjAiKQokOiBzKCJ%2BIH4gfiBiZCIpLmJhbmsoInJvbGFuZHRyODA4IikuZ2FpbigiMi4wIikKJDogcygiPHNoIFtzaCBzaCBzaCBzaF0%2BIH4gfiBbc2ggc2hdIikubigiMSIpLmJhbmsoInJvbGFuZHRyODA4IikKJDogcygiPHNkOjMgc2Q6MyB%2BPiIpLmJhbmsoInJvbGFuZHRyODA4IikKCiQ6IHMoIm9oIikuZXVjbGlkUm90KDMsIDgsICI8MSAyIDMgNCA4IDEyPiIpLmJhbmsoInJvbGFuZHRyODA4IikKCiQ6IG5vdGUoIjxjMio4IGMyKjggYzIqOCBhMSBjMSBkMT4iKS5zKCJ0cmksc2F3IikucGhhc2VyKDIpLnBoZCgiMC41IikucGhhc2Vyc3dlZXAoIjE1MDAiKS5jb2xvcigiZ3JlZW4iKQoKJDogbm90ZSgiPGMgZCBlIDxbYyBkIGUgYyBkXSBbYyBhIGQgZSBkXSBbYiBmIGcgZSBkXSBbYyBkIGUgZCBjXT4%2BIikKICAucygiZ21fYmlyZF90d2VldCIpCiAgLmxwZigxMTAwKQogIC5yb29tKCIuNCIpCiAgLnJvb21zaXplKCI0IikuY29sb3IoInJlZCIpCgoKYWxsKHggPT4geC5fc2NvcGUoKSk%3D&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;For this piece I sort of went in the opposite direction of the last one, and used a cute bird tweet sample to make a simple melody.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDA2CgokOiBzKCI8YmQ6MTU%2BIikuYmFuaygicm9sYW5kdHI4MDgiKS5nYWluKCIyLjAiKQokOiBzKCJ%2BIH4gfiBiZCIpLmJhbmsoInJvbGFuZHRyODA4IikuZ2FpbigiMi4wIikKJDogcygiPHNoIFtzaCBzaCBzaCBzaF0%2BIH4gfiBbc2ggc2hdIikubigiMSIpLmJhbmsoInJvbGFuZHRyODA4IikKJDogcygiPHNkOjMgc2Q6MyB%2BPiIpLmJhbmsoInJvbGFuZHRyODA4IikKCiQ6IHMoIm9oIikuZXVjbGlkUm90KDMsIDgsICI8MSAyIDMgNCA4IDEyPiIpLmJhbmsoInJvbGFuZHRyODA4IikKCiQ6IG5vdGUoIjxjMio4IGMyKjggYzIqOCBhMSBjMSBkMT4iKS5zKCJ0cmksc2F3IikucGhhc2VyKDIpLnBoZCgiMC41IikucGhhc2Vyc3dlZXAoIjE1MDAiKS5jb2xvcigiZ3JlZW4iKQoKJDogbm90ZSgiPGMgZCBlIDxbYyBkIGUgYyBkXSBbYyBhIGQgZSBkXSBbYiBmIGcgZSBkXSBbYyBkIGUgZCBjXT4%2BIikKICAucygiZ21fYmlyZF90d2VldCIpCiAgLmxwZigxMTAwKQogIC5yb29tKCIuNCIpCiAgLnJvb21zaXplKCI0IikuY29sb3IoInJlZCIpCgoKYWxsKHggPT4geC5fc2NvcGUoKSk%3D&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;7th&quot;&gt;
    &lt;h1&gt;7th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-07.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDA3CgokOiBzKCJiZCA8YmQgfj4gfiB%2BIH4gfiIpCiQ6IHMoIn4gfiA8aGggW2hoIFt%2BIGhoIGhoXV0%2BIH4iKQoKJDogIjwwIDEgMyA0IDU%2BIgoub2ZmKDEvMywgYWRkKDIpKQoub2ZmKDEvMiwgYWRkKDQpKQoubigpCi5zY2FsZSgiQzptaW5vciIpCi5zKCJnbV9lbGVjdHJpY19ndWl0YXJfY2xlYW4iKQouY3J1c2goIjw4PiIpCgokOiBuKGlyYW5kKDEyKSkKICAuc3RydWN0KCI8W3ggeCoyIHggeCozXSBbeCoyIHggeCoyIHgqM10%2BIikKICAuc2NhbGUoIkM6bWlub3IiKQogIC5zKCJnbV9lbGVjdHJpY19ndWl0YXJfY2xlYW4iKQogIC5zbG93KDIpCiAgLmNydXNoKCI8NiA0IDUgNCAxNiA0PiIpCgokOiBuKGlyYW5kKDMpLmFkZCgyKSkuc3RydWN0KCJ4IHggeCoyIHgiKS5zbG93KDQpLnNjYWxlKCJBMTptaW5vciIpLnMoInN1cGVyc2F3IikK&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;Guitar-ish noodling in Studel (stroodeling?)&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDA3CgokOiBzKCJiZCA8YmQgfj4gfiB%2BIH4gfiIpCiQ6IHMoIn4gfiA8aGggW2hoIFt%2BIGhoIGhoXV0%2BIH4iKQoKJDogIjwwIDEgMyA0IDU%2BIgoub2ZmKDEvMywgYWRkKDIpKQoub2ZmKDEvMiwgYWRkKDQpKQoubigpCi5zY2FsZSgiQzptaW5vciIpCi5zKCJnbV9lbGVjdHJpY19ndWl0YXJfY2xlYW4iKQouY3J1c2goIjw4PiIpCgokOiBuKGlyYW5kKDEyKSkKICAuc3RydWN0KCI8W3ggeCoyIHggeCozXSBbeCoyIHggeCoyIHgqM10%2BIikKICAuc2NhbGUoIkM6bWlub3IiKQogIC5zKCJnbV9lbGVjdHJpY19ndWl0YXJfY2xlYW4iKQogIC5zbG93KDIpCiAgLmNydXNoKCI8NiA0IDUgNCAxNiA0PiIpCgokOiBuKGlyYW5kKDMpLmFkZCgyKSkuc3RydWN0KCJ4IHggeCoyIHgiKS5zbG93KDQpLnNjYWxlKCJBMTptaW5vciIpLnMoInN1cGVyc2F3IikK&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;8th&quot;&gt;
    &lt;h1&gt;8th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-08.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/?S6mM-_rlc1aG#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDA4CgpzYW1wbGVzKCdnaXRodWI6bG9vcGZhbGwvcGFkcycpCnNhbXBsZXMoJ2dpdGh1YjptdWZmaW5pc3RhL3NhbXBsZXMnKQoKJDogcygicGFkcy8yIikubigiMiIpLm5vdGUoIjxjMkAyIGMzPiIpLmdhaW4oIjAuOCIpCgpjb25zdCBwYXRzID0gWwogIGlyYW5kKDMyKS5kaXYoMzIpLnNlZygxNikucmliKDEyMCwgMSksCiAgIjAuMTIgLjMgLjQ1IgpdCgokOiBzKCJ0cm9sbGV5IikKICAuc2xvdygyKQogIC5zY3J1YihwaWNrKHBhdHMsICI8MCAwIDAgMT4iKSkKICAucGhhc2VyKCI8MSAyIDMgMj4iKQoKJDogcygiPH4gfiB%2BIHlvdW9rPiIpLnNsb3coIjEuMiIpLmNydXNoKCIzIikKCmFsbCh4ID0%2BIHguX3Njb3BlKCkp&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;I sampled some trolley sounds from Mr Rogers, and also Mr Rogers himself saying &amp;quot;You ok?&amp;quot; and turned it into this. I actually like this one a lot, very basic but I feel like there could be something here.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/?S6mM-_rlc1aG#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDA4CgpzYW1wbGVzKCdnaXRodWI6bG9vcGZhbGwvcGFkcycpCnNhbXBsZXMoJ2dpdGh1YjptdWZmaW5pc3RhL3NhbXBsZXMnKQoKJDogcygicGFkcy8yIikubigiMiIpLm5vdGUoIjxjMkAyIGMzPiIpLmdhaW4oIjAuOCIpCgpjb25zdCBwYXRzID0gWwogIGlyYW5kKDMyKS5kaXYoMzIpLnNlZygxNikucmliKDEyMCwgMSksCiAgIjAuMTIgLjMgLjQ1IgpdCgokOiBzKCJ0cm9sbGV5IikKICAuc2xvdygyKQogIC5zY3J1YihwaWNrKHBhdHMsICI8MCAwIDAgMT4iKSkKICAucGhhc2VyKCI8MSAyIDMgMj4iKQoKJDogcygiPH4gfiB%2BIHlvdW9rPiIpLnNsb3coIjEuMiIpLmNydXNoKCIzIikKCmFsbCh4ID0%2BIHguX3Njb3BlKCkp&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;10th&quot;&gt;
    &lt;h1&gt;10th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-10.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDEwCgpzYW1wbGVzKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbXVmZmluaXN0YS9zYW1wbGVzL3JlZnMvaGVhZHMvbWFpbi9zdHJ1ZGVsLmpzb24%2FeD0yMicpOwoKCiQ6IG4oIjwzQDMgNCA2IDQgMj4qMiIuYWRkKCItMTgiKSkuc2NhbGUoIkE6bWlub3IiKS5zKCJzYXd0b290aCIpLmZhc3QoNCkucm9vbSgwLjgpLnJscCgxMDAwKQoKJDogcygicHJpbnRlcjo0IikuZmFzdCg0KQogIC5zbGljZSg4LCAiPDUgNCAyIDIgMCAxIDIgMj4iKQogIC5jbGlwKDEuMSkKICAuZGVsYXkoLjUpCiAgLmRlbGF5ZmVlZGJhY2soIjwuMjUgLjUgLjc1IDE%2BIikKICAuX3Njb3BlKCkKCiQ6IHMoImJkIGJkIGJkIGJkIikuZmFzdCg0KS5uKGlyYW5kKDgpKS5scGYoNjAwKQokOiBzKCJoaCBoaCBoaCBoaCIpLmZhc3QoMikubihpcmFuZCg0KSkubHBmKDE4MDApCgokOiBzKCJiZCIpLmV1Y2xpZCgiPDUgMyA0IDIgNyA4PiIsIDgpLmZhc3QoNCkubihpcmFuZCg4KSkubHBmKDYwMCkuX3Njb3BlKCkKCiQ6IHMoImNwISIpLmZhc3QoNCkuc29tZXRpbWVzKHBseSgyKSkubihpcmFuZCg4KSkubHBmKDYwMCkuX3Njb3BlKCk%3D&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;Another loud one. This uses the sample of a &lt;a href=&quot;https://github.com/sonic-pi-net/sonic-pi/blob/c14f85823db44040b78456ab5f8f5084953ef9e1/etc/samples/loop_3d_printer.flac&quot;&gt;3d printer from Sonic PI&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDEwCgpzYW1wbGVzKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbXVmZmluaXN0YS9zYW1wbGVzL3JlZnMvaGVhZHMvbWFpbi9zdHJ1ZGVsLmpzb24%2FeD0yMicpOwoKCiQ6IG4oIjwzQDMgNCA2IDQgMj4qMiIuYWRkKCItMTgiKSkuc2NhbGUoIkE6bWlub3IiKS5zKCJzYXd0b290aCIpLmZhc3QoNCkucm9vbSgwLjgpLnJscCgxMDAwKQoKJDogcygicHJpbnRlcjo0IikuZmFzdCg0KQogIC5zbGljZSg4LCAiPDUgNCAyIDIgMCAxIDIgMj4iKQogIC5jbGlwKDEuMSkKICAuZGVsYXkoLjUpCiAgLmRlbGF5ZmVlZGJhY2soIjwuMjUgLjUgLjc1IDE%2BIikKICAuX3Njb3BlKCkKCiQ6IHMoImJkIGJkIGJkIGJkIikuZmFzdCg0KS5uKGlyYW5kKDgpKS5scGYoNjAwKQokOiBzKCJoaCBoaCBoaCBoaCIpLmZhc3QoMikubihpcmFuZCg0KSkubHBmKDE4MDApCgokOiBzKCJiZCIpLmV1Y2xpZCgiPDUgMyA0IDIgNyA4PiIsIDgpLmZhc3QoNCkubihpcmFuZCg4KSkubHBmKDYwMCkuX3Njb3BlKCkKCiQ6IHMoImNwISIpLmZhc3QoNCkuc29tZXRpbWVzKHBseSgyKSkubihpcmFuZCg4KSkubHBmKDYwMCkuX3Njb3BlKCk%3D&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;12th&quot;&gt;
    &lt;h1&gt;12th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-12.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAxMgoKc2V0Y3BtKDMwKQpzYW1wbGVzKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbXVmZmluaXN0YS9zYW1wbGVzL3JlZnMvaGVhZHMvbWFpbi9zdHJ1ZGVsLmpzb24%2FeD0yMicpOwoKY29uc3QgcGF0dHkgPSBgYmQgYmQgYmQ%2FIH4gfiBiZCBiZCB%2BYApjb25zdCBwYXR0eTIgPSBgYmQgYmQgfiB%2BIGJkPyB%2BIH5gCmNvbnN0IHBhdHR5MyA9IGBiZCBoaCBoaD8gaGggfiB%2BIH5gCgokOiBwbSgKICBwYXR0eSwgCiAgcGF0dHkyLAogIHBhdHR5MwopLnMoKS5zbG93KDMpCi5yb29tKDAuMykucGhhc2VyKDEpLl9waWFub3JvbGwoKQokOiBhcnJhbmdlKAogIFs0LCAiW2ExIGExXSB%2BIH4gfiB%2BIH4gW2IxIGIxXSB%2BIH4iXSAsCiAgWzIsICJbYTMgYTNdIH4gfiB%2BIH4gfiBbYjEgYjFdIH4gfiJdICwKICBbMSwgIlthMyBhM10gW2EzIGEzXSBhMyBhMyBhMyB%2BIH4gW2IxIGIxXSB%2BIl0gCikucygic3VwZXJzYXciKS5mYXN0KDEuMSkKCiQ6IHMoInByaW50ZXI6NCIpLmZhc3QoNCkKICAuc2xpY2UoOCwgIjw1IDQgMiAyIDAgMSAyIDI%2BIikKICAuY2xpcCgwLjYpCiAgLmRlbGF5KC41KQogIC5kZWxheWZlZWRiYWNrKCI8LjI1IC41IC43NSAxPiIpCiAgLl9zY29wZSgpCg%3D%3D&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;I spent a week travelling without my laptop so made this on a Chromebook.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAxMgoKc2V0Y3BtKDMwKQpzYW1wbGVzKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbXVmZmluaXN0YS9zYW1wbGVzL3JlZnMvaGVhZHMvbWFpbi9zdHJ1ZGVsLmpzb24%2FeD0yMicpOwoKY29uc3QgcGF0dHkgPSBgYmQgYmQgYmQ%2FIH4gfiBiZCBiZCB%2BYApjb25zdCBwYXR0eTIgPSBgYmQgYmQgfiB%2BIGJkPyB%2BIH5gCmNvbnN0IHBhdHR5MyA9IGBiZCBoaCBoaD8gaGggfiB%2BIH5gCgokOiBwbSgKICBwYXR0eSwgCiAgcGF0dHkyLAogIHBhdHR5MwopLnMoKS5zbG93KDMpCi5yb29tKDAuMykucGhhc2VyKDEpLl9waWFub3JvbGwoKQokOiBhcnJhbmdlKAogIFs0LCAiW2ExIGExXSB%2BIH4gfiB%2BIH4gW2IxIGIxXSB%2BIH4iXSAsCiAgWzIsICJbYTMgYTNdIH4gfiB%2BIH4gfiBbYjEgYjFdIH4gfiJdICwKICBbMSwgIlthMyBhM10gW2EzIGEzXSBhMyBhMyBhMyB%2BIH4gW2IxIGIxXSB%2BIl0gCikucygic3VwZXJzYXciKS5mYXN0KDEuMSkKCiQ6IHMoInByaW50ZXI6NCIpLmZhc3QoNCkKICAuc2xpY2UoOCwgIjw1IDQgMiAyIDAgMSAyIDI%2BIikKICAuY2xpcCgwLjYpCiAgLmRlbGF5KC41KQogIC5kZWxheWZlZWRiYWNrKCI8LjI1IC41IC43NSAxPiIpCiAgLl9zY29wZSgpCg%3D%3D&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;13th&quot;&gt;
    &lt;h1&gt;13th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-13.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAxMCAxMyAyMDI1CgokOiBzKCJiZCo4PyIpLm4oIjEgMiAzIDQgNSIpCgokOiBub3RlKCI8YTIgYTIgYTIgYTIgYTIgZTIgZDIgYTI%2BIikKICAuc3RydWN0KCJ4IH4gW3ggeF0gfiB4IFt4IHhdIikKICAuc291bmQoImdtX2Fjb3VzdGljX2Jhc3MiKQogIC5yZWxlYXNlKDAuOCkKICAucm9vbSgwLjUpCgokOiBub3RlKCI8YTEgYjE%2BIikKICAuc291bmQoIjxudW1iZXJzOjcgbnVtYmVyczoxIG51bWJlcnM6NyBudW1iZXJzOjEgbnVtYmVyczoyPiIpCiAgLnNsaWNlKDgsICIwIDEgPDIgMj4gMyAyIDIgMSA0IDYgNyIpCiAgLmNydXNoKCI8OD4iKQogIC5yb29tKDAuMykKCiQ6IG5vdGUoIjxhNCBhNCBhNCBiNCBkNCBhND4iKQogIC5zdHJ1Y3QoInggfiB4IH4geCB%2BIFt4IHhdIikKICAuc291bmQoInN1cGVyc2F3IikKICAucmVsZWFzZSgwLjMpCiAgLnJvb20oMC41KQogIC5zbG93KDEuMikKICAuZ2FpbigwLjIpCg%3D%3D&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;I also made this on a Chromebook. I like the built in number samples in Strudel and they are fun to play around with but this is not much of a song.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAxMCAxMyAyMDI1CgokOiBzKCJiZCo4PyIpLm4oIjEgMiAzIDQgNSIpCgokOiBub3RlKCI8YTIgYTIgYTIgYTIgYTIgZTIgZDIgYTI%2BIikKICAuc3RydWN0KCJ4IH4gW3ggeF0gfiB4IFt4IHhdIikKICAuc291bmQoImdtX2Fjb3VzdGljX2Jhc3MiKQogIC5yZWxlYXNlKDAuOCkKICAucm9vbSgwLjUpCgokOiBub3RlKCI8YTEgYjE%2BIikKICAuc291bmQoIjxudW1iZXJzOjcgbnVtYmVyczoxIG51bWJlcnM6NyBudW1iZXJzOjEgbnVtYmVyczoyPiIpCiAgLnNsaWNlKDgsICIwIDEgPDIgMj4gMyAyIDIgMSA0IDYgNyIpCiAgLmNydXNoKCI8OD4iKQogIC5yb29tKDAuMykKCiQ6IG5vdGUoIjxhNCBhNCBhNCBiNCBkNCBhND4iKQogIC5zdHJ1Y3QoInggfiB4IH4geCB%2BIFt4IHhdIikKICAuc291bmQoInN1cGVyc2F3IikKICAucmVsZWFzZSgwLjMpCiAgLnJvb20oMC41KQogIC5zbG93KDEuMikKICAuZ2FpbigwLjIpCg%3D%3D&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;14th&quot;&gt;
    &lt;h1&gt;14th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-14.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDE0CgpzZXRjcG0oMTYwLzQpCgokOiBzKCI8YmQgYmQgW2JkITJdPiA8YmQgW2JkIGJkOjNdPiIpLm4oMikKJDogcygifiA8b2ggW29oIG9oIG9oIG9oXT4iKS5uKDIpCgokOiBub3RlKCJlMiBiMiBnMyBiMiBnMyBkMyIpCiAgLmV1Y2xpZExlZ2F0bygiPDYgMyAzIDMgNSAzPiIsIDgpCiAgLnNvbWV0aW1lcyhwbHkoIjJ8NCIpKQogIC5zKCJnbV9hY291c3RpY19iYXNzIikKICAucm9vbSgxLjEpCiAgLnJvb21zaXplKDIpCgokOiBub3RlKCJlMyBiMyBnNCIpCiAgLnNvbWV0aW1lc0J5KC4yLCB4ID0%2BIHgudHJhbnNwb3NlKCI8MSAyIC0xPiIpKQogIC5ldWNsaWRMZWdhdG8oIjwzIDYgNSA3IDM%2BIiwgOCkKICAuc29tZXRpbWVzKHBseSgiMiIpKQogIC5zKCJnbV9lbGVjdHJpY19ndWl0YXJfY2xlYW4iKQogIC5jcnVzaCg2KQogIC5nYWluKDAuNCkK&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;Another Chromebook piece, I actually like this one a lot, it was fun to jam on.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDE0CgpzZXRjcG0oMTYwLzQpCgokOiBzKCI8YmQgYmQgW2JkITJdPiA8YmQgW2JkIGJkOjNdPiIpLm4oMikKJDogcygifiA8b2ggW29oIG9oIG9oIG9oXT4iKS5uKDIpCgokOiBub3RlKCJlMiBiMiBnMyBiMiBnMyBkMyIpCiAgLmV1Y2xpZExlZ2F0bygiPDYgMyAzIDMgNSAzPiIsIDgpCiAgLnNvbWV0aW1lcyhwbHkoIjJ8NCIpKQogIC5zKCJnbV9hY291c3RpY19iYXNzIikKICAucm9vbSgxLjEpCiAgLnJvb21zaXplKDIpCgokOiBub3RlKCJlMyBiMyBnNCIpCiAgLnNvbWV0aW1lc0J5KC4yLCB4ID0%2BIHgudHJhbnNwb3NlKCI8MSAyIC0xPiIpKQogIC5ldWNsaWRMZWdhdG8oIjwzIDYgNSA3IDM%2BIiwgOCkKICAuc29tZXRpbWVzKHBseSgiMiIpKQogIC5zKCJnbV9lbGVjdHJpY19ndWl0YXJfY2xlYW4iKQogIC5jcnVzaCg2KQogIC5nYWluKDAuNCkK&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;15th&quot;&gt;
    &lt;h1&gt;15th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-15.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAxMCAxNQpzZXRjcG0oMTYwLzQpCgokOiBzKCJiZCgzLCA4KSIpCiAgLm4oIjw0IDQgNCAyPiIpCiAgLmJhbmsoInRyOTA5IikKICAuanV4KHJldikKICAuaHBmKDIwMCkKICAubHBmKDIwMDApCgokOiBjaG9yZCgiPEc3IFtENyBFbV0%2BIikKICAucGx5KCI0IDYiKQogIC5zb21ldGltZXNCeSgwLjIsIHggPT4geC5wbHkoIjMiKSkKICAudm9pY2luZygpCiAgLmZtKDIpCiAgLmZtaCgyLjApCiAgLnNvdW5kKCJzaW5lLHN1cGVyc2F3IikKICAuZ2FpbigwLjQpCiAgLmxwZigxNDAwKQoKJDogcygiPH4gfiBudW1iZXJzOjcgfiBudW1iZXJzOjg%2BIikKICAuc2xpY2UoOCwgIjAgMSAxIDIgNCAzIDYgPDUgWzUgNV0%2BIDcgOCIpCiAgLmNydXNoKDgpCg%3D%3D&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;I used the number samples again for this one and it&#39;s more interesting. Another Chromebook piece!&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAxMCAxNQpzZXRjcG0oMTYwLzQpCgokOiBzKCJiZCgzLCA4KSIpCiAgLm4oIjw0IDQgNCAyPiIpCiAgLmJhbmsoInRyOTA5IikKICAuanV4KHJldikKICAuaHBmKDIwMCkKICAubHBmKDIwMDApCgokOiBjaG9yZCgiPEc3IFtENyBFbV0%2BIikKICAucGx5KCI0IDYiKQogIC5zb21ldGltZXNCeSgwLjIsIHggPT4geC5wbHkoIjMiKSkKICAudm9pY2luZygpCiAgLmZtKDIpCiAgLmZtaCgyLjApCiAgLnNvdW5kKCJzaW5lLHN1cGVyc2F3IikKICAuZ2FpbigwLjQpCiAgLmxwZigxNDAwKQoKJDogcygiPH4gfiBudW1iZXJzOjcgfiBudW1iZXJzOjg%2BIikKICAuc2xpY2UoOCwgIjAgMSAxIDIgNCAzIDYgPDUgWzUgNV0%2BIDcgOCIpCiAgLmNydXNoKDgpCg%3D%3D&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;16th&quot;&gt;
    &lt;h1&gt;16th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-16.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDE2CgpzZXRjcG0oMTYwLzQpCgokOiBzKCJiZCg8MiAzIDU%2BLCA4KSIpCiAgLm4oIjw0IDQgNCAyPiIpCiAgLmJhbmsoInRyOTA5IikKICAuanV4KHJldikKICAuaHBmKDIwMCkKICAubHBmKDIwMDApCiAgLmRlbGF5KC4yNSkKICAuZGVsYXlzeW5jKCIwLjUiKQoKJDogZnJlcSgiMTEwIi5tdWwub3V0KCIuNSAxLjUgLjUgMiIpKQogIC5zb3VuZCgic3VwZXJzYXciKQogIC5yb29tKDIpCiAgLmxwZigxNDAwKQoKJDogYXJyYW5nZSgKICBbMSwgIlsxIDIgMSA0XSJdLAogIFsxLCAiWzIgMSAyIDFdIl0sCiAgKS5uKCkuY2hvcmQoIjxDIEYgRW0%2BIikKICAudm9pY2luZygpCiAgLnNsb3coNCkKICAuc29tZXRpbWVzQnkoMC4yLCB4ID0%2BIHgucGx5KCI8MiA0IDg%2BIikpCiAgLmRldHVuZSgiLjEiKQogIC5yb29tKDAuNCkKICAucm9vbXNpemUoMikKCiQ6IGFycmFuZ2UoCiAgWzEsICJbMCAxIDIgNF0iXSwKICBbMSwgIls0IDIgMCAxXSJdLAogIFsxLCAiWzAgMiAzIDRdIl0sCiAgKS5uKCkuY2hvcmQoIjxDIEYgfiBFbT4iKQogIC52b2ljaW5nKCkKICAuc29tZXRpbWVzQnkoMC4yLCB4ID0%2BIHgucGx5KCIyIikpCiAgLmRldHVuZSgiPC4xIC4yIDEuMCAyLjA%2BIikKICAucm9vbSgwLjQpCiAgLnJvb21zaXplKDIpCgokOiBhcnJhbmdlKAogIFsxLCAiWzQgMiAwIDFdIl0sCiAgWzEsICJbMCAxIDIgNF0iXSwKICBbMSwgIls0IDIgMCAxXSJdLAopLm4oKS5jaG9yZCgiPH4gQyBFbSBGPiIpCiAgLnZvaWNpbmcoKQogIC5zb21ldGltZXNCeSgwLjIsIHggPT4geC5wbHkoIjQiKSkKICAuZGV0dW5lKCI8MS4xIDEuMiAwLjMgMC4xPiIpCiAgLnJvb20oMC40KQogIC5yb29tc2l6ZSgyKQo%3D&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;I think this was my last Chromebook jam, it&#39;s ok.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDE2CgpzZXRjcG0oMTYwLzQpCgokOiBzKCJiZCg8MiAzIDU%2BLCA4KSIpCiAgLm4oIjw0IDQgNCAyPiIpCiAgLmJhbmsoInRyOTA5IikKICAuanV4KHJldikKICAuaHBmKDIwMCkKICAubHBmKDIwMDApCiAgLmRlbGF5KC4yNSkKICAuZGVsYXlzeW5jKCIwLjUiKQoKJDogZnJlcSgiMTEwIi5tdWwub3V0KCIuNSAxLjUgLjUgMiIpKQogIC5zb3VuZCgic3VwZXJzYXciKQogIC5yb29tKDIpCiAgLmxwZigxNDAwKQoKJDogYXJyYW5nZSgKICBbMSwgIlsxIDIgMSA0XSJdLAogIFsxLCAiWzIgMSAyIDFdIl0sCiAgKS5uKCkuY2hvcmQoIjxDIEYgRW0%2BIikKICAudm9pY2luZygpCiAgLnNsb3coNCkKICAuc29tZXRpbWVzQnkoMC4yLCB4ID0%2BIHgucGx5KCI8MiA0IDg%2BIikpCiAgLmRldHVuZSgiLjEiKQogIC5yb29tKDAuNCkKICAucm9vbXNpemUoMikKCiQ6IGFycmFuZ2UoCiAgWzEsICJbMCAxIDIgNF0iXSwKICBbMSwgIls0IDIgMCAxXSJdLAogIFsxLCAiWzAgMiAzIDRdIl0sCiAgKS5uKCkuY2hvcmQoIjxDIEYgfiBFbT4iKQogIC52b2ljaW5nKCkKICAuc29tZXRpbWVzQnkoMC4yLCB4ID0%2BIHgucGx5KCIyIikpCiAgLmRldHVuZSgiPC4xIC4yIDEuMCAyLjA%2BIikKICAucm9vbSgwLjQpCiAgLnJvb21zaXplKDIpCgokOiBhcnJhbmdlKAogIFsxLCAiWzQgMiAwIDFdIl0sCiAgWzEsICJbMCAxIDIgNF0iXSwKICBbMSwgIls0IDIgMCAxXSJdLAopLm4oKS5jaG9yZCgiPH4gQyBFbSBGPiIpCiAgLnZvaWNpbmcoKQogIC5zb21ldGltZXNCeSgwLjIsIHggPT4geC5wbHkoIjQiKSkKICAuZGV0dW5lKCI8MS4xIDEuMiAwLjMgMC4xPiIpCiAgLnJvb20oMC40KQogIC5yb29tc2l6ZSgyKQo%3D&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;20th&quot;&gt;
    &lt;h1&gt;20th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-20.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#Ly8gQHRpdGxlIHBlZXAgcGVlcCBsb29wdG9iZXIKCmNvbnN0IGRydW1zID0gImFsZXNpc2hyMTYiCgovLyBEUlVNUwoKJDogcygic2QiKS5ldWNsaWRSb3QoMiwgMTYsIDApLmJhbmsoZHJ1bXMpLmdhaW4oMC4yKQokOiBzKCI8fkAzIGJkIGJkIDxiZCB%2BPiB%2BQDI%2BKjE2IikuYmFuayhkcnVtcykuZ2FpbigwLjIpCiQ6IHMoImhoKjE2PyIpLmJhbmsoZHJ1bXMpLmdhaW4oMC41KQokOiBzKCJwZXJjOjIiKS5ldWNsaWRSb3QoNSwgOCwgMSkuc29tZXRpbWVzKHBseSgiMnw0IikpLmJhbmsoZHJ1bXMpLmdhaW4oMC4xKQoKY29uc3Qgc2NydWJzID0gWwogIGlyYW5kKDMyKS5kaXYoMzIpLnNlZygxNikucmliKDEyMCwgMSksCiAgIjwwIC40NSAwLjIwIC40NSAwLjExIC40NT4iLApdCgokOiBzKCJ0aG9tYXMiKQogIC5uKCI8NSA1IDUgNSA1IDUgNiA2IDY%2BIikKICAuc2NydWIocGljayhzY3J1YnMsICI8MCAwIDEgMSAxIDEgMSAxIDE%2BIikpCg%3D%3D&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;I took some samples from Thomas the Tank Engine for this one, it was fun to make.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#Ly8gQHRpdGxlIHBlZXAgcGVlcCBsb29wdG9iZXIKCmNvbnN0IGRydW1zID0gImFsZXNpc2hyMTYiCgovLyBEUlVNUwoKJDogcygic2QiKS5ldWNsaWRSb3QoMiwgMTYsIDApLmJhbmsoZHJ1bXMpLmdhaW4oMC4yKQokOiBzKCI8fkAzIGJkIGJkIDxiZCB%2BPiB%2BQDI%2BKjE2IikuYmFuayhkcnVtcykuZ2FpbigwLjIpCiQ6IHMoImhoKjE2PyIpLmJhbmsoZHJ1bXMpLmdhaW4oMC41KQokOiBzKCJwZXJjOjIiKS5ldWNsaWRSb3QoNSwgOCwgMSkuc29tZXRpbWVzKHBseSgiMnw0IikpLmJhbmsoZHJ1bXMpLmdhaW4oMC4xKQoKY29uc3Qgc2NydWJzID0gWwogIGlyYW5kKDMyKS5kaXYoMzIpLnNlZygxNikucmliKDEyMCwgMSksCiAgIjwwIC40NSAwLjIwIC40NSAwLjExIC40NT4iLApdCgokOiBzKCJ0aG9tYXMiKQogIC5uKCI8NSA1IDUgNSA1IDUgNiA2IDY%2BIikKICAuc2NydWIocGljayhzY3J1YnMsICI8MCAwIDEgMSAxIDEgMSAxIDE%2BIikpCg%3D%3D&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;22th&quot;&gt;
    &lt;h1&gt;22th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-22.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDIyCgpzZXRjcG0oMTQwLzQpCgokOiBzKCJiZCB%2BIH4gfiIpLm4oMykucm9vbSgxLjgpLnJvb21zaXplKDQpLmNvbG9yKCd5ZWxsb3cnKS5zY29wZSgpCiQ6IHMoIn4gYmQgYmQgYmQiKS5uKDMpLmRlY2F5KDAuMSkuY29sb3IoJ3BpbmsnKS5zY29wZSgpCgokOiBhcnJhbmdlKAogIFsxLCAiezF9JTwxIDIgMyA0IDUgNiA3IDggOSAxMCAxMT4iXSwKICBbMSwgInsyfSUyIl0sCiAgWzEsICJ7M30lMiIuc29tZXRpbWVzQnkoMC4zLCB4PT54LnBseSg0KSldLAogIFsxLCAiezR9JTIiXQopLm4oKS5zY2FsZSgiQzptYWpvciIpLnNvbWV0aW1lc0J5KDAuMSwgeD0%2BeC50cmFuc3Bvc2UoIjwtMiAtNyA3IDE0PiIpKS5mYXN0KDIpCiAgLnNvdW5kKCJzdXBlcnNhdyx0cmkiKQogIC5yb29tKDIpCiAgLnJvb21zaXplKDQpCiAgLmNydXNoKDQpCiAgLmNvbG9yKCdyZWQnKS5zY29wZSgpCg%3D%3D&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;I think this is my favorite one from this project. I had an idea in my head, managed to hold onto it for a couple of hours while I was working/taking care of life, and then I was able to convert it into something that was pretty close to what I wanted. It&#39;s pretty simple but I like it a lot.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDIyCgpzZXRjcG0oMTQwLzQpCgokOiBzKCJiZCB%2BIH4gfiIpLm4oMykucm9vbSgxLjgpLnJvb21zaXplKDQpLmNvbG9yKCd5ZWxsb3cnKS5zY29wZSgpCiQ6IHMoIn4gYmQgYmQgYmQiKS5uKDMpLmRlY2F5KDAuMSkuY29sb3IoJ3BpbmsnKS5zY29wZSgpCgokOiBhcnJhbmdlKAogIFsxLCAiezF9JTwxIDIgMyA0IDUgNiA3IDggOSAxMCAxMT4iXSwKICBbMSwgInsyfSUyIl0sCiAgWzEsICJ7M30lMiIuc29tZXRpbWVzQnkoMC4zLCB4PT54LnBseSg0KSldLAogIFsxLCAiezR9JTIiXQopLm4oKS5zY2FsZSgiQzptYWpvciIpLnNvbWV0aW1lc0J5KDAuMSwgeD0%2BeC50cmFuc3Bvc2UoIjwtMiAtNyA3IDE0PiIpKS5mYXN0KDIpCiAgLnNvdW5kKCJzdXBlcnNhdyx0cmkiKQogIC5yb29tKDIpCiAgLnJvb21zaXplKDQpCiAgLmNydXNoKDQpCiAgLmNvbG9yKCdyZWQnKS5zY29wZSgpCg%3D%3D&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;24th&quot;&gt;
    &lt;h1&gt;24th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-24.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/?S6mM-_rlc1aG#c2V0Y3BtKDE2MC80KQpzYW1wbGVzKCdnaXRodWI6bXVmZmluaXN0YS9zYW1wbGVzJykKCi8vIEB0aXRsZSBsb29udG9iZXIKCiQ6IHMoImxvb246MiIpLnNsb3coMikuZ2FpbigwLjIpCiAgCiQ6IHMoIndoaXRlIikuZXVjbGlkKCI8MyA1IDc%2BIiwgOCkuZGVjKDAuMSkuZ2FpbigwLjIpLmNydXNoKDUpLnNvbWV0aW1lcyhwbHkoIjIiKSkKJDogbm90ZSgiWzM2IDM2IDM2IDM0IDM0IDM0IDM0IDM1XSIpLnMoIndoaXRlIikuZGVjKDAuMSkuZ2FpbigwLjIpCgokOiBzKCJsb29uOjEiKS5zY3J1YigiezAuMSEyIC4yNUAzIDAuNyEyIDwwLjg6MS41Pn0lOCIpLmNydXNoKDEyKQokOiBzKCJsb29uLzIiKS5uKDMpLnNsaWNlKDgsICIwIDEgPDIgMioyPiAzIFs0IDBdIDUgNiA3IikKCgokOiBub3RlKCJbMzYgMzYgMzYgMzQgMzQgMzQgMzQgMzVdIikucygic3VwZXJzYXciKS5kZWMoMC4xKS5nYWluKDAuNCk%3D&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;I used some loon samples for this one #loontober.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/?S6mM-_rlc1aG#c2V0Y3BtKDE2MC80KQpzYW1wbGVzKCdnaXRodWI6bXVmZmluaXN0YS9zYW1wbGVzJykKCi8vIEB0aXRsZSBsb29udG9iZXIKCiQ6IHMoImxvb246MiIpLnNsb3coMikuZ2FpbigwLjIpCiAgCiQ6IHMoIndoaXRlIikuZXVjbGlkKCI8MyA1IDc%2BIiwgOCkuZGVjKDAuMSkuZ2FpbigwLjIpLmNydXNoKDUpLnNvbWV0aW1lcyhwbHkoIjIiKSkKJDogbm90ZSgiWzM2IDM2IDM2IDM0IDM0IDM0IDM0IDM1XSIpLnMoIndoaXRlIikuZGVjKDAuMSkuZ2FpbigwLjIpCgokOiBzKCJsb29uOjEiKS5zY3J1YigiezAuMSEyIC4yNUAzIDAuNyEyIDwwLjg6MS41Pn0lOCIpLmNydXNoKDEyKQokOiBzKCJsb29uLzIiKS5uKDMpLnNsaWNlKDgsICIwIDEgPDIgMioyPiAzIFs0IDBdIDUgNiA3IikKCgokOiBub3RlKCJbMzYgMzYgMzYgMzQgMzQgMzQgMzQgMzVdIikucygic3VwZXJzYXciKS5kZWMoMC4xKS5nYWluKDAuNCk%3D&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;26th&quot;&gt;
    &lt;h1&gt;26th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-26.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#c2V0Y3BtKDE2MC80KQpzYW1wbGVzKCdnaXRodWI6bG9vcGZhbGwvcGFkcycpCgovLyBAdGl0bGUgbG9vcHRvYmVyIDIwMjUgMTAgMjYKCiQ6IHN0YWNrKAogIHMoImhoKjgiKS5uKDQpLAogIHMoImJkKjQiKS5uKDQpLmRlbGF5KDAuMjUpLAopLmJyYWsoKS5zb21ldGltZXMocGx5KCIyIikpLmdhaW4oMC40KS5yb29tKDEuMikucm9vbXNpemUoMS4xKQoKJDogcygicGFkcyIpLm4oNCkuc2xpY2UoOCwgcmFuZC5zZWcoOCkucmliKDM2LCAuNSkpLmRlY2F5KDAuNCkubHBmKDEyMDApCiQ6IHMoInBhZHMiKS5uKDIpLnNsaWNlKDE2LCByYW5kLnNlZygxNikucmliKCI8MTIyIDM0IDk5PiIsIC41KSkuZGVjYXkoMC4yKQoKJDogbm90ZSgiZTVANCBkNUAyIFtlNSxkNV1AMiIuc29tZXRpbWVzKHggPT4geC5hZGQoLTcpKSkKICAuc291bmQoImdtX2Nob2lyX2FhaHMiKQogIC5kZWNheSgxLjQpCiAgLnJvb20oMikKICAuc2xvdyg0KQogIC5yb29tZmFkZSgyLjUpCiAgLmNydXNoKDYpCgokOiBzKCJzdXBlcnNhdyoxNj8iKS5ub3RlKHJhbmQuc2VnKDE2KS5yaWIoIjwxMjIgMSA0NCA5PiIsIC41KS5hZGQoMzIpKQogICAuZGVjYXkoMC4yKQogICAucm9vbSgyKQ%3D%3D&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;Messing around with the &#39;aahh&#39; choir sounds from Strudel and some pad samples. It&#39;s easy to get lost in playing with samples like this.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#c2V0Y3BtKDE2MC80KQpzYW1wbGVzKCdnaXRodWI6bG9vcGZhbGwvcGFkcycpCgovLyBAdGl0bGUgbG9vcHRvYmVyIDIwMjUgMTAgMjYKCiQ6IHN0YWNrKAogIHMoImhoKjgiKS5uKDQpLAogIHMoImJkKjQiKS5uKDQpLmRlbGF5KDAuMjUpLAopLmJyYWsoKS5zb21ldGltZXMocGx5KCIyIikpLmdhaW4oMC40KS5yb29tKDEuMikucm9vbXNpemUoMS4xKQoKJDogcygicGFkcyIpLm4oNCkuc2xpY2UoOCwgcmFuZC5zZWcoOCkucmliKDM2LCAuNSkpLmRlY2F5KDAuNCkubHBmKDEyMDApCiQ6IHMoInBhZHMiKS5uKDIpLnNsaWNlKDE2LCByYW5kLnNlZygxNikucmliKCI8MTIyIDM0IDk5PiIsIC41KSkuZGVjYXkoMC4yKQoKJDogbm90ZSgiZTVANCBkNUAyIFtlNSxkNV1AMiIuc29tZXRpbWVzKHggPT4geC5hZGQoLTcpKSkKICAuc291bmQoImdtX2Nob2lyX2FhaHMiKQogIC5kZWNheSgxLjQpCiAgLnJvb20oMikKICAuc2xvdyg0KQogIC5yb29tZmFkZSgyLjUpCiAgLmNydXNoKDYpCgokOiBzKCJzdXBlcnNhdyoxNj8iKS5ub3RlKHJhbmQuc2VnKDE2KS5yaWIoIjwxMjIgMSA0NCA5PiIsIC41KS5hZGQoMzIpKQogICAuZGVjYXkoMC4yKQogICAucm9vbSgyKQ%3D%3D&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;27th&quot;&gt;
    &lt;h1&gt;27th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-27.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#c2V0Y3BtKDE2MC80KQoKLy8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDI3Ci8vIHRoZXJlIGlzIGEgY2F0IG9uIG15IGtleWJvYXJkCgokOiBzKCJiZCo0Iikuc29tZXRpbWVzKHBseSgyKSkuY3J1c2goOCkKJDogcygiaGgqOCIpLmJhbmsoInRyOTA5IikubigiPDQgNCA0IDQgNCAyIDI%2BIikuY3J1c2goNikKJDogcygiY3AiKS5ldWNsaWQoMywgOCkuYmFuaygidHI5MDkiKS5uKCI8NCA0IDQgMiAyPiIpLnNvbWV0aW1lcyhwbHkoMikpCgoKY29uc3Qgc3R1ZmYgPSBbCiAgcmFuZC5zZWcoMTYpLnJpYigiPDEyMiAxIDQ0IDk%2BIiwgLjUpLmFkZCgzMiksCiAgIjMyIDMyIDM4IDM4IDM4KjQgNDAgNDIqNCA0MCAzNiAzNCIuc29tZXRpbWVzKHggPT4geC5hZGQoIjwxMCAxNT4iKSksCiAgcmFuZC5zZWcoOCkucmliKCI8NSA5IDExPiIsIDEpLmFkZCgzMiksCl0KCmNvbnN0IHBhdHMgPSBbCiAgIngqMTYiLAogICJ4KjQgeCo0IHgqND8geCo0IiwKICAiW3gqMyB%2BXSo0IgpdOwoKJDogcygiel90YW4iKQogIC5zdHJ1Y3QocGlja21vZChwYXRzLCBpcmFuZChwYXRzLmxlbmd0aCArIDEpLnNlZygxKSkpCiAgLm5vdGUocGljayhzdHVmZiwgIjwwIDAgMCAyIDIgMT4iKSkKICAgLmRlY2F5KDAuMSkKICAgLmNydXNoKDQpCiAgIC5yb29tKDEuMikK&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;I like the older electronic sound of this one.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#c2V0Y3BtKDE2MC80KQoKLy8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDI3Ci8vIHRoZXJlIGlzIGEgY2F0IG9uIG15IGtleWJvYXJkCgokOiBzKCJiZCo0Iikuc29tZXRpbWVzKHBseSgyKSkuY3J1c2goOCkKJDogcygiaGgqOCIpLmJhbmsoInRyOTA5IikubigiPDQgNCA0IDQgNCAyIDI%2BIikuY3J1c2goNikKJDogcygiY3AiKS5ldWNsaWQoMywgOCkuYmFuaygidHI5MDkiKS5uKCI8NCA0IDQgMiAyPiIpLnNvbWV0aW1lcyhwbHkoMikpCgoKY29uc3Qgc3R1ZmYgPSBbCiAgcmFuZC5zZWcoMTYpLnJpYigiPDEyMiAxIDQ0IDk%2BIiwgLjUpLmFkZCgzMiksCiAgIjMyIDMyIDM4IDM4IDM4KjQgNDAgNDIqNCA0MCAzNiAzNCIuc29tZXRpbWVzKHggPT4geC5hZGQoIjwxMCAxNT4iKSksCiAgcmFuZC5zZWcoOCkucmliKCI8NSA5IDExPiIsIDEpLmFkZCgzMiksCl0KCmNvbnN0IHBhdHMgPSBbCiAgIngqMTYiLAogICJ4KjQgeCo0IHgqND8geCo0IiwKICAiW3gqMyB%2BXSo0IgpdOwoKJDogcygiel90YW4iKQogIC5zdHJ1Y3QocGlja21vZChwYXRzLCBpcmFuZChwYXRzLmxlbmd0aCArIDEpLnNlZygxKSkpCiAgLm5vdGUocGljayhzdHVmZiwgIjwwIDAgMCAyIDIgMT4iKSkKICAgLmRlY2F5KDAuMSkKICAgLmNydXNoKDQpCiAgIC5yb29tKDEuMikK&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;29th&quot;&gt;
    &lt;h1&gt;29th&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-29.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/#c2V0Y3BtKDE2MC80KQoKLy8gQHRpdGxlIGxvb3B0b2JlciAxMC8yOS8yMDI1CgokOiBzKCJzYmQgc2JkIHNiZCBzYmQiKS5uKDMpLnNvbWV0aW1lcyhwbHkoIjJ8NCIpKS5jb2xvcignb3JhbmdlJykuc2NvcGUoKQokOiBzKCJjcCBjcCB%2BIH4iKS5uKCI8MiAyIDMgMyAyPiIpLmNvbG9yKCdwaW5rJykuc29tZXRpbWVzQnkoMC4xLCB4PT54LnBseSg0KSkuc2NvcGUoKQoKJDogbm90ZSgiYTEqNCBhMSBhMSoyIGExIikucygic3F1YXJlIikuZGVjYXkoMC4zKS5yb29tKCI8MC41IDAuNSAwLjUgMS4yPiIpLmNvbG9yKCdyZWQnKS5zY29wZSgpCiQ6IG5vdGUoIjxjMSo0PiA8YzEqND4iKS5zKCJzcXVhcmUiKS5kZWNheSgwLjMpLmxwZig2MDApLnJvb20oIjwxLjI%2BIikuc29tZXRpbWVzKHggPT4geC5scGYoMTQwMCkpLmNvbG9yKCd5ZWxsb3cnKS5zY29wZSgpCgokOiBub3RlKCJhIGEgYSBhIi5zb21ldGltZXNCeSgwLjEsIHggPT4geC5hZGQoIjwtMTQ%2BIikpKQogIC5zKCJnbV9wYWRfd2FybSIpCiAgLmNob3AoNCkKICAuc29tZXRpbWVzKHggPT4geC5yZXYoKSkKICAubG9vcEF0KDQpCiAgLnNvbWV0aW1lcyhwbHkoIjQiKSkKICAuY29sb3IoJ3B1cnBsZScpCiAgLnNjb3BlKCkK&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;Another electronic/vaguely industrial one. I&#39;d seen &lt;a href=&quot;https://www.reddit.com/r/autechre/comments/1oj0018/portsmouth_bootleg/&quot; target=&quot;_blank&quot;&gt;Autechre&lt;/a&gt; perform the night before.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/#c2V0Y3BtKDE2MC80KQoKLy8gQHRpdGxlIGxvb3B0b2JlciAxMC8yOS8yMDI1CgokOiBzKCJzYmQgc2JkIHNiZCBzYmQiKS5uKDMpLnNvbWV0aW1lcyhwbHkoIjJ8NCIpKS5jb2xvcignb3JhbmdlJykuc2NvcGUoKQokOiBzKCJjcCBjcCB%2BIH4iKS5uKCI8MiAyIDMgMyAyPiIpLmNvbG9yKCdwaW5rJykuc29tZXRpbWVzQnkoMC4xLCB4PT54LnBseSg0KSkuc2NvcGUoKQoKJDogbm90ZSgiYTEqNCBhMSBhMSoyIGExIikucygic3F1YXJlIikuZGVjYXkoMC4zKS5yb29tKCI8MC41IDAuNSAwLjUgMS4yPiIpLmNvbG9yKCdyZWQnKS5zY29wZSgpCiQ6IG5vdGUoIjxjMSo0PiA8YzEqND4iKS5zKCJzcXVhcmUiKS5kZWNheSgwLjMpLmxwZig2MDApLnJvb20oIjwxLjI%2BIikuc29tZXRpbWVzKHggPT4geC5scGYoMTQwMCkpLmNvbG9yKCd5ZWxsb3cnKS5zY29wZSgpCgokOiBub3RlKCJhIGEgYSBhIi5zb21ldGltZXNCeSgwLjEsIHggPT4geC5hZGQoIjwtMTQ%2BIikpKQogIC5zKCJnbV9wYWRfd2FybSIpCiAgLmNob3AoNCkKICAuc29tZXRpbWVzKHggPT4geC5yZXYoKSkKICAubG9vcEF0KDQpCiAgLnNvbWV0aW1lcyhwbHkoIjQiKSkKICAuY29sb3IoJ3B1cnBsZScpCiAgLnNjb3BlKCkK&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;article id=&quot;31st&quot;&gt;
    &lt;h1&gt;31st&lt;/h1&gt;
    &lt;video controls=&quot;&quot; preload=&quot;none&quot;&gt;
      &lt;source src=&quot;https://muffinlabs.nyc3.cdn.digitaloceanspaces.com/2025/looptober/looptober-31.mp4&quot; type=&quot;video/mp4&quot;&gt;
    &lt;/video&gt;
    &lt;div class=&quot;embed&quot;&gt;
      &lt;iframe src=&quot;https://strudel.cc/?S6mM-_rlc1aG#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDMxCi8vIGJ5ZSEKCnNldGNwbSgxNjAvNCkKc2FtcGxlcygnZ2l0aHViOm11ZmZpbmlzdGEvc2FtcGxlcycpCgokOiBzKCI8c2JkIHNiZCBzYmQgc2JkIHNiZCBzYmQqND4iKS5zb21ldGltZXNCeSgwLjIsIHggPT4geC5wbHkoMikpCiQ6IHMoInNkIH4gc2QqNCB%2BIikubigxKS5jcnVzaCgzKS5kZWNheSgwLjEpLmdhaW4oMC40KQokOiBzKCJoaCIpLmV1Y2xpZCg5LCAxNikubigzKS5jcnVzaCg0KS5wYWxpbmRyb21lKCkKIAokOiBzKCJzdXBlcnNhdyIpLmV1Y2xpZExlZ2F0byg1LCA4KS5yb29tKDEuMSkucm9vbXNpemUoMikKCiQ6IG5vdGUoIjxbY0AyIGMqMl0gW2NAMiBjKjJdIFtjQDIgYyoyXSBbY0AyIGMqMl0%2BIikKICAudHJhbnNwb3NlKCI8MCAwIDAgMCAwIDIgNSA3PiIpCiAgLnNvbWV0aW1lcyh4ID0%2BIHgudHJhbnNwb3NlKCItMTQiKSkKICAucygiZ21fZXBpYW5vMSIpCiAgLmNydXNoKDYpCiAgLnJvb20oMS41KQoKJDogcygiYXNoLzIiKQogIC5jaG9wKDgpCiAgLnJldigpCiAgLnNvbWV0aW1lc0J5KDAuOCwgeCA9PiB4LnJldigpKQogIC5uKDMpCiAgLmdhaW4oMS41KQoKCi8vJDogcygiYXNoLzIiKS5uKDIpCi8vJDogcygiYXNoLzIiKS5uKDMpCgo%3D&quot;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;content&quot;&gt;
&lt;p&gt;Last one! I think this is my second favorite piece. I sampled Ash from Aliens for the weird talking.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://strudel.cc/?S6mM-_rlc1aG#Ly8gQHRpdGxlIGxvb3B0b2JlciAyMDI1IDEwIDMxCi8vIGJ5ZSEKCnNldGNwbSgxNjAvNCkKc2FtcGxlcygnZ2l0aHViOm11ZmZpbmlzdGEvc2FtcGxlcycpCgokOiBzKCI8c2JkIHNiZCBzYmQgc2JkIHNiZCBzYmQqND4iKS5zb21ldGltZXNCeSgwLjIsIHggPT4geC5wbHkoMikpCiQ6IHMoInNkIH4gc2QqNCB%2BIikubigxKS5jcnVzaCgzKS5kZWNheSgwLjEpLmdhaW4oMC40KQokOiBzKCJoaCIpLmV1Y2xpZCg5LCAxNikubigzKS5jcnVzaCg0KS5wYWxpbmRyb21lKCkKIAokOiBzKCJzdXBlcnNhdyIpLmV1Y2xpZExlZ2F0byg1LCA4KS5yb29tKDEuMSkucm9vbXNpemUoMikKCiQ6IG5vdGUoIjxbY0AyIGMqMl0gW2NAMiBjKjJdIFtjQDIgYyoyXSBbY0AyIGMqMl0%2BIikKICAudHJhbnNwb3NlKCI8MCAwIDAgMCAwIDIgNSA3PiIpCiAgLnNvbWV0aW1lcyh4ID0%2BIHgudHJhbnNwb3NlKCItMTQiKSkKICAucygiZ21fZXBpYW5vMSIpCiAgLmNydXNoKDYpCiAgLnJvb20oMS41KQoKJDogcygiYXNoLzIiKQogIC5jaG9wKDgpCiAgLnJldigpCiAgLnNvbWV0aW1lc0J5KDAuOCwgeCA9PiB4LnJldigpKQogIC5uKDMpCiAgLmdhaW4oMS41KQoKCi8vJDogcygiYXNoLzIiKS5uKDIpCi8vJDogcygiYXNoLzIiKS5uKDMpCgo%3D&quot; target=&quot;_blank&quot;&gt;view on strudel.cc&lt;/a&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
  &lt;/article&gt;&lt;/section&gt;
</content>
  </entry>
  <entry>
    <title>mastodon archive viewer</title>
    <link href="https://muffinlabs.com/posts/2025/02/05/02-05-mastodon-archive-viewer/" />
    <updated>2025-02-05T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2025/02/05/02-05-mastodon-archive-viewer/</id>
    <content type="html">&lt;p&gt;I kept putting off finishing it because, you know, everything sucks, but I put together a mastodon archive viewer website/tool here:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mastodon-viewer.muffinlabs.com/&quot;&gt;https://mastodon-viewer.muffinlabs.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It does the whole &#39;100% local processing&#39; thing, so you can specify your archive zipfile and everything is processed/stored locally. You can also use it to generate a website suitable for uploading somewhere and sharing your toots if you want.&lt;/p&gt;
&lt;p&gt;My initial goal was to have this out in the world before botsin.space closed down, but again, the world/etc.&lt;/p&gt;
&lt;p&gt;There&#39;s a few other tools out there that will do this for you, and a couple of them are definitely nicer looking, if not more functional than this one, but this might be the only mastodon archive viewer that does in-browser processing, offers an export, and also has the &lt;a href=&quot;https://github.com/muffinista/mastodon&quot;&gt;source code available&lt;/a&gt;. I hope folks find it useful.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>botsin.space postmortem</title>
    <link href="https://muffinlabs.com/posts/2024/12/21/12-21-botsin-space-post-mortem/" />
    <updated>2024-12-21T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2024/12/21/12-21-botsin-space-post-mortem/</id>
    <content type="html">&lt;p&gt;I switched botsin.space to read-only mode on December 16th. I essentially just prevented the creation of new toots -- you can still login, migrate your account, request an account archive, etc. Unsurprisingly, the load on the website has plummeted. In the next couple of weeks I hope to spend some time downsizing the instance, cleaning up some junk, etc, etc, to have a lean archive of the server that I can keep online without much expense for as long as possible.&lt;/p&gt;
&lt;p&gt;After I made the announcement that I was shutting down the instance, a few things happened. First, I received an overwhelming amount of thanks and support. I&#39;m so incredibly grateful for all the kind words.  So many people reached out to offer their thanks for running botsin.space, and their understanding for my need to end things. A few people (literally just one or two out of hundreds) were angry about it, which I understand.&lt;/p&gt;
&lt;p&gt;Several people/organizations reached out with offers to either fund the service, offer spare servers/bandwidth, promote their new cloud platform, or take it over in one way or another. I rejected these for several reasons. First, several of them involved me continuing to run botsin.space, and as soon as I made the announcement that I wanted to shut down the instance, I realized just how badly I didn&#39;t want to do that anymore. Second, a few of the offers involved established orgs/people with a decent presence on the fediverse, but I was concerned that handing over control would change how botsin.space would be run in ways that made me uncomfortable. For example, I blocked Threads/Meta on botsin.space, and I know that some of the orgs that offered their support are either cool with Meta or even supported by Meta. That&#39;s their right for sure, but it&#39;s not something I was comfortable with.&lt;/p&gt;
&lt;p&gt;But even more importantly, I was really worried about the privacy implications of giving the service to someone else. It has always been really important to me to maintain the privacy of the people with accounts on the server. As a rule, it&#39;s good behavior to identify the creator of a bot/automated account in the profile of the bot, but it&#39;s not strictly required, and there&#39;s certainly good reasons to remain anonymous. From time to time someone would request the contact information of a bot owner, and I basically never handed out that information. I would try and be an intermediary instead -- someone contacted me, I would contact the bot owner and pass along their message, etc. I have also been concerned for a few years now about the possibility of law enforcement/state actors asking/demanding information from the instance. It&#39;s extremely plausible that the database of an average mastodon service includes some toots about someone&#39;s abortion for example, which is the sort of information that police officers are suddenly interested in having in parts of the US. Ultimately, my concerns are probably irrelevant because my hosting provider could hand over the information without me ever knowing, but I worried that handing the server to someone else would leave these questions unresolved in a way that was unacceptable to me.&lt;/p&gt;
&lt;p&gt;I was also contacted by at least one known bad actor that definitely had malice in mind when they offered to take over the instance, and went so far as to setup and populate a throwaway account to contact me.&lt;/p&gt;
&lt;p&gt;Finally, one or two archivists have reached out, but that&#39;s a little different from maintaining the service, and I&#39;ll probably see what the options are there.&lt;/p&gt;
&lt;h2&gt;Numbers&lt;/h2&gt;
&lt;p&gt;I thought it might be interesting to cobble together some stats, graphs, etc. for the instance. They show certain trends, and might be helpful for people thinking about their own instances.&lt;/p&gt;
&lt;h3&gt;Expenses&lt;/h3&gt;
&lt;p&gt;Here&#39;s a chart of the monthly expenses for botsin.space:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://muffinlabs.com/img/M8efON6cTa-350.avif 350w, https://muffinlabs.com/img/M8efON6cTa-700.avif 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://muffinlabs.com/img/M8efON6cTa-350.webp 350w, https://muffinlabs.com/img/M8efON6cTa-700.webp 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;img src=&quot;https://muffinlabs.com/img/M8efON6cTa-350.png&quot; alt=&quot;Monthly expenses&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;700&quot; height=&quot;418&quot; srcset=&quot;https://muffinlabs.com/img/M8efON6cTa-350.png 350w, https://muffinlabs.com/img/M8efON6cTa-700.png 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The red line is the bandwidth/storage cost, and the blue line is the server/CPU cost. The yellow line is the cost for the mail/SMTP service I used, which changed a couple of times over the course of the project. It started off being essentially free, then $24/year, then $10/month when the number of emails sent by the instance hit a certain threshold. The green line is the sum total of everything.&lt;/p&gt;
&lt;p&gt;Observant folks will notice that the bandwidth expense trends up over time, but then has a big drop near the end of 2023. I&#39;d been worrying about the creeping expense for months at that point, and I implemented a cache layer to try and save some money. Originally I used AWS to host files, but I moved to Digital Ocean in 2022. Both services charge separately for storage and bandwidth. As the bandwidth expense grew, I experimented with a proxy/cache system on the botsin.space server itself, which gets a certain amount of &#39;free&#39; bandwidth every month. This helped a bit, but not for very long, as the bandwidth usage continued to grow and grow.&lt;/p&gt;
&lt;h3&gt;Toot/Media stats&lt;/h3&gt;
&lt;p&gt;Here&#39;s some charts for the number of toots tooted each month, as well as the number and size of media files processed by month. See if you can guess when Elon Musk bought Twitter.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://muffinlabs.com/img/vpLmVY8V4a-350.avif 350w, https://muffinlabs.com/img/vpLmVY8V4a-700.avif 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://muffinlabs.com/img/vpLmVY8V4a-350.webp 350w, https://muffinlabs.com/img/vpLmVY8V4a-700.webp 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;img src=&quot;https://muffinlabs.com/img/vpLmVY8V4a-350.png&quot; alt=&quot;Statuses created each month&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;700&quot; height=&quot;430&quot; srcset=&quot;https://muffinlabs.com/img/vpLmVY8V4a-350.png 350w, https://muffinlabs.com/img/vpLmVY8V4a-700.png 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://muffinlabs.com/img/oeBTfq6Pvs-350.avif 350w, https://muffinlabs.com/img/oeBTfq6Pvs-700.avif 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://muffinlabs.com/img/oeBTfq6Pvs-350.webp 350w, https://muffinlabs.com/img/oeBTfq6Pvs-700.webp 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;img src=&quot;https://muffinlabs.com/img/oeBTfq6Pvs-350.png&quot; alt=&quot;Media files per month&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;700&quot; height=&quot;429&quot; srcset=&quot;https://muffinlabs.com/img/oeBTfq6Pvs-350.png 350w, https://muffinlabs.com/img/oeBTfq6Pvs-700.png 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;/picture&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://muffinlabs.com/img/Ydd86rQNJa-350.avif 350w, https://muffinlabs.com/img/Ydd86rQNJa-700.avif 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://muffinlabs.com/img/Ydd86rQNJa-350.webp 350w, https://muffinlabs.com/img/Ydd86rQNJa-700.webp 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;img src=&quot;https://muffinlabs.com/img/Ydd86rQNJa-350.png&quot; alt=&quot;Media size per month&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;700&quot; height=&quot;432&quot; srcset=&quot;https://muffinlabs.com/img/Ydd86rQNJa-350.png 350w, https://muffinlabs.com/img/Ydd86rQNJa-700.png 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;In many ways, that giant spike in 2022 was the beginning of the end for botsin.space. The monthly active accounts total went from 700 to 1100, from just under a million statuses created to 3 million statuses (!). The media usage and bandwidth grew similarly. There&#39;s not a whole lot else to say about these three charts except that Elon Musk is a real chaos agent.&lt;/p&gt;
&lt;h3&gt;Tech Specs&lt;/h3&gt;
&lt;p&gt;I&#39;ve written a bit about how &lt;a href=&quot;https://muffinlabs.com/posts/2022/09/10/how-i-maintain-botsin-space/&quot;&gt;I ran botsin.space&lt;/a&gt; already, and it&#39;s still fairly accurate. In the end times, I added a varnish caching layer to try and help keep things running, and I also added two extra servers, one devoted to web requests and one to background jobs.&lt;/p&gt;
&lt;p&gt;Originally the instance was a 2 CPU instance with 4GB of RAM. In the end, it was an 8 CPU instance with 16GB of RAM, with the two extra instances being slightly smaller. It moved from a &lt;a href=&quot;https://docs.digitalocean.com/products/droplets/details/pricing/&quot;&gt;s-2vcpu-4gb to a s-8vcpu-16gb-amd&lt;/a&gt; on this table, with a few steps in the middle. I think one takeaway from these graphs are that if I&#39;d been running an instance for a small, limited number of accounts, it would&#39;ve been manageable for a very long time. It took a long time for the expense to creep past $50/month, and another long time to go above $100/month.&lt;/p&gt;
&lt;p&gt;Starting in 2020, I moved the database storage off of the instance and onto &lt;a href=&quot;https://docs.digitalocean.com/products/volumes/&quot;&gt;a separate volume&lt;/a&gt;. Having data on a volume separate from everything else meant that I was able to take instant snapshots of the database before running upgrades, and this really saved my ass several times. There was a Mastodon upgrade sometime in 2022 that involved some involved data migrations, and I think an upgrade to Postgres. When I ran the upgrade, something went horribly wrong and botsin.space was pretty badly broken. I ended up taking the instance down for several days while I dealt with the issue. Ultimately, I needed to rewrite the migration scripts from scratch and run them on a backup snapshot of the database. This was really hard work -- I had to setup a new server, attach a copy of the database, debug my script, etc, etc. I was extremely likely to be qualified for this work -- I&#39;ve been working with Ruby on Rails since it was beta software. But I still came pretty close to calling it quits right here and shutting down the instance forever. Anyway, &lt;b&gt;make good backups of your server&lt;/b&gt;!&lt;/p&gt;
&lt;h2&gt;Assorted Challenges&lt;/h2&gt;
&lt;h3&gt;Technical challenges&lt;/h3&gt;
&lt;p&gt;There were long stretches in the beginning when the service ran with little or no attention from me. Other than the event I described above, there weren&#39;t any epic challenges involving downtime, server crashes, etc. I&#39;m fortunate to have a lot of knowledge and expertise regarding running servers. I tend to know how to identify a problem, I can figure out how to fix it, etc. Docker doesn&#39;t particularly bother me and using it made it easier for me to tune the service. I wrote scripts to handle things like expand the database volume when needed, run cleanup tasks, etc. I maintained the configuration for the server in git. I also have an instance of &lt;a href=&quot;https://www.jenkins.io/&quot;&gt;Jenkins&lt;/a&gt; that I use to deploy my personal projects, and I used it here too. Every time I pushed an update to the setup for botsin.space, Jenkins would grab the changes, build a new docker image and push it to the right place, and take care of a few other tasks. Then I would ssh into the server and run a command or two to switch to the new version. All things considered, I had it running pretty smoothly for years.&lt;/p&gt;
&lt;p&gt;Using S3/DigitalOcean spaces to store files meant that I never really needed to worry about hard drives filling up, although when I decided to move from S3 to DigitalOcean, I ended up with a huge AWS bill for the expense of transferring all of those files. Oops!&lt;/p&gt;
&lt;p&gt;Two annoyances were spiders/spam, and background jobs. Every now and then some web scraper, spammer, or well-meaning but malfunctioning bot script would tie up a huge chunk of system resources until I blocked their IP address or found some other way to deal with the issue. It was never a catastrophic problem, but it would be annoying from time to time.&lt;/p&gt;
&lt;p&gt;But background jobs could frequently become an issue. Basically, every time someone creates a toot, a bunch of background jobs are created to send it to all the followers of an account. There&#39;s a similar set of jobs to deal with incoming toots. Sometimes this would slow down and there would be a backlog of work to be done. This was probably happening for several reasons. First, it involves communicating with remote servers, some of which might be slow to respond, or they might be offline. Second, sometimes a job would create multiple other jobs. Essentially speaking, a popular/viral toot can create an unexpected cascade of background jobs. The main solution here was usually to run extra copies of sidekiq to process the backlog, but sometimes this meant doing a lot of juggling to keep from overwhelming the db/web instances that also needed to run.&lt;/p&gt;
&lt;h3&gt;Other challenges&lt;/h3&gt;
&lt;p&gt;Dealing with new accounts was never too much of a big deal, especially after I shut down unverified signups, and asked for a &#39;magic word&#39; in the signup flow. It probably got a little tiring during the months that a couple hundred people signed up.&lt;/p&gt;
&lt;p&gt;Moderation was generally not much of a problem most of the time. Most months the number of reports was low, and sometimes there weren&#39;t any reports at all.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://muffinlabs.com/img/MuSY8pABof-350.avif 350w, https://muffinlabs.com/img/MuSY8pABof-700.avif 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://muffinlabs.com/img/MuSY8pABof-350.webp 350w, https://muffinlabs.com/img/MuSY8pABof-700.webp 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;img src=&quot;https://muffinlabs.com/img/MuSY8pABof-350.png&quot; alt=&quot;Moderation reports created each month&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;700&quot; height=&quot;428&quot; srcset=&quot;https://muffinlabs.com/img/MuSY8pABof-350.png 350w, https://muffinlabs.com/img/MuSY8pABof-700.png 700w&quot; sizes=&quot;100vh&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;There were definitely some real problems in these reports -- bots behaving badly, accounts on remote servers being assholes. Lots of complaints about spammers on mastodon.social. But in general, a huge chunk of these reports contained literally no information in them -- no description of the problem, and no links to specific statuses. I generally classified these as &amp;quot;I don&#39;t like this account/content, but I&#39;m going to make someone else do labor by clicking the report button instead of the block/unfollow button.&amp;quot; They were really frustrating, because I&#39;d generally end up doing some digging to see if anything was going on with the reported account, and inevitably nothing was. I&#39;ve said this in the past, but I think it would be really easy for a bad actor to weaponize reports to cause a lot of pain for people running instances. I also think that I didn&#39;t have a typical experience regarding moderation, since as a rule any interaction between a remote account and a botsin.space account involved a non-human, and while bots can definitely say terrible things and make awful mistakes and are ultimately a human product, in general this didn&#39;t happen a whole lot (or at least, I rarely heard about it).&lt;/p&gt;
&lt;p&gt;Weirdly, I didn&#39;t get a single DMCA takedown request, it seemed basically inevitable and never happened.&lt;/p&gt;
&lt;p&gt;There were a few times that I added an instance to the blocklist and would get brigaded by people being total assholes about it. They&#39;d hop on new accounts from other servers to harass me, they&#39;d email me spewing hate or trying to convince me to undo the block (or both at the same time). Sometimes threats were involved. But I recognize that I had it pretty easy compared to a lot of other people running instances. I rarely announced blocks, which I think helped, but maybe wasn&#39;t the greatest way to do things.&lt;/p&gt;
&lt;p&gt;Once or twice I needed to deal with content that was CSAM/CSAM-adjacent, and honestly it was very upsetting. I think all the articles out there about moderators at big social networks struggling to deal with the mental hardship of dealing with content like this are actually underselling the problem. It really sucked, I lost sleep over it, and what I needed to deal with was pretty trivial compared to other people.&lt;/p&gt;
&lt;h2&gt;Some final thoughts&lt;/h2&gt;
&lt;p&gt;When I first started drafting this post, I thought I would write something about how you shouldn&#39;t launch an instance without having a fallback plan, an exit strategy, a team to help manage your community, etc, but having spent a couple of days writing everything here, I&#39;m not sure I feel that way anymore. I actually think that ideally, a person or group can decide they want to start a community on the fediverse, do that, and then when it&#39;s time to end, they end it, and have that all be fine. Communities don&#39;t have to last forever.&lt;/p&gt;
&lt;p&gt;I think a lot about &lt;a href=&quot;https://en.wikipedia.org/wiki/PhpBB&quot;&gt;phpBB&lt;/a&gt;. It&#39;s easy to forget about in the post social media era, but there are a lot of phpBB/etc forums out there that host vibrant, active communities. They might be small, but that&#39;s ok, and it&#39;s likely even a good thing. A friend of mine runs an instance of phpBB devoted to cars with manual transmissions. I know of another forum devoted to parenting that started as a splinter group from yet another forum that was mostly about feminism. I used to frequent a board devoted to the Red Sox, and another one devoted to a 2d airplane game I used to love. Today I spend time on forums related to ambient music and making tape loops. There&#39;s forums devoted to medical issues, where people can go to talk, ask questions and find support. And most of these places have off-topic sections, where you can discuss random topics, what&#39;s for dinner, shitposting, etc. And those areas exist because phpBB is a great tool for building a community.&lt;/p&gt;
&lt;p&gt;phpBB runs on PHP, arguably the most important programming language of all time, and certainly one of the most successful ones. Almost every hosting platform supports it by default. It runs on cheap hardware. You can get a Dreamhost/etc account on a server shared with 1000 other websites and run your forum without thinking twice. It&#39;s far from perfect, but you can do it with a relatively low amount of technical knowledge, especially with one-click installers and things like that. It&#39;s an incredibly successful and historically important software project.&lt;/p&gt;
&lt;p&gt;Right now, there&#39;s basically no equivalent to phpBB for the fediverse. I think this is likely true in part because everyone&#39;s brains broke in the early dotcom era, and we all collectively decided that something wasn&#39;t worth doing online unless it could scale up to 10 million users. A web forum is useless to someone with that mindset. Mastodon requires quite a bit of technical knowledge, and if something goes wrong you need to be an expert to deal with it. Mastodon the software platform is built and maintained to support the scale required to run mastodon.social, an instance with two million users. And if you use Mastodon to run your instance, you&#39;re locked into the choices made to support a giant instance. There&#39;s alternatives to Mastodon, some of which make better choices for smaller instance, but I don&#39;t think any of them are really any easier to use.&lt;/p&gt;
&lt;p&gt;I worry that this makes it very difficult to resist the inclination to centralize everything on a couple of big instances. And that inclination absolutely must be resisted. I would love to see a fediverse full of thousands of small instances of software platforms that are as easy to manage as a PHP web forum. But there are a lot of challenges to tackle before something like that could really exist. I could probably ramble about this for another thousand words but I&#39;ll stop now. If you made it this far, thanks for reading, and thanks for supporting botsin.space!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>RIP botsin.space</title>
    <link href="https://muffinlabs.com/posts/2024/10/29/10-29-rip-botsin-space/" />
    <updated>2024-10-29T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2024/10/29/10-29-rip-botsin-space/</id>
    <content type="html">&lt;p&gt;There&#39;s no easy way to put it, so here goes -- after a lot of consideration, I&#39;ve made the hard (frankly, painful) decision to shut down botsin.space. TLDR: here&#39;s the plan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Effective immediately I&#39;m shutting down new account signups&lt;/li&gt;
&lt;li&gt;I will switch the site into read-only mode sometime not long after December 15th.&lt;/li&gt;
&lt;li&gt;I&#39;ll do everything I can to help people migrate their accounts elsewhere, and/or generate archives.&lt;/li&gt;
&lt;li&gt;I&#39;ll keep the site running in read-only mode at least into March of 2025, and if possible/needed I&#39;ll extend that as long as I can.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why?&lt;/h2&gt;
&lt;p&gt;I launched botsin.space in April of 2017, which honestly feels like it was about six thousand years ago. Originally I just wanted to play around with the fediverse and Mastodon. The oauth flow for creating a bot was messy, so I forked Mastodon and fixed it, deployed those changes to botsin.space, and invited people to create bots.&lt;/p&gt;
&lt;p&gt;The server was popular with bot allies and artists, people who wanted to get RSS feeds onto the fediverse, as well as students and professors who wanted to work on coding projects or learn about federated social media. There have been some moderation challenges over the years, but to be honest those have never been all that considerable.&lt;/p&gt;
&lt;p&gt;But botsin.space has always been a bit of an odd duck with a unique set of challenges. Over the years, the server has grown to have around a few thousand active accounts, which isn&#39;t all that many. However, they&#39;ve generated something like 32 million statuses. Just to put that in perspective, mastodon.social has over 2 million users, who have generated around 110 million statuses. So the usage patterns are very different, and I think it&#39;s safe to say the the mastodon codebase is tuned for mastodon.social and not a weird freaky server like botsin.space.&lt;/p&gt;
&lt;p&gt;I work on the internet professionally, use Rails at my day job, and server management is part of my job description, so I&#39;ve been able to use my skills to keep botsin.space running on a relative shoestring budget. Until recently, the whole thing ran on one server. But that&#39;s not maintainable, and given that and some other concerns, I think that now is the time to retire the server.&lt;/p&gt;
&lt;p&gt;There are four major expenses for botsin.space, in order from least to most expensive:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;My time. As long as I find managing the server rewarding, this is an expense I&#39;m happy to pay.&lt;/li&gt;
&lt;li&gt;Server costs. I&#39;ve been able to be fairly cheap here until recently.&lt;/li&gt;
&lt;li&gt;Database storage. The database for the server lives on a dedicated volume at Digital Ocean, and is currently around 191GB in size. Every time I need to increase the size of this volume, the expense goes up, and it&#39;s safe to assume that this will only continue to grow.&lt;/li&gt;
&lt;li&gt;File storage and bandwidth. These expenses will also only get more expensive over time. File bandwidth is the #1 charge on the monthly server bill right now. I live in fear of an AI scraper figuring out how to scrape all of these files and bankrupting me overnight.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Until recently, my thinking has been: &amp;quot;I&#39;m cool with finding all sorts of weird tricks to keep the server going, and I&#39;ll worry about #3 and #4 someday in the future maybe lalalalala I can&#39;t hear you.&amp;quot; But the recent Mastodon upgrade has caused a significant amount of performance degradation, and I think the only way to really solve it is going to be to throw a lot of money into hardware.&lt;/p&gt;
&lt;p&gt;I should mention at this point that I&#39;ve had a Patreon to help with server expenses, and I&#39;ve also accepted Paypal donations, and I&#39;m truly grateful for everyone who has ever sent me money to support the server.&lt;/p&gt;
&lt;p&gt;However, even with the support, expenses have always outpaced the donations, and while that&#39;s been fine with me for a long time, it&#39;s not sustainable. I&#39;m fortunate enough to have a career and life where I&#39;ve been able to support botsin.space, but I can&#39;t do it forever, and as the expenses and challenges mount, I find myself thinking about things that I&#39;d probably rather be doing with my time.&lt;/p&gt;
&lt;p&gt;With a few exceptions, botsin.space isn&#39;t anyone&#39;s primary instance, and I&#39;ve always been mindful of the fact that everyone who supports botsin.space financially has other places and people to think of also, and I am so thankful for the consideration. I hope that everyone who is currently supporting botsin.space finds another instance to support, there are a lot of great instances out there with vibrant communities that need all the help they can get to survive.&lt;/p&gt;
&lt;p&gt;So, given two choices -- asking for more donations so I can pay for more hardware to keep the instance running, or retiring it and encouraging people to support more community-oriented instances, I&#39;ll choose the second option every time.&lt;/p&gt;
&lt;p&gt;As I mentioned above, I&#39;ll be working to keep the server stable and running for as long as possible, to give people a chance to migrate their accounts, get archives, etc. If anyone has any questions, please feel free to contact me at &lt;a href=&quot;https://muffin.industries/@cass&quot;&gt;@cass@muffin.industries&lt;/a&gt;. It&#39;s probably smarter to ping me there instead of at botsin.space, because it&#39;s more likely that your message will be delivered in a timely fashion.&lt;/p&gt;
&lt;p&gt;I&#39;d like to thank everyone who has ever run a bot on botsin.space and gotten joy out of it. I&#39;d like to thank all the people who have ever shared their thanks or kind words with me online -- your support has meant the world to me. I&#39;d like to thank all the #botALLY folks, who have been a constant source of inspiration and learning to me for over a decade. Finally, I&#39;d like to thank Johanna, who has always been there for me &amp;lt;3&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>A system for randomly timed bot posts</title>
    <link href="https://muffinlabs.com/posts/2024/09/06/09-06-random-bot-timing/" />
    <updated>2024-09-06T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2024/09/06/09-06-random-bot-timing/</id>
    <content type="html">&lt;p&gt;Awhile ago I made a very simple bot -- &lt;a href=&quot;https://botsin.space/@whatnewdevilry&quot;&gt;@WhatNewDevilry&lt;/a&gt;, which simply posts one of my favorite scenes/lines from Lord of The Rings:&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/v9wS_-AzIU8?si=ALBgzoyK9GGewCm3&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Instead of posting on a scheduled interval, I wanted to add some randomness to the posting schedule. I decided to do this by using the Mastodon API&#39;s scheduled tweet system. Basically, the bot code checks to see if there&#39;s a scheduled tweet for the account. If not, it schedules one at a random time in the future. The script runs every hour or so to keep checking the status. Meanwhile, Mastodon itself will post the scheduled toot at the proper time.&lt;/p&gt;
&lt;p&gt;The code is pretty basic and looks an awful lot like this:&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/muffinista/6ff4a67bbc9ac57218fd97994b3811ec.js&quot;&gt;&lt;/script&gt;
</content>
  </entry>
  <entry>
    <title>A Million Random Digits with 100,000 Normal Deviates - Audio Edition</title>
    <link href="https://muffinlabs.com/rand-digits-audio-book/" />
    <updated>2024-05-05T00:00:00Z</updated>
    <id>https://muffinlabs.com/rand-digits-audio-book/</id>
    <content type="html">
&lt;h1&gt;A Million Random Digits with 100,000 Normal Deviates - Audio Edition&lt;/h1&gt;

&lt;a href=&quot;https://archive.org/details/a-million-random-digits-audio-edition&quot;&gt;&lt;img src=&quot;https://muffinlabs.com/rand-digits-audio-book/numbers-small.jpg&quot; alt=&quot;Cover art for the audio book&quot; width=&quot;500&quot;&gt;&lt;/a&gt;

&lt;iframe src=&quot;https://archive.org/embed/a-million-random-digits-audio-edition&amp;playlist=1&quot; width=&quot;500&quot; height=&quot;400&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;


&lt;p&gt;&lt;a href=&quot;https://archive.org/details/a-million-random-digits-audio-edition&quot;&gt;This&lt;/a&gt; is an audio version of the acclaimed book &lt;a href=&quot;https://www.rand.org/pubs/monograph_reports/MR1418.html&quot;&gt;&lt;i&gt;A
Million Random Digits with 100,000 Normal Deviates&lt;/i&gt;&lt;/a&gt;. Although it was originally published in 1955, there has never been an audio version of it -- until today. Weighing in at 18 gigabytes of audio data, the book provides 455 hours (almost 19 days) of listening enjoyment.&lt;/p&gt;

&lt;p&gt;The print edition contains a series of random numbers and some
guidance on how to use them. At the time it was published, generating
random numbers was challenging so the book was fairly useful and
noteworthy for mathematicians, scientists, etc. RAND used it for lots
of things, probably including gaming out how a global nuclear war
would work out.&lt;/p&gt;

&lt;p&gt;The audio book is simply a reading of the digits, in order, along
  with the introduction, preface, etc. It was generated via a bunch of
  Python scripts that use the &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/ai-services/speech-service/overview&quot;&gt;Azure Speech service&lt;/a&gt; to
  generate the samples for all of the digits. Originally I considered
  generating samples for the numbers zero through nine, and just
  combining them together. But that generated pretty monotonous audio,
  so instead I generated samples for every unique sequence of five
  digits. I spread the creation out over a few months to maximize my
  use of the Azure free tier (although I messed up and did end up with a bit of a bill).&lt;/p&gt;

&lt;p&gt;I originally thought that I would use the code that generates audio
  for &lt;a href=&quot;https://secretbroadcast.net/&quot;&gt;the secret broadcast&lt;/a&gt; to generate the audio book, but ultimately I ended up writing some &lt;a href=&quot;https://github.com/muffinista/rand-audio-book&quot;&gt;very
  simple Python code&lt;/a&gt; to do the work. I had a script to generate
  the samples, and a few more to combine them together into WAV
  files. I had to split the audiobook into sizes small enough to not
  exceed the 4GB maximum WAV file size.&lt;/p&gt;

</content>
  </entry>
  <entry>
    <title>feedsin.space -- RSS feeds on the fediverse</title>
    <link href="https://muffinlabs.com/posts/2023/03/09/feedsin-space/" />
    <updated>2023-03-09T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2023/03/09/feedsin-space/</id>
    <content type="html">&lt;p&gt;Introducing &lt;a href=&quot;https://feedsin.space/&quot;&gt;feedsin.space&lt;/a&gt;, a
service for generating Fediverse accounts that post content from RSS
feeds.&lt;/p&gt;
&lt;p&gt;Something that I&#39;ve learned over the years of
running &lt;a href=&quot;https://botsin.space&quot;&gt;botsin.space&lt;/a&gt; is that a lot
of people want to be able to publish RSS feeds to Mastodon. A few
months ago, I decided to implement a service to run alongside
botsin.space that people could use to setup accounts for RSS feeds,
but without needing to go through the work of setting up a full
Mastodon account on botsin.space.&lt;/p&gt;
&lt;p&gt;Using feedsin.space is pretty straightforward. First, you need to
authenticate with the website by sending a message from your mastodon
account
to &lt;a href=&quot;https://feedsin.space/feed/admin&quot;&gt;@admin@feedsin.space&lt;/a&gt;
with the word &amp;quot;help&amp;quot;. You&#39;ll get a response with a link you can click
on to authenticate with the website. Then, you can create an account
on feedsin.space by specifying a username for the account and the RSS
feed you want to follow. Assuming everything looks good, there will be
an account created at @username@feedsin.space, which you can follow
from your Mastodon account, and any time the RSS feed updates, you&#39;ll
get the post in your timeline.&lt;/p&gt;
&lt;p&gt;I&#39;ve implemented a few features to the service beyond the basics, including:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;You can set the visibility of posts, so they can be public,
  unlisted, followers-only, or you can opt to get direct messages from
  the service to keep your feed private&lt;/li&gt;
  &lt;li&gt;The ability to add a content warning to posts&lt;/li&gt;
  &lt;li&gt;An optional hashtag for posts&lt;/li&gt;
  &lt;li&gt;A setting for allowing/disallowing search engine indexing&lt;/li&gt;
  &lt;li&gt;Embedded audio from podcasts (this isn&#39;t working as well as I want)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the future, I am thinking about adding a directory of feeds
available on the service, and I have some other things on my todo
list.&lt;/p&gt;
&lt;h2&gt;The Code&lt;/h2&gt;
&lt;p&gt;feedsin.space is written in Rust, and the code is
available &lt;a href=&quot;https://github.com/muffinista/rust-rss-to-fedi&quot;&gt;on
Github&lt;/a&gt;. There&#39;s a few libraries I&#39;ve used, and other ActivityPub
websites/projects that I frequently referenced to figure out what the
heck I was doing. The ActivityPub protocol can be pretty intimidating
to learn, so I spent a lot of time looking at the code for these
projects:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;The &lt;a href=&quot;https://www.w3.org/TR/2018/REC-activitypub-20180123/&quot;&gt;ActivityPub
      spec&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;The
    rust &lt;a href=&quot;https://git.asonix.dog/asonix/activitystreams&quot;&gt;ActivityStreams&lt;/a&gt;
    library. I wouldn&#39;t have built the project in Rust without this
    library&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://git.joinplu.me/Plume/Plume&quot;&gt;Plume&lt;/a&gt;
    and &lt;a href=&quot;https://github.com/LemmyNet/activitypub-federation-rust&quot;&gt;Lemmy&lt;/a&gt;,
    two AP projects which use Rust&lt;/li&gt;
  &lt;li&gt;Darius
    Kazemi&#39;s &lt;a href=&quot;https://github.com/dariusk/rss-to-activitypub&quot;&gt;rss-to-activitypub&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/mastodon/mastodon/&quot;&gt;Mastodon&lt;/a&gt;
    itself. I ran a local copy of Mastodon for testing, and I hacked
    into the code for sending/receiving messages to get an idea of what
    was going on, for debugging, etc, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Alternatives&lt;/h2&gt;
&lt;p&gt;If you want to get RSS feeds into the Fediverse, but this doesn&#39;t seem
like the service you are looking for, there&#39;s a few other tools
currently available to do this, including:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://feed2toot.readthedocs.io/en/latest/&quot;&gt;feed2toot&lt;/a&gt;,
    which is a script you can run to post from an RSS feed to an
    account.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.jessesquires.com/blog/2022/12/15/rss-to-mastodon/&quot;&gt;Zapier and/or IFTTT&lt;/a&gt;,
    if you&#39;re willing to hack a bit.&lt;/li&gt;
  &lt;li&gt;Darius Kazemi&#39;s &lt;a href=&quot;https://github.com/dariusk/rss-to-activitypub&quot;&gt;rss-to-activitypub&lt;/a&gt; project.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mastofeed.org/&quot;&gt;MastoFeed&lt;/a&gt;, which is a web
    service to do this, but it&#39;s a little mysterious about who runs it,
    and it requires a lot of excess permissions.&lt;/li&gt; 
    &lt;li&gt;&lt;a href=&quot;https://feedbot.net/&quot;&gt;FeedBot&lt;/a&gt; appears to be similar to MastoFeed, but I can&#39;t get it to work for me right now so I don&#39;t have much of an opinion about it.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>How I maintain botsin.space</title>
    <link href="https://muffinlabs.com/posts/2022/09/10/how-i-maintain-botsin-space/" />
    <updated>2022-09-10T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2022/09/10/how-i-maintain-botsin-space/</id>
    <content type="html">&lt;p&gt;I&#39;ve been meaning to write up some notes on how I manage &lt;a href=&quot;https://botsin.space/&quot;&gt;botsin.space&lt;/a&gt;, and how I&#39;ve dealt with certain
problems in the past -- in particular, the several days of &lt;a href=&quot;https://botsin.space/@muffinista/108273247048311451&quot;&gt;issues and
downtime&lt;/a&gt; in May 2022.&lt;/p&gt;
&lt;h2&gt;Hosting&lt;/h2&gt;
&lt;p&gt;botsin.space is hosted at DigitalOcean. There&#39;s nothing really special about DO
(in fact, I think about moving often) but there&#39;s a few features that have
really saved me a few times now. First, it&#39;s very easy to create a new disk
volume, and once you have a volume, it&#39;s pretty easy to expand its size. I store
the database on a separate volume. Currently the database is taking up ~65GB of
space. When the volume is close to full, I&#39;ll expand it as needed. Second, it&#39;s
very easy to take snapshots of volumes. I have a script that takes a nightly
snapshot of the database volume. I also make snapshots before doing upgrades,
server maintenance, etc. If something bad happens and I need to restore the db
copy, I can create a new volume, attach it to the server, and switch from the
broken db to the snapshot db. I&#39;ve had to do this several times, and knowing I
can do it again really helps alleviate the stress of running the server.&lt;/p&gt;
&lt;p&gt;I run the instance using &lt;a href=&quot;https://github.com/mastodon/mastodon/blob/main/docker-compose.yml&quot;&gt;docker
compose&lt;/a&gt;. I know that docker causes some people a lot of suffering (enough
that the official mastodon documentation doesn&#39;t seem to include using docker as
an option anymore), but I like it for a few reasons. First, I have a lot of
professional experience using docker, so I&#39;m used to the different ways it can
cause you pain. Second, I find that using docker makes it a little easier to run
upgrades and rollbacks. Third, it makes it a little easier to maintain the
code/scripts I need to run the instance in git without having to fork the entire
mastodon codebase. Finally, it also makes the service a lot more portable, since
if/when I want to move the instance to a new server, I don&#39;t need to reinstall
as many required programs.&lt;/p&gt;
&lt;h2&gt;The code&lt;/h2&gt;
&lt;p&gt;I have a slightly customized build of mastodon, with a docker file that looks an
awful lot like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FROM tootsuite/mastodon:v3.5.3

COPY app/views/about/_registration.html.haml /opt/mastodon/app/views/about/
COPY app/views/about/_botsinspace-custom-signup.html.haml /opt/mastodon/app/views/about/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This takes the &lt;a href=&quot;https://hub.docker.com/r/tootsuite/mastodon/#!&quot;&gt;pre-existing image&lt;/a&gt; for mastodon, copies a few customized files in, and that&#39;s it!&lt;/p&gt;
&lt;p&gt;Here&#39;s what the Dockerfile and docker-compose.yml look like:&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/muffinista/b7674bd5afe5d68089a92fb034d72c9e.js&quot;&gt;&lt;/script&gt;
&lt;h2&gt;Upgrades and maintenance&lt;/h2&gt;
&lt;p&gt;When it&#39;s time to run an upgrade, I make a snapshot of the database, update the
version numbers in docker-compose.yml, and run something along the lines of
&lt;code&gt;docker compose build &amp;amp;&amp;amp; docker compose up -d&lt;/code&gt;. This builds a new docker image
and deploys it, then restarts everything as needed. If something goes wrong, I
roll back the version and re-run &lt;code&gt;docker compose up -d&lt;/code&gt;. The configuration file
itself could be a little more optimized (ideally I&#39;d only specify the version
stuff once), but I&#39;m lazy and usually do it via search/replace in my editor.&lt;/p&gt;
&lt;h2&gt;Other stuff&lt;/h2&gt;
&lt;p&gt;A few things happen outside of docker:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;nginx&lt;/strong&gt; - nginx runs directly on the server, and routes traffic to docker. The
configuration is reasonably close to the default mastodon configuration file.
There&#39;s a couple of rules in there to block some bad actors, and there&#39;s some
rate-limiting as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lets Encrypt&lt;/strong&gt; - I use Let&#39;s Encrypt to setup HTTPS certificates/etc. I use
DNS validation since there&#39;s a special plugin that handles everything via the
Digital Ocean API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scheduled tasks&lt;/strong&gt; - There&#39;s a few nightly tasks running in cron -- making
backups, running mastodon maintenance/etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;File storage&lt;/strong&gt; - File storage is a huge chunk of the expense of running the
instance. Uploads are stored in Digital Ocean&#39;s Spaces, which is basically a
clone of S3. I kept files on S3 for awhile, but I don&#39;t like giving Amazon
money, and Spaces is a little cheaper. It&#39;s also probably better for performance
to have the file storage closer to the actual server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Emails&lt;/strong&gt; - Emails are sent with &lt;a href=&quot;https://mailpace.com/&quot;&gt;MailPace&lt;/a&gt; and it works
well enough that I basically never think about it.&lt;/p&gt;
&lt;h2&gt;Server upgrades&lt;/h2&gt;
&lt;p&gt;The botsin.space server is running Ubuntu. Server updates aren&#39;t too much of a
concern, but if I need to do upgrade between major versions or something else
large like that, I take advantage of the fact that the database is on its own
dedicated volume. I can boot an entirely new server, install any required
software (I basically have a script for this), copy over my configuration files,
then detach the volume from the old server, attach it to the new one, and update
DNS to point to the new server.&lt;/p&gt;
&lt;h2&gt;Moderation and new accounts&lt;/h2&gt;
&lt;p&gt;At the moment, I handle all moderation issues and new account requests myself. I
use a slightly tweaked version of &lt;a href=&quot;https://github.com/bclindner/ivory&quot;&gt;ivory&lt;/a&gt; to help with spam signups
and things like that. It&#39;s certainly possible that this will become enough work
that I can&#39;t handle it myself, but that hasn&#39;t happened yet.&lt;/p&gt;
&lt;h2&gt;When things go wrong&lt;/h2&gt;
&lt;p&gt;The upgrade to Mastodon v3.5.0 involved upgrading PostgreSQL from version 9.6 to
14. There were instructions for running this upgrade that were along the lines
of: make a dump of the data in the old version of postgres, upgrade, then import
the data into the new version. With a large database, that can take hours or
even days, and if it fails while it&#39;s running, that&#39;s a bunch of time that
you&#39;ve wasted. So, I took a snapshot and shutdown botsin.space, and started
running the dump. Unfortunately, the process failed for me over and over again,
and when I eventually got it to work, and tried to bring botsin.space back
online, it was clear that there were some data issues. I rolled back to the old
snapshot and started running upgrade tests on a separate test server.&lt;/p&gt;
&lt;p&gt;Eventually I found a &lt;a href=&quot;https://github.com/tianon/docker-postgres-upgrade&quot;&gt;neat little docker
image&lt;/a&gt; that can be used to upgrade between postgres versions, and that seemed
to work.&lt;/p&gt;
&lt;p&gt;However, there was another problem -- botsin.space was experiencing a &lt;a href=&quot;https://docs.joinmastodon.org/admin/troubleshooting/index-corruption/&quot;&gt;data
corruption issue&lt;/a&gt;. When I tried to run mastodon&#39;s custom &lt;a href=&quot;https://github.com/mastodon/mastodon/blob/b07906bdb0127cd73662506b519183cc51a2758e/lib/mastodon/maintenance_cli.rb#L139&quot;&gt;fix-duplicates&lt;/a&gt;
script, I found a whole new set of issues. That script checks a bunch of tables
for duplicate data. Many of those tables have a manageable amount of data in
them, but some of them -- particularly the conversations and status tables --
each of which have over 50 million rows in them right now. The script was trying
to run fairly complicated queries against that table, but the server didn&#39;t have
enough memory to process the result. This meant I needed to write some custom
ruby code to do the same thing without causing quite so much server load. I
managed to do that (luckily I program in Ruby for a living), let it run for a
couple of hours, and when it was done, I was able to bring botsin.space back
online.&lt;/p&gt;
&lt;p&gt;If I hadn&#39;t been able to take snapshots, and increase the database storage
volume as needed, and if I wasn&#39;t well-versed in Ruby, there&#39;s a good chance
that this upgrade would&#39;ve either failed entirely, involved a lot of data lostt,
or taken many days/weeks to finish.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>SpaceJamCheck in the New York Times</title>
    <link href="https://www.nytimes.com/2021/05/21/style/welcome-to-the-space-jam-again.html" />
    <updated>2021-05-24T00:00:00Z</updated>
    <id>https://www.nytimes.com/2021/05/21/style/welcome-to-the-space-jam-again.html</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Emoji Fireplace app</title>
    <link href="https://muffinlabs.com/emoji-fireplace" />
    <updated>2019-12-29T00:00:00Z</updated>
    <id>https://muffinlabs.com/emoji-fireplace</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Audio Sweetener Bot</title>
    <link href="https://botsin.space/@audiosweetener" />
    <updated>2019-01-10T00:00:00Z</updated>
    <id>https://botsin.space/@audiosweetener</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>November Rain Bot</title>
    <link href="https://botsin.space/@NovemberRain" />
    <updated>2018-11-16T00:00:00Z</updated>
    <id>https://botsin.space/@NovemberRain</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Tall Boy</title>
    <link href="https://glitch.com/~tall-boy" />
    <updated>2018-11-16T00:00:00Z</updated>
    <id>https://glitch.com/~tall-boy</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Pitchers and Catchers</title>
    <link href="http://pitchersandcatchersreport.in/" />
    <updated>2018-10-29T00:00:00Z</updated>
    <id>http://pitchersandcatchersreport.in/</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>The Secret Broadcast</title>
    <link href="https://secretbroadcast.net/" />
    <updated>2018-09-18T00:00:00Z</updated>
    <id>https://secretbroadcast.net/</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Emily Dickinson&#39;s Herbarium</title>
    <link href="https://botsin.space/@herbarium" />
    <updated>2018-09-14T00:00:00Z</updated>
    <id>https://botsin.space/@herbarium</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>moire</title>
    <link href="https://glitch.com/~p5-moireish-color" />
    <updated>2018-04-10T00:00:00Z</updated>
    <id>https://glitch.com/~p5-moireish-color</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Before Dawn v0.9.25</title>
    <link href="https://github.com/muffinista/before-dawn/releases" />
    <updated>2018-04-06T00:00:00Z</updated>
    <id>https://github.com/muffinista/before-dawn/releases</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>p5.js fullscreen starter on glitch</title>
    <link href="https://glitch.com/~p5-fullerscreen-starter" />
    <updated>2018-04-06T00:00:00Z</updated>
    <id>https://glitch.com/~p5-fullerscreen-starter</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Before Dawn v0.9.14</title>
    <link href="https://github.com/muffinista/before-dawn/releases" />
    <updated>2017-12-12T00:00:00Z</updated>
    <id>https://github.com/muffinista/before-dawn/releases</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Nice Gradients</title>
    <link href="http://muffinlabs.com/gradients/" />
    <updated>2017-11-17T00:00:00Z</updated>
    <id>http://muffinlabs.com/gradients/</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Before Dawn v0.9.11</title>
    <link href="https://github.com/muffinista/before-dawn/releases" />
    <updated>2017-11-16T00:00:00Z</updated>
    <id>https://github.com/muffinista/before-dawn/releases</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Editorialize Chrome Plugin</title>
    <link href="https://chrome.google.com/webstore/detail/editorialize/emfpglodamcbfnecphcmlkbhnlloghko" />
    <updated>2017-08-30T00:00:00Z</updated>
    <id>https://chrome.google.com/webstore/detail/editorialize/emfpglodamcbfnecphcmlkbhnlloghko</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Lonely Computer</title>
    <link href="http://muffinlabs.com/screensavers/4-listening/" />
    <updated>2017-08-06T00:00:00Z</updated>
    <id>http://muffinlabs.com/screensavers/4-listening/</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Defrag</title>
    <link href="http://muffinlabs.com/screensavers/3-defragment/" />
    <updated>2017-07-28T00:00:00Z</updated>
    <id>http://muffinlabs.com/screensavers/3-defragment/</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Atari Attract Mode</title>
    <link href="http://muffinista.github.io/before-dawn-screensavers/#atari-attract-mode" />
    <updated>2017-07-14T00:00:00Z</updated>
    <id>http://muffinista.github.io/before-dawn-screensavers/#atari-attract-mode</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>@IndyDaySpeech</title>
    <link href="https://twitter.com/IndyDaySpeech" />
    <updated>2017-07-04T00:00:00Z</updated>
    <id>https://twitter.com/IndyDaySpeech</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>@eliza on mastodon</title>
    <link href="https://botsin.space/@eliza" />
    <updated>2017-04-20T00:00:00Z</updated>
    <id>https://botsin.space/@eliza</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>@loveletter on mastodon</title>
    <link href="https://botsin.space/@loveletter" />
    <updated>2017-04-05T00:00:00Z</updated>
    <id>https://botsin.space/@loveletter</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>The Journey of EarthRoverBot</title>
    <link href="https://muffinlabs.com/posts/2017/03/28/the-journey-of-earth-rover-bot/" />
    <updated>2017-03-28T16:20:00Z</updated>
    <id>https://muffinlabs.com/posts/2017/03/28/the-journey-of-earth-rover-bot/</id>
    <content type="html">&lt;img src=&quot;https://muffinlabs.com/posts/2017/images/trip-full.jpg&quot; class=&quot;full-bleed&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/earthroverbot&quot;&gt;@EarthRoverBot&lt;/a&gt; is in the final
stretch of a journey from the edge of Maine to the US/Mexico border.
The bot is entirely virtual, and the trip is powered by Google&#39;s
Street View data. It takes a step forward every 12 minutes. It has a
location and a bearing, and if there&#39;s valid Street View data in that
direction, then it moves forward. If there isn&#39;t data, it adjusts
course until it finds a way to continue. With each step it sends the
image to Twitter.&lt;/p&gt;
&lt;p&gt;The bot can be controlled via commands sent through tweets, but mostly
it runs on autopilot, with a simple algorithm that it uses to work its
way towards the border crossing in San Diego. At some point in the
next few weeks, the bot will send an image that looks something like
this:&lt;/p&gt;
&lt;img src=&quot;https://muffinlabs.com/posts/2017/images/end-view.png&quot;&gt;
&lt;p&gt;And the trip will be done.&lt;/p&gt;
&lt;p&gt;Of all the bots I&#39;ve made, I think this one is my favorite. I love
the experience of a slow, meditative journey, without using a map,
getting stuck in unusual places, finding dead-ends and the insides of
buildings in places where the data is weird.&lt;/p&gt;
&lt;p&gt;Also, while the bot is basically automated, it can accept human
commands, so people have been able to control the course of the bot.
In fact, it never would have made it as far as it has without help
from people.&lt;/p&gt;
&lt;p&gt;At the same time, thanks to the use of Google Street view, the journey
represents a fairly bizarre version of a road trip. Everything that
you are able to see has been dictated by largely commercial needs of a
gigantic company. It&#39;s almost always sunny in the world presented by
Street View, although sometimes seasons will change without warning.
There&#39;s very little traffic, you never see an accident or weather. The
trip is largely devoid of visible people. The quality of light is
almost constant -- it&#39;s always the middle of the day and the sun is
usually out. Over days or weeks, the color palette changes in subtle
ways.&lt;/p&gt;
&lt;img src=&quot;https://muffinlabs.com/posts/2017/images/flatten.gif&quot;&gt;
&lt;p&gt;When I made the bot, sending it from one corner of the country to the
other seemed like a fun and fairly innocuous idea, but it spent an
entire election season barreling towards a border that defined so much
of the election, and now it&#39;s impossible to avoid the feeling that
driving something towards a destination like this is inherently
political.&lt;/p&gt;
&lt;p&gt;Here&#39;s a map of the final leg of the trip:&lt;/p&gt;
&lt;img src=&quot;https://muffinlabs.com/posts/2017/images/rover-end-map.png&quot;&gt;
&lt;p&gt;(it&#39;s already moved past this point since I&#39;m the worst blogger ever lol)&lt;/p&gt;
&lt;p&gt;I do have plans for the bot after it has finished this trip. I might
add the ability to jump to specific locations, or I might just start
another trip between two other points. I&#39;ve thought about making a web
version, and I&#39;ll definitely release the source code for the bot.&lt;/p&gt;
&lt;p&gt;Here&#39;s a video of the trip of the bot. I took every image is posted to
Twitter, filtered out ones where the bot moved fewer than 10 meters,
then composited them down to a few thousand frames, then turned that
into a video. I&#39;m still experimenting, so I might come up with
something more interesting in the future.&lt;/p&gt;
&lt;iframe width=&quot;560&quot; height=&quot;400&quot; src=&quot;https://www.youtube.com/embed/unow3_ipkmQ?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</content>
  </entry>
  <entry>
    <title>Before Dawn</title>
    <link href="https://github.com/muffinista/before-dawn" />
    <updated>2017-02-28T00:00:00Z</updated>
    <id>https://github.com/muffinista/before-dawn</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Trump Administration Twitter Archives</title>
    <link href="https://archive.org/download/twitterArchiveDumps" />
    <updated>2017-02-12T00:00:00Z</updated>
    <id>https://archive.org/download/twitterArchiveDumps</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>buzzcut</title>
    <link href="https://raw.githubusercontent.com/muffinista/buzzcut/master/output-2.txt" />
    <updated>2016-11-30T00:00:00Z</updated>
    <id>https://raw.githubusercontent.com/muffinista/buzzcut/master/output-2.txt</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>@drillify_exe</title>
    <link href="https://twitter.com/drillify_exe" />
    <updated>2016-11-18T00:00:00Z</updated>
    <id>https://twitter.com/drillify_exe</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>@head_2_keyboard</title>
    <link href="https://twitter.com/head_2_keyboard" />
    <updated>2016-11-04T00:00:00Z</updated>
    <id>https://twitter.com/head_2_keyboard</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>@muffin_exe_sta</title>
    <link href="https://twitter.com/muffin_exe_sta" />
    <updated>2016-11-04T00:00:00Z</updated>
    <id>https://twitter.com/muffin_exe_sta</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>@happened_today</title>
    <link href="https://twitter.com/happened_today" />
    <updated>2016-11-04T00:00:00Z</updated>
    <id>https://twitter.com/happened_today</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>The Making of @lists_of_lists</title>
    <link href="https://muffinlabs.com/posts/2016/08/16/the-making-of-lists_of_lists/" />
    <updated>2016-08-16T18:37:00Z</updated>
    <id>https://muffinlabs.com/posts/2016/08/16/the-making-of-lists_of_lists/</id>
    <content type="html">&lt;p&gt;I thought I&#39;d write something about how I made the bot
&lt;a href=&quot;https://twitter.com/lists_of_lists&quot;&gt;@lists_of_lists&lt;/a&gt;, from start to
finish. It&#39;s a relatively simple idea, so if you&#39;re interested in
writing a bot for the first time, this might be a helpful guide.&lt;/p&gt;
&lt;p&gt;I have a bit of an advantage for two reasons. First, I&#39;m a
professional programmer, and have been for many years. I know ruby
very well, and it&#39;s the language I use to build most of my bots.
Second, I wrote the
&lt;a href=&quot;https://github.com/muffinista/chatterbot&quot;&gt;library&lt;/a&gt;, that I use to
make most of my bots, so it&#39;s basically adapted to my needs.&lt;/p&gt;
&lt;p&gt;That said, if you are not a developer, but want to make a bot, you
definitely can, but you should probably expect to have to learn a
little bit about coding, and also a little bit about server
management, because getting your bot to run consistently is sometimes
the hardest part of the process.&lt;/p&gt;
&lt;h2&gt;The Idea&lt;/h2&gt;
&lt;p&gt;I spent a lot of time exploring wikipedia&#39;s data downloads when I was
building &lt;a href=&quot;http://gopherpedia.com/&quot;&gt;gopherpedia&lt;/a&gt;. I knew that there
were a lot of &#39;list of&#39; pages, and that some of them were
&lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_salads&quot;&gt;amusing&lt;/a&gt; and
interesting. I decided to see if I could download a list of them so
that I could play around with the data.&lt;/p&gt;
&lt;p&gt;Wikipedia offers database dumps at
&lt;a href=&quot;https://dumps.wikimedia.org/&quot;&gt;https://dumps.wikimedia.org/&lt;/a&gt;. The main
files here are gigantic XML files that represent the complete contents
of the website. Depending on what you are interested in, some of these
XML files are 12GB or larger. That&#39;s a single XML file! Parsing those
is a real challenge.&lt;/p&gt;
&lt;p&gt;Luckily, they offer a much smaller file of just page titles. I
downloaded that file, and searched it for pages with the words &#39;list of&#39;
or &#39;lists of&#39; in the title. I ended up running this a few times, so I
combined it all into a single shell command that looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-all-titles-in-ns0.gz &amp;gt; enwiki-latest-all-titles-in-ns0.gz &amp;amp;&amp;amp; gzcat enwiki-latest-all-titles-in-ns0.gz | grep -i &#39;List_of&#92;|Lists_of&#39; &amp;gt; lists.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At that point, I had a text file that looked a little like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;quot;List_of_the_works_of_Charles_Cottet_depicting_scenes_of_Brittany
&amp;quot;List_of_the_works_of_Charles_Cottet_depicting_scenes_of_Brittany&amp;quot;
&#39;List_of_Mongolian_musical_instruments
(List_of_Toni,la_Chef_episodes)
/List_of_Parliament_of_Australia_Reports_on_Sport
1996_World_Monuments_Fund_List_of_Most_Endangered_Sites
1996_World_Monuments_Watch_List_of_Most_Endangered_Sites
1998_World_Monuments_Fund_List_of_Most_Endangered_Sites
1998_World_Monuments_Watch_List_of_Most_Endangered_Sites
2000_World_Monuments_Fund_List_of_Most_Endangered_Sites
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Sit on it for a year&lt;/h2&gt;
&lt;p&gt;Once I had the data, I had no idea what I actually wanted to do with
it. I thought about running it through a Markov chain tool, or
maybe swapping out words randomly, adding adjectives and modifiers,
etc, etc.&lt;/p&gt;
&lt;p&gt;I couldn&#39;t really decide what to do, so I didn&#39;t do anything. I let
the data sit around for a year or so.&lt;/p&gt;
&lt;p&gt;Eventually, I decided to just keep it simple and make a bot that would
simply iterate through the list of lists. I randomized the data to
make it a little more interesting:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gshuf lists.txt &amp;gt; lists-random.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(gshuf is an OSX command to randomly shuffle the lines of a file. If
it&#39;s not installed already, you can install it via &lt;code&gt;brew install coreutils&lt;/code&gt;. On Linux, there&#39;s a command called &lt;code&gt;shuf&lt;/code&gt; that does the
exact same thing. I suspect it&#39;s pre-installed on most Linux systems.
Thanks to &lt;a href=&quot;https://twitter.com/ckolderup&quot;&gt;@ckolderup&lt;/a&gt; for pointing
all of this out!&lt;/p&gt;
&lt;h2&gt;Start The bot&lt;/h2&gt;
&lt;p&gt;I had the data, now I needed the bot. Amazingly, when I went to
Twitter to register a new account, my first choice was available, so
&lt;a href=&quot;https://twitter.com/lists_of_lists&quot;&gt;@lists_of_lists&lt;/a&gt; was born.&lt;/p&gt;
&lt;p&gt;I made myself a directory to hold onto my bot files, and copied the
data there. Then, I setup a &lt;code&gt;Gemfile&lt;/code&gt; and got ready to install
&lt;code&gt;chatterbot&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir lists_of_lists
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I made a Gemfile that looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;source &amp;quot;https://rubygems.org&amp;quot;
gem &amp;quot;chatterbot&amp;quot;, :git =&amp;gt; &amp;quot;git://github.com/muffinista/chatterbot.git&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then I ran &lt;code&gt;bundle&lt;/code&gt; to install chatterbot.&lt;/p&gt;
&lt;p&gt;Chatterbot has a script which will walk you through the process of
setting up a Twitter bot. It will also create a template file for the
bot, and setup your credentials file. I ran it!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt; I ran all of this while being logged into Twitter as the
account for the bot.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bundle exec chatterbot-register
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It prints out a message telling me what happens next:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Welcome to Chatterbot. Let&#39;s walk through the steps to get a bot running.

Hey, looks like you need to get an API key from Twitter before you can get started.

Have you already set up an app with Twitter? [Y/N]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I haven&#39;t setup an app yet, so I put &#39;N&#39;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; N
OK, I can help with that!

Please hit enter, and I will send you to https://apps.twitter.com/app/new to start the process.
(If it doesn&#39;t work, you can open a browser and paste the URL in manually)

Hit Enter to continue.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The form looked a lot like this (they change this a lot):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://muffinlabs.com/images/twitter-app-signup.png&quot; alt=&quot;Twitter App Form&quot; title=&quot;Twitter App Form&quot;&gt;&lt;/p&gt;
&lt;p&gt;Once you&#39;ve filled out that form, Twitter will issue you some API
keys. I copied those keys into chatterbot-register, which was waiting
for the input:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://muffinlabs.com/images/twitter-app-settings.png&quot; alt=&quot;Twitter App Settings&quot; title=&quot;Twitter App Settings&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Once you&#39;ve filled out the app form, click on the &#39;Keys and Access Tokens&#39; link


Paste the &#39;Consumer Key&#39; here: 123456
Paste the &#39;Consumer Secret&#39; here: abcdefg

Now it&#39;s time to authorize your bot!

Do you want to authorize a bot using the account that created the app? [Y/N]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I do want to authorize this account, so I say so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; Y
OK, on the app page, you can click the &#39;Create my access token&#39; button
to proceed.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I do that, then I paste the results:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Paste the &#39;Access Token&#39; here: 123456

Paste the &#39;Access Token Secret&#39; here: 45678
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hooray, now I have two files! lists_of_lists.rb is a template file for
my bot. It lists a bunch of features of chatterbot and gives you
something to work from. lists_of_lists.yml has the credentials for the
bot, and will also track some other information needed to send out
tweets.&lt;/p&gt;
&lt;p&gt;My idea for the bot is pretty simple. Each time it runs, it should
open up the file with all the lists in it, read the next one, and
tweet it out.&lt;/p&gt;
&lt;p&gt;The bot will need to keep track of which line it sent
out last, and update that value every time. One of the features of
chatterbot is that the YAML file which holds the configuration data is
accessible to the bot, and is updated with any changes each time the
bot is run. This means you can use it to track variables that you need
to persist over time, such as the last index of a file that you used.&lt;/p&gt;
&lt;p&gt;So I start with some ruby to handle all of that:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SOURCE = &amp;quot;lines.txt&amp;quot;

bot.config[:index] ||= 0

if ENV[&amp;quot;FORCE_INDEX&amp;quot;]
  bot.config[:index] = ENV[&amp;quot;FORCE_INDEX&amp;quot;].to_i
end
 
data = File.read(SOURCE).split(/&#92;n/)

source = data[ bot.config[:index] ]
puts source

# the page title will have underscores in it, get rid of those
tweet_text = source.gsub(/_/, &amp;quot; &amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This code sets the index variable, opens the file &amp;quot;lines.txt&amp;quot;, turns
it into an array by splitting on newlines, and then reads the proper
value from that array.&lt;/p&gt;
&lt;h2&gt;Make it Nicer&lt;/h2&gt;
&lt;p&gt;At this point, I could just tweet that value out like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tweet tweet_text
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And be done. I decided that would be a little boring though, and I
started to wonder about pulling an image from the wikipedia page for
the list. Some lists have images on them, and they can be
&lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_salads&quot;&gt;pretty funny&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wikipedia has an API, and there are a few ruby libraries for accessing
it. I decided to check out the
&lt;a href=&quot;https://github.com/kenpratt/wikipedia-client&quot;&gt;official client&lt;/a&gt; since
I had never used it before. My assumption was that I would need to
parse out images from the source text, but it turns out that there is
a method you can use to get a list of images! Anyway, here&#39;s that code&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;page = Wikipedia.find( source )

opts = {}

# check if there are any images
if page.image_urls &amp;amp;&amp;amp; ! page.image_urls.empty?
  puts page.image_urls.inspect

  # pick an image at random
  image_url = filter_images(page.image_urls).sample
  
  puts image_url
  if image_url &amp;amp;&amp;amp; image_url != &amp;quot;&amp;quot;
    # make a local copy of the image
    opts[:media] = save_to_tempfile(image_url)
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I added a simple method &lt;code&gt;filter_images&lt;/code&gt; which rejects any SVG files:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def filter_images(list)
  list.reject { |l| l =~ /.svg$/ }
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And a second method &lt;code&gt;save_to_tempfile&lt;/code&gt; which makes a local copy of the
image:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def save_to_tempfile(url)
  uri = URI.parse(url)
  ext = [&amp;quot;.&amp;quot;, uri.path.split(/&#92;./).last].join(&amp;quot;&amp;quot;)

  dest = File.join &amp;quot;/tmp&amp;quot;, Dir::Tmpname.make_tmpname([&#39;list&#39;, ext], nil)

  puts &amp;quot;#{url} -&amp;gt; #{dest}&amp;quot;

  open(dest, &#39;wb&#39;) do |file|
    file &amp;lt;&amp;lt; open(url).read
  end

  # if the image is too big, let&#39;s lower the quality a bit
  if File.size(dest) &amp;gt; 5_000_000
    `mogrify -quality 65% #{dest}`
  end

  dest
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This method has one additional twist, which is that it checks the size
of the downloaded file. If it&#39;s too large, it runs the ImageMagick
command &lt;code&gt;mogrify&lt;/code&gt; on it to drop the quality down.&lt;/p&gt;
&lt;p&gt;At this point, I have the text of a tweet, a &lt;code&gt;page&lt;/code&gt; object from the
Wikiedpedia API library, and a hash that might have a file in it. I
combine it all together and tweet it out:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;output = [ tweet_title, page.fullurl ].join(&amp;quot;&#92;n&amp;quot;)

begin
  tweet(output, opts)
rescue Exception =&amp;gt; e
  puts e.inspect
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, I increment the index variable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bot.config[:index] += 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When the script is done running, this value will be updated in the
YAML config file for the bot.&lt;/p&gt;
&lt;p&gt;During this whole process, I ran the script a couple times. Chatterbot
has a &lt;code&gt;debug_mode&lt;/code&gt; command, which you can use to run a script without
actually sending a tweet, which is pretty handy.&lt;/p&gt;
&lt;p&gt;I&#39;m a pretty messy coder, especially when I&#39;m working on personal side
projects, so I fixed a couple bugs, spent awhile cleaning up my junky
code, etc, etc. Once I was happy with it, I uploaded my code to the
server where I run my bots.&lt;/p&gt;
&lt;p&gt;Then I needed to setup a cron job to run the bot every few hours. I
decided to run the bot every two hours for starters (I might slow it
down later), and for variery I run it at 2 minutes past the hour. This
is what the job looks like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2 */2 * * * . ~/.bash_profile; cd /var/stuff/lists_of_lists/; bundle exec ./lists_of_lists.rb &amp;gt;&amp;gt; tweets.log 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first bit specifies when the job runs. The rest of it is the
command that executes the bot. cron jobs usually run in a different
environment then you get when you login to a server via SSH, so you
need to explicitly load your environment, cd into the directory where
the script is, and run the script. the &lt;code&gt;&amp;gt;&amp;gt; tweets.log 2&amp;gt;&amp;amp;1&lt;/code&gt; bit sends any output
into the tweets.log file, which I can check for any errors/etc.&lt;/p&gt;
&lt;p&gt;Anyway, that&#39;s about it! I&#39;ve put the code &lt;a href=&quot;https://github.com/muffinista/lists_of_lists&quot;&gt;on
github&lt;/a&gt; -- please feel
free to take it and adapt it to your needs!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>@lists_of_lists</title>
    <link href="https://twitter.com/lists_of_lists" />
    <updated>2016-08-05T00:00:00Z</updated>
    <id>https://twitter.com/lists_of_lists</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Tweet Masker</title>
    <link href="https://chrome.google.com/webstore/detail/tweet-masker/aobdgenfpejjjfcpagkhognobonnjcbc" />
    <updated>2016-06-10T00:00:00Z</updated>
    <id>https://chrome.google.com/webstore/detail/tweet-masker/aobdgenfpejjjfcpagkhognobonnjcbc</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>@kiki_flies_exe</title>
    <link href="https://twitter.com/kiki_flies_exe" />
    <updated>2016-05-01T00:00:00Z</updated>
    <id>https://twitter.com/kiki_flies_exe</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>@cat_in_field</title>
    <link href="https://twitter.com/cat_in_field" />
    <updated>2016-03-07T00:00:00Z</updated>
    <id>https://twitter.com/cat_in_field</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>@snowfall_exe</title>
    <link href="https://twitter.com/snowfall_exe" />
    <updated>2015-12-14T00:00:00Z</updated>
    <id>https://twitter.com/snowfall_exe</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>@yulelogbot</title>
    <link href="https://twitter.com/yulelogbot" />
    <updated>2015-12-05T00:00:00Z</updated>
    <id>https://twitter.com/yulelogbot</id>
    <content type="html"></content>
  </entry>
  <entry>
    <title>@wayback_exe</title>
    <link href="https://muffinlabs.com/wayback_exe/" />
    <updated>2015-10-15T00:00:00Z</updated>
    <id>https://muffinlabs.com/wayback_exe/</id>
    <content type="html">
&lt;h1&gt;@wayback_exe&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/wayback_exe&quot;&gt;@wayback_exe&lt;/a&gt; is a bot
  that loads old pages from
  the &lt;a href=&quot;http://archive.org/web/&quot;&gt;Wayback Machine&lt;/a&gt; and
  generates screenshots of the output in an old browser.&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;T-BannerThe James Marshall Homepage&amp;#10;Jun 1997&amp;#10;&lt;a href=&quot;https://t.co/ClD8MMNGgo&quot;&gt;https://t.co/ClD8MMNGgo&lt;/a&gt; &lt;a href=&quot;https://t.co/GfExw9p4tv&quot;&gt;pic.twitter.com/GfExw9p4tv&lt;/a&gt;&lt;/p&gt;&amp;mdash; Wayyyyyyback (@wayback_exe) &lt;a href=&quot;https://twitter.com/wayback_exe/status/656438674670751744&quot;&gt;October 20, 2015&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;h2&gt;Why?&lt;/h2&gt;
&lt;p&gt;The Wayback Machine is an incredible tool. It has archived
    over &lt;a href=&quot;https://archive.org/about/faqs.php#9&quot;&gt;23
    petabtyes&lt;/a&gt; of data and grows by terabytes every day. The
    Wayback Machine launched just about 20 years ago, and I thought it
    would be interesting to write a bot displaying some of the oldest
    pages from the system.
&lt;/p&gt;

&lt;p&gt;By the way, if you like this bot, or if you like the internet, you
  should consider &lt;a href=&quot;https://archive.org/donate/&quot;&gt;donating to
  the Internet Archive&lt;/a&gt;. This bot wouldn&#39;t be possible without
  their hard work.&lt;/p&gt;

&lt;h2&gt;Code&lt;/h2&gt;
&lt;p&gt;The bot is my first project using node.js. The code is pretty messy
  but I&#39;ve put
  it &lt;a href=&quot;https://github.com/muffinista/wayback_exe&quot;&gt;on Github&lt;/a&gt;
  for people to take a look and experiment. Please fork it and make
  your own weird page scrapers!&lt;/p&gt;

</content>
  </entry>
  <entry>
    <title>@botgle</title>
    <link href="https://muffinlabs.com/botgle/" />
    <updated>2015-07-01T00:00:00Z</updated>
    <id>https://muffinlabs.com/botgle/</id>
    <content type="html">
&lt;p&gt;&lt;a href=&quot;https://twitter.com/botgle&quot;&gt;@botgle&lt;/a&gt; is a bot that
  plays games of &lt;a href=&quot;https://en.wikipedia.org/wiki/Boggle&quot;&gt;Boggle&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;TIME FOR BOGGLE:&amp;#10;&amp;#10;Ｗ　Ｓ　Ｌ　Ｒ　&amp;#10;Ａ　Ｉ　Ｉ　Ｎ　&amp;#10;Ｇ　Ｂ　Ｗ　Ｓ　&amp;#10;Ｍ　Ｓ　Ｙ　Ｙ　&amp;#10;&amp;#10;🎶 💫 🐉&lt;/p&gt;&amp;mdash; BoggleBot (@Botgle) &lt;a href=&quot;https://twitter.com/Botgle/status/618171925462814721&quot;&gt;July 6, 2015&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;h2&gt;The Rules&lt;/h2&gt;

&lt;p&gt;
  The rules are pretty simple:
  &lt;/p&gt;&lt;ul&gt;
    &lt;li&gt;Just like in normal Boggle, there is a 4x4 grid of letters.&lt;/li&gt;
    &lt;li&gt;The goal is to find as many words as possible in eight minutes.&lt;/li&gt;
    &lt;li&gt;The game lasts for eight minutes, but the timer doesn&#39;t actually
      start until someone makes the first move.&lt;/li&gt;
    &lt;li&gt;Words must be built from adjacent tiles - the tiles must
      be touching horizontally, vertically, or diagonally.&lt;/li&gt;
    &lt;li&gt;Words must be at least three letters long.&lt;/li&gt;
    &lt;li&gt;Once someone plays a word, no one else can play it.&lt;/li&gt;
    &lt;li&gt;If you play a word that no one else has played, the bot will
    fav your tweet and send out a tweet with the words you found.&lt;/li&gt;
  &lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;


&lt;h2&gt;How To Play&lt;/h2&gt;
&lt;p&gt;It&#39;s easy! Just
  follow &lt;a href=&quot;https://twitter.com/botgle&quot;&gt;@botgle&lt;/a&gt;. There&#39;s
  four games a day, every six hours. When the game starts, tweet all
  the words you see in the grid at the bot. You can tweet more
  than one word at a time, and you can tweet as often as you like. The
  bot will reply with any valid words which haven&#39;t been played by
  another player. When the game is over, the bot will post the scores
  of everyone who played.&lt;/p&gt;

&lt;h2&gt;Notify Me Please!&lt;/h2&gt;
&lt;p&gt;If you would like to get DM notifications of upcoming games, DM
  &#39;NOTIFY&#39; to @botgle, and it will send you a message 10 minutes
  before any games. If you DM it &#39;WARN&#39;, it will send you a message 1
  minute before the game.&lt;/p&gt;

&lt;p&gt;If you are getting notifications and they are annoying, DM &#39;STOP&#39;
  to @botgle, and it will stop alerting you.&lt;/p&gt;

&lt;h2&gt;Scoring&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;3 and 4-letter words are worth 1 point.&lt;/li&gt;
  &lt;li&gt;5-letter words are worth 2 points.&lt;/li&gt;
  &lt;li&gt;6-letter words are worth 3 points.&lt;/li&gt;
  &lt;li&gt;7-letter words are worth 5 points.&lt;/li&gt;
  &lt;li&gt;Longer words are worth 11 points&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Code&lt;/h2&gt;
&lt;p&gt;The code for @botgle
  is &lt;a href=&quot;https://github.com/muffinista/botgle&quot;&gt;on github&lt;/a&gt;. A
  good chunk of the code for the board itself is based on earlier work
  &lt;a href=&quot;https://github.com/scheibo/boggle&quot;&gt;here&lt;/a&gt;. There&#39;s a
  bunch of ruby code for Boggle solvers out there and I didn&#39;t want to
  reinvent the wheel. That said, any errors here are almost certainly
  mine.&lt;/p&gt;

&lt;p&gt;The code is a mess and I&#39;ll be cleaning it up over the next few weeks.&lt;/p&gt;

&lt;a class=&quot;twitter-timeline&quot; data-dnt=&quot;true&quot; href=&quot;https://twitter.com/Botgle&quot; data-widget-id=&quot;618117136653770752&quot;&gt;Tweets by @Botgle&lt;/a&gt;

</content>
  </entry>
  <entry>
    <title>@kaleid_o_bot</title>
    <link href="https://muffinlabs.com/kaleid_o_bot/" />
    <updated>2015-02-01T00:00:00Z</updated>
    <id>https://muffinlabs.com/kaleid_o_bot/</id>
    <content type="html">
&lt;h1&gt;@kaleid_o_bot&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/kaleid_o_bot&quot;&gt;@kaleid_o_bot&lt;/a&gt; is a bot
  that will take an image you send to it, and run it through an
  algorithm to make it look like you are seeing it through a kaleidoscope.&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://twitter.com/muffinista&quot;&gt;@muffinista&lt;/a&gt; here you go &lt;a href=&quot;https://twitter.com/hashtag/northwest?src=hash&quot;&gt;#northwest&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/12slices?src=hash&quot;&gt;#12slices&lt;/a&gt; &lt;a href=&quot;http://t.co/akqJ7MpolK&quot;&gt;pic.twitter.com/akqJ7MpolK&lt;/a&gt;&lt;/p&gt;&amp;mdash; Kaleioscope (@kaleid_o_bot) &lt;a href=&quot;https://twitter.com/kaleid_o_bot/status/547433526581559296&quot;&gt;December 23, 2014&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;
You can send any image and it will tweet the results back to you. If
you want, you can pass a few options:
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;animating:&lt;/b&gt; You can choose to animate the output or not. If you pass &lt;i&gt;#animate&lt;/i&gt; the bot will animate the output to make a funky kaleidoscope effect. If you pass &lt;i&gt;#noanimate&lt;/i&gt; the bot will return a static image. The whole animation process is definitely a work in progress, and could fail at any moment.&lt;/li&gt;
  
  &lt;li&gt;&lt;b&gt;weighting:&lt;/b&gt; You can pass one of these options to specify
  which section of the image you would like to focus on:
    &lt;ul&gt;
      &lt;li&gt;&lt;i&gt;#northwest&lt;/i&gt;&lt;/li&gt;
      &lt;li&gt;&lt;i&gt;#north&lt;/i&gt;&lt;/li&gt;
      &lt;li&gt;&lt;i&gt;#northeast&lt;/i&gt;&lt;/li&gt;
      &lt;li&gt;&lt;i&gt;#east&lt;/i&gt;&lt;/li&gt;
      &lt;li&gt;&lt;i&gt;#southeast&lt;/i&gt;&lt;/li&gt;
      &lt;li&gt;&lt;i&gt;#south&lt;/i&gt;&lt;/li&gt;
      &lt;li&gt;&lt;i&gt;#southwest&lt;/i&gt;&lt;/li&gt;
      &lt;li&gt;&lt;i&gt;#west&lt;/i&gt;&lt;/li&gt;
      &lt;li&gt;&lt;i&gt;#center&lt;/i&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;b&gt;Slices:&lt;/b&gt; You can specify how many slices you want. Basically
    the algorithm will make an image with a chunk of the source image
    mirrored this many times. Here&#39;s the options:
    &lt;ul&gt;
      &lt;li&gt;&lt;i&gt;#4slices&lt;/i&gt;&lt;/li&gt;
      &lt;li&gt;&lt;i&gt;#8slices&lt;/i&gt;&lt;/li&gt;
      &lt;li&gt;&lt;i&gt;#12slices&lt;/i&gt;&lt;/li&gt;
      &lt;li&gt;&lt;i&gt;#16slices&lt;/i&gt;&lt;/li&gt;
      &lt;li&gt;&lt;i&gt;#20slices&lt;/i&gt;&lt;/li&gt;
      &lt;li&gt;&lt;i&gt;#24slices&lt;/i&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;NOTE:&lt;/b&gt; If you don&#39;t pass an option, a random option will be chosen for you&lt;/p&gt;

&lt;a class=&quot;twitter-timeline&quot; data-dnt=&quot;true&quot; href=&quot;https://twitter.com/kaleid_o_bot&quot; data-widget-id=&quot;547434401215553536&quot;&gt;Tweets by @kaleid_o_bot&lt;/a&gt;

</content>
  </entry>
  <entry>
    <title>Chatterbot: A Ruby Library for Twitter Bots</title>
    <link href="https://muffinlabs.com/chatterbot.html/" />
    <updated>2015-01-01T00:00:00Z</updated>
    <id>https://muffinlabs.com/chatterbot.html/</id>
    <content type="html">&lt;p&gt;Introducing &lt;a href=&quot;http://github.com/muffinista/chatterbot&quot;&gt;Chatterbot&lt;/a&gt;, a ruby library for producing bots.&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;It makes setting up Twitter OAuth permissions very easy.  The included &lt;code&gt;chatterbot-register&lt;/code&gt; script will walk you through authorization in a couple of steps and generate a skeleton script for your bot.&lt;/li&gt;
&lt;li&gt;It has a very simple DSL for generating basic bots. Here&#39;s a basic but functional example for an &lt;a href=&quot;https://twitter.com/#!/echoes_bot&quot;&gt;actual bot&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;script src=&quot;https://gist.github.com/992405.js?file=gistfile1.rb&quot;&gt;&lt;/script&gt;
&lt;ul&gt;
&lt;li&gt;It will run searches for you -- multiple searches if you want, and you can also check for responses to your tweets.  This is the main functionality of all my bots so far -- search for a phrase or some keywords, and reply to those tweets in some interesting fashion, and then also potentially reply to any mentions of your name.  You can do a lot with this sort of functionality on Twitter -- it&#39;s mostly what actual humans do on it all day long.&lt;/li&gt;
&lt;li&gt;A very basic macro system -- if you reply to a tweet with your bot, and put &amp;quot;#USER#&amp;quot; in the reply string, it will replace that with the name of the user you&#39;re replying to.&lt;/li&gt;
&lt;li&gt;A fairly simple, but extensible configuration system.  If you just want to run a single bot, it will store your configuration data in a YAML file, and you never even need to look at it.  But if you want to run multiple bots, you can setup a global config file to store several common parameters.  You can also optionally store your configuration in a database.&lt;/li&gt;
&lt;li&gt;If desired, you can log tweets to a database.  This is handy for tracking your bots activity over time.&lt;/li&gt;
&lt;li&gt;It has a blacklist system to keep you from annoying users who don&#39;t want to be annoyed, and also to make it easy to ignore tweets which have certain keywords in them.&lt;/li&gt;
&lt;li&gt;It has a &#39;debug mode&#39; so you can test the bot without sending out actual tweets.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Setting up a Bot&lt;/h2&gt;
&lt;h3&gt;Make a Twitter Account&lt;/h3&gt;
&lt;p&gt;First thing you&#39;ll need to do is create an account for your bot on
Twitter.  That&#39;s the easy part.&lt;/p&gt;
&lt;h3&gt;Install Chatterbot&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;gem install chatterbot&lt;/code&gt; should do the trick.&lt;/p&gt;
&lt;h3&gt;Run the Generator&lt;/h3&gt;
&lt;p&gt;Chatterbot comes with a script named &lt;code&gt;chatterbot-register&lt;/code&gt; which will
handle two tasks -- it will authorize your bot with Twitter and it
will generate a skeleton script, which you use to implement your
actual bot.&lt;/p&gt;
&lt;h3&gt;Write your bot&lt;/h3&gt;
&lt;p&gt;Chatterbot has a very simple DSL inspired by Sinatra and Twibot, an
earlier Twitter bot framework.  Here&#39;s an example, based on
&lt;a href=&quot;http://twitter.com/#!/Dr_Rumack&quot;&gt;@dr_rumack&lt;/a&gt;, an actual bot running
on Twitter:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;    require &#39;chatterbot/dsl&#39;
    search(&amp;quot;&#39;surely you must be joking&#39;&amp;quot;) do |tweet|
      reply &amp;quot;@#{tweet_user(tweet)} I am serious, and don&#39;t call me Shirley!&amp;quot;, tweet
    end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or, you can create a bot object yourself, extend it if needed, and use it like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ruby&quot;&gt;   bot = Chatterbot::Bot.new
   bot.search(&amp;quot;&#39;surely you must be joking&#39;&amp;quot;) do |tweet|
     bot.reply &amp;quot;@#{tweet_user(tweet)} I am serious, and don&#39;t call me Shirley!&amp;quot;, tweet
   end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#39;s it!&lt;/p&gt;
&lt;h2&gt;Bots in Action&lt;/h2&gt;
&lt;p&gt;You can check out the bots I&#39;ve written on my &lt;a href=&quot;https://muffinlabs.com/content/twitter-bot-info&quot;&gt;Twitter Bot&lt;/a&gt; page, and there&#39;s a bunch of relevant stuff tagged as &#39;&lt;a href=&quot;https://muffinlabs.com/category/tags/twitter&quot;&gt;twitter&lt;/a&gt;&#39; on muffinlabs.&lt;/p&gt;
&lt;p&gt;Got questions? Did I document something poorly? &lt;a href=&quot;https://muffinlabs.com/contact.html&quot;&gt;Contact me&lt;/a&gt; here or on &lt;a href=&quot;http://github.com/muffinista/chatterbot&quot;&gt;Github&lt;/a&gt; and I&#39;ll see what I can do about that.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>A Real River</title>
    <link href="https://muffinlabs.com/posts/2014/12/11/a-real-river/" />
    <updated>2014-12-11T00:25:00Z</updated>
    <id>https://muffinlabs.com/posts/2014/12/11/a-real-river/</id>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://twitter.com/arealriver&quot;&gt;@ARealRiver&lt;/a&gt; is a Twitter bot that charts the course of a
generative river via emoji. The course of the river is constant as it
transitions between tweets, so you can scroll through 100s of tweets
and watch the river expand and shrink, and meander back and forth,
passing cities and forests and volcanoes and other scenery as it goes.&lt;/p&gt;
&lt;img src=&quot;https://muffinlabs.com/images/ARealRiver.png&quot;&gt;
&lt;p&gt;There were a lot of different inspirations for this bot. I was
directly influenced by &lt;a href=&quot;https://twitter.com/katierosepipkin&quot;&gt;@katierosepipkin&lt;/a&gt;&#39;s
&lt;a href=&quot;https://twitter.com/tiny_star_field&quot;&gt;@tiny_star_field&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/dungeon_bot&quot;&gt;dungeon_bot&lt;/a&gt; by
&lt;a href=&quot;https://twitter.com/jeffthompson_&quot;&gt;@jeffthompson_&lt;/a&gt;, as well as by accounts like
&lt;a href=&quot;https://twitter.com/crashtxt&quot;&gt;@crashtxt&lt;/a&gt; and the &lt;a href=&quot;https://twitter.com/hashtag/140art?src=hash&quot;&gt;#140art&lt;/a&gt; hash tag.&lt;/p&gt;
&lt;p&gt;Another lingering inspiration was a book from the early 80s: &lt;em&gt;Computer
Spacegames&lt;/em&gt; from Usborne Publishing.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://muffinlabs.com/images/computer-spacegames.jpg&quot;&gt;&lt;img src=&quot;https://muffinlabs.com/images/computer-spacegames-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This book was one of several that introduced me to programming. You
can get a look at it and many others like it &lt;a href=&quot;http://mocagh.org/loadpage.php?getcompany=usborne-hayes&quot;&gt;here&lt;/a&gt;. It&#39;s
full of source code for simple games written in BASIC. In particular,
there&#39;s one called &lt;em&gt;Death Valley&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://muffinlabs.com/images/death-valley.jpg&quot;&gt;&lt;img src=&quot;https://muffinlabs.com/images/death-valley-small.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This was a super-simple game that placed you in a canyon that probably
looked a lot like this:&lt;/p&gt;
&lt;pre&gt;
*            *
 *            *
  *            *
   *            *
    *            *
     *            *
   *            *
    *            *
  *            *
 *            *
*     X       *
&lt;/pre&gt;
&lt;p&gt;Your ship is the X, and you need to run along the canyon for as long
as possible. Good luck!&lt;/p&gt;
&lt;p&gt;I spent years iterating on programs like this as a young programmer,
all the way through high school. I would experiment with different
output, different speeds, obstacles, etc. It&#39;s always stuck with me
and ARealRiver is definitely inspired by my time with this code.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>EarthRoverBot</title>
    <link href="https://muffinlabs.com/rover/" />
    <updated>2014-10-01T00:00:00Z</updated>
    <id>https://muffinlabs.com/rover/</id>
    <content type="html">


&lt;script src=&quot;https://muffinlabs.com/rover/scripts.js&quot;&gt;&lt;/script&gt;

&lt;h1&gt;@EarthRoverBot status page&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/EarthRoverBot&quot;&gt;@EarthRoverBot&lt;/a&gt; is a
  simulation of a rover that travels the globe via Google Street View
  imagery. Basically, it stitches together a route by hopping from point
  to point, wherever there is valid street view data.&lt;/p&gt;

&lt;p&gt;In April 2017 the bot completed its first trip from the Canada/US
  border in Maine, to the US/Mexico border in California, near San
  Diego. You can see &lt;a href=&quot;https://muffinlabs.com/rover/maine-to-california/&quot;&gt;a map of that trip&lt;/a&gt;
  if you like.&lt;/p&gt;

&lt;p&gt;The bot is currently in eastern Russia, and is maybe driving to
  Portugal? I reserve the right to change my mind about that one.&lt;/p&gt;

&lt;p&gt;Although the bot can move on its own, it also accepts commands via
Twitter, and humans often help it to find paths through difficult
situations. Without human input, the bot will make a move every 20
minutes.&lt;/p&gt;

&lt;p&gt;The bot has some very simple navigation routines, and it will attempt
to drive itself to its destination, but it will only travel to places
that have Google Street Map data. Every 20 minutes it will pick a move
to make, hopefully towards the destination.&lt;/p&gt;

&lt;p&gt;But it&#39;s not very smart, so it could definitely use some help from
humans! You can issue commands to the bot via Twitter to help it on
its way. Here&#39;s a list of commands @EarthRoverBot accepts:&lt;/p&gt;


&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;help&lt;/b&gt; - Asking for help will send you to this page.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;status&lt;/b&gt; - Send this command to get the bot&#39;s position, bearing,
    and a picture of what it can see.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;map&lt;/b&gt; - Are you lost? Send this command to get a Google Map URL of the
    bot&#39;s current location.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;auto&lt;/b&gt; - make a move using the bot&#39;s autopilot&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;move x&lt;/b&gt; - Move the bot x meters. You can pass a negative value to
    go backwards&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;turn x&lt;/b&gt; - turn right x degrees. You can pass a
    negative value if you want.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;left x&lt;/b&gt; - turn left x degrees&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;right x&lt;/b&gt; - turn right x degrees&lt;/li&gt;
 
&lt;/ul&gt;

&lt;a class=&quot;twitter-timeline&quot; data-dnt=&quot;true&quot; href=&quot;https://twitter.com/EarthRoverBot&quot; data-widget-id=&quot;497812496950894592&quot;&gt;Tweets by @EarthRoverBot&lt;/a&gt;


&lt;p&gt;Also, to get around Twitter&#39;s duplicate tweet limitations, you can add
extra words/characters to a command. For example, &quot;@EarthRoverBot move
10&quot; and &quot;@EarthRoverBot move 10 please&quot; will both work.&lt;/p&gt;

&lt;p&gt;This map tracks where the rover is. It will update every 15 minutes
  or so.&lt;/p&gt;
&lt;div class=&quot;full-bleed&quot; id=&quot;map-canvas&quot;&gt;&lt;/div&gt;

</content>
  </entry>
  <entry>
    <title>US Prisons</title>
    <link href="https://muffinlabs.com/posts/2014/09/13/us-prisons/" />
    <updated>2014-09-13T13:14:00Z</updated>
    <id>https://muffinlabs.com/posts/2014/09/13/us-prisons/</id>
    <content type="html">&lt;p&gt;I launched &lt;a href=&quot;https://twitter.com/usprisons&quot;&gt;@USPrisons&lt;/a&gt; on Twitter a
few weeks ago. It will output every prison in the
United States -- or at least, I think it&#39;s all of them. I found a
&lt;a href=&quot;http://www.insideprison.com/&quot;&gt;website&lt;/a&gt; with the data, did a bunch of parsing and cleanup, and ended
up with 4763 prisons. The bot should spend a year listing them all,
along with a few stats, and a picture if possible.&lt;/p&gt;
&lt;p&gt;If you&#39;re interested, I released
&lt;a href=&quot;https://github.com/muffinista/prison_scrape&quot;&gt;the code&lt;/a&gt; that does the
parsing on github.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>StckMrktStatus - Providing Logical Explanations for the Stock Market</title>
    <link href="https://muffinlabs.com/posts/2014/04/21/stckmrktstatus---providing-logical-explanations-for-the-stock-market/" />
    <updated>2014-04-21T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2014/04/21/stckmrktstatus---providing-logical-explanations-for-the-stock-market/</id>
    <content type="html">&lt;p&gt;I&#39;ve always thought the stock market reports you hear on the news are
fairly silly. &amp;quot;The Dow Jones was up x% because this or that happened.&amp;quot;
The people saying those things always sound smart and informed, but no
one really has any idea why a stock goes up or down in value. So, I
made a bot to do the same thing. &lt;a href=&quot;https://twitter.com/StckMrktStatus&quot;&gt;@StckMrktStatus&lt;/a&gt; will pick a stock
from the NASDAQ or Dow Jones, see how it is doing for the day, and
then add a reason for the change. The reasons are pulled from tweets
that have the word &#39;because&#39; on them. It&#39;s pretty simple but seems to
work nicely:&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;twitter-timeline&quot; href=&quot;https://twitter.com/StckMrktStatus&quot; data-widget-id=&quot;458347021812789248&quot;&gt;Tweets by @StckMrktStatus&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code is pretty simple, and I&#39;ll post it sometime soon (I&#39;m working
on a post about the code of my last few bots in general).&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>SpaceJamCheck: Space Jam website monitoring on Twitter</title>
    <link href="https://muffinlabs.com/posts/2014/01/09/spacejamcheck-space-jam-website-monitoring-on-twitter/" />
    <updated>2014-01-09T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2014/01/09/spacejamcheck-space-jam-website-monitoring-on-twitter/</id>
    <content type="html">&lt;p&gt;People who have been online for awhile probably know that the &lt;a href=&quot;http://www2.warnerbros.com/spacejam/movie/jam.htm&quot;&gt;website
for Space Jam&lt;/a&gt;, a movie from 1996, is online still, and is essentially
unchanged:&lt;/p&gt;
&lt;img src=&quot;https://muffinlabs.com/images/space-jam-small.jpg&quot;&gt;
&lt;p&gt;(If you don&#39;t know what I&#39;m talking about, you can read about it &lt;a href=&quot;http://lmgtfy.com/?q=space+jam+website+still+up&quot;&gt;here&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;At the end of 2010, someone noticed that the website was still online.
Before I did a little research, I was convinced that people must have
realized this before then, but &lt;a href=&quot;http://www.google.com/trends/explore#q=%22space%20jam%22&amp;amp;geo=US&amp;amp;cmpt=q&quot;&gt;Google suggests otherwise&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, here&#39;s &lt;a href=&quot;http://techcrunch.com/2010/12/31/space-jam/&quot;&gt;an article&lt;/a&gt; that summarizes how it all happened,
basically some Reddit user noticed, the word spread, and then it went
viral on Twitter.&lt;/p&gt;
&lt;p&gt;I haven&#39;t seen this mentioned anywhere, but according to the headers
for the website, there were actually some modifications of some sort
in 2005:&lt;/p&gt;
&lt;p&gt;HEAD http://www2.warnerbros.com/spacejam/movie/jam.htm
200 OK
Connection: close
Date: Fri, 10 Jan 2014 02:12:09 GMT
Accept-Ranges: bytes
ETag: &amp;quot;89dfb-13c5-4027752a8ca80&amp;quot;
Server: Apache
Content-Length: 5061
Content-Type: text/html
Last-Modified: Thu, 06 Oct 2005 15:10:18 GMT&lt;/p&gt;
&lt;p&gt;It&#39;s possible this was just a server move or something like that, but
it&#39;s interesting to think that someone actually did some &lt;em&gt;maintenance&lt;/em&gt;
of some sort on the site.&lt;/p&gt;
&lt;p&gt;I enjoy visiting the site, especially when I get nostalgic for the
early days of my work on the internet. There are so many projects
which I&#39;ve worked on over the years, and a lot of them are gone
forever. It&#39;s nice to see one that has managed to survive.&lt;/p&gt;
&lt;p&gt;Because I&#39;m lazy, and like easy reassurance, I wrote a
&lt;a href=&quot;https://twitter.com/SpaceJamCheck&quot;&gt;@SpaceJamStatus&lt;/a&gt;, a Twitter bot that will check on the status of the
website every few hours and tweet out the status:&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;twitter-timeline&quot; href=&quot;https://twitter.com/SpaceJamCheck&quot; data-widget-id=&quot;421465296361103361&quot;&gt;Tweets by @SpaceJamCheck&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Furthermore, because I am apocalyptic, I wrote
&lt;a href=&quot;https://twitter.com/spacejamisdown&quot;&gt;@spacejamisdown&lt;/a&gt;, a bot which checks the status of
the website every few hours, and will only report if it&#39;s not online:&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;twitter-timeline&quot; href=&quot;https://twitter.com/spacejamisdown&quot; data-widget-id=&quot;421465631746060288&quot;&gt;Tweets by @spacejamisdown&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With a little luck, this bot won&#39;t tweet any time soon.&lt;/p&gt;
&lt;p&gt;Finally, because I have a love of writing random libraries, I wrote
the ruby gem &lt;a href=&quot;https://github.com/muffinista/spacejam&quot;&gt;spacejam&lt;/a&gt;, which is a pretty simple Ruby library
you can use to check on the status of any website. It can do tests
against expected response codes, the body of a page, etc. It&#39;s pretty
simple, but it&#39;s good enough to check on the status of the Space Jam
website.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Each Town - Listing All Towns in America on Twitter</title>
    <link href="https://muffinlabs.com/posts/2013/10/16/each-town---listing-all-towns-in-america-on-twitter/" />
    <updated>2013-10-16T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2013/10/16/each-town---listing-all-towns-in-america-on-twitter/</id>
    <content type="html">&lt;p&gt;A week or two ago I launched &lt;a href=&quot;https://twitter.com/eachtown&quot;&gt;@eachtown&lt;/a&gt; on Twitter. It will spend the
next couple years tweeting the name and location of every populated
place in America, in alphabetical order.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;twitter-timeline&quot; data-dnt=&quot;true&quot; href=&quot;https://twitter.com/eachtown&quot; data-widget-id=&quot;390546604588924928&quot;&gt;Tweets by @eachtown&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A couple of years ago, I spent a lot of time fiddling with the
&lt;a href=&quot;http://gnis.usgs.gov/index.html&quot;&gt;USGS database of Geographic Names&lt;/a&gt;. It&#39;s a cool set of data and
I&#39;ve often thought of doing more with it. I was inspired by
&lt;a href=&quot;https://twitter.com/everyword&quot;&gt;@everyword&lt;/a&gt; to create something similar, and decided to
create a bot which iterates through every populated place in America,
and tweets the name, and a link to a Google Map for the location. I
enjoy the context you get from having the ability to look at a place.
Not every location in the database is a city or even a town. There&#39;s
mobile home parks, condominiums, etc. Seeing them on the map gives you
a sense of the fact that these places are real, and gives them a
little context.&lt;/p&gt;
&lt;div&gt;
&lt;img src=&quot;https://muffinlabs.com/images/agnew-mobile-home-park-wa.jpg&quot; class=&quot;imgp_img&quot; alt=&quot;Agnew Mobile Home Park, WA&quot;&gt;
&lt;/div&gt;
**[Agnew Mobile Home Park, WA][agnew]**
&lt;p&gt;It&#39;s a pretty simple bot, and I&#39;ll post the source code at some point
once I clean it up a little.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Gopherpedia - The Free Encyclopedia via gopher</title>
    <link href="https://muffinlabs.com/posts/2013/06/14/gopherpedia---the-free-encyclopedia-via-gopher/" />
    <updated>2013-06-14T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2013/06/14/gopherpedia---the-free-encyclopedia-via-gopher/</id>
    <content type="html">&lt;p&gt;My last release for Project Dump week is &lt;a href=&quot;http://gopherpedia.com/&quot;&gt;Gopherpedia&lt;/a&gt; --
a mirror of Wikipedia in gopherspace. If you happen to have a gopher
client, you can see it at gopherpedia.com on port 70. Otherwise, you
can browse to &lt;a href=&quot;http://gopherpedia.com/&quot;&gt;gopherpedia.com&lt;/a&gt; and view it via a web
proxy.&lt;/p&gt;
&lt;p&gt;A couple of years ago, I landed on the idea of a gopher interface to
Wikipedia. Originally it was probably a joke, but it stuck with me. So
one day I registered a domain name and got to work. The first thing I
needed to do was build a gopher server, because none of the currently
available options were up to the task. So I built
&lt;a href=&quot;https://github.com/muffinista/gopher2000&quot;&gt;Gopher2000&lt;/a&gt;. Then, I quickly realized that the current
gopher proxies weren&#39;t any good either, so I built &lt;a href=&quot;https://github.com/muffinista/gophper-proxy&quot;&gt;GoPHPer&lt;/a&gt;.
Once both of those were written (well over a year ago), it didn&#39;t seem
like there was much left to be done -- gopherpedia should&#39;ve been
ready to launch.&lt;/p&gt;
&lt;p&gt;But I hadn&#39;t reckoned on the challenges of churning through a database dump
of Wikipedia.&lt;/p&gt;
&lt;p&gt;Wikipedia is very open. They have an API which you can use to search
and query documents, and they provide
&lt;a href=&quot;http://dumps.wikimedia.org/&quot;&gt;downloadable archives&lt;/a&gt; of their entire collection of
databases. They encourage you to download these, mirror them, etc.&lt;/p&gt;
&lt;p&gt;My first implementation of gopherpedia used the API. This worked well,
but had two problems. First, it was a little slow, since it needed to
query a remote server for every request. Second, Wikipedia prohibits
using the API this way - if you want to make a mirror of their
website, they want you to download an archive and use that, so their
servers aren&#39;t overloaded.&lt;/p&gt;
&lt;p&gt;So I downloaded a dump of their database, which is a single 9GB
compressed XML file. Nine. Gigabytes. Compressed. A single file.&lt;/p&gt;
&lt;p&gt;Then a took the opportunity to learn about streaming XML Parsers.
Basically I wrote a &lt;a href=&quot;https://gist.github.com/muffinista/5781615&quot;&gt;parser script&lt;/a&gt; that parsed the file while
it was reading it, as opposed to reading the whole thing into memory
at once, which was clearly impossible. The script splits up wikipedia
entries and stores them as flat text files. Running that script took a
couple days on my extremely cheap Dreamhost server -- that&#39;s right, I
have a gopher server hosted on Dreamhost.&lt;/p&gt;
&lt;p&gt;So, when someone requests a page, the gopher server reads that file,
does some parsing, and returns the result as a gopher query. Sounds
simple, right? Not quite, because parsing the contents of a wikipedia
entry is also a mess. It&#39;s part wikitext, part HTML, and there&#39;s
plenty of places where both are broken. If I was just outputting HTML,
I could probably get away with it. But since this is Gopher I really
needed to format the results as plain text. I spent a while writing an
incredibly messy parser, and the imperfect results are what you see on
gopherpedia now. Sorry for all the flaws.&lt;/p&gt;
&lt;p&gt;Anyway, this was a fun project, and it occupied a pleasant chunk of my
spare time over the last year or two, but it&#39;s time to release it to
the wild. Unless I&#39;m mistaken, this is now the largest gopher site in
existence. There are about 4.2 million pages on gopherpedia, totaling
somewhere over 10GB of data.&lt;/p&gt;
&lt;p&gt;Here&#39;s my favorite page on the site -- the
&lt;a href=&quot;http://gopherpedia.com/gopherpedia.com/Gopher%20(protocol)&quot;&gt;gopherified wikipedia entry for Gopher&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please note, this is in extreme beta, and is likely to break, just let
me know if you have any problems. Enjoy!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Gophper - A Modern Gopher Proxy for the Modern Age</title>
    <link href="https://muffinlabs.com/posts/2013/06/13/gophper/" />
    <updated>2013-06-13T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2013/06/13/gophper/</id>
    <content type="html">&lt;p&gt;As I mentioned &lt;a href=&quot;http://muffinlabs.com/2013/06/12/goper2000---a-modern-gopher-server&quot;&gt;yesterday&lt;/a&gt;, building Gopher applications
is fun, but using gopherspace is actually pretty challenging unless
you&#39;re a die-hard throwback geek. I have a super-secret gopher project
(to be revealed tomorrow), but it&#39;s pretty useless if no one can
actually see it. Sure, I could write up a blog post about how to
download a gopher client, etc, etc, but that&#39;s just dumb.&lt;/p&gt;
&lt;p&gt;There&#39;s a few gopher proxies out there -- primarily
&lt;a href=&quot;http://gopher.floodgap.com/gopher/&quot;&gt;floodgap&lt;/a&gt; and &lt;a href=&quot;http://gopherproxy.meulie.net/&quot;&gt;meulie&lt;/a&gt; -- these are websites which
you can use to browse gopher servers. But there&#39;s a few problems with
these proxies. First, they&#39;re a little clunky. They&#39;re handy tools,
but they&#39;re not really attractive, and the HTML they output is pretty
old-fashioned. And most importantly, neither one is open-source.&lt;/p&gt;
&lt;p&gt;I wanted a simple gopher proxy, using modern web standards, that was
open-source and easy to install. So, I wrote &lt;a href=&quot;https://github.com/muffinista/gophper-proxy&quot;&gt;gophper&lt;/a&gt;.
You can see it in action at &lt;a href=&quot;http://gopher.muffinlabs.com/&quot;&gt;gopher.muffinlabs.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&#39;s the details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It runs on PHP using &lt;a href=&quot;http://www.slimframework.com/&quot;&gt;Slim&lt;/a&gt;, which is a nifty lightweight application framework.&lt;/li&gt;
&lt;li&gt;It caches requests for faster response times.&lt;/li&gt;
&lt;li&gt;All of the rendering happens in the browser, which means someone could easily write a different backend.&lt;/li&gt;
&lt;li&gt;It has a wacky theme switcher, so you can choose between a nice
modern look, or an old-school monochrome CRT look.&lt;/li&gt;
&lt;li&gt;If the user accesses a binary file, they can download it. If they click on an image, they can see it in the browser.&lt;/li&gt;
&lt;li&gt;It can be integrated with Google Analytics.&lt;/li&gt;
&lt;li&gt;You can restrict it to a single gopher server, so you can integrate it into your project without any fears of someone using your proxy for naughty tricks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&#39;s still a little rough around the edges, but it definitely works. I
would love to see it used all over the place. But tomorrow I&#39;ll reveal
where I&#39;m using it.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Gopher2000 - A Modern Gopher Server</title>
    <link href="https://muffinlabs.com/posts/2013/06/12/gopher2000---a-modern-gopher-server/" />
    <updated>2013-06-12T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2013/06/12/gopher2000---a-modern-gopher-server/</id>
    <content type="html">&lt;p&gt;I&#39;m old enough that the Internet basically didn&#39;t exist for anyone
other than a college student or scientist when I was a teenager, but
by the time I graduated from college it was everywhere. My first
access to the Internet was via a friend-of-a-friend-of-a-friend&#39;s
borrowed account on a Clark University server while I was in high
school. I still remember the password.&lt;/p&gt;
&lt;p&gt;I was nerdy enough to be dialing into BBSes at this point, and I even
managed to communicate over some distance in discussion groups via
&lt;a href=&quot;http://en.wikipedia.org/wiki/FidoNet&quot;&gt;FIDOnet&lt;/a&gt;, but that was a pretty pale comparison to
undiscovered wilderness of the Internet. Most of my knowledge of the
Internet came from reading &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Cuckoo&#39;s_Egg_(book)&quot;&gt;&lt;em&gt;The Cuckoo&#39;s Egg&lt;/em&gt;&lt;/a&gt;. When I
finally had real access, naturally I spent most of my time playing on
Multi-User Dungeons like &lt;a href=&quot;http://www.dartmud.com/&quot;&gt;DartMud&lt;/a&gt; and &lt;a href=&quot;http://www.eotl.org/&quot;&gt;EOTL&lt;/a&gt; -- and
somehow they both still exist. At the time, everything was text-based,
so &lt;a href=&quot;http://www.bogleg.com/eotl/welcome.php&quot;&gt;welcome screens&lt;/a&gt; like these were pretty amazing.&lt;/p&gt;
&lt;p&gt;My friends and I would learn about interesting FTP servers, and we
tried to download interesting documents and applications from them,
but we barely knew any commands to use, and the files were always in
weird archive formats that we didn&#39;t understand at the time, and of
course you couldn&#39;t Google it.&lt;/p&gt;
&lt;p&gt;So while it was amazing to be online, in a lot of ways it was very
limiting. Until I learned about Gopher.&lt;/p&gt;
&lt;p&gt;If you aren&#39;t familiar with it, Gopher is a very simple protocol for
browsing text documents on the Internet. It doesn&#39;t sound like much,
but before HTTP and the World-Wide Web, it was a revelation. There was
&lt;strong&gt;data&lt;/strong&gt; out there, and you could get it, if only you knew the
hostname. Luckily the first few years of &lt;a href=&quot;http://www.wired.com/wired/archive/1.05/net_surf.html&quot;&gt;Wired&lt;/a&gt; would post
interesting gopher address you could visit. Here&#39;s their description
of gopher from the &#39;Net Surf&#39; column of one of their early issues:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Is There a Rodent In Your Future?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;If you surf the Internet and haven&#39;t heard of gopher, you&#39;re
probably reefed in the backwaters somewhere. Gopher is one of
cyberspace&#39;s hidden gems - the application even employs that
buzz-term of computing, &amp;quot;client- server architecture.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Specifically, gopher is an information gathering tool that offers a
smooth, menu-driven way to traverse international &amp;quot;gopherspace&amp;quot; -
which these days literally means several hundred servers worldwide,
offering text (from the CIA Fact Book to the Bible), computer
programs, audio, still images, and even movie clips. Gopher provides
a seamless, &amp;quot;hidden programming&amp;quot; interface with which you can
transfer files, browse databases, and telnet to sites around the
globe, simply and easily. For example, gopher the University of
Wisconsin-Parkside (gopher.uwp.edu) and you&#39;ll find the music
server: a collection of song lyrics, discographies and sound files
from a variety of selected tunes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Another destination, the ArchiGopher at the University of Michigan,
contains photographed examples of French architecture and Ann Arbor
campus buildings, as well as scanned copies of paintings by
Kandinsky. Via gopher, academics can search for employment while
students can seek information on various campuses. But there is a
catch: To access these goodies, you must have direct access to the
Internet (with client software), or be able to remotely login to Net
servers that offer that capability. (The software is publicly
available via ftp at boombox.micro.umn.edu, in directory
pub/gopher.) Then it&#39;s as simple as typing &amp;quot;gopher&amp;quot; and the server
address (with proper command accompaniment, such as &amp;quot;%&amp;quot; for Unix
clients).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Gopher, the helpful rodent, was initially born of programmers at
the University of Minnesota (the Gopher State) in an effort to link
and search disparate, specialized computer systems on campus. Later
offered up to the Net, most public gopher servers have sprung up
only within the last year, while new rodents appear to be tunneling
fresh soil almost daily. This little tool is a definite nugget in
the ore of the Internet, rich with information. - Tom Zillner&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We&#39;re Listing, Captain&lt;/strong&gt;
Every two weeks, surfers anxiously await the &amp;quot;Yanoff List.&amp;quot; Compiled
by Scott Yanoff, a computer science student at the University of
Wisconsin (yanoff@csd4.csd.uwm.edu) the list offers concise
descriptions of helpful sites around the Net. Started in 1991 as a
personal log with only six entries, public distribution of The List
brought a flood of suggestions: Topics now range from philosophy to
amateur radio, astronomy to games. Yanoff also documents locations
for such research essentials as Archie, WAIS, Netfind and World Wide
Web (WWW or W3). (Internet Hunt participants remember this one ) Cut
over to USENET group alt.internet.services, or ftp or gopher
csd4.csd.uwm.edu (available in /pub/inet.services.txt). Don&#39;t leave
cyberspace without it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;I&#39;ll Gopher That&lt;/strong&gt;
Known also as the Whole Earth &#39;Lectronic Link, this particular
gopher shreds an info-tube It offers access to a host of electronic
magazines, an SF arena featuring input from well-known cybernauts
such as Bruce Sterling, as well as all the stuff you&#39;d expect from
old (and young) hippies. You&#39;ll find text from some of the major,
progressive magazines, help files for traversing the
big-bad-networks, the online Factsheet Five, art world calls for
action, and lots more edgy stuff to gnaw on. All in an easily
navigable, menu-driven environment that won&#39;t flatten out on you.
This service is provided by the Well, and can be accessed at
gopher.well.sf.ca.us. E-mail (gopher@well.sf.ca.us) with any
questions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wow, has the tone of that magazine changed over 20 years.&lt;/p&gt;
&lt;p&gt;Beyond sharing hostnames with your friends, if you knew about the
Gopher search engine &lt;a href=&quot;http://en.wikipedia.org/wiki/Veronica_(computer)&quot;&gt;Veronica&lt;/a&gt;, then you could find all
sorts of stuff. I first learned about Veronica from the teacher who
ran our high school Model United Nations club. He showed us how to use
it to download copies of UN Resolutions and other documents that
would&#39;ve been very hard to get otherwise. They still list a couple
gopher servers on their website, but unfortunately I can&#39;t find one
that&#39;s active anymore.&lt;/p&gt;
&lt;p&gt;Of course, Gopher lost out to HTTP. There were some
&lt;a href=&quot;http://www.nic.funet.fi/pub/vms/networking/gopher/gopher-software-licensing-policy.ancient&quot;&gt;regrettable licensing decisions&lt;/a&gt; that scared away a lot of
interest, and HTTP was always open. And even though in some ways it
has never fulfilled this promise, HTTP was all about collaborative
sharing and even editing of documents, something that was lacking from
Gopher.&lt;/p&gt;
&lt;p&gt;Today there&#39;s still a couple hundred gopher servers out there, with
maybe a million or two pages on them, which is obviously nothing
compared to the incredible mass of data you can access via your
browser. But I still have a fondness for Gopher, for a few reasons.
First, because it was part of my formative years on the internet.
Second, because it has an important place in the history of the
internet, and given how ephemeral digital history is, it&#39;s easy to
lose track of this. And finally, because it is super-hackable.&lt;/p&gt;
&lt;p&gt;And since it&#39;s so hackable, I went ahead and wrote a modern,
fully-functional Gopher server in Ruby: &lt;a href=&quot;https://github.com/muffinista/gopher2000&quot;&gt;&lt;strong&gt;Gopher2000&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;
     _____             _                 _____  _____  _____  _____
    |  __ &#92;           | |               / __  &#92;|  _  ||  _  ||  _  |
    | |  &#92;/ ___  _ __ | |__   ___ _ __  `&#39; / /&#39;| |/&#39; || |/&#39; || |/&#39; |
    | | __ / _ &#92;| &#39;_ &#92;| &#39;_ &#92; / _ &#92; &#39;__|   / /  |  /| ||  /| ||  /| |
    | |_&#92; &#92; (_) | |_) | | | |  __/ |    ./ /___&#92; |_/ /&#92; |_/ /&#92; |_/ /
     &#92;____/&#92;___/| .__/|_| |_|&#92;___|_|    &#92;_____/ &#92;___/  &#92;___/  &#92;___/
                | |
                |_|
&lt;/pre&gt;
&lt;p&gt;There are a few gopher server frameworks out there, but most of them
are lacking in one way or another. They&#39;re focused on delivering
static pages, or they force you to use weird methods of putting
together your menus. There&#39;s even a few rough Ruby scripts out there
for serving gopher requests, but they are all either so old that they
don&#39;t work with a modern Ruby, or the code is lacking in one way or
another.&lt;/p&gt;
&lt;p&gt;I wanted to build the best Gopher server imaginable, using everything
I&#39;ve learned in my career writing software. I wanted something simple,
with an easy, flexible syntax that stays out of your way. For example,
this is the code for a working gopher application:&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/muffinista/5766917.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;Gopher2000 is inspired by &lt;a href=&quot;http://www.sinatrarb.com/about.html&quot;&gt;Sinatra&lt;/a&gt;, an awesome web framework
also built in Ruby. Reviewing the code for Sinatra (and reading the
book &lt;a href=&quot;http://shop.oreilly.com/product/0636920019664.do&quot;&gt;Sinatra: Up and Running&lt;/a&gt;) has inspired me and
educated me about code more than any other place in recent memory.&lt;/p&gt;
&lt;p&gt;Here&#39;s a few nice things about Gopher2000:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simple, Sintra-inspired routing and templating DSL. It&#39;s easy to
define routes, build menus, accept input, etc.&lt;/li&gt;
&lt;li&gt;Dynamic routing of requests via named parameters on request paths,
and dynamic responses -- so you can have a dynamic, interactive
gopher site.&lt;/li&gt;
&lt;li&gt;It&#39;s easy to mount directories and serve up files if you&#39;re into that.&lt;/li&gt;
&lt;li&gt;Integrated logging and stats.&lt;/li&gt;
&lt;li&gt;Lots of helper methods for formatting output as prettily as possible&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I wrote most of Gopher2000 well over a year ago, and it&#39;s been
functional for a long while, but I never publicized it until now.&lt;/p&gt;
&lt;p&gt;Anyway, the real reason I wrote Gopher2000 is to help with the
top-secret gopher project which I will announce in a couple days.
Frankly, it&#39;s going to blow the fucking roof off of gopherspace. The
only problem is that no one will be able to see it -- Gopher support
has been stripped from all major web browsers over the years, and I&#39;m
guessing that you don&#39;t have a gopher client handy. My next post will
talk about how I handled that problem.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Just The Comments</title>
    <link href="https://muffinlabs.com/posts/2013/06/11/just-the-comments/" />
    <updated>2013-06-11T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2013/06/11/just-the-comments/</id>
    <content type="html">&lt;p&gt;&amp;quot;Don&#39;t read the bottom half of the internet&amp;quot; is a frequently repeated
phrase as you travel on the web -- meaning, avoid the comments on a
blog post or article whenever possible. In certain realms of the
internet, it&#39;s basically a truism.&lt;/p&gt;
&lt;p&gt;There&#39;s arguments out there both for and against it. Many bloggers
have gone so far as to disable commenting entirely on their sites.
Other bloggers find a lot of value in comments. But the notion of
skipping out on a huge chunk of the internet really interested me.&lt;/p&gt;
&lt;p&gt;It also raises an obvious question - instead of skipping it entirely,
what if you &lt;strong&gt;only&lt;/strong&gt; read the bottom half of the internet? Well,
&lt;a href=&quot;http://justthecomments.com/&quot;&gt;justthecomments.com&lt;/a&gt; is your chance to
do that, all in one place, and totally removed from the context of
pesky blog posts.&lt;/p&gt;
&lt;p&gt;The site pulls comments from the all of the websites using the Disqus
commenting system via their API in real time. You can read a bunch,
then click the &#39;load more comments&#39; button to see some more. There&#39;s
essentially no context here. The comments come from all over the web,
and have no relation to each other. I wanted to provide a link to the
source content, but it&#39;s actually sort of involved with the Disqus
API, and in hindsight, reading comments with no context whatsoever is
kind of amazing. Here&#39;s some choice comments I saw over the course of
a few minutes recently:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Yep! It is funny, I was required to read it Freshmen year of
college... the Progressive professor tried to say that it was a
roadmap to what Reagan was trying to impose upon the people... I could
see that nothing in the book came close to Reagan&#39;s policies (but they
did resemble what Carter had been saying and doing)... it only
reinforced my belief that Democrats will lie about who and what they
were. -- louisiana_mom
&lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Um, no it isn&#39;t. -- BRAND NEWCROW
&lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I mean, I&#39;ve seen Hara. Especially when she was truly stripped down in
those ChumChum Churi soju commercials. I&#39;m not saying that she has to
have the booty of Nicki Minaj/Kim Kardasian, but her body isn&#39;t
something amazing and heaven-sent to me either. -- Nova_REMIX
&lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Leftists are the most disgusting form of humanity that has been burped
up by the oceans. To try to leverage and manipulate individuals under
the guise of being in camp of the poor and unempowered is their great
evil. But, as with everyone, I hope you have a long and meaningful
life and that at some point you stop trying to foist the misanthropic
political philosphy that exists at the core of the Left. There, how&#39;s
that for positive. -- Alfa Spider
&lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;post a time and place, wear a purple shirt, and one of us will be
glad to meat you face to face and DEBATE further -- A Z
&lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;YOU ARE HOPELESS ans long as you continue to BLAME the GOP or
DEMOCRATS..you will NEVER understand what the problem is. you are
a_MORON -- Buddy
&lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Way to be classy. No valid point to make, namecall. -- Chiefpr&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As you read the comments, it&#39;s clear that many of them would probably
seem valid if you saw them in the context where they were written. But
in isolation, they are sometimes incredibly offensive. It makes me
think of moments of
&lt;a href=&quot;http://science.howstuffworks.com/science-vs-myth/everyday-myths/hush-crowded-room.htm&quot;&gt;crowd silence&lt;/a&gt;
where a crowd goes silent except for the one person who blurts out
something incredibly inappropriate.&lt;/p&gt;
&lt;p&gt;Some people like to be really immature, and sometimes very cruel, on
the Internet. Here&#39;s an
&lt;a href=&quot;http://www.uni-watch.com/2013/04/19/an-interview-with-uni-watchs-most-prominent-troll/&quot;&gt;amazing story&lt;/a&gt;
from someone who contacted a long-time troll on their website in order
to learn more about him. They have an amazing conversation. And the
troll is totally unlike his online persona.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>I Forgot My Age: A Special Helper</title>
    <link href="https://muffinlabs.com/posts/2013/06/10/i-forgot-my-age-a-special-helper/" />
    <updated>2013-06-10T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2013/06/10/i-forgot-my-age-a-special-helper/</id>
    <content type="html">&lt;p&gt;As we age, and stop remembering our exact age, down to the month/day,
and as other concerns begin to crowd into our brains, it can be easy
to forget something as essential as &#39;How old am I?&#39; Am I 37, or 38?
How old was I on my last birthday? And so on.&lt;/p&gt;
&lt;p&gt;To help with this serious problem, I launched
&lt;a href=&quot;http://iforgotmyage.com/&quot;&gt;iforgotmyage.com&lt;/a&gt;, a website where you can
enter your birthday and learn how old you are. Of course it sounds
dumb when you read that, but there&#39;s more! You can also learn how many
months, weeks, days, hours, minutes, and even seconds old you are.
Furthermore, the site sets a cookie so that on return trips you can
check your age quickly, and there&#39;s even a convenient bookmark you can
store to check your age. Finally, if you visit on your birthday, you
get a special surprise.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>WTFlevel.com: Real-Time Tracking of Swearing on Twitter</title>
    <link href="https://muffinlabs.com/posts/2012/11/05/wtflevelcom-real-time-tracking-of-swearing-on-twitter/" />
    <updated>2012-11-05T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2012/11/05/wtflevelcom-real-time-tracking-of-swearing-on-twitter/</id>
    <content type="html">&lt;p&gt;Today I&#39;m launching &lt;a href=&quot;http://wtflevel.com&quot;&gt;WTFlevel.com&lt;/a&gt;, a website that
tracks the rate and magnitude of swearing on Twitter, and displays
the data in real-time with a couple of snazzy dynamic charts. I wanted
to launch it in time for the election, and I just made it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PREDICTION&lt;/strong&gt; there will be a lot of swearing tomorrow and the next
day on Twitter.&lt;/p&gt;
&lt;p&gt;I have worked on a number of projects with Twitter - there are a
&lt;a href=&quot;https://muffinlabs.com/content/twitter-bot-info&quot;&gt;handful of bots&lt;/a&gt; that mostly entertain
people, and a &lt;a href=&quot;https://github.com/muffinista/chatterbot&quot;&gt;library&lt;/a&gt;
devoted to building them, along with a few other random
unpublished/discarded projects. Anyway, Twitter can be fairly
&lt;a href=&quot;https://muffinlabs.com/2012/06/04/the-current-state-of-bots-on-twitter/&quot;&gt;annoying&lt;/a&gt;, and I
doubt their API will last in its current form for too much longer, but
it&#39;s still fun to work with their data.&lt;/p&gt;
&lt;p&gt;Over time I noticed that people on Twitter swear a lot. I started
wondering - do people swear more online than they do in real life? And
could you identify trends or useful information in the rates of
cursing on Twitter? WTFLevel.com is an attempt to begin to answer
those questions.&lt;/p&gt;
&lt;p&gt;Using the Twitter Streaming API, I scan tweets for a collection a
swear words and other curse-like expressions. I calculate two values
from that data: the &lt;em&gt;rate&lt;/em&gt; of tweets which contain swears to those that
do not contain swears, and also the &lt;em&gt;magnitude&lt;/em&gt; of sweariness in those
tweets. For example, a tweet with more swears in it has a higher
magnitude than one which only has one swear in it.&lt;/p&gt;
&lt;p&gt;For fun, I invented a threat level scale, basically a spoof of the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Homeland_Security_Advisory_System&quot;&gt;Homeland Security threat level&lt;/a&gt;,
since the notion of color-coded threat levels hasn&#39;t been sufficiently
mocked yet.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Hsas-chart_with_header.svg/220px-Hsas-chart_with_header.svg.png&quot; alt=&quot;threat level&quot;&gt;&lt;/p&gt;
&lt;p&gt;I also tried to keep in mind the
&lt;a href=&quot;http://en.wikipedia.org/wiki/DEFCON&quot;&gt;DEFCON&lt;/a&gt; system which always gave
me chills during my childhood. And of course, who could forget this
scene from War Games:&lt;/p&gt;
&lt;iframe width=&quot;480&quot; height=&quot;360&quot; src=&quot;http://www.youtube.com/embed/UHBqJj0znYo?rel=0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;The level is assigned according to the current rate of swearing, with
a little math tossed in to predict if the rate is increasing or
decreasing. The colored bars displayed on the graph correspond to the
levels.&lt;/p&gt;
&lt;p&gt;I made a decision when I started the project to only look at tweets
that are reported as being in English, and to only look for English
swear words. This meant that I couldn&#39;t get a really good idea of the
global swearing status, but I don&#39;t really have the knowledge to
implement a decent system for tracking swears in other languages. That
said, I am really amazed to see that people swear a lot more what is
roughly the evening hours in America.&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://www.google.com/jsapi&quot;&gt;&lt;/script&gt;

&lt;div id=&quot;chart_div&quot; style=&quot;width: 500px; height: 400px;&quot;&gt;&lt;/div&gt;
&lt;p&gt;I expected to see a more constant level of swearing through the day.
It&#39;s not like there aren&#39;t reasons to swear in the morning or
something. So while I worked on the website, I spent a little time
researching the use of profanity in real life, to get an idea of how
it compares to online usage. According to Wikipedia&#39;s article on
&lt;a href=&quot;http://en.wikipedia.org/wiki/Profanity&quot;&gt;Profanity&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Analyses of recorded conversations reveal that roughly 80–90 spoken
words each day – 0.5% to 0.7% of all words – are swear words, with
usage varying from between 0% to 3.4%. In comparison, first-person
plural pronouns (we, us, our) make up 1% of spoken words.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Over two months of monitoring, I found that about 6.97% of tweets had
a swear in them. I need to work out the word count for that, but it
would seem to be roughly comparable to this analysis. By the way, the
&lt;a href=&quot;http://www.psychologicalscience.org/journals/pps/4_2_inpress/Jay.pdf&quot;&gt;article&lt;/a&gt;
cited by Wikipedia is fascinating.&lt;/p&gt;
&lt;p&gt;But I find it really interesting that there&#39;s an evening peak in the
data. Since we&#39;re measuring the rate here, and not the totals, I
expected swearing to be at least somewhat constant -- it didn&#39;t seem
like there would be a reason for there to be fewer sweary tweets in
the morning as opposed to the evening. I need to do a little digging
into the data to see if I can figure out if there&#39;s anything obvious
that can explain what is happening here. I might also change the
output a bit -- it&#39;s interesting to see the current rate of swearing,
but it might also be interesting to know how much higher/lower it is
than it usually is for the given time of day.&lt;/p&gt;
&lt;p&gt;If you like to follow computer programs on Twitter, you can follow
&lt;a href=&quot;https://twitter.com/WTFLevel&quot;&gt;@WTFLevel&lt;/a&gt;, and get notifications
whenever shit blows up or calms down.&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;twitter-timeline&quot; href=&quot;https://twitter.com/WTFLevel&quot; data-widget-id=&quot;264519862339112960&quot;&gt;Tweets by @WTFLevel&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Technical Notes&lt;/h2&gt;
&lt;p&gt;If you care about how things like this are implemented, then you can
check out the &lt;a href=&quot;http://wtflevel.com/about.md&quot;&gt;WTFlevel implementation details&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Crossfire</title>
    <link href="https://muffinlabs.com/games/crossfire.html" />
    <updated>2012-01-01T00:00:00Z</updated>
    <id>https://muffinlabs.com/games/crossfire.html</id>
    <content type="html">&lt;p&gt;Here is Crossfire, my latest game project.&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_new&quot; href=&quot;https://en.wikipedia.org/wiki/Crossfire_(1981_video_game)&quot;&gt;The
original Crossfire&lt;/a&gt; is an 8-bit game published in the early 80s.
It&#39;s one of the first memories I have of plucking away at our old
Apple
][. This game is my attempt to recreate it, making a couple things easier but also hopefully a few things more interesting as well.&lt;/p&gt;
&lt;p&gt;I used &lt;a href=&quot;http://flixel.org/&quot; target=&quot;_new&quot;&gt;Flixel&lt;/a&gt; to build the game. It&#39;s a great library.&lt;/p&gt;
&lt;p&gt;Although the game plays well enough, I&#39;m not entirely happy with it. The balance could use some work, and it would be interesting to have some other modes.&lt;/p&gt;
&lt;p&gt;Anyway, here&#39;s the game.&lt;/p&gt;
&lt;p&gt;&lt;object type=&quot;application/x-shockwave-flash&quot; data=&quot;https://muffinlabs.com/sites/default/files/xfire.swf&quot; width=&quot;640&quot; height=&quot;500&quot;&gt;&lt;/object&gt;&lt;/p&gt;
  &lt;param name=&quot;movie&quot; value=&quot;/sites/default/files/xfire.swf&quot;&gt;
  &lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt;
  
</content>
  </entry>
  <entry>
    <title>Public Art of Amazon Reviews</title>
    <link href="https://muffinlabs.com/posts/2011/11/29/public-art-of-amazon-reviews/" />
    <updated>2011-11-29T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2011/11/29/public-art-of-amazon-reviews/</id>
    <content type="html">&lt;p&gt;The art and humor from the UC Davis pepper spray incident has certainly made the most of an otherwise awful event. There&#39;s no shortage of &lt;a href=&quot;http://knowyourmeme.com/memes/pepper-spray-cop-casually-pepper-spray-everything-cop&quot;&gt;photoshopped photos&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://muffinlabs.com/sites/default/files/imagepicker/1/VhOeq.jpg&quot; class=&quot;colorbox &quot;&gt;&lt;img src=&quot;http://muffinlabs.com/sites/default/files/imagepicker/1/VhOeq.jpg&quot; alt=&quot;John Pike&quot; class=&quot;imgp_img&quot; width=&quot;500&quot; height=&quot;375&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A lot of people have helpfully reviewed a &lt;a href=&quot;http://www.amazon.com/Defense-Technology-56895-Stream-Pepper/product-reviews/B0058EOAUE/ref=cm_cr_pr_shwvpnt?ie=UTF8&amp;amp;showViewpoints=1&amp;amp;sortBy=bySubmissionDateDescending&quot;&gt;variant of the pepper spray on Amazon&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I casually used this product to try to disperse a small band of non-violent campers who had locked their arms together. Although initially it seemed to be effective, it took two applications! The worst part is that the next day they multiplied exponentially! Now what?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There&#39;s a long history of subversive product reviews on Amazon, and it is a weird and growing form of participatory public art. Way back in 1999, mock reviews of Monica Lewinksky&#39;s tell-all book made the &lt;a href=&quot;http://www.cbsnews.com/stories/1999/02/10/archive/main32387.shtml&quot;&gt;news&lt;/a&gt;. Back then, there were a &lt;a href=&quot;http://www.suck.com/daily/99/02/18/&quot;&gt;lot of questions&lt;/a&gt; about how it was even possible for Amazon to let these reviews appear on their site. Shouldn&#39;t they be doing a better job of scanning them and removing &#39;unacceptable content&#39;? But people continued messing with the system, and Amazon was forced to stop anonymous reviews and they probably had to implement some other protections as well.&lt;/p&gt;
&lt;p&gt;The best reviews of this genre on Amazon are without a doubt all from Family Circus books. This is where there first concerted effort to subvert the review system started, and I think it is where the best work lies. For example, check out the reviews for &lt;a href=&quot;http://www.amazon.com/What-Does-This-Say-Keane/product-reviews/0345470303/ref=cm_cr_pr_top_helpful?ie=UTF8&amp;amp;showViewpoints=0&quot;&gt;&lt;em&gt;What Does This Say?&lt;/em&gt;&lt;/a&gt;, a collection published in 1995:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Proustian introspection with Munch&#39;s visual conundrums&lt;/strong&gt;, July 29, 2002&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Yeats once wrote, &amp;quot;None other knows what pleasures man/At table or in bed.&amp;quot; Bil Keane, however, seems to have found in his latest &#39;Family Circus&#39; opus a treasure-chest of pleasures for each and all of us.
There are some who chafe at the seeming repetitive themes within Keane&#39;s major works; I would respectfully submit that all great stories are about life and death, love and loss, fear and triumph. If not Keane, then so go Shakespeare, Lewis Carroll, Sor Juana Inez de la Cruz and Callimachus, too, for good measure. It is not originality that spawns thought and wonderment; it is the vessels of those themes (Billy, Grandma, Barfy, PJ) that inspire and enlighten.&lt;/p&gt;
&lt;p&gt;Keane, as carrier of these vessels, reminds us of a truth so eloquently immortalized by Ralph Waldo Emerson: &amp;quot;Some books leave us free and some books make us free.&amp;quot; In &#39;What Does This Say&#39;, it is clear that the tome achieves the latter, with gusto and aplomb.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Happiness&lt;/strong&gt;, November 10, 1999&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;There is a certain sadness one feels in remembering happy times: turning over the last page of a good novel, and reflecting over the wonders we have just experienced, the characters who have become our friends; discovering old pictures, seeing ourselves in the halcyon throes of youth, silly smiles on our innocent faces; the plangent last notes of a Chopin nocturne, the theme, growing softer and softer now, floating across the room to rest against our face like the rhythmic breaths of a peaceful, sleeping lover.
I don&#39;t know how: but Keane captures this feeling, this happy sadness - &amp;quot;Oh heavy lightness,&amp;quot; as Shakespeare put it. Billy romps around the yard. He runs all over town. His parents are in love. His family is love with itself, each unto each. Can our lives ever be like this? Perhaps not, but we can watch, watch ever single day, and wrap ourself in that happy sadness. And maybe forget, if only for a little while, the way our lives really are, the way they have to be: our heavy lightness. Thanks, Bil Keane, for that, and thanks to Amazon for letting people express themselves. Thank you all.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There is a long history of mocking Family Circus that predates the web. &lt;a href=&quot;http://en.wikipedia.org/wiki/Dysfunctional_Family_Circus&quot;&gt;&lt;em&gt;Dysfunctional Family Circus&lt;/em&gt;&lt;/a&gt; was originally a series of small booklets published in the late 80s/early 90s in San Jose. Apparently they managed to remain anonymous until recently, when they &lt;a href=&quot;http://www.metroactive.com/features/dysfunctional-family-circus.html&quot;&gt;went public&lt;/a&gt; after the death of Bil Keane. They succeeded largely because they were anonymous -- it&#39;s hard to shut down a publishing operation when you can&#39;t find &lt;a href=&quot;http://www.metroactive.com/features/dysfunctional-family-circus.html&quot;&gt;the publishers&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When we had boxes of professional looking 12- or 24-pagers, we left handfuls of them of them in public places around San Jose and the valley. Our influence was Jack Chick, the Chino-based comic-book evangelist whose millions of free pamphlets still turn up like lint at the Laundromat...&lt;/p&gt;
&lt;p&gt;We knew what we were doing was semilegal, if that. We weren&#39;t just skirting certain sacred rules of copyright, we were making jokes about always uneasy subjects like molestation and incest. For some odd reason, this is the first direction a nihilist humorist takes when disfiguring cartoons about a blameless family.&lt;/p&gt;
&lt;p&gt;In an &lt;a href=&quot;http://gettingit.com/article/124&quot;&gt;1999 article&lt;/a&gt; for Gettingit.com, David Cassel interviewed Seth Friedman, then editor of the zine roundup Factsheet Five. Friedman said he expected lawyers coming out of the woodwork when he saw the Dysfunctional Family Circus booklets: &amp;quot;We were kind of surprised at the time to hear that there was no legal action coming down. I think the anonymity of it really helped.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The booklets were published for a couple years until the creators moved on to other things. Then in the mid 90s someone else started up a &lt;a href=&quot;http://dfc.furr.org/&quot;&gt;Dysfunctional Family Circus&lt;/a&gt; website (that link is to an archive of the site). It ran for a couple years, and people submitted captions for 500 panels. Eventually it was shut down by a request from King Syndicates -- and an apparently amicable phone call between the person running the website and Bil Keane himself. A lot of people were really angry that DFC agreed to shutdown, since it seemed like an acceptable form of parody. Plenty of archives are still available on the web.&lt;/p&gt;
&lt;img src=&quot;http://muffinlabs.com/sites/default/files/imagepicker/1/051_1_.jpg&quot; alt=&quot;Image&quot; class=&quot;imgp_img&quot; width=&quot;360&quot; height=&quot;432&quot;&gt;
&lt;p&gt;Ostensibly, Amazon expects reviews to be pertinent to the product, but any filtering they do is either very basic vulgarity blocking, or it is based on actual requests from the manufacturer of the product. So some of these reviews have been removed, but others have lived on, as seen in this &lt;a href=&quot;http://www.amazon.com/review/R19AQIADRI4LBK/ref=cm_cr_pr_cmt?ie=UTF8&amp;amp;ASIN=0449146154&amp;amp;nodeID=&amp;amp;tag=&amp;amp;linkCode=#wasThisHelpful&quot;&gt;reply&lt;/a&gt; to a snarky review of &lt;a href=&quot;http://www.amazon.com/I-Had-Frightmare-Bil-Keane/product-reviews/0449146154/ref=sr_1_21_cm_cr_acr_txt?ie=UTF8&amp;amp;showViewpoints=1&quot;&gt;I Had A Frightmare!&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As wonderful as this review is, it makes me sad to think about how similarly sarcastic reviews used to be deleted by Amazon--about this very book, in fact -- when some of us wrote them in the early 2000s. But, hey, yours is better than mine was anyway, so more power to you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The world of Amazon product reviews is its own very bizarre ecosystem. As you flip through them, eventually you find the &lt;a href=&quot;http://www.amazon.com/review/top-reviewers-classic&quot;&gt;Top Reviewers&lt;/a&gt; page. And you&#39;ll find &lt;a href=&quot;http://en.wikipedia.org/wiki/Harriet_Klausner&quot;&gt;Harriet Klausner&lt;/a&gt;, who reviewed 24 books today -- so far! Her grand total for reviews is almost 26,000. She has been profiled in the &lt;a href=&quot;http://web.archive.org/web/20071016170653/http://opinionjournal.com/la/?id=110006483&quot;&gt;Wall Street Journal&lt;/a&gt;, was listed as one of the &amp;quot;top 15 web generation&#39;s movers and shakers&amp;quot; in &lt;a href=&quot;http://www.time.com/time/magazine/article/0,9171,1570726,00.html&quot;&gt;Time&lt;/a&gt;, and there is an &lt;a href=&quot;http://harriet-rules.blogspot.com/&quot;&gt;entire blog&lt;/a&gt; devoted to attacking her reviews -- which seems fair, since she&#39;s reading books at a ridiculous rate, and quite possibly plagiarizing reviews.&lt;/p&gt;
&lt;p&gt;You have to wonder why anyone would become a prolific reviewer on Amazon.  It seems like the main motive is to become a member of the invite-only &lt;a href=&quot;http://en.wikipedia.org/wiki/Amazon_Vine&quot;&gt;Amazon Vine&lt;/a&gt; program, where Amazon sends you a couple of items you choose each month in return for your reviews of those products. The program has been &lt;a href=&quot;http://www.publishersweekly.com/pw/print/20091109/25966-vetting-vine-voices-.html&quot;&gt;criticized&lt;/a&gt; all over the place for probably being a little too shadowy and underhanded.&lt;/p&gt;
&lt;p&gt;Here&#39;s some other Family Circus books with good reviews:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/Pick-What-Things-Bil-Keane/product-reviews/0449127850/ref=sr_1_25_cm_cr_acr_txt?ie=UTF8&amp;amp;showViewpoints=1&quot;&gt;&lt;em&gt;Pick Up What Things?&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.amazon.com/Daddys-Cap-Backwards-Bil-Keane/product-reviews/0449148165/ref=cm_cr_dp_all_summary?ie=UTF8&amp;amp;showViewpoints=1&amp;amp;sortBy=bySubmissionDateDescending&quot;&gt;&lt;em&gt;Daddy&#39;s Cap Is on Backwards&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://foo.ca/wp/2005/01/11/amazon-reviews-on-family-circus-books/&quot;&gt;&lt;em&gt;What Does This Say?&lt;/em&gt;&lt;/a&gt;, archived elsewhere.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blksuede.tripod.com/familycircus.html&quot;&gt;Some copies of reviews&lt;/a&gt; snagged before they were removed from Amazon.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mistersquirrel.net/mutantdog/dfc3.htm&quot;&gt;An Archive of Family Circus Reviews&lt;/a&gt; from all over the internet.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&#39;s also funny reviews on Amazon for &lt;a href=&quot;http://www.amazon.com/AudioQuest-K2-terminated-speaker-cable/dp/B000J36XR2/ref=cm_rdp_product&quot;&gt;speaker cables&lt;/a&gt;, the famous &lt;a href=&quot;http://www.amazon.com/Mountain-Three-Wolf-Short-Sleeve/dp/B002HJ377A/ref=pd_sim_sbs_e_3&quot;&gt;Three Wolf Moon T-Shirt&lt;/a&gt;, a book called &lt;a href=&quot;http://www.amazon.com/Hgiyiyi-hgjhjh-hjhk-jjjj/dp/0649875427/ref=pd_sim_sbs_e_13&quot;&gt;&lt;em&gt;Hgiyiyi&lt;/em&gt;&lt;/a&gt; (written by &lt;a href=&quot;http://www.amazon.com/jjjj-jjjjj/dp/B0068PM7HK/ref=sr_1_2?s=books&amp;amp;ie=UTF8&amp;amp;qid=1322592934&amp;amp;sr=1-2&quot;&gt;jjjj&lt;/a&gt;), and don&#39;t forget &lt;a href=&quot;http://www.amazon.com/Control-Christian-Marriages-Priesthood-Children/dp/1425992609/ref=pd_sim_sbs_e_26&quot;&gt;&lt;em&gt;Birth Control is Sinful in the Christian Marriages and also Robbing God of Priesthood Children!!&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You also have to wonder why Amazon allows such bullshit products to remain on their site. The speaker cables are particularly heinous, since no one is going to spend $8500 on a cable, especially after reading the mocking commentary.  I assume that Amazon figures the funny fake reviews are driving as much traffic as the good actual reviews.&lt;/p&gt;
&lt;p&gt;In a twist on this idea, here&#39;s the story of people &lt;a href=&quot;http://youngie.prblogs.org/2008/01/23/transparency-is-an-ideal/&quot;&gt;subverting a McDonalds question and answer site&lt;/a&gt; in the UK with some pretty awesome questions.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Namey - A Random Name Generator</title>
    <link href="https://muffinlabs.com/posts/2011/11/11/namey-a-random-name-generator/" />
    <updated>2011-11-11T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2011/11/11/namey-a-random-name-generator/</id>
    <content type="html">&lt;p&gt;Recently, I had an idea for a project where I wanted to be able to create random names for people on the fly. It&#39;s a fictional schedule for a fictional cable channel, the &lt;a href=&quot;https://muffinlabs.com/content/not-lifetime-tv-schedule&quot;&gt;Not Lifetime Movie Network&lt;/a&gt;.  Some of the movie titles needed random names.  I dug around, and found a few name generators out there, but none of them had an API, or available source code, so I ended up making my own.  This quickly turned into a classic project -- I spent maybe an hour or two writing some code to generate a list of fake movies, and ten times longer coming up with a generic library for random name generation. it went something like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://imgs.xkcd.com/comics/the_general_problem.png&quot; alt=&quot;I don&#39;t actually like xkcd that much, but this sums things up nicely.&quot;&gt;&lt;/p&gt;
&lt;p&gt;But when I was done, I had &lt;a href=&quot;http://namey.muffinlabs.com/&quot;&gt;Namey&lt;/a&gt; -- a website where you can quickly generate some random names, as well as an underlying library written in ruby. It uses files generated by the US Census Bureau for the &lt;a href=&quot;http://www.census.gov/genealogy/names/names_files.html&quot;&gt;1990 census&lt;/a&gt; to generate whatever sort of name you would like.  You can pick a gender, specify if you want a last name or not, and if you would like a common name, rare name, etc.&lt;/p&gt;
&lt;p&gt;The data itself looks a lot like this (in fact, this is the data):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;JAMES          3.318  3.318      1&lt;br&gt;
JOHN           3.271  6.589      2&lt;br&gt;
ROBERT         3.143  9.732      3&lt;br&gt;
MICHAEL        2.629 12.361      4&lt;br&gt;
WILLIAM        2.451 14.812      5&lt;br&gt;
DAVID          2.363 17.176      6&lt;br&gt;
RICHARD        1.703 18.878      7&lt;br&gt;
CHARLES        1.523 20.401      8&lt;br&gt;
JOSEPH         1.404 21.805      9&lt;br&gt;
THOMAS         1.380 23.185     10&lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, the government is big on ALL CAPS. Also, there&#39;s no punctuation, so O&#39;Brian is OBRIAN. I&#39;ve done a bunch of massaging to the data - names are mostly in proper case, with apostrophes where it&#39;s fairly obvious, but I&#39;m sure I missed some.&lt;/p&gt;
&lt;p&gt;For nerds, the code is open source and available on &lt;a href=&quot;https://github.com/muffinista/namey&quot;&gt;github&lt;/a&gt;, so you can fork it and play around as much as you want. As I worked on this project, I developed certain goals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Write a decent Ruby gem to generate random names -- this is the bulk of the project&lt;/li&gt;
&lt;li&gt;Build a website which can use it -- see &lt;a href=&quot;http://namey.muffinlabs.com/&quot;&gt;http://namey.muffinlabs.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Play with Twitter&#39;s &lt;a href=&quot;http://twitter.github.com/bootstrap/&quot;&gt;bootstrap library&lt;/a&gt; -- I built the website with it.  It&#39;s pretty cool!&lt;/li&gt;
&lt;li&gt;Generate a Javascript API layer in between.  If you wanted to, you could pull the JS onto your own site and generate random names. Still working on this part.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, by the time I&#39;m done, I intend to have a ridiculously overbuilt system for generating random names.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Five Pawns, a Simple Chess Game</title>
    <link href="https://muffinlabs.com/posts/2010/12/29/five-pawns-a-simple-chess-game/" />
    <updated>2010-12-29T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2010/12/29/five-pawns-a-simple-chess-game/</id>
    <content type="html">&lt;p&gt;At the beginning of this year, I released &lt;a href=&quot;https://muffinlabs.com/four-pawns&quot;&gt;Four
Pawns&lt;/a&gt;, a very basic strategy game. The idea is simple -- on a 4x4
chess board, two players each have four pawns, and you win by either
getting a pawn to the other side of the board, eliminating all the
other players pieces, or blocking them from moving.&lt;/p&gt;
&lt;p&gt;The concept is simple enough, and I wrote a decent AI system for it,
but it was relatively easy to win the game, because I limited the
amount of processing per turn that the computer would do to pick a
move. As a result, the computer wasn&#39;t able to look as far ahead as a
human player might, and didn&#39;t win as much.&lt;/p&gt;
&lt;p&gt;The general solution to this is to precompute a couple million boards,
and store the results. Then, the AI just looks it up. The AI gets a
lot smaller, and also a lot faster. So, I wrote some code to do this,
outputted it in a way that made a file that wasn&#39;t too huge, and
updated the game.&lt;/p&gt;
&lt;p&gt;That makes the 4x4 version of the game virtually impossible to win for
a human. Basically every move has been computed, and the computer will
kick you ass over and over again.&lt;/p&gt;
&lt;p&gt;My real plan the whole time was to make a 5x5 version of the game, but
Five Pawns failed because the AI was even more limited than in Four
Pawns, so it was pretty easy to beat. But now, with a couple bazillion
moves computed, it&#39;s a lot smarter. Here goes:&lt;/p&gt;
&lt;p&gt;&lt;object type=&quot;application/x-shockwave-flash&quot; data=&quot;https://muffinlabs.com/sites/default/files/fivepawns.swf&quot; width=&quot;480&quot; height=&quot;520&quot;&gt;&lt;/object&gt;&lt;/p&gt;
  &lt;param name=&quot;movie&quot; value=&quot;/sites/default/files/fivepawns.swf&quot;&gt;
  &lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt;
  
&lt;p&gt;&lt;b&gt;UPDATE:&lt;/b&gt; Code available on &lt;a href=&quot;https://github.com/muffinista/Five-Pawns&quot;&gt;github&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Today in History on Twitter</title>
    <link href="https://muffinlabs.com/posts/2010/10/22/today-in-history-on-twitter/" />
    <updated>2010-10-22T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2010/10/22/today-in-history-on-twitter/</id>
    <content type="html">&lt;p&gt;With my copious amounts of free seconds, I&#39;ve written another Twitter bot.  &lt;a href=&quot;http://twitter.com/#!/happened_today&quot;&gt;happened_today&lt;/a&gt; is operating differently from my other bots, which all reply to keywords posted by other users.  Instead it tweets an event from history every hour or so, as my own personal &amp;quot;Today in History&amp;quot; Twitter bot.&lt;/p&gt;
&lt;p&gt;The data is scraped from Wikipedia, and I wrote a &lt;a href=&quot;http://github.com/muffinista/really-simple-history-api&quot;&gt;Really Simple History API&lt;/a&gt; to allow general access.  The API outputs JSON, which I then slurp into the bot, and spit out random events over the day.  It&#39;s pretty crude, but it works.&lt;/p&gt;
&lt;script src=&quot;http://widgets.twimg.com/j/2/widget.js&quot;&gt;&lt;/script&gt;

</content>
  </entry>
  <entry>
    <title>Most Common Town/City Names in the US</title>
    <link href="https://muffinlabs.com/posts/2010/08/19/most-common-town-city-names-in-the-us/" />
    <updated>2010-08-19T00:00:00Z</updated>
    <id>https://muffinlabs.com/posts/2010/08/19/most-common-town-city-names-in-the-us/</id>
    <content type="html">&lt;p&gt;Here&#39;s the most common town names, again from the &lt;a href=&quot;http://gnis.usgs.gov/index.html&quot;&gt;US Board on Geographic Names&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Its sort of amazing that the most common name is Midway, and Five Points isn&#39;t far behind.  And a bunch of the rest are about hope or second chances.&lt;/p&gt;
&lt;pre&gt;
+-----------------+-------+
| name            | tally |
+-----------------+-------+
| Midway          |   218 |
| Fairview        |   213 |
| Oak Grove       |   169 |
| Five Points     |   150 |
| Riverside       |   130 |
| Pleasant Hill   |   124 |
| Mount Pleasant  |   119 |
| Bethel          |   111 |
| Centerville     |   109 |
| New Hope        |   108 |
| Liberty         |    98 |
| Oakland         |    98 |
| Union           |    97 |
| Pleasant Valley |    97 |
| Shady Grove     |    94 |
| Pine Grove      |    92 |
| Salem           |    92 |
| Greenwood       |    91 |
| Pleasant Grove  |    89 |
| Forest Hills    |    89 |
| Oak Hill        |    88 |
| Georgetown      |    86 |
| Lakeview        |    85 |
| Shiloh          |    84 |
| Glendale        |    81 |
| Lakewood        |    80 |
| Concord         |    79 |
| Cedar Grove     |    78 |
| Highland Park   |    77 |
+-----------------+-------+
&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>Montague - Paper or Plastic?</title>
    <link href="https://muffinlabs.com/pages/paper-or-plastic/" />
    <updated>2010-01-01T00:00:00Z</updated>
    <id>https://muffinlabs.com/pages/paper-or-plastic/</id>
    <content type="html">
Hey Montague, wondering what goes out on the curb this week?  I can
only ever find out by looking at what my neighbors have out.  At some
point I added the info to my calendar but that gets tiresome fast
enough.  So, I decided to write a &lt;a href=&quot;http://montaguepaperorplastic.com/&quot;&gt;quickie website&lt;/a&gt; to do
the work for me.  By the time I was done, I found the &lt;a target=&quot;_new&quot; href=&quot;https://montague-ma.gov/trash-recycle-schedule&quot;&gt;official
schedule&lt;/a&gt;, but it was utterly buried, and the website is easy to
refer to, and should work next year and any year after as well.

The source code is available &lt;a href=&quot;https://github.com/muffinista/montaguepaperorplastic&quot;&gt;on
github&lt;/a&gt;.

</content>
  </entry>
</feed>
