<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="pretty-atom-feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Miguel Carneiro</title>
  <subtitle>My personal little corner of the internet.</subtitle>
  <link href="https://carneiro.pt/feed/feed.xml" rel="self" />
  <link href="https://carneiro.pt/" />
  <updated>2025-12-05T00:00:00Z</updated>
  <id>https://carneiro.pt/</id>
  <author>
    <name>Miguel Carneiro</name>
  </author>
  <entry>
    <title>How I manage the infrastructure of skeeled alone</title>
    <link href="https://carneiro.pt/blog/how-i-manage-skeeled-infrastructure-alone/" />
    <updated>2025-12-05T00:00:00Z</updated>
    <id>https://carneiro.pt/blog/how-i-manage-skeeled-infrastructure-alone/</id>
    <content type="html">&lt;p&gt;How I manage the infrastructure of skeeled alone?
Plot twist: I&#39;m not really alone!&lt;/p&gt;
&lt;p&gt;Over the past 5 years, I built and managed what is today skeeled&#39;s infrastructure. I worked alone, but with the trust and guidance of Rui, my manager, who knows infrastructure well and trusted me completely with this task. All while staying confident in our stack and sleeping well at night.&lt;/p&gt;
&lt;p&gt;This was accomplished through two main approaches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keeping it simple with standards and &amp;quot;boring&amp;quot; technology&lt;/li&gt;
&lt;li&gt;Standing on the shoulders of giants (mentors and open source)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;keeping-it-simple&quot;&gt;Keeping it simple&lt;/h2&gt;
&lt;p&gt;We follow industry standards and use well-tested &lt;a href=&quot;https://boringtechnology.club/&quot;&gt;boring technology&lt;/a&gt;. Our infrastructure is coded simply and clearly.&lt;/p&gt;
&lt;p&gt;This approach let us migrate environments, join clusters, and adapt when tools like Rancher Fleet added features we needed. We could revert changes and try again seamlessly.&lt;/p&gt;
&lt;p&gt;Everything declared as code gives us an always-updated recipe for our infrastructure. This is like having the blueprint of the Disaster Recovery Plan (DRP) defined as code.&lt;/p&gt;
&lt;p&gt;When problems arise, we move quickly because we have a solid foundation, not a castle of sand. We have proper disaster recovery and data backups.&lt;/p&gt;
&lt;h2 id=&quot;standing-on-the-shoulders-of-giants&quot;&gt;Standing on the shoulders of giants&lt;/h2&gt;
&lt;p&gt;I stand and work on the shoulders of giants: mentors and the open source community.&lt;/p&gt;
&lt;h3 id=&quot;mentors&quot;&gt;Mentors&lt;/h3&gt;
&lt;p&gt;Having mentors accelerates your career and knowledge.
When I joined Farfetch, my team &lt;s&gt;forced&lt;/s&gt; inspired me to read two technical books:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://sre.google/sre-book/table-of-contents/&quot;&gt;Site Reliability Engineering: How Google Runs Production Systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.prombook.info/index.html&quot;&gt;Hands-On Infrastructure Monitoring with Prometheus&lt;/a&gt; by &lt;a href=&quot;https://blog.kintoandar.com/&quot;&gt;Joel Bastos&lt;/a&gt; and &lt;a href=&quot;https://verynomagic.com/&quot;&gt;Pedro Araújo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second book is special and biased because it was written by two team members who became important mentors.&lt;/p&gt;
&lt;p&gt;My daily routine started with reading, taking notes, doing exercises, and asking questions. They were kind yet demanding in their explanations and expectations.&lt;/p&gt;
&lt;p&gt;Before that, during my interview, they recommended &lt;em&gt;The Phoenix Project&lt;/em&gt;, which I bought and read before starting.&lt;/p&gt;
&lt;p&gt;They taught me to read open source code and understand how it works. When issues appear, check the source code—you might find a bug and contribute a fix.&lt;/p&gt;
&lt;p&gt;When I joined skeeled knowing little about Kubernetes, the team again provided courses, books, and most importantly, time to properly learn.&lt;/p&gt;
&lt;p&gt;Even after changing companies, I contact mentors for implementation advice. I pay it forward by helping friends or even strangers that ask for help. These helping moments matter more than all the solo coding hours. I still remember the feeling of helping the wife of a friend that works at TripAdvisor with some Git issue, or helping a chilhood friend with his company GitHub Actions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;There&#39;s joy in getting help and learning from others, and even more joy in teaching and helping others.&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;open-source-community&quot;&gt;Open source community&lt;/h3&gt;
&lt;p&gt;My job would be impossible without volunteer developers making the world better, usually for free. The world runs on software written by developers who provide it freely with source code we can learn from and improve.&lt;/p&gt;
&lt;p&gt;This creates both a learning source and high-quality industry standard tools.&lt;/p&gt;
&lt;p&gt;Our infrastructure is setup and runs almost exclusively on open source tools: Kubernetes, Helm, Prometheus, Grafana, Thanos, OpenTelemetry, SigNoz, Rancher Fleet, and Terraform&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://carneiro.pt/blog/how-i-manage-skeeled-infrastructure-alone/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Rather than diving into technical details, I&#39;ll focus on the important decisions these tools enabled.&lt;/p&gt;
&lt;p&gt;Kubernetes is complex, but it&#39;s learnable complexity. Once you understand it, it saves significant work and provides sensible defaults.&lt;/p&gt;
&lt;p&gt;Running Prometheus and Grafana in each cluster is essential (thanks to mentor advice). You can have all the global monitoring you want, but when network issues hit, you&#39;ll thank yourself for having local tools to understand the problem.&lt;/p&gt;
&lt;p&gt;Trust me, it&#39;s always DNS.&lt;/p&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://carneiro.pt/blog/how-i-manage-skeeled-infrastructure-alone/qMfc4VfId9-600.avif 600w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://carneiro.pt/blog/how-i-manage-skeeled-infrastructure-alone/qMfc4VfId9-600.webp 600w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://carneiro.pt/blog/how-i-manage-skeeled-infrastructure-alone/qMfc4VfId9-600.jpeg&quot; alt=&quot;It was DNS image&quot; width=&quot;600&quot; height=&quot;358&quot;&gt;&lt;/picture&gt;
Source: https://www.auvik.com/franklyit/blog/securing-your-dns/
&lt;p&gt;Thanos provides global metric storage, letting us compare application behavior across years. This helped us understand strange behavior from a deployment months earlier.&lt;/p&gt;
&lt;p&gt;We use Dead Man&#39;s Snitch&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://carneiro.pt/blog/how-i-manage-skeeled-infrastructure-alone/#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt; for watchdog alerts. Prometheus should be silent to avoid interrupting work, but you need to know your monitoring works. A watchdog alert provides peace of mind.&lt;/p&gt;
&lt;p&gt;These industry standards gave us flexibility to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Migrate from Datadog to SigNoz in days using OpenTelemetry (saving money)&lt;/li&gt;
&lt;li&gt;Move Thanos data from AWS S3 to OVH Object Storage (saving money)&lt;/li&gt;
&lt;li&gt;Migrate clusters from Scaleway to OVH easily (saving money)&lt;/li&gt;
&lt;li&gt;Switch Kafka from Confluent to OVH (saving a lot of money, reduced costs to 20% of original bill)&lt;/li&gt;
&lt;li&gt;Migrate from Mongo Atlas&lt;/li&gt;
&lt;li&gt;Move freely between cloud providers (AWS → OVH → Scaleway → Azure → GCP)&lt;/li&gt;
&lt;li&gt;Migrate regions after a &lt;a href=&quot;https://www.datacenterdynamics.com/en/analysis/ovhcloud-fire-france-data-center/&quot;&gt;datacenter fire&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Recover from a drop database in production.&lt;/li&gt;
&lt;li&gt;And more...&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;key-takeaways&quot;&gt;Key takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;You&#39;re never truly alone&lt;/li&gt;
&lt;li&gt;Keep it simple—use boring, well-tested technologies and standards&lt;/li&gt;
&lt;li&gt;Get a mentor and mentor others&lt;/li&gt;
&lt;li&gt;Read technical books and manuals (RTFM)&lt;/li&gt;
&lt;li&gt;Invest in education; managers should provide learning time and resources&lt;/li&gt;
&lt;li&gt;Use and contribute to open source (start small even with documentation typos or examples)&lt;/li&gt;
&lt;li&gt;Define everything as code, including disaster recovery and backups&lt;/li&gt;
&lt;li&gt;Choose options that avoid vendor lock-in and enable movement&lt;/li&gt;
&lt;li&gt;Accept challenges even when you&#39;re not ready yet and do your best to learn&lt;/li&gt;
&lt;/ul&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Terraform now uses Business Source License rather than being fully open source. &lt;a href=&quot;https://carneiro.pt/blog/how-i-manage-skeeled-infrastructure-alone/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;a href=&quot;http://deadmanssnitch.com/&quot;&gt;Dead Man&#39;s Snitch&lt;/a&gt; is not open source. Let me know if you know a good open alternatives. &lt;a href=&quot;https://carneiro.pt/blog/how-i-manage-skeeled-infrastructure-alone/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content>
  </entry>
  <entry>
    <title>Cloudflare outage and infrastructure as code</title>
    <link href="https://carneiro.pt/blog/2025-cloudflare-outage/" />
    <updated>2025-11-20T00:00:00Z</updated>
    <id>https://carneiro.pt/blog/2025-cloudflare-outage/</id>
    <content type="html">&lt;p&gt;Last Tuesday (Nov 18, 2025), 20% of the internet was &amp;quot;down&amp;quot; due to some proxy issue on Cloudflare.&lt;/p&gt;
&lt;p&gt;skeeled was affected by this. João (our Quality Control Analyst) asked me if I broke our non-production environment (again). Soon after, we received a message from Eric (our Head of Customer Success) that some clients were experiencing issues.&lt;/p&gt;
&lt;p&gt;Quickly we noticed something that had never happened to us, Cloudflare was down! The Cloudflare dashboard was also down, but we disabled the proxy feature in our config as code and the API was working, mitigating the issue.&lt;/p&gt;
&lt;p&gt;Within minutes, our clients were able to use our application without Cloudflare as a middleman, which increased our load a bit. Sorry for not giving our clients some slack!&lt;/p&gt;
&lt;p&gt;Things like these happen to all companies: Cloudflare, AWS, GCP, OVH, Scaleway... How it&#39;s handled and communicated shows their true value.&lt;/p&gt;
&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://carneiro.pt/blog/2025-cloudflare-outage/IFxNWvd2KQ-1294.avif 1294w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://carneiro.pt/blog/2025-cloudflare-outage/IFxNWvd2KQ-1294.webp 1294w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://carneiro.pt/blog/2025-cloudflare-outage/IFxNWvd2KQ-1294.jpeg&quot; alt=&quot;Git commit with change, infrastructure as code book and my amazing cat&quot; width=&quot;1294&quot; height=&quot;1726&quot;&gt;&lt;/picture&gt;
</content>
  </entry>
  <entry>
    <title>Nix - using multiple channels in a shell.nix file</title>
    <link href="https://carneiro.pt/blog/nix-multiple-channels-shell/" />
    <updated>2021-09-07T00:00:00Z</updated>
    <id>https://carneiro.pt/blog/nix-multiple-channels-shell/</id>
    <content type="html">&lt;p&gt;This post is a public archival of a self-contained shell.nix file to use multiple channels of Nix. In this case the default and unstable channels.&lt;/p&gt;
&lt;p&gt;Template:&lt;/p&gt;
&lt;pre class=&quot;language-nix&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nix&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# shell.nix&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt;
  unstable &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fetchTarball&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;https://nixos.org/channels/nixos-unstable/nixexprs.tar.xz&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; nixpkgs &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;nixpkgs&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; nixpkgs&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; mkShell &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  buildInputs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    packageFromTheDefaultChannelHere
    unstable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;packageFromTheUnstableChannelHere
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;E.g. I needed kubectl 1.21.1 (from 21.05) and Terraform 1.0.6 (from unstable):&lt;/p&gt;
&lt;pre class=&quot;language-nix&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nix&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt;
  unstable &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fetchTarball&lt;/span&gt; &lt;span class=&quot;token url&quot;&gt;https://nixos.org/channels/nixos-unstable/nixexprs.tar.xz&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; nixpkgs &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;nixpkgs&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; nixpkgs&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; mkShell &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  buildInputs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    kubectl
    unstable&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;terraform
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  shellHook &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;
    export KUBECONFIG=&quot;`echo $(pwd)`/kubeconfig&quot;
  &#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The shellHook is an extra to have kubectl ready using the kubeconfig file that is generated by the Terraform code.&lt;/p&gt;
&lt;p&gt;Result:&lt;/p&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 punctuation&quot;&gt;[&lt;/span&gt;nix-shell:~/tmp/nix-example&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;which&lt;/span&gt; terraform
/nix/store/ya9w0sdja8d3d7vkjv2cbj6qjb70gdzs-terraform-1.0.6/bin/terraform

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;nix-shell:~/tmp/nix-example&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ terraform version
Terraform v1.0.6
on linux_amd64

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;nix-shell:~/tmp/nix-example&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;which&lt;/span&gt; kubectl
/nix/store/hjvsr2zgiz11n7dc3g7yp04qcxad9jrd-kubectl-1.21.1/bin/kubectl

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;nix-shell:~/tmp/nix-example&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ kubectl version
Client Version: version.Info&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Major:&lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;, Minor:&lt;span class=&quot;token string&quot;&gt;&quot;21&quot;&lt;/span&gt;, GitVersion:&lt;span class=&quot;token string&quot;&gt;&quot;v1.21.1&quot;&lt;/span&gt;, GitCommit:&lt;span class=&quot;token string&quot;&gt;&quot;5e58841cce77d4bc13713ad2b91fa0d961e69192&quot;&lt;/span&gt;, GitTreeState:&lt;span class=&quot;token string&quot;&gt;&quot;archive&quot;&lt;/span&gt;, BuildDate:&lt;span class=&quot;token string&quot;&gt;&quot;1980-01-01T00:00:00Z&quot;&lt;/span&gt;, GoVersion:&lt;span class=&quot;token string&quot;&gt;&quot;go1.16.4&quot;&lt;/span&gt;, Compiler:&lt;span class=&quot;token string&quot;&gt;&quot;gc&quot;&lt;/span&gt;, Platform:&lt;span class=&quot;token string&quot;&gt;&quot;linux/amd64&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
Server Version: version.Info&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Major:&lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;, Minor:&lt;span class=&quot;token string&quot;&gt;&quot;21&quot;&lt;/span&gt;, GitVersion:&lt;span class=&quot;token string&quot;&gt;&quot;v1.21.1&quot;&lt;/span&gt;, GitCommit:&lt;span class=&quot;token string&quot;&gt;&quot;5e58841cce77d4bc13713ad2b91fa0d961e69192&quot;&lt;/span&gt;, GitTreeState:&lt;span class=&quot;token string&quot;&gt;&quot;clean&quot;&lt;/span&gt;, BuildDate:&lt;span class=&quot;token string&quot;&gt;&quot;2021-05-12T14:12:29Z&quot;&lt;/span&gt;, GoVersion:&lt;span class=&quot;token string&quot;&gt;&quot;go1.16.4&quot;&lt;/span&gt;, Compiler:&lt;span class=&quot;token string&quot;&gt;&quot;gc&quot;&lt;/span&gt;, Platform:&lt;span class=&quot;token string&quot;&gt;&quot;linux/amd64&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Thank you Rui (our Head of Engineering at skeeled) for sharing this with me.&lt;/p&gt;
&lt;p&gt;P.S. This page could be a TIL (Today I Learned) bit in a category like this one &lt;a href=&quot;https://mrkaran.dev/tils/&quot;&gt;https://mrkaran.dev/tils/&lt;/a&gt;. When I do mine I will probably move it there.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href=&quot;https://mig4ng.hashnode.dev/nix-using-multiple-channels-in-a-shellnix-file&quot;&gt;https://mig4ng.hashnode.dev/nix-using-multiple-channels-in-a-shellnix-file&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Hello World</title>
    <link href="https://carneiro.pt/blog/hello-world/" />
    <updated>2019-05-09T00:00:00Z</updated>
    <id>https://carneiro.pt/blog/hello-world/</id>
    <content type="html">&lt;p&gt;Hello, world! My name is Miguel Carneiro but you can call me Mig. I am also known as mig4ng. More &lt;a href=&quot;https://carneiro.pt/about/&quot;&gt;about me here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is my very first and awkward hello world article. Breaking the ice is never easy and this article&#39;s purpose is to break it. Therefore, I will try to make it as short and embarrassing as possible so all articles that come next should feel easier to publish than this one.&lt;/p&gt;
&lt;p&gt;You are here either because you know me personally or because you read something I wrote and wanted to find out if there is more. Either way, I think we have wasted enough of our time.&lt;/p&gt;
&lt;p&gt;The only lesson I have to give in this article is that you start. Whatever it is that you are trying to do (a blog, a company, exercising, meditating, reading, etc.) just do it! Nike knew it all along. Baby steps, break your goal into smaller and more easily achievable goals and pick the first one on the list. Make the first item on the list very easy and achievable (e.g. read 5 minutes, write 100 words or 10 push-ups). Upon starting, it is way easier to keep going.&lt;/p&gt;
&lt;p&gt;Now I have no alternative than to follow my own advice and go publish my very first article.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a href=&quot;https://web.archive.org/web/20190509031433/https://mig4ng.com/articles/hello-world/&quot;&gt;https://mig4ng.com/articles/hello-world/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
</feed>