<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>James Vasile's Blog</title><link href="https://jamesvasile.com/" rel="alternate"></link><link href="https://jamesvasile.com/feed" rel="self"></link><id>https://jamesvasile.com/</id><updated>2023-05-22T00:00:00-04:00</updated><entry><title>Every Noise</title><link href="https://jamesvasile.com/2023/05/every-noise/" rel="alternate"></link><published>2023-05-22T00:00:00-04:00</published><updated>2023-05-22T00:00:00-04:00</updated><author><name>James Vasile</name></author><id>tag:jamesvasile.com,2023-05-22:/2023/05/every-noise/</id><summary type="html">&lt;p&gt;&lt;a href="https://everynoise.com"&gt;Every Noise&lt;/a&gt; is a website for music discovery.  It is spare.  You don't
experience it with your eyes.  &lt;/p&gt;
&lt;p&gt;Its main page is a tag map of genres.  Scroll or search, click to get a sample, repeat.  It is absolutely
thrilling fun. It turns out I like &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=Earth&amp;amp;genre=sambass"&gt;Sambass&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;Every Noise sifted …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="https://everynoise.com"&gt;Every Noise&lt;/a&gt; is a website for music discovery.  It is spare.  You don't
experience it with your eyes.  &lt;/p&gt;
&lt;p&gt;Its main page is a tag map of genres.  Scroll or search, click to get a sample, repeat.  It is absolutely
thrilling fun. It turns out I like &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=Earth&amp;amp;genre=sambass"&gt;Sambass&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;Every Noise sifted through &lt;a href="https://everynoise.com/2022_around_the_world.cgi"&gt;the most popular music of 2022 from around the world&lt;/a&gt;.  They have samples
and spotify playlists for a ton of genres, and you can narrow by country.  I haven't started
exploring beyond the US yet.&lt;/p&gt;
&lt;p&gt;You can enter an artist's name and Every Noise will show you all the lists they're on so you can
explore similar songs.  That's a very cool feature.  Unfortunately, many of the artists I initially
entered were not popular enough to be on any lists.  And the ones who were
(&lt;a href="https://everynoise.com/2022_around_the_world.cgi?searchartist=rosalia"&gt;Rosalia&lt;/a&gt;, &lt;a href="https://everynoise.com/2022_around_the_world.cgi?searchartist=bad+bunny"&gt;Bad Bunny&lt;/a&gt;) are &lt;em&gt;too&lt;/em&gt; popular
for that to be useful.  The place this feature sings is with artists like
&lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=%7Cgorillaz&amp;amp;genre=glam%20rock"&gt;Gorillaz&lt;/a&gt;,
that genre hop and aren't so popular as to be everywhere. &lt;/p&gt;
&lt;p&gt;Combined with the &lt;a href="https://everynoise.com"&gt;genre map&lt;/a&gt;, the hit lists are a great tool.  You can find
a genre on the map, then do a text search on the &lt;a href="https://everynoise.com/2022_around_the_world.cgi"&gt;2022 Around The World&lt;/a&gt; page, click it and get a bunch of related
artists and songs. One thing that's interesting is that the most popular songs of related genres all
tend to sound closer to each other than the samples on the genre map do. This is especially
noticeable with things like &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=Earth&amp;amp;genre=tropical%20house"&gt;Trop House&lt;/a&gt;, where
the "tropical" part gets flattened into the vibe of popular dance music that gets music on to hit
lists.&lt;/p&gt;
&lt;p&gt;And for all that there are a &lt;strong&gt;lot&lt;/strong&gt; of genres here, it is more striking in its breadth than its
depth.  Any fan of a genre could parse things into microniches and maybe if you're using "sounds
like this other artist I know" as your starting point, that would be useful.  Still, what makes
music good isn't how many adjectives it takes to name its genre.  What you really want is
music that is ineffably catchy and charming, and that quality will never be reducable to MP3 tags in
an itunes library.&lt;/p&gt;
&lt;p&gt;I spent way more time on this site than I should.  It was like roaming the shelves in a labyrinthian
alibrary.  It's easy to get lost in the stacks. Below are my tasting notes.&lt;/p&gt;
&lt;h2&gt;Concentrated Focus&lt;/h2&gt;
&lt;p&gt;So much of my music listening isn't actually listening.  It's more like curating a sonic background
for my brain to track while I do other things.  My first foray into this list was to look for the
lulls.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=Earth&amp;amp;genre=ambient%20techno"&gt;Ambient Techno&lt;/a&gt; is
   what the inside of my head sounds like when I'm trying to fall asleep at a party.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=compositional%20ambient"&gt;Compositional Ambient&lt;/a&gt;
     was a delight.  It's perfect for when you're doing sunrise yoga in your hexayurt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=lounge"&gt;Lounge&lt;/a&gt; and &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=deep%20sunset%20lounge"&gt;Sunset Lounge&lt;/a&gt; playlists are pleasant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=escape%20room"&gt;Escape Room&lt;/a&gt; is a
   surprisingly good listen if you want to concentrate with some urgency and you can take background
   noise.  I guess that's what it's like in an escape room?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Their &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=lo-fi%20beats"&gt;LowFi Beats&lt;/a&gt; are not
   low fi, but they are slow beats without the crackle and pop.
   &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=chillhop"&gt;Chillhop&lt;/a&gt; is also
   pretty on point. If you're in this mode, you might also enjoy &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=focus%20beats"&gt;Focus Beats&lt;/a&gt;, which
   clocks in at a slightly higher bpm.  Similarly,
   &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=focus"&gt;Focus&lt;/a&gt; and
   &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=neo-classical"&gt;Neoclassical&lt;/a&gt;
   are pleasant if you trend acoustic. Meanwhile, the &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=lo-fi%20chill"&gt;LoFi Chill&lt;/a&gt; playlist
   steps it up a pace but is vocal-forward.  A more melodic alternative is the &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=chillwave"&gt;Chill Wave&lt;/a&gt; playlist.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=vapor%20soul"&gt;Vapor Soul&lt;/a&gt; is nice and chill without being super slow.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Jazzy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=electric%20blues"&gt;Electric Blues&lt;/a&gt;
   playlist is not electro or electronic, just electric, which is quaint buy rhythmically
   satsifying. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=jazz%20funk"&gt;Jazz Funk&lt;/a&gt; playlist is
   funkier tho.  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=jazz%20piano"&gt;Jazz Piano&lt;/a&gt; is every
   hotel lobby with a live pianist you've ever been to.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;House and Electronic&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=turntablism"&gt;Turntablism&lt;/a&gt; does
   not feature turntablism, but if you like the flow of Method Man and KRSONE, you will enjoy it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=minimal%20synth"&gt;Minimal Synth&lt;/a&gt; is exactly what it says: just people playing with synths.  It's like 90s tracker mods.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And of course I had to listen to the &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=deep%20house"&gt;Deep House&lt;/a&gt; playlist,
   which is... poppy?  Full of vocals, not minimal at all.  Why have a &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=vocal%20house"&gt;Vocal House&lt;/a&gt; category if
   everybody is cramming divas and baritone drones into their house?  And the &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=bass%20house"&gt;Bass
   House&lt;/a&gt; is all
   over the place.  It even gets a little jungle at times. My quest for deep, minimal house that
   doesn't devolve into tech house continues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you have to do tech house, at least make it &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=Earth&amp;amp;genre=funky%20tech%20house"&gt;funky&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I am secretly into &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=witch%20house"&gt;Witch House&lt;/a&gt;, but the &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=russian%20witch%20house"&gt;Russian Witch House&lt;/a&gt; is way extra.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=electronic%20trap"&gt;Electronic Trap&lt;/a&gt; playlist has too much of the wubs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Are you into &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=progressive%20trance%20house"&gt;Progressive House&lt;/a&gt;?
   I wasn't, then I listened to the most popular tunes of 2022 and... I'm nostalgic for progressive.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Everything Else&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I refused to click on &lt;a href="https://everynoise.com/2022_around_the_world.cgi?vantage=US&amp;amp;genre=meme%20rap"&gt;Meme Rap&lt;/a&gt;.  There is
   good hip hop out there.  I guess I should dig into Every Noise and find it.&lt;/li&gt;
&lt;/ul&gt;</content><category term="Misc"></category><category term="music"></category></entry><entry><title>Installing Matrix's Synapse!</title><link href="https://jamesvasile.com/2023/05/installing-matrixs-synapse/" rel="alternate"></link><published>2023-05-20T00:00:00-04:00</published><updated>2023-05-20T00:00:00-04:00</updated><author><name>James Vasile</name></author><id>tag:jamesvasile.com,2023-05-20:/2023/05/installing-matrixs-synapse/</id><summary type="html">&lt;p&gt;We are going to follow the &lt;a href="https://matrix-org.github.io/synapse/latest/setup/installation.html"&gt;standard instructions&lt;/a&gt; for installing Synapse.&lt;/p&gt;
&lt;h1&gt;Install and Config&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;matrix-synapse
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I chose a servername of &lt;code&gt;jamesvasile.com&lt;/code&gt; and enabled anon stat reporting.&lt;/p&gt;
&lt;h3&gt;Reverse Proxy And Delegation&lt;/h3&gt;
&lt;p&gt;We want to share this box with other services.  The root domain is doing other things …&lt;/p&gt;</summary><content type="html">&lt;p&gt;We are going to follow the &lt;a href="https://matrix-org.github.io/synapse/latest/setup/installation.html"&gt;standard instructions&lt;/a&gt; for installing Synapse.&lt;/p&gt;
&lt;h1&gt;Install and Config&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;matrix-synapse
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I chose a servername of &lt;code&gt;jamesvasile.com&lt;/code&gt; and enabled anon stat reporting.&lt;/p&gt;
&lt;h3&gt;Reverse Proxy And Delegation&lt;/h3&gt;
&lt;p&gt;We want to share this box with other services.  The root domain is doing other things, but we want
people to be able to get to us via &lt;code&gt;jamesvasile.com&lt;/code&gt;, not &lt;code&gt;matrix.jamesvasile.com&lt;/code&gt;.  So we use
delegation.  We provide a pointer at &lt;a href="https://jamesvasile.com/.well-known/materix/server"&gt;https://jamesvasile.com/.well-known/matrix/server&lt;/a&gt;.  The
pointer is just a JSON file that tells clients where to go for the real server.&lt;/p&gt;
&lt;h4&gt;Delegation&lt;/h4&gt;
&lt;h5&gt;Server&lt;/h5&gt;
&lt;p&gt;We already serve a site at &lt;code&gt;jamesvasile.com&lt;/code&gt; so we'll add .well-known to it.  That site is a Pelican
static site, so this is easy.&lt;/p&gt;
&lt;p&gt;Frist we add &lt;code&gt;.well-known&lt;/code&gt; as a static path in &lt;code&gt;pelicanconf&lt;/code&gt;.  Then:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;content/.well-known/matrix
$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{ &amp;quot;m.server&amp;quot;: &amp;quot;matrix.jamesvasile.com:443&amp;quot; }&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;content/.well-known/matrix/server
$&lt;span class="w"&gt; &lt;/span&gt;push&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# send all this to our live server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then we check it with: &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;https://jamesvasile.com/.well-known/matrix/server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and see if we get our JSON snippet back.  If we do, then it's working.&lt;/p&gt;
&lt;h5&gt;Client&lt;/h5&gt;
&lt;p&gt;Now we should do the same for clients:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;quot;m.homeserver&amp;quot;: { &amp;quot;base_url&amp;quot;: &amp;quot;https://matrix.jamesvasile.com&amp;quot; }}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;content/.well-known/matrix/client
$&lt;span class="w"&gt; &lt;/span&gt;push&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# send all this to our live server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;As above, we can check it with: &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;https://jamesvasile.com/.well-known/matrix/client
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and see if we get our JSON snippet back.  If we do, then it's working.&lt;/p&gt;
&lt;h4&gt;Reverse Proxy&lt;/h4&gt;
&lt;p&gt;We are serving our static site with &lt;a href="https://caddyserver.com"&gt;Caddy&lt;/a&gt;, so we just need to configure it.
We configure Caddy by editing &lt;code&gt;/etc/caddy/Caddyfile&lt;/code&gt; to include two new stanzas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;matrix.jamesvasile.com {
  reverse_proxy /_matrix/* http://localhost:8008
  reverse_proxy /_synapse/client/* http://localhost:8008
}
jamesvasile.com:8448 {
  reverse_proxy http://localhost:8008
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then &lt;code&gt;sudo service caddy reload&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Postgres&lt;/h3&gt;
&lt;p&gt;We installed via apt-get, but that doesn't include postgres, so let's apt-get it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# apt install postgresql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;From there, we'll follow the &lt;a href="https://matrix-org.github.io/synapse/latest/postgres.html"&gt;official docs&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# su - postgres # change to postgres user
# createuser --pwprompt synapse_user
# createdb --encoding=UTF8 --locale=C --template=template0 --owner=synapse_user synapse
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then adjust the &lt;code&gt;database&lt;/code&gt; part of &lt;code&gt;/etc/matrix-synapse/homeserver.yaml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;database:
  # The database engine name
  name: &amp;quot;psycopg2&amp;quot;
  args:
    user: synapse_user
    password: &amp;lt;PUT PASSWORD HERE from /box/jamesvasile.com/synapse&amp;gt;
    database: synapse
    host: localhost
    cp_min: 5
    cp_max: 10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Other Synapse Config&lt;/h3&gt;
&lt;p&gt;In &lt;code&gt;/etc/matrix-synapse/homeserver.yaml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;suppress_key_server_warning&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;macaroon_secret_key&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PUT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PASSWORD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sr"&gt;/box/jamesvasile.com/s&lt;/span&gt;&lt;span class="n"&gt;ynapse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;no_tls&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Troubleshooting&lt;/h3&gt;
&lt;p&gt;If &lt;code&gt;sudo service matrix-synapse restart&lt;/code&gt; doesn't get you a running server, you might want to run it
manually so you can interact with finer control and see the output live.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# cd /var/lib/matrix-synapse&lt;/span&gt;
&lt;span class="c1"&gt;# /usr/bin/python3 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Running this showed me I was missing the macaroon key, for example.&lt;/p&gt;
&lt;h2&gt;Add User Account&lt;/h2&gt;
&lt;p&gt;At this point, you should have a running synapse instance.&lt;/p&gt;
&lt;p&gt;Registrations via client are closed to prevent strangers from using the server.  I'm not sure how it
works. Maybe it's possible that with the &lt;code&gt;registration_shared_key&lt;/code&gt;, a remote user could register,
but I used the commandline to register myself as a user.&lt;/p&gt;
&lt;p&gt;Note that the usual instructions say to use &lt;code&gt;register_new_materix_user&lt;/code&gt; but the Debian package
prefixes that bin with &lt;code&gt;synapse&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;synapse_register_new_matrix_user&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;james&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;/etc/matrix-synapse/homeserver.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Try it out!&lt;/h2&gt;
&lt;p&gt;I fired up &lt;a href="https://nheko-reborn"&gt;nheko&lt;/a&gt; and it instantly complained about keys despite my not
having given it any login info.  Perhaps when I tried (and failed) to login earlier it left some
stale data.  I deleted &lt;code&gt;~/.config/nheko/nheko.conf&lt;/code&gt; and restarted.  It was fine
after that.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;Matrix&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;james&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jamesvasile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;
&lt;span class="nx"&gt;Homeserver&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//jamesvasile.com:8448&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you have to add &lt;code&gt;:8448&lt;/code&gt; after your homeserver address to make it work, the client delegation
isn't working.  Check the &lt;a href="https://jamesvasile.com/.well-known/matrix/client"&gt;client delegation
file&lt;/a&gt; and the caddy proxy.&lt;/p&gt;
&lt;h2&gt;UPDATE&lt;/h2&gt;
&lt;p&gt;Well, it runs and I can connect a client to it, but... I tried to join a large room or two and it
ate 100% CPU and I will never do that again.&lt;/p&gt;
&lt;p&gt;It seems like matrix is good for small, unfederated instances or maybe federation if your users
never join any large rooms.&lt;/p&gt;
&lt;p&gt;And now the server is borked because those large room joins are in the database.  Any time I start
it up, I synapse tries to sync up with those rooms and eats the CPU again. I can see the rooms in
the db:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;room_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;current_state_events&lt;/span&gt;
&lt;span class="nx"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;state_key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;@&lt;/span&gt;&lt;span class="nx"&gt;james&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;jamesvasile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;span class="nx"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;room&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;member&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;span class="nx"&gt;AND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;membership&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I tried to use &lt;code&gt;synadm&lt;/code&gt; to delete those room memberships from the commandline, but it doesn't
support that.&lt;/p&gt;
&lt;p&gt;I contemplated just removing those rows from the db, but I don't know what that would break.&lt;/p&gt;
&lt;p&gt;I guess I could try to figure out how to construct a curl request to delete the room joins via the
admin api, but I am out of time on this project.  &lt;/p&gt;
&lt;p&gt;I &lt;strong&gt;could&lt;/strong&gt; just blow away the database and start over, but I came across some ominous warning that
then the rooms I tried to join would forever bar me or something like that.  That seems... brittle?
Like maybe decentralized, self-hosted systems should assume sometimes people are going to experiment
or do a fresh install?&lt;/p&gt;
&lt;p&gt;Maybe I need to &lt;a href="https://not.just-paranoid.net/migrating-matrix-synapse-to-another-server/"&gt;migrate
synapse&lt;/a&gt; to another box.&lt;/p&gt;
&lt;p&gt;The funniest part about all this is that I keep seeing messages to ask for help in the synapse
matrix room, which I cannot reach because my synapse server isn't working.&lt;/p&gt;
&lt;p&gt;Ah well, exploring matrix will have to wait for another day!&lt;/p&gt;</content><category term="Server Log"></category><category term="matrix"></category></entry><entry><title>Open Sourcing Checklist</title><link href="https://jamesvasile.com/2023/05/open-sourcing-checklist/" rel="alternate"></link><published>2023-05-19T00:00:00-04:00</published><updated>2023-05-19T00:00:00-04:00</updated><author><name>James Vasile</name></author><id>tag:jamesvasile.com,2023-05-19:/2023/05/open-sourcing-checklist/</id><summary type="html">&lt;p&gt;Taking an existing, non-open codebase into the open is one of those tasks that seems relatively simple --- apply open source license and publish the code.  In practice, however, there is some hidden complexity along the way, and many projects start out with the best of intentions but fail to complete …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Taking an existing, non-open codebase into the open is one of those tasks that seems relatively simple --- apply open source license and publish the code.  In practice, however, there is some hidden complexity along the way, and many projects start out with the best of intentions but fail to complete the process.&lt;/p&gt;
&lt;p&gt;This, of course, is why we always advise people to &lt;a href="/2018/09/be-open-from-day-one/"&gt;be open from day one&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/jamesvasile/status/1410241468833406986"&gt;
&lt;img alt="&amp;quot;Write a horror story for your industry using just four words.&amp;quot;  &amp;quot;We'll open source it later&amp;quot;  Text is from a Twitter screenshot at https://twitter.com/jamesvasile/status/1410241468833406986" src="/uploads/2023/05/we will open source it later.png"&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This document is a checklist of steps you might take before you finally publish your work under open source license.  Most steps are optional, but all of them have value.  Think of them as best practices, not mandatory requirements.  Consider each step and whether it applies to your project.  Then narrow the checklist to the steps you will take.  Feel free to do these in any order that makes sense to you.  Good luck, and please ping &lt;a href="https://opentechstrategies.com"&gt;OTS&lt;/a&gt; at info AT opentechstrategies.com if we can help.&lt;/p&gt;
&lt;p&gt;This document is not an exhaustive list of concerns you should consider when
open sourcing.  It doesn't go into the reasons why you are considering open
source (and we have found that going open without a clear goal in mind usually
fails to achieve any goals at all).  It doesn't include building a community or
a sustainability model (open source is not, in and of itself, a business model).
All of those are considerations of a much bigger picture than this checklist
contemplates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Get internal buy-in.&lt;/strong&gt;  Taking code into the open can be a big deal.  It
can disturb existing strategies or revenue streams.  Often, publishing code is
the right answer overall, but might impose tradeoffs that impact some
stakeholders more than others.  Some of those stakeholders might become net
losers.  Make sure you start the process of obtaining the necessary buy-in
from internal stakeholders early.  Secure support all the way up the org-chart
if you can.  This is the step that at first seems doable or even easy but
ultimately blocks so many projects from ever going open.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Get legal buy-in.&lt;/strong&gt; Let your counsel know you're moving in this direction.
Make sure you know what their requirements are to sign off on publishing under
an open source license.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Ensure regulatory compliance.&lt;/strong&gt;  Check to make sure you're square with
export control regulations regarding encryption.  If you're just using
commonly-used open source encryption libraries, you are probably fine.
Depending on what your software does, other regulatory rules might apply.  Find
out and get in compliance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Check your copyrights.&lt;/strong&gt;  Ensure you have the needed permissions to
release your project under open license.  These permissions could come from
licenses or copyright ownership. Do not assume you have the rights. Go look. Do
an audit.  If necessary, read up on works for hire and federal ownership of
copyright.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Consider your patent portfolio.&lt;/strong&gt;  FOSS licenses sometimes include patent permissions, whether explicitly stated or implicitly granted.  If you or your contributors hold patents, you should evaluate the impact of open licensing on your patent rights.  You might decide your patents are best used to nurture your open source strategy.  Alternatively, you might want to take steps to protect your patents.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Pick an outbound license.&lt;/strong&gt;  Usually this will be BSD, Apache, or some flavor of GPL, but there is a wide range of &lt;a href="https://opensource.org/licenses/"&gt;FOSS licenses&lt;/a&gt; out there for you to choose from.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Consider an inbound license.&lt;/strong&gt;  Sometimes these licenses are called
"contributor license agreements".  By default, a project usually takes code
under an inbound license that is equal to their outbound license.  If that
outbound license gives the project all the rights it needs for the foreseeable
future, that's good enough. If it doesn't, you might consider a contributor
license agreement.  Project Harmony has some &lt;a href="https://harmonyagreements.org/"&gt;sample
agreements&lt;/a&gt; that are old but worth reading (full
disclosure: I worked on that project).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Ensure license compatibility with dependencies.&lt;/strong&gt;  Two pieces of software are license compatible when they can be combined into one work and released together without violating the licenses of either of the original pieces of software.  The combined work is then treated as goverend by only one of those two licenses, usually the less permissive license.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Upload your code to an online repository.&lt;/strong&gt;  This will probably be a git
repository hosted on &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt;, &lt;a href="https://code.librehq.com"&gt;LibreHQ&lt;/a&gt;, or a
&lt;a href="https://gitlab.com"&gt;GitLab&lt;/a&gt; instance.  &lt;em&gt;Do not make it public it yet.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Add a README.md file.&lt;/strong&gt;  Place it in the root directory of your repository.  It should specify the name of the software and describe what it does in lay terms.  Include contact information, directions to your mailing list or Zulip/Slack /Discord instance, and your general level of willingness to accept public participation.  Provide basic instructions for installation or refer readers to online documentation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Test installation.&lt;/strong&gt;  Give repo access to a new user or developer who has never installed your software before.  Have them follow your instructions.  If they got a running installation, good.  If not, fix your instructions before you publish.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Fix your test suite.&lt;/strong&gt;  Ensure your tests pass.  Sideline (e.g. mark "expected fail") those that don't.  New users will often run tests to make sure their install worked.  If the tests fail, it will be difficult for them to know whether that is because the install failed or because that test stopped passing and nobody cared.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Add a LICENSE or COPYING file.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Add a CONTRIBUTING file.&lt;/strong&gt;  This file tells people how to contribute.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Prepare for public participation.&lt;/strong&gt;  Pay particular attention
to your planned cadence of replies to incoming interest.  Your approach to
inbound messages will, of course, depends on your community strategy, which is
beyond the scope of this checklist (see our &lt;a href="https://opentechstrategies.com/archetypes"&gt;Archetypes
Analysis&lt;/a&gt; and &lt;a href="https://producingoss.com/"&gt;Producing
OSS&lt;/a&gt; for starting points).  Document that approach in
your README or CONTRIBUTING file so people can form expectations about how
quickly you will respond to issues and PRs.  See&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Add issue templates.&lt;/strong&gt;  These can help guide public participation.  Give people some hints about &lt;em&gt;where&lt;/em&gt; discussion of issues happens.  Typically, public projects default to the issue tracker, but some prefer the project's mailing list or forum.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Examine ownership of your repository.&lt;/strong&gt;  Make sure multiple people have authority and actual ability to administer the repository.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Squash history.&lt;/strong&gt;  Does your repository contain sensitive information or secrets?  Has it ever?  When repositories are private, people tend to be less guarded about what they check in to the repo.  Problematic content includes secrets and PII but also might include commit messages containing profanity or even defamatory content.  It is not practical for most projects to examine all their history, so many delete, edit, or squash history before going public.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Remove secrets.&lt;/strong&gt; Ensure there are no API keys or passwords or other
sensitive information in the remaining codebase.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ ] Publish documentation.&lt;/strong&gt;  Centralize it into an accessible location under open source or creative commons license.  Documentation should be open to change requests.  Track down the design and usage documentation that may currently reside in various internal places and make them public.  Collect the implicit learnings of your team, and write them down so people without your experience can productively approach the software.&lt;/p&gt;
&lt;p&gt;Remember, this checklist is a general list of tasks, some of which might not
apply to you.  Adapt it to your specific needs and legal requirements.  Work
with your lawyer and your open source advisor to reduce this to the list that
works for you and your product.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks to Karl Fogel, Frank Duncan, and Jesse Bickel for reading early drafts of
this checklist.&lt;/em&gt;&lt;/p&gt;</content><category term="Misc"></category></entry><entry><title>Main screen turn on!</title><link href="https://jamesvasile.com/2023/04/main-screen-turn-on/" rel="alternate"></link><published>2023-04-13T00:00:00-04:00</published><updated>2023-04-13T00:00:00-04:00</updated><author><name>James Vasile</name></author><id>tag:jamesvasile.com,2023-04-13:/2023/04/main-screen-turn-on/</id><summary type="html">&lt;p&gt;All this self-hosted fediverse stuff has me nostalgic for the blogs of yore.&lt;/p&gt;
&lt;p&gt;I also needed a place to put some notes where I could share them.&lt;/p&gt;
&lt;p&gt;You might notice that this post is not the oldest item on the site.  I am backfilling some of the
other things I've …&lt;/p&gt;</summary><content type="html">&lt;p&gt;All this self-hosted fediverse stuff has me nostalgic for the blogs of yore.&lt;/p&gt;
&lt;p&gt;I also needed a place to put some notes where I could share them.&lt;/p&gt;
&lt;p&gt;You might notice that this post is not the oldest item on the site.  I am backfilling some of the
other things I've written from other places.&lt;/p&gt;</content><category term="Misc"></category><category term="intro"></category><category term="test"></category></entry><entry><title>Spot The Pattern: Commoditization</title><link href="https://jamesvasile.com/2019/10/commoditization/" rel="alternate"></link><published>2019-10-02T15:28:00-04:00</published><updated>2019-10-02T15:28:00-04:00</updated><author><name>James Vasile</name></author><id>tag:jamesvasile.com,2019-10-02:/2019/10/commoditization/</id><summary type="html">&lt;p&gt;&lt;em&gt;(This is the fifth post in our&lt;/em&gt; &lt;a class="reference external" href="https://blog.opentechstrategies.com/category/open-source-at-large/"&gt;Open Source At Large&lt;/a&gt; &lt;em&gt;series.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Last week, I spoke with the CEO of a company that makes a proprietary, category-leading workflow product. He asked me &amp;quot;what should we open source and when?&amp;quot;&lt;/p&gt;
&lt;p&gt;This is one of the most common questions we get. There …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;(This is the fifth post in our&lt;/em&gt; &lt;a class="reference external" href="https://blog.opentechstrategies.com/category/open-source-at-large/"&gt;Open Source At Large&lt;/a&gt; &lt;em&gt;series.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Last week, I spoke with the CEO of a company that makes a proprietary, category-leading workflow product. He asked me &amp;quot;what should we open source and when?&amp;quot;&lt;/p&gt;
&lt;p&gt;This is one of the most common questions we get. There is no easy, standard answer to this question, but I usually start by looking for features of the ecosystem that either are or could be &lt;strong&gt;commoditized&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A commodity is something that is the same no matter who makes it. Gasoline is a commodity. Customers don't really care where they buy gas. They want it cheap and reliable, but the gas itself should be the same stuff regardless of which oil company refines it and pumps it into your car.&lt;/p&gt;
&lt;p&gt;In practice, of course, gas from different companies is not identical. Some places enhance it with detergents, mix it with ethanol, or add stabilizers.&amp;nbsp; But for the most part, consumers ignore these small differences.&amp;nbsp; You put it in your car and it works.&amp;nbsp; People pick gas stations based on price and convenience.&lt;/p&gt;
&lt;p&gt;It's hard to charge a premium for a commoditized good. People are not willing to pay extra for a product if they can get the equivalent for less elsewhere. As a result, gas stations compete on price.&amp;nbsp; This squeezes margins, and so in the end they make their money on the convenience store, just like movie theaters do with popcorn.&lt;/p&gt;
&lt;p&gt;Open source software businesses are often in the same position. There's a core offering that is, to put it bluntly, boring. Anybody could offer this boring core without innovating. You cannot be in the market without matching the core's offerings, and customers want standard interfaces these days, so there's not much opportunity to differentiate on the basic core offering.&lt;/p&gt;
&lt;p&gt;Database servers follow this model. From a business perspective, storing rows of data is not interesting. Everybody can do it, and nobody really does it much better than anybody else. There are performance improvements at the margins, and we can build interesting services on top of storing information, but basic data storage and retrieval is just facilities maintenance, not the thing your customers choose you for.&lt;/p&gt;
&lt;p&gt;Of course, not all data storage is basic. You can store things faster or in ways that make access easier. You can stack data vertically instead of horizontally. You can keep all the data in memory, duplicate it across multiple servers, or sync with client-side storage. These are features that can set one product apart from another. You might be able to charge a premium for them. None of them, though, is actually the boring, basic task of putting data on a disk and making sure you can find it later.&lt;/p&gt;
&lt;p&gt;For a business that manages data but can't find competitive advantage on storing it, the database is a cost. It's not worth spending a lot of money to develop or acquire a database that improves on the standard set of features because there's just not much improvement to be had. Best to source those features as cheaply as possible.&lt;/p&gt;
&lt;p&gt;Of course, the same logic applies to everybody else in your industry. We're all trying to get the boring stuff done as cheaply as possible. This is where open source cooperation comes in. We can't compete on those features, so there's no point being competitive about it. We use open source to get together and collaborate with all the other folks who want rock-solid databases. Open source lets us do this even if we're in competition on a range of other fronts.&lt;/p&gt;
&lt;p&gt;We see this pattern a lot in free and open source software. Product categories go open source, then contract, then perhaps expand when somebody figures out the next frontier of differentiation. Most recently, we've seen this effect around web rendering engines. Every browser's goal is to depict HTML in standard ways. Aside from being at Google's mercy, there's little reason for most companies to make their own rendering engine when there's a pretty good one that is open for the taking.&lt;/p&gt;
&lt;p&gt;Spotting this pattern early is a crucial step in knowing&amp;nbsp;&lt;em&gt;what&lt;/em&gt; to open source and &lt;em&gt;when&lt;/em&gt;.&amp;nbsp; You can lead or let somebody else lead -- either might be strategically useful, but spotting the pattern lets you choose which position to take.&lt;/p&gt;
&lt;p&gt;Sometimes it makes sense to open source what you have mainly as a signal to others that an area is becoming commoditized and so they should open source their stuff too.&amp;nbsp; That is, you don't necessarily have to be aiming for a dominant position in a new open source area -- in fact, you often don't have to decide that in advance.&amp;nbsp; Instead, you open source because an area is &lt;em&gt;about&lt;/em&gt; to become commoditized, and the earlier you shift your investments, the better positioned you will be get the type of influence that serves your needs in the inevitable post-commoditization universe.&amp;nbsp; (For more about the various forms that influence can take, see &lt;a class="reference external" href="https://opentechstrategies.com/files/pub/MZ+OTS_OS_Archetypes_report_ext_scr.pdf"&gt;Open Source Archetypes&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;Once you start looking for the commoditization pattern, you see it all over the open source world. It is a common tool for understanding the strategic position of all kinds of products. In addition to the basic pattern, there are two more big concepts around commoditization worth considering: the cyclical nature of commoditization and the factors that allow resisting that cycle. We'll cover those in future posts.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thanks to Microsoft for sponsoring the&lt;/em&gt; &lt;a class="reference external" href="https://blog.opentechstrategies.com/category/open-source-at-large/"&gt;Open Source At Large&lt;/a&gt; &lt;em&gt;blog series.&lt;/em&gt;&lt;/p&gt;
</content><category term="Misc"></category><category term="foss"></category><category term="Open Source At Large"></category></entry></feed>