blowfish/docs/posts/202206-homepage-guide/index.html

1235 lines
80 KiB
HTML
Raw Normal View History

2022-09-11 16:04:33 -05:00
<!DOCTYPE html>
<html
lang="en"
dir="ltr"
class="scroll-smooth"
data-default-appearance="light"
data-auto-appearance="true"
><head>
<meta charset="utf-8" />
<meta http-equiv="content-language" content="en" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>How I Created My Homepage (for free) Using Docker, Hugo, and Firebase &middot; Blowfish</title>
<meta name="title" content="How I Created My Homepage (for free) Using Docker, Hugo, and Firebase &middot; Blowfish" />
<meta name="description" content="Product | Nuno Coração" />
<link rel="canonical" href="https://nunocoracao.github.io/blowfish/posts/202206-homepage-guide/" />
<link
type="text/css"
rel="stylesheet"
href="/blowfish/css/main.bundle.min.3f7a3d89b943c3dacb033ff4448c83a5b58692eb75f99e903ee759443c690298da06dc2cc7adc967ae51bb50103acfa1b65f99a428ef2ff09176f2519b277273.css"
integrity="sha512-P3o9iblDw9rLAz/0RIyDpbWGkut1&#43;Z6QPudZRDxpApjaBtwsx63JZ65Ru1AQOs&#43;htl&#43;ZpCjvL/CRdvJRmydycw=="
/>
<script type="text/javascript" src="/blowfish/js/main.min.cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e.js" integrity="sha512-z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP&#43;DGNKHfuwvY7kxvUdBeoGlODJ6&#43;SfaPg=="></script>
<script type="text/javascript" src="/blowfish/js/appearance.min.4a00b8b8a9118d31826a03a2a9cca83390fcd3eddd9e03868fffcf4dc1e2dc15649e9266091f1225a24e1bcf6558ff4807f77663bcfaaa8f3050d73c1bd5bf0b.js" integrity="sha512-SgC4uKkRjTGCagOiqcyoM5D80&#43;3dngOGj//PTcHi3BVknpJmCR8SJaJOG89lWP9IB/d2Y7z6qo8wUNc8G9W/Cw=="></script>
<script defer type="text/javascript" id="script-bundle" src="/blowfish/js/main.bundle.min.e6e48d63bad91cf9da5ad2ef829f0e1a4f79580fef3b734cbce6d93a5c2042e544ac067c02a4ae5d9f83b402ae77c7a04f8f3c347050a2d5bfb18c21fc7de756.js" integrity="sha512-5uSNY7rZHPnaWtLvgp8OGk95WA/vO3NMvObZOlwgQuVErAZ8AqSuXZ&#43;DtAKud8egT488NHBQotW/sYwh/H3nVg==" data-copy="Copy" data-copied="Copied"></script>
<script src="/js/zoom.min.js"></script>
<link rel="apple-touch-icon" sizes="180x180" href="/blowfish/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/blowfish/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/blowfish/favicon-16x16.png" />
<link rel="manifest" href="/blowfish/site.webmanifest" />
<meta property="og:title" content="How I Created My Homepage (for free) Using Docker, Hugo, and Firebase" />
<meta property="og:description" content="Currently, there are several solutions to build and host your personal website. I wanted to challenge myself to see if I could do it with the same set of features as some of the paid solutions out there and for free. Here are the results." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://nunocoracao.github.io/blowfish/posts/202206-homepage-guide/" /><meta property="og:image" content="https://nunocoracao.github.io/blowfish/posts/202206-homepage-guide/feature.png"/><meta property="article:section" content="posts" />
<meta property="article:published_time" content="2022-06-27T00:00:00+00:00" />
<meta property="article:modified_time" content="2022-06-27T00:00:00+00:00" /><meta property="og:site_name" content="Blowfish" />
<meta name="twitter:card" content="summary_large_image"/>
<meta name="twitter:image" content="https://nunocoracao.github.io/blowfish/posts/202206-homepage-guide/feature.png"/>
<meta name="twitter:title" content="How I Created My Homepage (for free) Using Docker, Hugo, and Firebase"/>
<meta name="twitter:description" content="Currently, there are several solutions to build and host your personal website. I wanted to challenge myself to see if I could do it with the same set of features as some of the paid solutions out there and for free. Here are the results."/>
<script type="application/ld+json">
[{
"@context": "https://schema.org",
"@type": "Article",
"articleSection": "Posts",
"name": "How I Created My Homepage (for free) Using Docker, Hugo, and Firebase",
"headline": "How I Created My Homepage (for free) Using Docker, Hugo, and Firebase",
"description": "Currently, there are several solutions to build and host your personal website. I wanted to challenge myself to see if I could do it with the same set of features as some of the paid solutions out there and for free. Here are the results.",
"abstract": "Currently, there are several solutions to build and host your personal website. I wanted to challenge myself to see if I could do it with the same set of features as some of the paid solutions out there and for free. Here are the results.",
"inLanguage": "en",
"url" : "https:\/\/nunocoracao.github.io\/blowfish\/posts\/202206-homepage-guide\/",
"author" : {
"@type": "Person",
"name": "Blowfish"
},
"copyrightYear": "2022",
"dateCreated": "2022-06-27T00:00:00\u002b00:00",
"datePublished": "2022-06-27T00:00:00\u002b00:00",
"dateModified": "2022-06-27T00:00:00\u002b00:00",
"keywords": ["Development","Environment","Tutorial","Hugo","Congo","Docker","VSCode","Go"],
"mainEntityOfPage": "true",
"wordCount": "2892"
}]
</script>
<meta name="author" content="Blowfish" />
<link href="https://linkedin.com/in/nunocoracao" rel="me" />
<link href="https://twitter.com/nunocoracao" rel="me" />
<link href="https://medium.com/@nunocoracao" rel="me" />
<link href="https://github.com/nunocoracao" rel="me" />
<link href="http://goodreads.com/nunocoracao" rel="me" />
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXX"></script>
<script>
var doNotTrack = false;
if (!doNotTrack) {
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXX', { 'anonymize_ip': false });
}
</script>
<link rel="stylesheet" href="https://rsms.me/inter/inter.css">
</head>
<body
class="flex flex-col h-screen px-6 m-auto text-lg leading-7 max-w-7xl bg-neutral text-neutral-900 dark:bg-neutral-800 dark:text-neutral sm:px-14 md:px-24 lg:px-32"
>
<div id="the-top" class="absolute flex self-center">
<a
class="px-3 py-1 text-sm -translate-y-8 rounded-b-lg bg-primary-200 focus:translate-y-0 dark:bg-neutral-600"
href="#main-content"
><span class="font-bold text-primary-600 ltr:pr-2 rtl:pl-2 dark:text-primary-400"
>&darr;</span
>Skip to main content</a
>
</div>
<div style="padding-left:0;padding-right:0"
class="flex items-center justify-between px-4 py-6 sm:px-6 md:justify-start space-x-3">
<div>
<a href="/blowfish/" class="flex">
<span class="sr-only">Blowfish</span>
<img src="/blowfish/img/blowfish_logo_transparent.png" width="1000" height="1000"
class="max-h-[5rem] max-w-[5rem] object-scale-down object-left nozoom" alt="Blowfish" />
</a>
</div>
<div class="flex flex-1 items-center justify-between">
<nav class="flex space-x-3">
<a href="/" class="text-base font-medium text-gray-500 hover:text-gray-900">Blowfish</a>
</nav>
<div class="hidden md:flex items-center space-x-5 md:ml-12">
<a href="/blowfish/about/" class="text-base font-medium text-gray-500 hover:text-gray-900" title="About">About</a>
<span></span>
<button id="search-button" class="text-base hover:text-primary-600 dark:hover:text-primary-400"
title="">
<span class="relative inline-block align-text-bottom icon">
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</button>
<div
class="ltr:mr-14 rtl:ml-14 cursor-pointer text-sm text-neutral-700 hover:text-primary-600 dark:text-neutral dark:hover:text-primary-400">
<button id="appearance-switcher" type="button">
<div class="flex items-center justify-center h-12 dark:hidden">
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z"/></svg>
</span>
</div>
<div class="items-center justify-center hidden h-12 dark:flex">
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/></svg>
</span>
</div>
</button>
</div>
</div>
<div class="flex md:hidden items-center space-x-5 md:ml-12">
<span></span>
<button id="search-button-mobile" class="text-base hover:text-primary-600 dark:hover:text-primary-400"
title="">
<span class="relative inline-block align-text-bottom icon">
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</button>
<button id="appearance-switcher-mobile" type="button" style="margin-right:5px">
<div class="flex items-center justify-center h-12 dark:hidden">
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M32 256c0-123.8 100.3-224 223.8-224c11.36 0 29.7 1.668 40.9 3.746c9.616 1.777 11.75 14.63 3.279 19.44C245 86.5 211.2 144.6 211.2 207.8c0 109.7 99.71 193 208.3 172.3c9.561-1.805 16.28 9.324 10.11 16.95C387.9 448.6 324.8 480 255.8 480C132.1 480 32 379.6 32 256z"/></svg>
</span>
</div>
<div class="items-center justify-center hidden h-12 dark:flex">
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M256 159.1c-53.02 0-95.1 42.98-95.1 95.1S202.1 351.1 256 351.1s95.1-42.98 95.1-95.1S309 159.1 256 159.1zM509.3 347L446.1 255.1l63.15-91.01c6.332-9.125 1.104-21.74-9.826-23.72l-109-19.7l-19.7-109c-1.975-10.93-14.59-16.16-23.72-9.824L256 65.89L164.1 2.736c-9.125-6.332-21.74-1.107-23.72 9.824L121.6 121.6L12.56 141.3C1.633 143.2-3.596 155.9 2.736 164.1L65.89 256l-63.15 91.01c-6.332 9.125-1.105 21.74 9.824 23.72l109 19.7l19.7 109c1.975 10.93 14.59 16.16 23.72 9.824L256 446.1l91.01 63.15c9.127 6.334 21.75 1.107 23.72-9.822l19.7-109l109-19.7C510.4 368.8 515.6 356.1 509.3 347zM256 383.1c-70.69 0-127.1-57.31-127.1-127.1c0-70.69 57.31-127.1 127.1-127.1s127.1 57.3 127.1 127.1C383.1 326.7 326.7 383.1 256 383.1z"/></svg>
</span>
</div>
</button>
</div>
</div>
<div class="-my-2 -mr-2 md:hidden">
<label id="menu-button" for="menu-controller" class="block">
<input type="checkbox" id="menu-controller" class="hidden" />
<div class="cursor-pointer hover:text-primary-600 dark:hover:text-primary-400">
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M0 96C0 78.33 14.33 64 32 64H416C433.7 64 448 78.33 448 96C448 113.7 433.7 128 416 128H32C14.33 128 0 113.7 0 96zM0 256C0 238.3 14.33 224 32 224H416C433.7 224 448 238.3 448 256C448 273.7 433.7 288 416 288H32C14.33 288 0 273.7 0 256zM416 448H32C14.33 448 0 433.7 0 416C0 398.3 14.33 384 32 384H416C433.7 384 448 398.3 448 416C448 433.7 433.7 448 416 448z"/></svg>
</span>
</div>
<div id="menu-wrapper" style="padding-top:25px;"
class="fixed inset-0 z-30 invisible w-screen h-screen m-auto overflow-auto transition-opacity opacity-0 cursor-default bg-neutral-100/50 backdrop-blur-sm dark:bg-neutral-900/50">
<ul
class="flex movedown flex-col w-full px-6 py-6 mx-auto overflow-visible list-none ltr:text-right rtl:text-left max-w-7xl sm:px-14 md:px-24 lg:px-32 sm:py-10 sm:pt-10">
<li class="mb-1">
<span class="cursor-pointer hover:text-primary-600 dark:hover:text-primary-400">
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>
</span>
</span>
</li>
<li class="mb-1">
<a class="decoration-primary-500 hover:underline hover:decoration-2 hover:underline-offset-2"
href="/blowfish/about/" title="About">About</a>
</li>
</ul>
</div>
</label>
</div>
</div>
<div id="mobile-menu"
class="fixed inset-0 z-30 invisible w-screen h-screen m-auto overflow-auto transition-opacity opacity-0 cursor-default bg-neutral-100/50 backdrop-blur-sm dark:bg-neutral-900/50">
<ul
class="flex movedown flex-col w-full px-6 py-6 mx-auto overflow-visible list-none ltr:text-right rtl:text-left max-w-7xl sm:px-14 md:px-24 lg:px-32 sm:py-10 sm:pt-10">
<li class="mb-1">
<span class="cursor-pointer hover:text-primary-600 dark:hover:text-primary-400">
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>
</span>
</span>
</li>
<li class="mb-1">
<a class="decoration-primary-500 hover:underline hover:decoration-2 hover:underline-offset-2"
href="/blowfish/about/" title="About">About</a>
</li>
<li>
<button id="search-button-mobile" class="text-base hover:text-primary-600 dark:hover:text-primary-400">
<span class="relative inline-block align-text-bottom icon">
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</button>
</li>
</ul>
</div>
<div class="relative flex flex-col grow">
<main id="main-content" class="grow">
<article>
<header class="max-w-prose">
<ol class="text-sm text-neutral-500 dark:text-neutral-400 print:hidden">
<li class="inline hidden">
<a
class="hover:underline decoration-neutral-300 dark:underline-neutral-600"
href="/blowfish/"
>Welcome to Congo! :tada:</a
><span class="px-1 text-primary-500">/</span>
</li>
<li class="inline ">
<a
class="hover:underline decoration-neutral-300 dark:underline-neutral-600"
href="/blowfish/posts/"
>Posts</a
><span class="px-1 text-primary-500">/</span>
</li>
<li class="inline hidden">
<a
class="hover:underline decoration-neutral-300 dark:underline-neutral-600"
href="/blowfish/posts/202206-homepage-guide/"
>How I Created My Homepage (for free) Using Docker, Hugo, and Firebase</a
><span class="px-1 text-primary-500">/</span>
</li>
</ol>
<h1 class="mt-0 text-4xl font-extrabold text-neutral-900 dark:text-neutral">
How I Created My Homepage (for free) Using Docker, Hugo, and Firebase
</h1>
<div class="mt-8 mb-12 text-base text-neutral-500 dark:text-neutral-400 print:hidden">
<div class="flex flex-row flex-wrap items-center">
<time datetime="2022-06-27 00:00:00 &#43;0000 UTC">27 June 2022</time><span class="px-2 text-primary-500">&middot;</span><span>2892 words</span><span class="px-2 text-primary-500">&middot;</span><span title="Reading time">14 mins</span><span class="px-2 text-primary-500">&middot;</span>
<span class="mb-[2px]">
<a
href="#/posts/202206-homepage-guide/index.md"
class="text-lg hover:text-primary-500"
rel="noopener noreferrer"
target="_blank"
title="Edit content"
>
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M490.3 40.4C512.2 62.27 512.2 97.73 490.3 119.6L460.3 149.7L362.3 51.72L392.4 21.66C414.3-.2135 449.7-.2135 471.6 21.66L490.3 40.4zM172.4 241.7L339.7 74.34L437.7 172.3L270.3 339.6C264.2 345.8 256.7 350.4 248.4 353.2L159.6 382.8C150.1 385.6 141.5 383.4 135 376.1C128.6 370.5 126.4 361 129.2 352.4L158.8 263.6C161.6 255.3 166.2 247.8 172.4 241.7V241.7zM192 63.1C209.7 63.1 224 78.33 224 95.1C224 113.7 209.7 127.1 192 127.1H96C78.33 127.1 64 142.3 64 159.1V416C64 433.7 78.33 448 96 448H352C369.7 448 384 433.7 384 416V319.1C384 302.3 398.3 287.1 416 287.1C433.7 287.1 448 302.3 448 319.1V416C448 469 405 512 352 512H96C42.98 512 0 469 0 416V159.1C0 106.1 42.98 63.1 96 63.1H192z"/></svg>
</span>
</a
>
</span>
</div>
</div>
</header>
<section class="flex flex-col max-w-full mt-0 prose dark:prose-invert lg:flex-row">
<div class="order-first px-0 lg:order-last lg:max-w-xs ltr:lg:pl-8 rtl:lg:pr-8">
<div class="toc ltr:pl-5 rtl:pr-5 print:hidden lg:sticky lg:top-10">
<details open class="mt-0 overflow-hidden rounded-lg ltr:-ml-5 ltr:pl-5 rtl:-mr-5 rtl:pr-5">
<summary
class="block py-1 text-lg font-semibold cursor-pointer bg-neutral-100 text-neutral-800 ltr:-ml-5 ltr:pl-5 rtl:-mr-5 rtl:pr-5 dark:bg-neutral-700 dark:text-neutral-100 lg:hidden"
>
Table of Contents
</summary>
<div
class="py-2 border-dotted border-neutral-300 ltr:-ml-5 ltr:border-l ltr:pl-5 rtl:-mr-5 rtl:border-r rtl:pr-5 dark:border-neutral-600"
>
<nav id="TableOfContents">
<ul>
<li><a href="#tldr">TL;DR</a></li>
<li><a href="#why-would-a-pm-build-their-own-homepage-from-scratch">Why would a PM build their own homepage from scratch…</a></li>
<li><a href="#lets-get-started">Lets get started…</a></li>
<li><a href="#tools">Tools</a></li>
<li><a href="#setup-the-development-environment">Setup the Development Environment</a>
<ul>
<li><a href="#using-docker">Using Docker</a></li>
<li><a href="#using-visual-studio-code">Using Visual Studio Code</a></li>
<li><a href="#but-i-really-want-to-run-everything-locally">&hellip;but I really want to run everything locally</a></li>
</ul>
</li>
<li><a href="#create-site-skeleton">Create Site Skeleton</a></li>
<li><a href="#configure-theme">Configure Theme</a>
<ul>
<li><a href="#profile-picture">Profile picture</a></li>
<li><a href="#configuration-files">Configuration Files</a>
<ul>
<li><a href="#configtoml">config.toml</a></li>
<li><a href="#languagesentoml">languages.en.toml</a></li>
<li><a href="#paramstoml">params.toml</a></li>
</ul>
</li>
<li><a href="#final">Final</a></li>
</ul>
</li>
<li><a href="#how-to-generate-articles">How to generate articles</a></li>
<li><a href="#deploy">Deploy</a>
<ul>
<li><a href="#create-firebase-project">Create Firebase Project</a></li>
<li><a href="#setup-firebase">Setup Firebase</a></li>
<li><a href="#deploy-1">Deploy</a></li>
</ul>
</li>
<li><a href="#conclusion">Conclusion</a></li>
<li><a href="#resources">Resources</a></li>
</ul>
</nav>
</div>
</details>
</div>
</div>
<div class="min-w-0 min-h-0 max-w-prose">
<img style="box-shadow: 10px 10px 30px 2px rgba(0,0,0,0.6);" src="feature.png"/>
<h2 id="tldr" class="relative group">TL;DR <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#tldr" aria-label="Anchor">#</a></span></h2>
<p>Currently, there are several solutions to build and host your personal website. I wanted to challenge myself to see if I could do it with the same set of features as some of the paid solutions out there and for free. Here are the results.</p>
<h2 id="why-would-a-pm-build-their-own-homepage-from-scratch" class="relative group">Why would a PM build their own homepage from scratch… <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#why-would-a-pm-build-their-own-homepage-from-scratch" aria-label="Anchor">#</a></span></h2>
<p>A couple of months ago I decided that I wanted to start writing more in order to a) exercise my writing skills and b) get feedback on some of my ideas. With this goal in mind, I started researching tools/platforms that would help me publish without creating too much friction for me, or for the people wanting to read what I have to say e.g. having to pay. Ultimately I decided upon creating my own website.</p>
<p>I had a couple of reasons for wanting to try this:</p>
<ul>
<li>
<p>challenge me to see if I, a previous software engineering student, could still bodge something together that would work and feel good about not having forgotten everything I ever learned about programming,</p>
</li>
<li>
<p>find a flexible free solution that would allow me to kickstart my website without investing money right away into it, aka avoiding operational costs with platforms and services that would lock me in the future,</p>
</li>
<li>
<p>have my content hosted in a place that will not require people to pay for reading it,</p>
</li>
<li>
<p>play around with <a target="_blank" href="https://docs.docker.com/desktop/dev-environments/">Docker&rsquo;s developer environments</a> and <a target="_blank" href="https://github.com/microsoft/vscode-dev-containers">Microsoft&rsquo;s developer containers</a> to get myself familiar with both solutions.</p>
</li>
</ul>
<h2 id="lets-get-started" class="relative group">Lets get started… <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#lets-get-started" aria-label="Anchor">#</a></span></h2>
<p>After some research, I decided to choose a website generator framework and a free hosting service. For the website framework, I choose <a target="_blank" href="https://gohugo.io">Hugo</a> with <a target="_blank" href="https://github.com/jpanther/congoand">Congo</a> as the theme, and for the hosting service <a target="_blank" href="https://firebase.google.com">Firebase</a>. And for obvious reasons, I decided to set up my development environment using <a target="_blank" href="https://www.docker.com">Docker</a> in order to put myself in the user&rsquo;s shoes for this experiment.</p>
<p>I didn&rsquo;t go into a deep analysis of which framework was the best for my problem as I wanted to get an MVP out fast so I went through a couple of options and picked the first one that I liked. There are several other options with different features and approaches from the one I picked. If you want to explore other options these are some you can explore: <a target="_blank" href="https://docusaurus.io/">Docussaurus</a>, <a target="_blank" href="https://www.gatsbyjs.com/">Gatsby</a>, <a target="_blank" href="https://jekyllrb.com/">Jekyll</a>, <a target="_blank" href="https://ghost.org/">Ghost</a>, and even <a target="_blank" href="https://wordpress.com/">WordPress</a>. The same is applicable to the hosting part, even though I chose <a target="_blank" href="https://firebase.google.com/">Firebase</a> there are other solutions like <a target="_blank" href="https://pages.cloudflare.com/">Cloudflare Pages</a>, <a target="_blank" href="https://pages.github.com/">GitHub Pages</a>, <a target="_blank" href="https://www.digitalocean.com/">Digital Ocean</a>, <a target="_blank" href="https://www.netlify.com/">Netlify</a>, <a target="_blank" href="https://vercel.com/">Vercel</a>, and others that you might consider exploring. If you have any suggestions for this guide feel free to reach out, always happy to chat and learn.</p>
<h2 id="tools" class="relative group">Tools <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#tools" aria-label="Anchor">#</a></span></h2>
<p>For this guide, I will use the following tools, which should be installed on your machine. Here is a small explanation of what each component is going to be used for and a link to the installation instructions.</p>
<ul>
<li>
<p><strong>Docker</strong> - I will use Docker to configure a development environment for this project so that we can skip the need to install all the software required to run Hugo and Firebase CLI i.e. cURL, Go, Hugo, Node, NPM, etc. This will allow you to start from a git repository, start the environment and go straight into writing code instead of spending hours figuring out how to install a specific compiler for your CPU architecture. <a target="_blank" href="https://www.docker.com/get-started/">Install Docker</a></p>
</li>
<li>
<p><strong>Visual Studio Code</strong> - I&rsquo;m using Visual Studio Code as my code editor at the moment, and all the material in the guide assumes that this is what you&rsquo;re using. If you have a different preference youll need to adapt some parts of this guide to achieve the same results. <a target=”_blank” href="https://code.visualstudio.com/">Install Visual Studio Code</a></p>
</li>
</ul>
<h2 id="setup-the-development-environment" class="relative group">Setup the Development Environment <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#setup-the-development-environment" aria-label="Anchor">#</a></span></h2>
<p>Let&rsquo;s start by configuring your development environment using <a target="_blank" href="https://www.docker.com">Docker</a>. This will allow you to create a container with all the tools you need inside of it without having to mess with your system configurations. Moreover, it will also make it easier to just delete the container and rebuild it whenever you need it instead of keeping old versions of software you don&rsquo;t require daily in your personal machine.</p>
<div class="flex px-4 py-3 rounded-md bg-primary-100 dark:bg-primary-900">
<span class="text-primary-400 ltr:pr-3 rtl:pl-3">
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"/></svg>
</span>
</span>
<span class="dark:text-neutral-300">Note: If you just want to clone a repo with the final skeleton feel free to clone <a target="_blank" href="https://github.com/nunocoracao/homepage-hugo-congo">this repo</a> and skip to the deploy section</span>
</div>
<p>I&rsquo;ll provide two ways of setting up your development environment feel free to choose the one you prefer or try both to explore the differences between them. Both options rely on a <code>Dockerfile</code> built by me which uses <code>klakegg/hugo:0.93.2-ubuntu</code> as the base image, even though this is not Hugo&rsquo;s official image (since there isn&rsquo;t one at the moment) it&rsquo;s the one <a target="_blank" href="https://gohugo.io/getting-started/installing/#docker">recommended on their website,</a>.</p>
<h3 id="using-docker" class="relative group">Using Docker <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#using-docker" aria-label="Anchor">#</a></span></h3>
<p>To spin up a Dev Environment just open Docker Dashboard and select the &ldquo;Dev Environments&rdquo; tab on the left. If you don&rsquo;t have any dev environments setup select &ldquo;Create New Environment&rdquo; otherwise use the button on the upper right side &ldquo;Create&rdquo;. Proceed to the setup step.</p>
<img src="devenvs/step2.png"/>
<p>Here choose the &ldquo;Existing Git repo&rdquo; option and use the following GitHub URL:</p>
<pre tabindex="0"><code>https://github.com/nunocoracao/homepage-kickstart
</code></pre><div class="flex px-4 py-3 rounded-md bg-primary-100 dark:bg-primary-900">
<span class="text-primary-400 ltr:pr-3 rtl:pl-3">
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"/></svg>
</span>
</span>
<span class="dark:text-neutral-300"><strong>Note:</strong> If you clone the repo locally you can also start from the local folder</span>
</div>
<p>Once the container is running you should see something similar to the images below.</p>
<img style="float: left" width="50%" src="devenvs/step4.png"/>
<img style="float: left" width="50%" src="devenvs/step5.png"/>
<p>In both situations, you will be able to see and click the button &ldquo;Open in VSCode&rdquo; which will open the editor and will allow you to start working. From there open a terminal and proceed to <a href="#create-site-skeleton">create the site skeleton</a></p>
<h3 id="using-visual-studio-code" class="relative group">Using Visual Studio Code <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#using-visual-studio-code" aria-label="Anchor">#</a></span></h3>
<p>Start by cloning the GitHub repository with the development environment configurations.</p>
<pre tabindex="0"><code>git clone https://github.com/nunocoracao/homepage-kickstart
</code></pre><p>This method requires the installation of an extra VSCode extension in order to spin up the containers. Please search for <strong>Remote - Containers</strong> and install the extension to continue this guide.</p>
<p>After successfully installing the extension, open your source folder in VSCode and open the “Remote - Containers” extension panel on the left. Select &ldquo;Open Folder in Container&rdquo; to spin up a container with the development environment.</p>
<img src="setup/extension.png"/>
<p>Wait a couple of minutes while the image is built. Docker is creating an image with all the required software for the development of the website. This will only happen the first time you spin the environment.</p>
<img src="setup/imagebuild.png"/>
<p>Once the image is built, VSCode will spin the container and will place your working environment inside of it (information available in the bottom left corner of the window). You now have a development environment with Go, Hugo, Firebase CLI, and all the tools you will need for this guide. Just open a new terminal and youre ready to begin creating your site.</p>
<img src="setup/newterminal.png"/>
<h3 id="but-i-really-want-to-run-everything-locally" class="relative group">&hellip;but I really want to run everything locally <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#but-i-really-want-to-run-everything-locally" aria-label="Anchor">#</a></span></h3>
<p>If you either prefer or need to run your environment locally follow the guides below to install everything you need for your setup:</p>
<ul>
<li><strong>Homebrew</strong> - <a target="_blank" href="https://brew.sh/">Install homebrew</a></li>
<li><strong>Hugo</strong> - <a target="_blank" href="https://gohugo.io/getting-started/installing/">Install Hugo</a></li>
<li><strong>Node.js and NPM</strong> - <a target="_blank" href="https://nodejs.org/en/download/">Install node.js &amp; NPM</a> (easier to install Firebase CLI)</li>
<li><strong>Firebase CLI</strong> - <a target="_blank" href="https://firebase.google.com/docs/cli#install_the_firebase_cli">Install Firebase CLI</a></li>
</ul>
<h2 id="create-site-skeleton" class="relative group">Create Site Skeleton <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#create-site-skeleton" aria-label="Anchor">#</a></span></h2>
<p>Now that we have a development environment running the first step is to create the base version of your website. For this lets use <strong>Hugo</strong> to generate the folder template and configuration files we need by running the following command (<code>--force</code> parameter is required to run Hugo on a non-empty directory):</p>
<pre tabindex="0"><code>hugo new site . --force
</code></pre><p>This should have created a set of folders inside your workspace that you dont need to worry about for now. The next step is to install a theme for Hugo. I choose <a target="_blank" href="https://github.com/jpanther/congo">Congo</a> as it had all the features I required for my website and it seemed to be easy to change if I ever need it to. If you want to try a different theme there are several available in Hugos documentation, each with documentation and examples.</p>
<p>Install Congo using git submodules by running the following command:</p>
<pre tabindex="0"><code>git submodule add -b stable https://github.com/jpanther/congo.git themes/congo
</code></pre><p>Now we need to make some changes to the directory and file structure so that Congo can work properly. I will not get into the details of what is happening in this guide (you can consult Congos documentation if you want to learn more), the main takeaway is that were creating and configuring a folder in <code>config/_default/</code> which will contain all the important configuration files for Hugo and Congo.</p>
<p>Please run the following commands in order:</p>
<pre tabindex="0"><code>mkdir -p config/_default
rm config.toml
cp themes/congo/config/_default/*.toml config/_default/
echo &#39;theme = &#34;congo&#34;&#39; | cat - config/_default/config.toml &gt; temp &amp;&amp; mv temp config/_default/config.toml
</code></pre><p>Congratulations, you should have your site up and running now. Let&rsquo;s try it out by running Hugo&rsquo;s debug server:</p>
<pre tabindex="0"><code>hugo server -D
</code></pre><p>Please open your favorite browser and navigate to <a target="_blank" href="http://localhost:1313">localhost:1313</a> to see your page.</p>
<img src="theme/vanilla.png"/>
<p>You should see something similar to the image above. Doesnt look that exciting, does it? Lets configure the theme in the next sections and learn how to create your first article.</p>
<h2 id="configure-theme" class="relative group">Configure Theme <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#configure-theme" aria-label="Anchor">#</a></span></h2>
<p>Now Ill be covering how to change the look and feel of your website, add some personal information, and activate the dark mode toggle (aka the most important feature in any website these days).</p>
<div class="flex px-4 py-3 rounded-md bg-primary-100 dark:bg-primary-900">
<span class="text-primary-400 ltr:pr-3 rtl:pl-3">
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"/></svg>
</span>
</span>
<span class="dark:text-neutral-300">A note, I am covering a very simple configuration for this theme please check <a target="_blank" href="https://jpanther.github.io/congo/docs/">Congos theme documentation</a> to understand everything you can do with this theme.</span>
</div>
<h3 id="profile-picture" class="relative group">Profile picture <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#profile-picture" aria-label="Anchor">#</a></span></h3>
<p>Lets start by adding a profile picture to your site. Create a folder called “assets” at the root of your project. Choose a profile picture and place it inside the assets folder. The rest of the guide will assume the final picture is named &ldquo;profile.jpg&rdquo;, so please rename your picture or take that into account when configuring some of the other files.</p>
<figure>
<img src="configure/profile.jpg"/>
<figcaption>If you still need to take a proper awesome picture for this feel free to download this one to proceed with the tutorial.</figcaption>
</figure>
<h3 id="configuration-files" class="relative group">Configuration Files <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#configuration-files" aria-label="Anchor">#</a></span></h3>
<p>Lets open a couple of configuration files and start updating them. All the files we are going to change are inside <code>config/_default/</code> folder.</p>
<h4 id="configtoml" class="relative group">config.toml <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#configtoml" aria-label="Anchor">#</a></span></h4>
<p>Uncomment the <code>baseURL</code> parameter and replace it with the final domain of your website. This value will be used to create the robots.txt file for any search engines to successfully crawl and index your website.</p>
<img src="configure/config.png"/>
<div class="flex px-4 py-3 rounded-md bg-primary-100 dark:bg-primary-900">
<span class="text-primary-400 ltr:pr-3 rtl:pl-3">
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"/></svg>
</span>
</span>
<span class="dark:text-neutral-300">Note: if you want to configure Google Analytics please add the following line with your id to this file <code>googleAnalytics = &quot;G-XXXXXX&quot;</code></span>
</div>
<h4 id="languagesentoml" class="relative group">languages.en.toml <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#languagesentoml" aria-label="Anchor">#</a></span></h4>
<p>This file will drive the main information for the website and the author of the page (you). Replace the <code>title</code> and <code>description</code> for the ones you want for your page, these values will drive the HTML title and description tags.</p>
<p>Within the <code>[author]</code> block you can update the details that you wish to highlight in your profile. The bare minimum would be <code>name</code>, <code>image</code>, <code>headline</code>, and <code>links</code>. For the <code>links</code> parameter don&rsquo;t forget to uncomment the last line of the file as this is a json array. Update each entry with your personal links.</p>
<img src="configure/languages.png"/>
<h4 id="paramstoml" class="relative group">params.toml <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#paramstoml" aria-label="Anchor">#</a></span></h4>
<p>This file defines much of the overall behavior across the entire framework. For this tutorial I changed some of the overall values and one for the homepage, if you want to learn more about the other available configurations please consult <a target="_blank" href="https://jpanther.github.io/congo/docs/">Congos theme documentation</a>.</p>
<p>I&rsquo;ve changed <code>colorScheme</code> to &ldquo;ocean&rdquo; which changes the global UI theme. Congo defines a three-color palette that is used throughout the theme. Valid values are congo (default), avocado, ocean, fire, and slate. Although these are the default schemes, you can also create your own. Refer to the theme&rsquo;s main documentation to learn how.</p>
<p>Activated <code>showAppearanceSwitcher</code> to enable the light/dark mode toggle. Activated <code>enableSearch</code> which indexes all future posts each time you build the site and provides a simple search feature. I&rsquo;ve also changed the value of <code>layout</code>, inside <code>[homepage]</code>, to &ldquo;profile&rdquo; which changes the way the landing page is rendered. Finally, the last interesting value here is <code>showRecent</code>, which when turned on shows the recent posts on the homepage.</p>
<img src="configure/params.png"/>
<h3 id="final" class="relative group">Final <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#final" aria-label="Anchor">#</a></span></h3>
<p>Lets see how it looks, run the Hugo again:</p>
<pre tabindex="0"><code>hugo server -D
</code></pre><p>And navigate to <a target="_blank" href="http://localhost:1313">localhost:1313</a> you should see something similar to the page below.</p>
<img style="box-shadow: 10px 10px 30px 2px rgba(0,0,0,0.6);" src="configure/final.png"/>
<p>Congrats its looking great, lets learn how to generate your first articles.</p>
<h2 id="how-to-generate-articles" class="relative group">How to generate articles <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#how-to-generate-articles" aria-label="Anchor">#</a></span></h2>
<p>Hugo provides some tools to generate your articles (<a target="_blank" href="https://www.markdownguide.org/">markdown</a> files) with a base set of tags already in them. Run the following command to create your first post</p>
<pre tabindex="0"><code>hugo new posts/my-first-post.md
</code></pre><p>replace the contents of the file with the following:</p>
<pre tabindex="0"><code>---
title: &#34;My Published Post&#34;
date: 2022-06-19T20:10:29Z
draft: false
categories: [&#34;published&#34;, &#34;test&#34;]
tags: [&#34;first&#34;, &#34;awesome&#34;]
---
This is my first blog post
</code></pre><p>This just created your first blog post. We&rsquo;ve added a couple of categories and tags, which will be indexed by Hugo during build time. These tags will be used to create the Categories and Tags section of the website automatically for you. Notice that I&rsquo;ve changed the <code>draft</code> to false to simulate a published post.</p>
<p>Run the following command to create your second post</p>
<pre tabindex="0"><code>hugo new posts/my-draft-post.md
</code></pre><p>and replace the contents of that file with the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">title: &#34;My Draft Post&#34;
</span></span><span class="line"><span class="cl">date: 2022-06-19T20:20:39Z
</span></span><span class="line"><span class="cl">draft: true
</span></span><span class="line"><span class="cl">categories: [&#34;draft&#34;, &#34;test&#34;]
</span></span><span class="line"><span class="cl">tags: [&#34;second&#34;, &#34;awesome&#34;]
</span></span><span class="line"><span class="cl">---
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">This is my second blog post
</span></span></code></pre></div><p>For the second post, I&rsquo;ve left the <code>draft</code> parameter true to simulate a draft post.</p>
<p>Hugo automatically hides draft posts from the final site generation. You can keep working on articles leaving the draft label true and they will be ignored by the engine. If you want to run in DEBUG mode just use the command:</p>
<pre tabindex="0"><code>hugo server -D
</code></pre><p>If you go to the posts on the site you should be able to see both entries. If you then run the server in normal mode the draft articles will disappear. You can use the command below to do so:</p>
<pre tabindex="0"><code>hugo server
</code></pre><p>You can use this command to test the final version of the website or an article before generating the final build. When you&rsquo;re ready just use the command &lsquo;Hugo&rsquo; to generate the final website inside the /public folder.</p>
<pre tabindex="0"><code>hugo
</code></pre><p>All files are written in <a target="_blank" href="https://en.wikipedia.org/wiki/Markdown">Markdown</a> which Hugo then uses to generate the final pages. I&rsquo;ll not teach you how to write markdown files in this guide but I can recommend this <a target="_blank" href="https://www.markdownguide.org/getting-started/">&ldquo;getting started&rdquo;</a> tutorial and this <a target="_blank" href="https://www.markdownguide.org/cheat-sheet/">&ldquo;cheat sheet&rdquo;</a> to get you started.</p>
<h2 id="deploy" class="relative group">Deploy <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#deploy" aria-label="Anchor">#</a></span></h2>
<p>Ok, youve configured your website and created a couple of articles, but we still need to deploy it somewhere. As I mentioned before I chose Firebase for this guide, even though I know that it offers much more than just a simple hosting service it allows me to host my site for free without much of a hassle.</p>
<h3 id="create-firebase-project" class="relative group">Create Firebase Project <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#create-firebase-project" aria-label="Anchor">#</a></span></h3>
<p>Lets start by going to <a target="_blank" href="https://firebase.google.com"><a href="https://firebase.google.com">https://firebase.google.com</a></a> and creating an account. Once that is done you can create a project for free. The process should be straightforward and when you finish you should be in Firebase&rsquo;s project dashboard.</p>
<h3 id="setup-firebase" class="relative group">Setup Firebase <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#setup-firebase" aria-label="Anchor">#</a></span></h3>
<p>Now you can go back to your environment which already has Firebase CLI tools installed and ready to go. Lets start by authenticating using:</p>
<pre tabindex="0"><code>firebase login
</code></pre><p>Once you are successfully logged in you need to initiate the project configurations for firebase. For that please use:</p>
<pre tabindex="0"><code>firebase init
</code></pre><p>The tool will offer you a wide variety of different options in order to configure your Firebase project. For now, we just want to configure hosting. If you are using GitHub, you might want to consider configuring GitHub action deploys which can automatically build and deploy your site every time there is a push to a specific branch or a merged pull request.</p>
<img src="deploy/firebasehosting.png"/>
<p>Choose the Firebase project created before as the hosting destination. And select the configurations you wish for the deployment process. The important one here is the folder where the final files to the server will be placed and this is the <code>public</code> folder. For the other parameters you experiment with what better matches your use-case, the image below shows you what I picked (<em>Note: for this tutorial I didn&rsquo;t configure GitHub actions but I am using that in my real setup</em>).</p>
<img src="deploy/firebaseconfig.png"/>
<h3 id="deploy-1" class="relative group">Deploy <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#deploy-1" aria-label="Anchor">#</a></span></h3>
<p>Ok, now for the long and boring process of deployment… joking! Once you are ready and have all your files generated by the <code>hugo</code> command in the public folder just use the following command to deploy:</p>
<pre tabindex="0"><code>firebase deploy
</code></pre><img src="deploy/firebasedeploy.png"/>
<p>The process should take a couple of seconds and there you go your site is deployed. The final line of the CLI tool will give you a URL to see for yourself, otherwise, you can explore your Firebase dashboard hosting section which will have more information regarding the deployment.</p>
<img src="deploy/final.png"/>
<h2 id="conclusion" class="relative group">Conclusion <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusion" aria-label="Anchor">#</a></span></h2>
<p>By now you should have a simple version of your website which you can configure to your needs. The main advantage of this solution is that it is flexible and extensible to a variety of different needs especially if you take the time to explore Hugo&rsquo;s theme catalog. True that it might require some coding to implement complex but I would guess that this solves the problem for almost everyone.</p>
<p>Above all, its a completely free solution if you&rsquo;re looking to start and can&rsquo;t (or don&rsquo;t want to) spend money. Hope this guide helps you, feel free to share it with your network and give me feedback so that I can make it better over time.</p>
<h2 id="resources" class="relative group">Resources <span class="absolute top-0 w-6 transition-opacity opacity-0 ltr:-left-6 rtl:-right-6 not-prose group-hover:opacity-100"><a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#resources" aria-label="Anchor">#</a></span></h2>
<ul>
<li><a target="_blank" href="https://github.com/nunocoracao/homepage-kickstart">GitHub Repo for development environment</a></li>
<li><a target="_blank" href="https://github.com/nunocoracao/homepage-hugo-congo">GitHub Repo for base Hugo and Congo configuration</a></li>
<li><a target="_blank" href="https://github.com/nunocoracao/homepage-dockerimage">GitHub Repo for base image</a></li>
<li><a target="_blank" href="https://hub.docker.com/r/nunocoracao/homepage-dockerimage">Docker Hub image URL</a></li>
<li><a target="_blank" href="https://gohugo.io/documentation/">Hugo's Documentation</a></li>
<li><a target="_blank" href="https://github.com/jpanther/congo">Congo's Documentation</a></li>
<li><a target="_blank" href="https://firebase.google.com/docs">Firebase Documentation</a></li>
<li><a target="_blank" href="https://www.markdownguide.org/">Markdown Guide</a></li>
<li><a target="_blank" href="https://www.markdownguide.org/getting-started/">Markdown Getting Started&quot;</a></li>
<li><a target="_blank" href="https://www.markdownguide.org/cheat-sheet/">Markdown Cheat Sheet</a></li>
</ul>
</div>
</section>
<footer class="pt-8 max-w-prose print:hidden">
<div class="flex">
<img
class="!mt-0 !mb-0 h-24 w-24 rounded-full ltr:mr-4 rtl:ml-4"
width="96"
height="96"
alt="Blowfish"
src="/blowfish/img/blowfish_logo_hu184ea2fa12490a2458ca388a16ab730e_227816_192x192_fill_box_smart1_3.png"
/>
<div class="place-self-center">
<div class="text-[0.6rem] uppercase leading-3 text-neutral-500 dark:text-neutral-400">
Author
</div>
<div class="font-semibold leading-6 text-neutral-800 dark:text-neutral-300">
Blowfish
</div>
<div class="text-sm text-neutral-700 dark:text-neutral-400">A little bit about you and me</div>
<div class="text-2xl sm:text-lg">
<div class="flex flex-wrap text-neutral-400 dark:text-neutral-500">
<a
class="px-1 hover:text-primary-700 dark:hover:text-primary-400"
href="https://linkedin.com/in/nunocoracao"
target="_blank"
aria-label="Linkedin"
rel="me noopener noreferrer"
>
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/></svg>
</span>
</a
>
<a
class="px-1 hover:text-primary-700 dark:hover:text-primary-400"
href="https://twitter.com/nunocoracao"
target="_blank"
aria-label="Twitter"
rel="me noopener noreferrer"
>
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg>
</span>
</a
>
<a
class="px-1 hover:text-primary-700 dark:hover:text-primary-400"
href="https://medium.com/@nunocoracao"
target="_blank"
aria-label="Medium"
rel="me noopener noreferrer"
>
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="currentColor" d="M180.5,74.262C80.813,74.262,0,155.633,0,256S80.819,437.738,180.5,437.738,361,356.373,361,256,280.191,74.262,180.5,74.262Zm288.25,10.646c-49.845,0-90.245,76.619-90.245,171.095s40.406,171.1,90.251,171.1,90.251-76.619,90.251-171.1H559C559,161.5,518.6,84.908,468.752,84.908Zm139.506,17.821c-17.526,0-31.735,68.628-31.735,153.274s14.2,153.274,31.735,153.274S640,340.631,640,256C640,171.351,625.785,102.729,608.258,102.729Z"/></svg>
</span>
</a
>
<a
class="px-1 hover:text-primary-700 dark:hover:text-primary-400"
href="https://github.com/nunocoracao"
target="_blank"
aria-label="Github"
rel="me noopener noreferrer"
>
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path fill="currentColor" d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
</span>
</a
>
<a
class="px-1 hover:text-primary-700 dark:hover:text-primary-400"
href="http://goodreads.com/nunocoracao"
target="_blank"
aria-label="Goodreads"
rel="me noopener noreferrer"
>
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<path fill="currentColor" d="M299.9 191.2c5.1 37.3-4.7 79-35.9 100.7-22.3 15.5-52.8 14.1-70.8 5.7-37.1-17.3-49.5-58.6-46.8-97.2 4.3-60.9 40.9-87.9 75.3-87.5 46.9-.2 71.8 31.8 78.2 78.3zM448 88v336c0 30.9-25.1 56-56 56H56c-30.9 0-56-25.1-56-56V88c0-30.9 25.1-56 56-56h336c30.9 0 56 25.1 56 56zM330 313.2s-.1-34-.1-217.3h-29v40.3c-.8.3-1.2-.5-1.6-1.2-9.6-20.7-35.9-46.3-76-46-51.9.4-87.2 31.2-100.6 77.8-4.3 14.9-5.8 30.1-5.5 45.6 1.7 77.9 45.1 117.8 112.4 115.2 28.9-1.1 54.5-17 69-45.2.5-1 1.1-1.9 1.7-2.9.2.1.4.1.6.2.3 3.8.2 30.7.1 34.5-.2 14.8-2 29.5-7.2 43.5-7.8 21-22.3 34.7-44.5 39.5-17.8 3.9-35.6 3.8-53.2-1.2-21.5-6.1-36.5-19-41.1-41.8-.3-1.6-1.3-1.3-2.3-1.3h-26.8c.8 10.6 3.2 20.3 8.5 29.2 24.2 40.5 82.7 48.5 128.2 37.4 49.9-12.3 67.3-54.9 67.4-106.3z"/></svg>
</span>
</a
>
</div>
</div>
</div>
</div>
<section class="flex flex-row flex-wrap justify-center pt-4 text-xl">
<a
class="m-1 inline-block min-w-[2.4rem] rounded bg-neutral-300 p-1 text-center text-neutral-700 hover:bg-primary-500 hover:text-neutral dark:bg-neutral-700 dark:text-neutral-300 dark:hover:bg-primary-400 dark:hover:text-neutral-800"
href="https://www.linkedin.com/shareArticle?mini=true&amp;url=https://nunocoracao.github.io/blowfish/posts/202206-homepage-guide/&amp;title=How%20I%20Created%20My%20Homepage%20%28for%20free%29%20Using%20Docker,%20Hugo,%20and%20Firebase"
title="Share on LinkedIn"
aria-label="Share on LinkedIn"
>
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/></svg>
</span>
</a
>
<a
class="m-1 inline-block min-w-[2.4rem] rounded bg-neutral-300 p-1 text-center text-neutral-700 hover:bg-primary-500 hover:text-neutral dark:bg-neutral-700 dark:text-neutral-300 dark:hover:bg-primary-400 dark:hover:text-neutral-800"
href="https://twitter.com/intent/tweet/?url=https://nunocoracao.github.io/blowfish/posts/202206-homepage-guide/&amp;text=How%20I%20Created%20My%20Homepage%20%28for%20free%29%20Using%20Docker,%20Hugo,%20and%20Firebase"
title="Tweet on Twitter"
aria-label="Tweet on Twitter"
>
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"/></svg>
</span>
</a
>
<a
class="m-1 inline-block min-w-[2.4rem] rounded bg-neutral-300 p-1 text-center text-neutral-700 hover:bg-primary-500 hover:text-neutral dark:bg-neutral-700 dark:text-neutral-300 dark:hover:bg-primary-400 dark:hover:text-neutral-800"
href="https://pinterest.com/pin/create/bookmarklet/?url=https://nunocoracao.github.io/blowfish/posts/202206-homepage-guide/&amp;description=How%20I%20Created%20My%20Homepage%20%28for%20free%29%20Using%20Docker,%20Hugo,%20and%20Firebase"
title="Pin on Pinterest"
aria-label="Pin on Pinterest"
>
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path fill="currentColor" d="M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z"/></svg>
</span>
</a
>
<a
class="m-1 inline-block min-w-[2.4rem] rounded bg-neutral-300 p-1 text-center text-neutral-700 hover:bg-primary-500 hover:text-neutral dark:bg-neutral-700 dark:text-neutral-300 dark:hover:bg-primary-400 dark:hover:text-neutral-800"
href="https://reddit.com/submit/?url=https://nunocoracao.github.io/blowfish/posts/202206-homepage-guide/&amp;resubmit=true&amp;title=How%20I%20Created%20My%20Homepage%20%28for%20free%29%20Using%20Docker,%20Hugo,%20and%20Firebase"
title="Submit to Reddit"
aria-label="Submit to Reddit"
>
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M201.5 305.5c-13.8 0-24.9-11.1-24.9-24.6 0-13.8 11.1-24.9 24.9-24.9 13.6 0 24.6 11.1 24.6 24.9 0 13.6-11.1 24.6-24.6 24.6zM504 256c0 137-111 248-248 248S8 393 8 256 119 8 256 8s248 111 248 248zm-132.3-41.2c-9.4 0-17.7 3.9-23.8 10-22.4-15.5-52.6-25.5-86.1-26.6l17.4-78.3 55.4 12.5c0 13.6 11.1 24.6 24.6 24.6 13.8 0 24.9-11.3 24.9-24.9s-11.1-24.9-24.9-24.9c-9.7 0-18 5.8-22.1 13.8l-61.2-13.6c-3-.8-6.1 1.4-6.9 4.4l-19.1 86.4c-33.2 1.4-63.1 11.3-85.5 26.8-6.1-6.4-14.7-10.2-24.1-10.2-34.9 0-46.3 46.9-14.4 62.8-1.1 5-1.7 10.2-1.7 15.5 0 52.6 59.2 95.2 132 95.2 73.1 0 132.3-42.6 132.3-95.2 0-5.3-.6-10.8-1.9-15.8 31.3-16 19.8-62.5-14.9-62.5zM302.8 331c-18.2 18.2-76.1 17.9-93.6 0-2.2-2.2-6.1-2.2-8.3 0-2.5 2.5-2.5 6.4 0 8.6 22.8 22.8 87.3 22.8 110.2 0 2.5-2.2 2.5-6.1 0-8.6-2.2-2.2-6.1-2.2-8.3 0zm7.7-75c-13.6 0-24.6 11.1-24.6 24.9 0 13.6 11.1 24.6 24.6 24.6 13.8 0 24.9-11.1 24.9-24.6 0-13.8-11-24.9-24.9-24.9z"/></svg>
</span>
</a
>
<a
class="m-1 inline-block min-w-[2.4rem] rounded bg-neutral-300 p-1 text-center text-neutral-700 hover:bg-primary-500 hover:text-neutral dark:bg-neutral-700 dark:text-neutral-300 dark:hover:bg-primary-400 dark:hover:text-neutral-800"
href="https://www.facebook.com/sharer/sharer.php?u=https://nunocoracao.github.io/blowfish/posts/202206-homepage-guide/&amp;quote=How%20I%20Created%20My%20Homepage%20%28for%20free%29%20Using%20Docker,%20Hugo,%20and%20Firebase"
title="Share on Facebook"
aria-label="Share on Facebook"
>
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M504 256C504 119 393 8 256 8S8 119 8 256c0 123.78 90.69 226.38 209.25 245V327.69h-63V256h63v-54.64c0-62.15 37-96.48 93.67-96.48 27.14 0 55.52 4.84 55.52 4.84v61h-31.28c-30.8 0-40.41 19.12-40.41 38.73V256h68.78l-11 71.69h-57.78V501C413.31 482.38 504 379.78 504 256z"/></svg>
</span>
</a
>
<a
class="m-1 inline-block min-w-[2.4rem] rounded bg-neutral-300 p-1 text-center text-neutral-700 hover:bg-primary-500 hover:text-neutral dark:bg-neutral-700 dark:text-neutral-300 dark:hover:bg-primary-400 dark:hover:text-neutral-800"
href="mailto:?body=https://nunocoracao.github.io/blowfish/posts/202206-homepage-guide/&amp;subject=How%20I%20Created%20My%20Homepage%20%28for%20free%29%20Using%20Docker,%20Hugo,%20and%20Firebase"
title="Send via email"
aria-label="Send via email"
>
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M207.8 20.73c-93.45 18.32-168.7 93.66-187 187.1c-27.64 140.9 68.65 266.2 199.1 285.1c19.01 2.888 36.17-12.26 36.17-31.49l.0001-.6631c0-15.74-11.44-28.88-26.84-31.24c-84.35-12.98-149.2-86.13-149.2-174.2c0-102.9 88.61-185.5 193.4-175.4c91.54 8.869 158.6 91.25 158.6 183.2l0 16.16c0 22.09-17.94 40.05-40 40.05s-40.01-17.96-40.01-40.05v-120.1c0-8.847-7.161-16.02-16.01-16.02l-31.98 .0036c-7.299 0-13.2 4.992-15.12 11.68c-24.85-12.15-54.24-16.38-86.06-5.106c-38.75 13.73-68.12 48.91-73.72 89.64c-9.483 69.01 43.81 128 110.9 128c26.44 0 50.43-9.544 69.59-24.88c24 31.3 65.23 48.69 109.4 37.49C465.2 369.3 496 324.1 495.1 277.2V256.3C495.1 107.1 361.2-9.332 207.8 20.73zM239.1 304.3c-26.47 0-48-21.56-48-48.05s21.53-48.05 48-48.05s48 21.56 48 48.05S266.5 304.3 239.1 304.3z"/></svg>
</span>
</a
>
</section>
<div class="pt-8">
<hr class="border-dotted border-neutral-300 dark:border-neutral-600" />
<div class="flex justify-between pt-3">
<span>
<a class="flex group" href="/blowfish/posts/202206-mentorcruise-interview-copy/">
<span
class="mr-3 text-neutral-700 group-hover:text-primary-600 ltr:inline rtl:hidden dark:text-neutral dark:group-hover:text-primary-400"
>&larr;</span
>
<span
class="ml-3 text-neutral-700 group-hover:text-primary-600 ltr:hidden rtl:inline dark:text-neutral dark:group-hover:text-primary-400"
>&rarr;</span
>
<span class="flex flex-col">
<span
class="mt-[0.1rem] leading-6 group-hover:underline group-hover:decoration-primary-500"
>Nuno Coração Meet the Mentor</span
>
<span class="mt-[0.1rem] text-xs text-neutral-500 dark:text-neutral-400">
<time datetime="2022-06-26 00:00:00 &#43;0000 UTC">26 June 2022</time>
</span>
</span>
</a>
</span>
<span>
<a class="flex text-right group" href="/blowfish/posts/202207-docker-bulk-add/">
<span class="flex flex-col">
<span
class="mt-[0.1rem] leading-6 group-hover:underline group-hover:decoration-primary-500"
>Bulk User Add for Docker Business and Teams</span
>
<span class="mt-[0.1rem] text-xs text-neutral-500 dark:text-neutral-400">
<time datetime="2022-07-27 00:00:00 &#43;0000 UTC">27 July 2022</time>
</span>
</span>
<span
class="ml-3 text-neutral-700 group-hover:text-primary-600 ltr:inline rtl:hidden dark:text-neutral dark:group-hover:text-primary-400"
>&rarr;</span
>
<span
class="mr-3 text-neutral-700 group-hover:text-primary-600 ltr:hidden rtl:inline dark:text-neutral dark:group-hover:text-primary-400"
>&larr;</span
>
</a>
</span>
</div>
</div>
</footer>
</article>
<div
class="pointer-events-none absolute top-[100vh] bottom-0 w-12 ltr:right-0 rtl:left-0"
>
<a
href="#the-top"
class="pointer-events-auto sticky top-[calc(100vh-5.5rem)] flex h-12 w-12 items-center justify-center rounded-full bg-neutral/50 text-xl text-neutral-700 backdrop-blur hover:text-primary-600 dark:bg-neutral-800/50 dark:text-neutral dark:hover:text-primary-400"
aria-label="Scroll to top"
title="Scroll to top"
>
&uarr;
</a>
</div>
</main><footer class="py-10 print:hidden">
<nav class="pb-4 text-base font-medium text-neutral-500 dark:text-neutral-400">
<ul class="flex flex-col list-none sm:flex-row">
<li
class="mb-1 ltr:text-right rtl:text-left sm:mb-0 ltr:sm:mr-7 ltr:sm:last:mr-0 rtl:sm:ml-7 rtl:sm:last:ml-0"
>
<a
class="decoration-primary-500 hover:underline hover:decoration-2 hover:underline-offset-2"
href="/blowfish/tags/"
title="Tags"
>Tags</a
>
</li>
<li
class="mb-1 ltr:text-right rtl:text-left sm:mb-0 ltr:sm:mr-7 ltr:sm:last:mr-0 rtl:sm:ml-7 rtl:sm:last:ml-0"
>
<a
class="decoration-primary-500 hover:underline hover:decoration-2 hover:underline-offset-2"
href="/blowfish/categories/"
title="Categories"
>Categories</a
>
</li>
</ul>
</nav>
<div class="flex items-center justify-between">
<p class="text-sm text-neutral-500 dark:text-neutral-400">
&copy;
2022
Blowfish
</p>
<p class="text-xs text-neutral-500 dark:text-neutral-400">
Powered by <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500"
href="https://gohugo.io/" target="_blank" rel="noopener noreferrer">Hugo</a> &amp; <a class="hover:underline hover:decoration-primary-400 hover:text-primary-500" href="https://github.com/nunocoracao/blowfish" target="_blank" rel="noopener noreferrer">Blowfish</a>
</p>
</div>
<script>
mediumZoom(document.querySelectorAll("img:not(.nozoom)"), {
margin: 24,
background: 'rgba(0,0,0,0.5)',
scrollOffset: 0,
})
</script>
</footer>
<div
id="search-wrapper"
class="invisible fixed inset-0 z-50 flex h-screen w-screen cursor-default flex-col bg-neutral-500/50 p-4 backdrop-blur-sm dark:bg-neutral-900/50 sm:p-6 md:p-[10vh] lg:p-[12vh]"
data-url="https://nunocoracao.github.io/blowfish/"
>
<div
id="search-modal"
class="flex flex-col w-full max-w-3xl min-h-0 mx-auto border rounded-md shadow-lg top-20 border-neutral-200 bg-neutral dark:border-neutral-700 dark:bg-neutral-800"
>
<header class="relative z-10 flex items-center justify-between flex-none px-2">
<form class="flex items-center flex-auto min-w-0">
<div class="flex items-center justify-center w-8 h-8 text-neutral-400">
<span class="relative inline-block align-text-bottom icon">
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="search" class="svg-inline--fa fa-search fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/></svg>
</span>
</div>
<input
type="search"
id="search-query"
class="flex flex-auto h-12 mx-1 bg-transparent appearance-none focus:outline-dotted focus:outline-2 focus:outline-transparent"
placeholder="Search"
tabindex="0"
/>
</form>
<button
id="close-search-button"
class="flex items-center justify-center w-8 h-8 text-neutral-700 hover:text-primary-600 dark:text-neutral dark:hover:text-primary-400"
title="Close (Esc)"
>
<span class="relative inline-block align-text-bottom icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path fill="currentColor" d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>
</span>
</button>
</header>
<section class="flex-auto px-2 overflow-auto">
<ul id="search-results">
</ul>
</section>
</div>
</div>
</div>
</body>
</html>