<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Marc Cornellà</title>
    <description>The latest articles on Forem by Marc Cornellà (@mcornella).</description>
    <link>https://forem.com/mcornella</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F249285%2F3b2e769b-0466-4395-99d8-89e9e1732541.jpg</url>
      <title>Forem: Marc Cornellà</title>
      <link>https://forem.com/mcornella</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mcornella"/>
    <language>en</language>
    <item>
      <title>“DNS” URL redirect records considered harmful</title>
      <dc:creator>Marc Cornellà</dc:creator>
      <pubDate>Sat, 16 May 2020 12:06:19 +0000</pubDate>
      <link>https://forem.com/mcornella/dns-url-redirect-records-considered-harmful-2jf0</link>
      <guid>https://forem.com/mcornella/dns-url-redirect-records-considered-harmful-2jf0</guid>
      <description>&lt;p&gt;&lt;em&gt;Yes, I used "considered harmful" in the title. Can I be a thought-leader now?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When you own a domain it is often desirable to use a subdomain to point to somewhere else. For example, you might want to use the cooler-looking &lt;code&gt;blog.mcornella.com&lt;/code&gt; domain to point to your &lt;a href="https://dev.to/mcornella"&gt;dev.to&lt;/a&gt; profile.&lt;/p&gt;

&lt;p&gt;This can be done easily with a URL redirect record, where you specify the subdomain (&lt;code&gt;blog&lt;/code&gt;) and the URL it should be redirected to (&lt;code&gt;https://dev.to/mcornella&lt;/code&gt;). Fortunately, most major domain name registrars offer this option on their DNS settings dashboard. For example, this is how it looks in the current Namecheap DNS dashboard:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CdI1GStU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3qm3r54xxqgjxor7g1t1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CdI1GStU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3qm3r54xxqgjxor7g1t1.png" alt="Namecheap's add URL redirect record form"&gt;&lt;/a&gt;&lt;/p&gt;
Namecheap's add URL redirect record form



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aCvMnC3l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vhbr5xj0f27cs3ratzmp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aCvMnC3l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vhbr5xj0f27cs3ratzmp.png" alt="URL redirect record for blog.mcornella.com"&gt;&lt;/a&gt;&lt;/p&gt;
URL redirect record for `blog.mcornella.com`



&lt;h2&gt;
  
  
  How does this work?
&lt;/h2&gt;

&lt;p&gt;Let's use &lt;code&gt;curl&lt;/code&gt; to see what happens under the hood:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;curl &lt;span class="nt"&gt;-v&lt;/span&gt; blog.mcornella.com
&lt;span class="go"&gt;*   Trying 162.255.119.141:80...
* TCP_NODELAY set
&lt;/span&gt;&lt;span class="gp"&gt;* Connected to blog.mcornella.com (162.255.119.141) port 80 (#&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;GET / HTTP/1.1
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Host: blog.mcornella.com
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;User-Agent: curl/7.65.3
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Accept: &lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;* Mark bundle as not supporting multiuse
&amp;lt; HTTP/1.1 302 Found
&amp;lt; Server: nginx
&amp;lt; Date: Fri, 15 May 2020 14:49:06 GMT
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt; Content-Type: text/html;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;utf-8
&lt;span class="go"&gt;&amp;lt; Content-Length: 47
&amp;lt; Connection: keep-alive
&amp;lt; Location: https://dev.to/mcornella
&amp;lt; X-Served-By: Namecheap URL Forward
&amp;lt;
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt;a href='https://dev.to/mcornella'&amp;gt;&lt;/span&gt;Found&amp;lt;/a&amp;gt;.
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;* Connection #&lt;/span&gt;0 to host blog.mcornella.com left intact
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can see that the cURL request hits a Namecheap server (that uses Nginx, but that's not important here). This server then serves the redirect to the URL we set up, using a &lt;code&gt;Location:&lt;/code&gt; header and an HTTP 302 status code.&lt;/p&gt;

&lt;p&gt;What's more interesting is what we don't see. There are no TLS negotiation steps, and it's using port 80: &lt;strong&gt;this request is not using HTTPS&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;p&gt;Let's say we want to point somewhere else where security is crucial. In my case, I use &lt;code&gt;suport.mcornella.com&lt;/code&gt; as a shortcut to the TeamViewer QuickSupport executable, so that my clients have it easier to download.&lt;/p&gt;

&lt;p&gt;It's important that this is served using HTTPS all the way through, since it's something that users will end up running. Otherwise, an attacker could put themselves between the user and the Namecheap server, and modify the &lt;code&gt;Location&lt;/code&gt; header with another URL pointing to a malicious payload masquerading as the TeamViewer QuickSupport executable.&lt;/p&gt;

&lt;p&gt;Can we still use the previous method to do the redirect using HTTPS? This is what cURL says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;curl &lt;span class="nt"&gt;-v&lt;/span&gt; https://blog.mcornella.com
&lt;span class="go"&gt;*   Trying 162.255.119.141:443...
* TCP_NODELAY set
* connect to 162.255.119.141 port 443 failed: Connection timed out
* Failed to connect to blog.mcornella.com port 443: Connection timed out
* Closing connection 0
curl: (7) Failed to connect to blog.mcornella.com port 443: Connection timed out
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we can see, the Namecheap servers don't support HTTPS to make the redirect. &lt;em&gt;And why is that, you might ask.&lt;/em&gt; Well, to do that, their servers don't just serve requests for our domain, they serve many other domains. &lt;strong&gt;They'd have to respond to each subdomain request with a custom certificate&lt;/strong&gt;, which is significantly harder to do at the scale Namecheap operates in. It isn't impossible though, especially with &lt;a href="https://letsencrypt.org/"&gt;Let's Encrypt&lt;/a&gt;. Regardless, Namecheap doesn't support this at the moment, so let's see what alternatives we have.&lt;/p&gt;

&lt;h2&gt;
  
  
  Securing the redirect
&lt;/h2&gt;

&lt;p&gt;What do we need then? We need a hosting solution with a way to redirect to another endpoint with an automatically-generated certificate. I'll cover 2 alternatives: &lt;a href="https://vercel.com/"&gt;Vercel&lt;/a&gt; (previously &lt;a href="https://vercel.com/blog/zeit-is-now-vercel"&gt;Zeit Now&lt;/a&gt;), and &lt;a href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vercel
&lt;/h3&gt;

&lt;p&gt;For Vercel, you first need to have an account in &lt;a href="https://vercel.com"&gt;vercel.com&lt;/a&gt;. You can sign up with your GitHub account, as well as using other methods.&lt;/p&gt;

&lt;p&gt;Next, &lt;a href="https://vercel.com/download"&gt;install the Vercel CLI&lt;/a&gt; with &lt;code&gt;npm i -g vercel&lt;/code&gt;. Then, login to Vercel from the CLI with &lt;code&gt;vercel login&lt;/code&gt; and follow the instructions.&lt;/p&gt;

&lt;p&gt;Next, we need to create a folder in which we'll add a &lt;code&gt;vercel.json&lt;/code&gt; file, with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"redirects"&lt;/span&gt;&lt;span class="p"&gt;:&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/(.*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"destination"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://download.teamviewer.com/download/TeamViewerQS.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"permanent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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="p"&gt;]&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things to note here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;source&lt;/code&gt; value (&lt;code&gt;/(.*)&lt;/code&gt;) will match any path of the subdomain, so hitting &lt;code&gt;/&lt;/code&gt;, &lt;code&gt;/abc&lt;/code&gt;, or &lt;code&gt;/an/even/longer/path&lt;/code&gt; will all redirect to the destination URL.&lt;/li&gt;
&lt;li&gt;You should replace the value of &lt;code&gt;destination&lt;/code&gt; with the URL you want to redirect to.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once you have that, deploy the folder by running &lt;code&gt;vercel --prod&lt;/code&gt; inside the folder we just created. This will by default get you a server running on &lt;code&gt;&amp;lt;site-name-with-dashes&amp;gt;.now.sh&lt;/code&gt;, which is already ready to serve the redirects. How cool is that?&lt;/p&gt;

&lt;p&gt;Finally, &lt;a href="https://vercel.com/docs/v2/custom-domains"&gt;set up the custom domain in Vercel&lt;/a&gt;, and replace the &lt;code&gt;URL redirect record&lt;/code&gt; in Namecheap with a &lt;code&gt;CNAME&lt;/code&gt; record pointing to &lt;code&gt;alias.zeit.co&lt;/code&gt; (this is how it works up until now, follow the instructions in the linked Vercel docs if this doesn't work).&lt;/p&gt;

&lt;p&gt;I've found that after doing the last step, this works pretty much right after the Vercel endpoint detects the custom domain change. Also, Vercel redirects HTTP requests to the appropriate HTTPS URL out of the box:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;curl &lt;span class="nt"&gt;-v&lt;/span&gt; suport.mcornella.com
&lt;span class="go"&gt;*   Trying 35.180.16.12:80...
* TCP_NODELAY set
&lt;/span&gt;&lt;span class="gp"&gt;* Connected to suport.mcornella.com (35.180.16.12) port 80 (#&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;GET / HTTP/1.1
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Host: suport.mcornella.com
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;User-Agent: curl/7.65.3
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Accept: &lt;span class="k"&gt;*&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;* Mark bundle as not supporting multiuse
&amp;lt; HTTP/1.1 308 Permanent Redirect
&amp;lt; Date: Fri, 15 May 2020 17:15:54 GMT
&amp;lt; Content-Type: text/plain
&amp;lt; Transfer-Encoding: chunked
&amp;lt; Connection: keep-alive
&amp;lt; Location: https://suport.mcornella.com/
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt; Refresh: 0;&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://suport.mcornella.com/
&lt;span class="go"&gt;&amp;lt; x-now-trace: cdg1
&amp;lt; server: now
&amp;lt; x-vercel-id: cdg1::rdj82-1589562954711-4fc270f67df9
&amp;lt; x-now-id: cdg1::rdj82-1589562954711-4fc270f67df9
&amp;lt;
Redirecting to https://suport.mcornella.com/ (308)
&lt;/span&gt;&lt;span class="gp"&gt;* Connection #&lt;/span&gt;0 to host suport.mcornella.com left intact
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Netlify
&lt;/h3&gt;

&lt;p&gt;The setup with &lt;a href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt; is pretty much the same. You can also &lt;a href="https://app.netlify.com/signup"&gt;sign up&lt;/a&gt; with GitHub and using other methods.&lt;/p&gt;

&lt;p&gt;To &lt;a href="https://docs.netlify.com/cli/get-started/#installation"&gt;install the CLI&lt;/a&gt;, run &lt;code&gt;npm i -g netlify-cli&lt;/code&gt;. Then, &lt;a href="https://docs.netlify.com/cli/get-started/#authentication"&gt;login with &lt;code&gt;netlify login&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The redirect API of Netlify is also very similar. &lt;a href="https://docs.netlify.com/routing/redirects/"&gt;There are two options here to specify a redirect&lt;/a&gt;; I'll explain using a &lt;code&gt;_redirects&lt;/code&gt; file. &lt;a href="https://docs.netlify.com/routing/redirects/#syntax-for-the-netlify-configuration-file"&gt;Using the &lt;code&gt;netlify.toml&lt;/code&gt; file allows extra options&lt;/a&gt;, but we don't really need them here.&lt;/p&gt;

&lt;p&gt;As before, create a folder where we'll put a file named &lt;code&gt;_redirects&lt;/code&gt;, with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/*      https://download.teamviewer.com/download/TeamViewerQS.exe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first part of the line is the original path to be matched (use &lt;code&gt;/*&lt;/code&gt; to match all requests), and the last part is the destination path or URL.&lt;/p&gt;

&lt;p&gt;Then, deploy the site by running &lt;code&gt;netlify deploy --prod&lt;/code&gt; inside the folder we just created, making sure to specify &lt;code&gt;.&lt;/code&gt; as the publish directory (default value).&lt;/p&gt;

&lt;p&gt;When the site has been created, &lt;a href="https://docs.netlify.com/domains-https/custom-domains"&gt;add your custom domain&lt;/a&gt; by following the instructions in the site dashboard. It'll ask you to add a CNAME pointing to the site URL created (&lt;code&gt;&amp;lt;site-name-with-dashes&amp;gt;.netlify.app&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Finally, verify that both the HTTP and HTTPS requests work. In the case of Netlify, the HTTP requests aren't upgrading to HTTPS automatically, but the important thing is that HTTPS requests work just the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Creating a URL redirect served via HTTPS is very easy and it costs nothing, and while some domain name registrars haven't caught up yet with the times, using Vercel and Netlify are two very good options which I'm sure you'll enjoy.&lt;/p&gt;

</description>
      <category>https</category>
      <category>redirect</category>
      <category>dns</category>
      <category>namecheap</category>
    </item>
    <item>
      <title>Migrating Oh My Zsh to our GitHub organization</title>
      <dc:creator>Marc Cornellà</dc:creator>
      <pubDate>Mon, 25 Nov 2019 21:27:23 +0000</pubDate>
      <link>https://forem.com/ohmyzsh/migrating-oh-my-zsh-to-our-github-organization-2cbc</link>
      <guid>https://forem.com/ohmyzsh/migrating-oh-my-zsh-to-our-github-organization-2cbc</guid>
      <description>&lt;h5&gt;
  
  
  &lt;code&gt;$ mv robbyrussell/oh-my-zsh ohmyzsh/ohmyzsh&lt;/code&gt;
&lt;/h5&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;How the project started was already talked about in &lt;a href="https://medium.com/free-code-camp/d-oh-my-zsh-af99ca54212c"&gt;this blog post by Robby&lt;/a&gt;. It talks of the serendipity and dumb luck of starting a popular and still growing project, and some of the philosophies behind it. Since then, 10 years have past (we celebrated it in style), and the size of the project made evident that we were lacking something. Something that only a GitHub organization could give us.&lt;/p&gt;

&lt;p&gt;Liquid error: internal&lt;/p&gt;

&lt;p&gt;The organization was created in September of 2016(the &lt;a href="https://twitter.com/MarcCornella/status/805828681214083072"&gt;first public reference is of late 2016&lt;/a&gt;), but it wasn’t put to use for real until beginning this year when &lt;a href="https://github.com/ohmyzsh/github-actions"&gt;a repository for GitHub Actions&lt;/a&gt; was created. We didn’t really talk about a migration until much later, probably because the thought of breaking something was too stressful. It turned out though that we didn’t have any reasons to be concerned.&lt;/p&gt;

&lt;p&gt;The final decision was made 2 weeks ago: the project had grown so much that it didn’t make sense to have it hamstrung by being under a personal account. GitHub has many features and advantages for open source projects that are only applicable under an organization.&lt;/p&gt;

&lt;p&gt;Some of the main features of GitHub organizations that we needed were member roles and fine-grained permissions, to easily onboard maintainers at a pace we’d be comfortable with, and also a better experience with GitHub Actions that we couldn’t get with the project being under a personal account. We’re excited to dive in and find many other cool stuff that GitHub has built.&lt;/p&gt;

&lt;h2&gt;
  
  
  The process
&lt;/h2&gt;

&lt;p&gt;As it turns out, the process of transferring a personal repository to an organization is really easy and has very few caveats. It’s obvious that GitHub did really think it through. Here are some of the items we thought important to cover for the transfer (taken from &lt;a href="https://github.com/ohmyzsh/ohmyzsh/issues/8388"&gt;#8388&lt;/a&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Update main / billing email address to Robby's email&lt;/li&gt;
&lt;li&gt;Notify the teams&lt;/li&gt;
&lt;li&gt;Transfer repository to &lt;a href="https://github.com/ohmyzsh"&gt;@ohmyzsh&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Rename repository from oh-my-zsh to ohmyzsh for consistency&lt;/li&gt;
&lt;li&gt;Update all instances of old URL in codebase&lt;/li&gt;
&lt;li&gt;Update all instances of old URL in the wiki&lt;/li&gt;
&lt;li&gt;Update website install guide&lt;/li&gt;
&lt;li&gt;Add automatic remote reset when performing an upgrade (this should check the remote matches &lt;code&gt;robbyrussell/oh-my-zsh&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;3 and 4 are the only really necessary ones. Everything else comes second: we could live without doing them but they’re a nice-to-have, as GitHub takes care of redirecting the old URLs. There have been no documented hiccups while the transfer was in process; this really says a lot about GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does this mean for the end user?
&lt;/h2&gt;

&lt;p&gt;Great question. We attempted to make this transition as simple and seamless as possible and, as we’ve said before, &lt;a href="https://help.github.com/en/github/administering-a-repository/transferring-a-repository"&gt;GitHub has made it very easy&lt;/a&gt;. Here are the things that have been transferred along with the repository:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Issues, including Pull Requests&lt;/li&gt;
&lt;li&gt;Wiki&lt;/li&gt;
&lt;li&gt;Stars&lt;/li&gt;
&lt;li&gt;Watchers&lt;/li&gt;
&lt;li&gt;Webhooks&lt;/li&gt;
&lt;li&gt;Forks associated&lt;/li&gt;
&lt;li&gt;Issue assignments to members of the organization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also added an automatic reset of the git remote URL in the ohmyzsh folder (&lt;code&gt;$ZSH&lt;/code&gt;). This reset only applies if the git remote is the default one (&lt;code&gt;robbyrussell/oh-my-zsh&lt;/code&gt; via HTTPS). For this reset to be applied, there needs to be a 2-step upgrade: once to download the remote reset logic, and once again to apply it. As always, you can trigger an upgrade with &lt;code&gt;upgrade_oh_my_zsh&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag_asciinema"&gt;
  
&lt;/div&gt;


&lt;p&gt;Users using an &lt;a href="https://git-scm.com/docs/git-fetch#_git_urls_a_id_urls_a"&gt;SSH URL or other valid git remote URLs&lt;/a&gt; should make the change manually. Again, nothing happens if this isn’t done, GitHub takes care of the redirection, but it’s just to avoid confusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Going forward
&lt;/h2&gt;

&lt;p&gt;The project has been a little behind the times compared to other successful projects. We want to fix that from now on. One of the things we’re fixing is that the community doesn’t have a place other than GitHub issues to talk to each other. This is why &lt;a href="https://discord.gg/bpXWhnN"&gt;we have created a Discord server&lt;/a&gt;, with the goal of putting users in touch with each other and also to get support from the community. We have other goals in mind to get the project to the state that the community deserves that we'll get to in a future article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Developers
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/robbyrussell"&gt;Robby Russell&lt;/a&gt;: original creator and maintainer.&lt;br&gt;
&lt;a href="https://github.com/mcornella"&gt;Marc Cornellà&lt;/a&gt;: maintainer for the past few years.&lt;br&gt;
&lt;a href="https://github.com/larson-carter"&gt;Larson Carter&lt;/a&gt;: newly added maintainer.&lt;/p&gt;

</description>
      <category>zsh</category>
      <category>ohmyzsh</category>
      <category>productivity</category>
      <category>github</category>
    </item>
  </channel>
</rss>
