<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  
  <title>Huzaifa Dhapai — blog</title>
  <subtitle>Writing about what I&#39;m building, learning, and finding interesting.</subtitle>
  <link href="https://blog.xaif.in/feeds/blog.xml" rel="self" />
  <link href="https://blog.xaif.in/" />
  <updated>2026-09-13T08:33:30Z</updated>
  <id>https://blog.xaif.in/</id>
  <author>
    <name>Huzaifa Dhapai</name>
    <email>hello@example.com</email>
  </author>
  <entry>
    <title>How to Migrate n8n: Export &amp; Import Credentials and Workflows</title>
    <link href="https://blog.xaif.in/exporting-and-importing-n8n/" />
    <updated>2026-01-02T18:59:43Z</updated>
    <id>https://blog.xaif.in/exporting-and-importing-n8n/</id>
    <content type="html">&lt;p&gt;Recently, I wanted to migrate my n8n instance from a SQLite-based setup to a more robust solution.&lt;/p&gt;
&lt;p&gt;I began reviewing the &lt;a href=&quot;https://docs.n8n.io/workflows/export-import/&quot;&gt;guide provided by n8n&lt;/a&gt;, but I found it confusing and difficult to understand.&lt;/p&gt;
&lt;p&gt;As someone who has never used Docker, I struggled to figure out how to get started with it.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blog.xaif.in/img/h5GzNaFLT1-320.webp 320w, https://blog.xaif.in/img/h5GzNaFLT1-640.webp 640w, https://blog.xaif.in/img/h5GzNaFLT1-960.webp 960w, https://blog.xaif.in/img/h5GzNaFLT1-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://blog.xaif.in/img/h5GzNaFLT1-320.png&quot; alt=&quot;How to Migrate n8n: Export &amp;amp; Import Credentials and Workflows&quot; width=&quot;1280&quot; height=&quot;714&quot; srcset=&quot;https://blog.xaif.in/img/h5GzNaFLT1-320.png 320w, https://blog.xaif.in/img/h5GzNaFLT1-640.png 640w, https://blog.xaif.in/img/h5GzNaFLT1-960.png 960w, https://blog.xaif.in/img/h5GzNaFLT1-1280.png 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;how-to-migrate-n8n%3A-export-credentials-and-workflows&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.xaif.in/exporting-and-importing-n8n/#how-to-migrate-n8n%3A-export-credentials-and-workflows&quot;&gt;&lt;span&gt;How to Migrate n8n: Export Credentials and Workflows&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Login to your server.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ssh&lt;/span&gt; root@ip-address&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Run the command to retrieve the list of containers.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ps&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; n8n&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Find your container name, and then run the following command to export the credentials.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;container_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; n8n export:credentials &lt;span class=&quot;token parameter variable&quot;&gt;--all&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--decrypted&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; credentials.json&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Now, it’s time to implement it for workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;container_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; n8n export:workflow &lt;span class=&quot;token parameter variable&quot;&gt;--all&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; workflows.json&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Now you can verify whether the workflows have been exported correctly by using this command.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-la&lt;/span&gt; workflows.json credentials.json&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;how-to-migrate-n8n%3A-import-credentials-and-workflows&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.xaif.in/exporting-and-importing-n8n/#how-to-migrate-n8n%3A-import-credentials-and-workflows&quot;&gt;&lt;span&gt;How to Migrate n8n: Import Credentials and Workflows&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Firstly, ensure that you copy and paste these two files to your new server using the SCP command.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;scp&lt;/span&gt; workflows.json credentials.json root@new-server-ip:/home&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Then, find the name of the new container where your n8n is hosted by following the steps provided above. After that, copy and paste the files correctly.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; workflows.json &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;new_container_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;:/tmp/workflows.json
&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; credentials.json &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;new_container_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;:/tmp/credentials.json&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Verify that the files are correctly present inside the container.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;new_container_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-la&lt;/span&gt; /tmp/&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;You need to begin by importing the credentials.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;new_container_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; n8n import:credentials &lt;span class=&quot;token parameter variable&quot;&gt;--input&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/tmp/credentials.json&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Now, please proceed with the workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;new_container_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; n8n import:workflow &lt;span class=&quot;token parameter variable&quot;&gt;--input&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/tmp/workflows.json&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;That’s it! Now, just remember to restart the container once the work is done.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; restart &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;new_container_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Also, remember to clean up the files.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;new_container_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; /tmp/workflows.json /tmp/credentials.json&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;That’s it! You’ve successfully moved your workflows. If you encounter any issues during the process, please comment below, and let’s work together to resolve them.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>How a Sidebar Ruined Every Other Browser for Me</title>
    <link href="https://blog.xaif.in/sidebar-ruined-every-other-browser/" />
    <updated>2026-01-03T20:40:57Z</updated>
    <id>https://blog.xaif.in/sidebar-ruined-every-other-browser/</id>
    <content type="html">&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://blog.xaif.in/img/mJxtVj7Fm4-320.webp 320w, https://blog.xaif.in/img/mJxtVj7Fm4-640.webp 640w, https://blog.xaif.in/img/mJxtVj7Fm4-960.webp 960w, https://blog.xaif.in/img/mJxtVj7Fm4-1280.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://blog.xaif.in/img/mJxtVj7Fm4-320.png&quot; alt=&quot;Thumbnail: the author at a microphone beside the Comet, Dia and Zen Browser logos, under the headline &amp;quot;Sidebar Ruined Every Browser&amp;quot;&quot; width=&quot;1280&quot; height=&quot;720&quot; srcset=&quot;https://blog.xaif.in/img/mJxtVj7Fm4-320.png 320w, https://blog.xaif.in/img/mJxtVj7Fm4-640.png 640w, https://blog.xaif.in/img/mJxtVj7Fm4-960.png 960w, https://blog.xaif.in/img/mJxtVj7Fm4-1280.png 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I’ve always been a Google Chrome guy. Like, my entire life. Never really questioned it. It was just the browser I used, and that was that.&lt;/p&gt;
&lt;p&gt;Then in 2022, I got my hands on the Arc browser, and honestly? That was the beginning of my problems.&lt;/p&gt;
&lt;p&gt;Arc had this sidebar. Vertical tabs on the left instead of the tiny horizontal ones at the top. And I know this sounds stupid when I say it out loud, but once you use it, you can’t go back. There’s something about having your tabs stacked neatly on the side that just makes sense.&lt;/p&gt;
&lt;p&gt;I was hooked.&lt;/p&gt;
&lt;h2 id=&quot;and-then-arc-started-dying&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.xaif.in/sidebar-ruined-every-other-browser/#and-then-arc-started-dying&quot;&gt;&lt;span&gt;And Then Arc Started Dying&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For a while, I tried to stick with it. The browser was getting abandoned, but I kept telling myself it’s fine, I can still use this, it won’t be a problem.&lt;/p&gt;
&lt;p&gt;Except it became a problem. On my Intel Mac, Arc started slowing down my entire system. Like, everything would lag.&lt;/p&gt;
&lt;p&gt;So I did what I never wanted to do. I went back to Chrome.&lt;/p&gt;
&lt;p&gt;And look, Chrome is fine. It’s fast, it works, it’s reliable. But tbh, it felt like a downgrade. I kept missing that sidebar.&lt;/p&gt;
&lt;h2 id=&quot;trying-to-find-a-replacement&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.xaif.in/sidebar-ruined-every-other-browser/#trying-to-find-a-replacement&quot;&gt;&lt;span&gt;Trying to Find a Replacement&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In February 2025, I heard about Comet browser. Everyone was saying it’s going to be the best thing ever, so I filled out the form, joined the waitlist, got excited.&lt;/p&gt;
&lt;p&gt;Never got an invite.&lt;/p&gt;
&lt;p&gt;Eventually I found the .dmg file somewhere and tried it anyway. And I hated it. The browser was buggy, laggy, just not ready. I gave up on it pretty quickly.&lt;/p&gt;
&lt;p&gt;Then I heard Dia browser added vertical tabs, and I immediately made the switch.&lt;/p&gt;
&lt;p&gt;Now, moving to Dia was a pain. There’s no way to import bookmarks directly, and since it’s based on the Arc development kit, I tried going to &lt;code&gt;arc://bookmarks&lt;/code&gt; to see if that would work. It kind of did. But still, rebuilding everything from scratch is annoying.&lt;/p&gt;
&lt;h2 id=&quot;why-i%E2%80%99m-staying-(for-now)&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.xaif.in/sidebar-ruined-every-other-browser/#why-i%E2%80%99m-staying-(for-now)&quot;&gt;&lt;span&gt;Why I’m Staying (For Now)&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here’s the thing. I don’t use Dia for the AI features. I really don’t care about that stuff, and honestly, the AI summaries feel like slop to me. I’m only here for the sidebar. That’s it.&lt;/p&gt;
&lt;p&gt;I’ve tried Zen browser too, but I’m tired of switching between browsers constantly. I just want one browser where all my stuff is in one place and it works.&lt;/p&gt;
&lt;p&gt;Oh, and this is important. Widevine and DRM support. I spend a lot of time on Netflix, Prime Video, Spotify. If a browser can’t handle protected content, it’s not an option for me. Doesn’t matter how nice the UI is.&lt;/p&gt;
&lt;p&gt;So yeah, Dia works for now. The sidebar is there, DRM works, I’m comfortable.&lt;/p&gt;
&lt;p&gt;But here’s my worry. If Dia becomes a paid browser, I’m going to have to find something else again. And I really don’t want to go through this whole cycle one more time.&lt;/p&gt;
&lt;h2 id=&quot;what-i%E2%80%99ve-learned-from-all-this&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.xaif.in/sidebar-ruined-every-other-browser/#what-i%E2%80%99ve-learned-from-all-this&quot;&gt;&lt;span&gt;What I’ve Learned From All This&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Basically, one design choice, putting tabs on the side, has ruined every “normal” browser for me. I genuinely cannot go back to horizontal tabs without feeling like something is wrong.&lt;/p&gt;
&lt;p&gt;Is that a good thing? I don’t know. It means I’m stuck chasing indie browsers that might die, might get buggy, might start charging money. Meanwhile, Chrome is right there, stable and free, and I just… can’t settle for it.&lt;/p&gt;
&lt;p&gt;I guess that’s the trade-off. You find a feature you love, and suddenly the safe options don’t feel good enough anymore.&lt;/p&gt;
&lt;p&gt;For now, I’m on Dia. Ask me again in six months. Who knows where I’ll be.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>I found the Perfect Meeting Recording App</title>
    <link href="https://blog.xaif.in/perfect-recording-app/" />
    <updated>2026-09-13T08:33:30Z</updated>
    <id>https://blog.xaif.in/perfect-recording-app/</id>
    <content type="html">&lt;p&gt;I think finding the perfect recording app is too difficult.&lt;/p&gt;
&lt;p&gt;Most apps impose recording limits of 20 minutes or less, and sometimes even stricter restrictions.&lt;/p&gt;
&lt;p&gt;Today, I discovered a new app called &lt;a href=&quot;https://granola.ai&quot;&gt;Granola&lt;/a&gt;. It automatically records meetings without notifying the other participants.&lt;/p&gt;
&lt;p&gt;Whenever there’s a meeting, it sends me a pop-up reminder to record it if I forget.&lt;/p&gt;
</content>
  </entry>
</feed>