<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ writing - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ writing - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 06 May 2026 16:59:54 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/writing/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Stop Staring at a Blank Deck: How I Use Claude Code + Marp to Think Through Presentations ]]>
                </title>
                <description>
                    <![CDATA[ The hard part of building a presentation is figuring out the story. What are you trying to say? What’s the structure? Which sections build on which? Where does the data go, table or bullets? Before th ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-use-claude-code-and-marp-to-think-through-presentations/</link>
                <guid isPermaLink="false">69bc3429b238fd45a3206764</guid>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ AI ]]>
                    </category>
                
                    <category>
                        <![CDATA[ research ]]>
                    </category>
                
                    <category>
                        <![CDATA[ claude-code ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Omer Rosenbaum ]]>
                </dc:creator>
                <pubDate>Thu, 19 Mar 2026 17:36:41 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/uploads/covers/5e1e335a7a1d3fcc59028c64/fcbd044d-0add-467c-a9b0-d068584a8197.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>The hard part of building a presentation is figuring out the <em>story</em>. What are you trying to say? What’s the structure? Which sections build on which? Where does the data go, table or bullets? Before the comparison or after?</p>
<p>What <em>would</em> help is having something to <strong>react to</strong>. Starting from zero is hard. Reacting to a draft is fast. “Move this before that” is way easier than “what should I say?”</p>
<p>That’s the workflow I want to show you. I use Claude Code + Marp to think through presentations. Claude helps me brainstorm the story, gives me a first draft to react to, and then I iterate, either through “conversation” or by editing the Markdown directly. The whole thing is a text file. 🎉</p>
<p>(I used a deck to think through this post. You can find it <a href="https://omerr.github.io/claude-skills/presentations/claude-code-marp/">here</a>.)</p>
<h3 id="heading-well-cover">We'll cover:</h3>
<ol>
<li><p><a href="#heading-the-workflow">The Workflow</a></p>
<ul>
<li><p><a href="#heading-brainstorm">Brainstorm</a></p>
</li>
<li><p><a href="#heading-react">React</a></p>
</li>
<li><p><a href="#heading-iterate">Iterate</a></p>
</li>
<li><p><a href="#heading-export">Export</a></p>
</li>
<li><p><a href="#heading-editable-pptx">Editable PPTX</a></p>
</li>
</ul>
</li>
<li><p><a href="#heading-get-started-in-5-minutes">Get Started in 5 Minutes</a></p>
<ul>
<li><p><a href="#heading-1-install-marp-cli">1. Install Marp CLI</a></p>
</li>
<li><p><a href="#heading-2-install-the-skill-via-skillssh">2. Install the skill (via skills.sh)</a></p>
</li>
<li><p><a href="#heading-run-it">Run it</a></p>
</li>
<li><p><a href="#heading-iterate">Iterate</a></p>
</li>
</ul>
</li>
<li><p><a href="#heading-use-case-this-very-article">Use Case: This Very Article</a></p>
</li>
<li><p><a href="#heading-under-the-hood">Under the Hood</a></p>
<ul>
<li><p><a href="#heading-marp-markdown-to-slides">Marp: Markdown to Slides</a></p>
</li>
<li><p><a href="#heading-the-skill-file">The Skill File</a></p>
</li>
<li><p><a href="#heading-section-dividers">Section Dividers</a></p>
</li>
<li><p><a href="#heading-breadcrumb-navigation">Breadcrumb Navigation</a></p>
</li>
</ul>
</li>
<li><p><a href="#heading-wrapping-up">Wrapping Up</a></p>
</li>
</ol>
<h2 id="heading-the-workflow">The Workflow</h2>
<p>The process has four stages: <strong>Brainstorm</strong>, <strong>React</strong>, <strong>Iterate</strong>, <strong>Export</strong>. Let me walk through each one.</p>
<h3 id="heading-brainstorm">Brainstorm</h3>
<p>You kick things off with a slash command (I will provide you with this command later):</p>
<pre><code class="language-plaintext">/create-marp-deck API rate limiting
</code></pre>
<p>Claude starts by interviewing you, asks about the goal, audience, key points, any data you want to include. This partforces you to articulate the story before a single slide exists.</p>
<img src="https://cdn-images-1.medium.com/max/1200/0*HHy7-RCRF_oS8WeU.png" alt="Claude Code interviewing the user about their presentation — asking about the goal, audience, and key&nbsp;sections" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<pre><code class="language-plaintext">~/projects/my-app $ claude
&gt; /create-marp-deck API rate limiting
─────────────────────────────────────────────

Claude: What's this presentation about? What should the audience
        walk away knowing?

User:   How our rate limiting works, which algorithm we chose and
        why, and what they need to know to configure it for their
        services.

Claude: Who's the audience?

User:   Platform engineering team — they know our stack but haven't
        seen the rate limiting internals.

Claude: What are the key points or sections you want to cover?

User:   1. Why we need rate limiting (the incident last month)
        2. Token bucket vs sliding window — our decision
        3. How to configure it per-service
        4. Monitoring dashboard walkthrough
</code></pre>
<p>Think of it as a lightweight brainstorm: you talk through what you’re trying to say, and Claude helps you structure it.</p>
<h3 id="heading-react">React</h3>
<p>Once you’ve aligned on the structure, Claude generates the full Marp Markdown file and exports it. You get a solid first draft you can <em>react to</em> and reshape.</p>
<img src="https://cdn-images-1.medium.com/max/1200/0*pFj4D2py1ATg816C.png" alt="Title slide with dark gradient background showing “API Rate Limiting — A Technical Deep&nbsp;Dive”" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<p>That title slide came from this Markdown:</p>
<pre><code class="language-plaintext">&lt;!-- _class: lead title-slide --&gt;
</code></pre>
<pre><code class="language-plaintext"># API Rate Limiting
## A Technical Deep Dive
</code></pre>
<pre><code class="language-plaintext">**Team**: Platform Engineering
**Date**: February 2026
</code></pre>
<p>Is it perfect? Probably not. But now you have something concrete, with sections, structure, and a story, that you can push around. That’s so much faster than starting from a blank canvas.</p>
<p>When you go through the slides, you <em>feel</em> if the story is coherent and clear.</p>
<h3 id="heading-iterate">Iterate</h3>
<p>While reviewing the draft, it'll inevitably spark ideas: “oh, I should add a comparison table here,” “this section is too dense, maybe split it into two,” “move this summary up to the top.”</p>
<p>One way to make such edits is to ask Claude Code to do that:</p>
<pre><code class="language-plaintext">"Slide 6 is too dense. Split the algorithm comparison into
two slides, one for token bucket, one for sliding window."
</code></pre>
<img src="https://cdn-images-1.medium.com/max/1200/0*dVWLJ1hecPviej4D.png" alt="Claude Code splitting a slide and adding a callout, with file&nbsp;diffs" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<pre><code class="language-plaintext">&gt; Slide 6 is too dense. Split the algorithm comparison into two
  slides — one for token bucket, one for sliding window.

Claude: I'll split slide 6 into two separate slides, one per algorithm.

  Edit presentations/api-rate-limiting.md
  ───────────────────────────────────────
  - # Algorithm Comparison
  - | Feature | Token Bucket | Sliding Window |
  + # Token Bucket
  + Tokens refill at a steady rate...
  + ---
  + # Sliding Window
  + Track exact timestamp of every request...

&gt; Add a "Why we chose token bucket" callout to that first slide

Claude: Added a blockquote callout explaining the decision.

  Edit presentations/api-rate-limiting.md
  ───────────────────────────────────────
  + &gt; We chose token bucket because it handles bursty traffic
  + &gt; from our mobile clients without penalizing steady callers
</code></pre>
<p>You can also edit in <strong>VS Code</strong> with the Marp extension for live preview. Open the&nbsp;<code>.md</code> file, hit <code>Ctrl+Shift+V</code>, and you get the source on the left with rendered slides on the right. Claude Code edits the file, VS Code detects the change, and the preview updates automatically. (I keep both open side by side and it just works.)</p>
<img src="https://cdn-images-1.medium.com/max/1200/0*88zY1J4xzeo1vUWS.png" alt="Me editing the deck that I created to help me think through this&nbsp;article" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<h3 id="heading-export">Export</h3>
<p>When you’re done, you get three files:</p>
<ul>
<li><p><code>.md</code> – the source (version-controlled, diffable)</p>
</li>
<li><p><code>.html</code> – open in any browser, share via Slack</p>
</li>
<li><p><code>.pptx</code> – open in PowerPoint, present anywhere</p>
</li>
</ul>
<pre><code class="language-bash">$ marp --no-stdin deck.md -o deck.html
[  INFO ] Converting 1 markdown...
[  INFO ] deck.md =&gt; deck.html

$ marp --no-stdin --pptx deck.md -o deck.pptx
[  INFO ] Converting 1 markdown...
[  INFO ] deck.md =&gt; deck.pptx

$ ls presentations/
api-rate-limiting.md
api-rate-limiting.html   ✓ open in browser, share via Slack
api-rate-limiting.pptx   ✓ open in PowerPoint, present anywhere
</code></pre>
<img src="https://cdn-images-1.medium.com/max/1200/0*XsnHZELJ9w3vovOz.png" alt="marp CLI exporting to HTML and&nbsp;PPTX" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<p>The skill runs the export commands automatically after generating the deck. A 15-slide deck converts in about 2 seconds.</p>
<h4 id="heading-editable-pptx">Editable PPTX</h4>
<p>The standard PPTX export renders each slide as an image  –  pixel-perfect, but you can’t edit the text in PowerPoint or Google Slides. If you need editable text, Marp has a <code>--pptx-editable</code> flag that uses LibreOffice under the hood to produce real text boxes.</p>
<p>The catch: LibreOffice creates text boxes that are too narrow, so text wraps and overlaps. The skill includes a python-pptx post-processing script that automatically widens the text boxes to fix this. Just ask for “editable PPTX” and the skill handles the rest  –  the LibreOffice conversion, the text box fix, everything.</p>
<h2 id="heading-get-started-in-5-minutes">Get Started in 5&nbsp;Minutes</h2>
<p>OK, are you ready? Here’s everything you need:</p>
<h3 id="heading-1-install-marp-cli">1. Install Marp CLI:</h3>
<ul>
<li><code>npm install -g @marp-team/marp-cli</code></li>
</ul>
<h3 id="heading-2-install-the-skill-via-skillssh">2. Install the skill (via <a href="http://skills.sh">skills.sh</a>):</h3>
<ul>
<li><code>npx skills add Omerr/claude-skills</code></li>
</ul>
<p>This works with Claude Code, Cursor, GitHub Copilot, and other AI agents. You can also install manually  ( see the <a href="https://github.com/Omerr/claude-skills">repo</a> for details).</p>
<h3 id="heading-3-run-it">3. Run it:</h3>
<ul>
<li><code>/create-marp-deck your topic here</code></li>
</ul>
<h3 id="heading-4-iterate">4. Iterate:</h3>
<p>React to the draft, refine through conversation or VS Code, and export.</p>
<p>That’s it. Four steps. Fork the repo and customize the conventions to match your style.</p>
<h2 id="heading-use-case-this-very-article">Use Case: This Very&nbsp;Article</h2>
<p>Want to see this workflow in practice? You’re looking at it.</p>
<p>I wrote this article by first creating a slide deck using exactly the process I described above. I ran <code>/create-marp-deck</code>, answered the interview questions, got a first draft, and iterated until the story felt right. You can <a href="https://omerr.github.io/claude-skills/presentations/claude-code-marp/">see the deck here</a>.</p>
<p>Why start with slides? Because a deck forces you to be concise and to go through the <em>story</em>. If the story doesn’t flow across 15 slides, it won’t flow across 1,500 words either. The deck became my outline, and once I had a coherent structure there, writing the article was much easier.</p>
<p>So if you’re ever staring at a blank doc thinking “I should write a blog post about X,” try making a deck first. You might be surprised how much faster the writing goes when the story is already figured out. 😎</p>
<h2 id="heading-under-the-hood">Under the&nbsp;Hood</h2>
<p>If you’re curious about what makes this work, read on. If not, you’re all set. 🙌🏻</p>
<h3 id="heading-marp-markdown-to-slides">Marp: Markdown to&nbsp;Slides</h3>
<p><a href="https://marp.app/"><strong>Marp</strong></a> (Markdown Presentation Ecosystem) converts&nbsp;<code>.md</code> files into slides. Your deck starts with frontmatter:</p>
<pre><code class="language-plaintext">---
marp: true
theme: default
paginate: true
size: 16:9
---
</code></pre>
<p>Four lines and you have widescreen, paginated slides. Slide breaks are just <code>---</code> in the Markdown. Your presentation is a text file: version-controlled, diffable, and AI-editable.</p>
<h3 id="heading-the-skill-file">The Skill&nbsp;File</h3>
<p>You <em>could</em> just ask Claude Code to “make me a Marp presentation” every time. But you’d spend half the conversation explaining your preferred format, color palette, and slide structure.</p>
<p>Instead, I created a <strong>Claude Code skill</strong> (see it <a href="https://github.com/Omerr/claude-skills.git">here</a>), a reusable set of instructions that Claude follows whenever you invoke it. It has two parts:</p>
<ol>
<li><p>An <strong>interview phase</strong> that gathers context before generating anything (the 5 questions from the brainstorm step)</p>
</li>
<li><p>A <strong>generation phase</strong> with the full Marp conventions: CSS palette, slide structure, breadcrumb pattern, formatting rules, and export commands</p>
</li>
</ol>
<p>The full skill is about 200 lines. That sounds like a lot, but you write it once and then every deck you create follows the same polished conventions automatically.</p>
<h3 id="heading-section-dividers">Section Dividers</h3>
<p>Each section of the deck gets its own gradient background. So when you’re presenting, the audience intuitively knows when you’ve moved to a new topic:</p>
<img src="https://cdn-images-1.medium.com/max/1200/0*SDRNCJnSw3BDwXUG.png" alt="Section divider slide with blue gradient showing “Part 1: The&nbsp;Problem”" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<p>Applied via CSS classes in the skill:</p>
<pre><code class="language-plaintext">&lt;!-- _class: lead part-problem --&gt;
# Part 1: The Problem
</code></pre>
<h3 id="heading-breadcrumb-navigation">Breadcrumb Navigation</h3>
<p>This is my favorite part of the whole setup.</p>
<p>Every content slide has a breadcrumb header at the top that shows where you are in the deck:</p>
<img src="https://cdn-images-1.medium.com/max/1200/0*PaPBdx60ZYJn9G3K.png" alt="Content slide showing breadcrumb “The Problem > Algorithms > Implementation” with the current section highlighted in&nbsp;blue" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<p>See that header? “The Problem &gt; <strong>Algorithms</strong> &gt; Implementation”, with “Algorithms” highlighted in blue.</p>
<p>In Marp, this is done with a simple HTML comment:</p>
<pre><code class="language-plaintext">&lt;!-- header: "The Problem &gt; **Algorithms** &gt; Implementation" --&gt;
</code></pre>
<p>The <code>**bold**</code> text renders in blue (via CSS <code>header strong { color: #2563eb; }</code>), while the rest stays gray. You set it once per section and it persists until you change it.</p>
<p>How often have you sat through a presentation wondering “wait, where are we?” 🤔</p>
<h2 id="heading-wrapping-up">Wrapping Up</h2>
<p>The hard part of presentations is telling a coherent story. Get yourself a first draft to react to, iterate until it flows, and export. That’s it.</p>
<p>If you want to try it: <code>npm install -g @marp-team/marp-cli</code>, run <code>npx skills add Omerr/claude-skills</code>, and then <code>/create-marp-deck</code>. You'll have a deck in minutes and a workflow you can reuse for every presentation after that.</p>
<h3 id="heading-about-the-author">About the&nbsp;Author</h3>
<p><a href="https://www.linkedin.com/in/omer-rosenbaum-034a08b9/">Omer Rosenbaum</a> is the author of the <a href="https://youtube.com/@BriefVid">Brief</a> <a href="https://youtube.com/@BriefVid">YouTube Channel</a>. He’s also a cyber training expert and founder of Checkpoint Security Academy. He’s the author of <a href="https://www.freecodecamp.org/news/product-led-research-a-practical-guide-for-randd-leaders-full-book/">Product-Led Research</a>, <a href="https://www.freecodecamp.org/news/gitting-things-done-book/">Gitting Things Done</a> (in English) and <a href="https://data.cyber.org.il/networks/networks.pdf">Computer Networks</a> (in Hebrew). You can find him on <a href="https://twitter.com/Omer_Ros">Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Improve Your Technical Writing Skills to Advance Your Career ]]>
                </title>
                <description>
                    <![CDATA[ Technical writing is important for all sorts of careers. We just posted a course on the freeCodeCamp.org YouTube channel that will teach you the fundamentals of technical writing and help you understand its importance in various fields. The course wi... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/improve-your-technical-writing-skills-to-advance-your-career/</link>
                <guid isPermaLink="false">688b8e97464706f0734d3716</guid>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ youtube ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Beau Carnes ]]>
                </dc:creator>
                <pubDate>Thu, 31 Jul 2025 15:41:11 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1753976458228/f3d14a7f-d0f7-4e61-a487-cdc4b6344843.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Technical writing is important for all sorts of careers.</p>
<p>We just posted a course on the freeCodeCamp.org YouTube channel that will teach you the fundamentals of technical writing and help you understand its importance in various fields. The course will guide you through techniques to make your writing more concrete and practical. By the end of this course, you’ll have the skills and confidence to communicate complex information clearly and professionally. Chumki Biswas created this course.</p>
<p>Here are the sections in this course:</p>
<ul>
<li><p>Introduction</p>
</li>
<li><p>What is Technical Writing?</p>
</li>
<li><p>How to Frame a Definition?</p>
</li>
<li><p>Using 'Class' Categories to Frame Definitions</p>
</li>
<li><p>How to Make Definitions More Concrete?</p>
</li>
<li><p>Describing an Object</p>
</li>
<li><p>Special Notices</p>
</li>
<li><p>Writing User Instructions</p>
</li>
<li><p>Describing a Process</p>
</li>
<li><p>How to Write a Formal Report - Types of Reports</p>
</li>
<li><p>How to Write a Formal Report - The Main Body</p>
</li>
<li><p>How to Write a Formal Report - The Prefatory Part</p>
</li>
</ul>
<p>Watch the full course <a target="_blank" href="https://youtu.be/vT5pcc30Ffw">on the freeCodeCamp.org YouTube channel</a> (1-hour watch).</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/vT5pcc30Ffw" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ freeCodeCamp Hashnode Publication Guide – How to Get Started Writing ]]>
                </title>
                <description>
                    <![CDATA[ As you may know, the freeCodeCamp community now uses Hashnode for our publication's backend instead of Ghost. Many of our contributors already have Hashnode accounts and publish there regularly on the ]]>
                </description>
                <link>https://www.freecodecamp.org/news/freecodecamp-hashnode-publication-guide/</link>
                <guid isPermaLink="false">66b516853b3009c15cd9e439</guid>
                
                    <category>
                        <![CDATA[ freeCodeCamp.org ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Abigail Rennemeyer ]]>
                </dc:creator>
                <pubDate>Tue, 02 Jul 2024 05:00:00 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1722457587467/2f95e9e3-ee3c-4499-8a1e-3245639555a6.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>As you may know, the freeCodeCamp community now uses Hashnode for our publication's backend instead of Ghost.</p>
<p>Many of our contributors already have Hashnode accounts and publish there regularly on their personal blogs. But if you're new to Hashnode, this guide will help you get started.</p>
<p>And if you're already familiar with Hashnode, <strong>read on anyway</strong> – there will be some <strong>important tips you'll need to know to write and submit drafts</strong> for freeCodeCamp's Hashnode publication.</p>
<p>Here's what we'll cover:</p>
<ol>
<li><p>How to set up your Hashnode account</p>
</li>
<li><p>How to submit drafts to the freeCodeCamp editorial team</p>
</li>
<li><p>How to use the Hashnode editor</p>
</li>
<li><p>Text formatting in the Hashnode editor</p>
</li>
<li><p>Other writing tips – freeCodeCamp's publication style guide</p>
</li>
</ol>
<h2 id="heading-how-to-set-up-your-hashnode-account">How to Set up Your Hashnode Account</h2>
<p>To start writing on freeCodeCamp's publication, you'll need a Hashnode account. If you don't already have one, you can sign up for one for free at hashnode.com.</p>
<p>Once you have an account, send us your username at <a href="mailto:editorial@freecodecamp.org">editorial@freecodecamp.org</a> and we'll invite you to the publication.</p>
<p>You'll see a notification in your Hashnode profile once we do that:</p>
<img src="https://www.freecodecamp.org/news/content/images/2024/03/Screenshot-2024-03-20-at-1.44.32-PM.png" alt="Notification in profile" width="600" height="400" loading="lazy">

<p>You'll also see the freeCodeCamp publication listed as one of your available publications.</p>
<img src="https://www.freecodecamp.org/news/content/images/2024/03/Screenshot-2024-03-20-at-1.43.26-PM.png" alt="freeCodeCamp listed as an available publication" width="600" height="400" loading="lazy">

<p>Then you can share drafts with us when you're ready.</p>
<p><strong>Something to keep in mind</strong>: if you have a different Hashnode profile/username from what you had on Ghost, the URL for your author profile will change. We'll eventually have redirects in place, but this will take some time.</p>
<p>In the meantime, we just want you to be aware of this in case you've listed this URL on your personal portfolio, résumé, and so on. We appreciate your patience as we get those redirects set up.</p>
<h2 id="heading-how-to-submit-drafts-to-the-editorial-team">How to Submit Drafts to the Editorial Team</h2>
<p>When you set up your account and sign into Hashnode, you'll see the home screen. Click on "Write", and you'll be taken to this page:</p>
<img src="https://www.freecodecamp.org/news/content/images/2024/03/Screenshot-2024-03-20-at-1.17.25-PM.png" alt="Write a draft on Hashnode" width="600" height="400" loading="lazy">

<p>Go ahead and write your draft (or paste it in from whatever other editor you use. If you do this, make sure you check that all formatting, code blocks, and so on render correctly. You'll also need to <strong>delete and directly upload any images</strong> you want to share, as this is the best way to assure they'll render correctly in the published version of the article).</p>
<p>When your draft is ready to submit, you'll click the "Publish" button in the upper right. Then you'll see the option to choose which publication – you should see both your own blog and freeCodeCamp's publication. Select freeCodeCamp's publication.</p>
<p>Hashnode will ask you if you want to switch, and if you do, it'll refresh the page, switching to freeCodeCamp's publication.</p>
<img src="https://www.freecodecamp.org/news/content/images/2024/04/Screenshot-2024-04-04-at-3.27.00-PM.png" alt="Confirm change of blog" width="600" height="400" loading="lazy">

<p>Then you'll see a "Submit Article" button in the upper right. Click that.</p>
<p>But there's a key (required) second step: <strong>you then also need to copy the draft URL and send it to <a href="mailto:editorial@freecodecamp.org">editorial@freecodecamp.org</a></strong>. Make sure you send the draft URL and not the preview URL – this will make it much easier for us to get to your draft (as we can just click into it, rather than searching through the Hashnode interface).</p>
<p>You'll need to do this – that is, email us the draft URL – so that we can establish an email chain in case we need to share any feedback and make any edit requests before publishing.</p>
<p><strong>Note</strong>: you must email the draft to the editorial team for us to review it (as well as submitting it via Hashnode's "Submit Article" button). <strong>You can't just click the submit button (or just email it) – both steps are required.</strong></p>
<h2 id="heading-how-to-use-the-hashnode-editor">How to Use the Hashnode Editor</h2>
<p>Hashnode's editor is pretty straightforward to use – and isn't all that different from the Ghost editor.</p>
<p>Here's what the page looks like when you get ready to write:</p>
<img src="https://www.freecodecamp.org/news/content/images/2024/04/Screenshot-2024-04-04-at-3.13.31-PM.png" alt="Write article page on Hashnode" width="600" height="400" loading="lazy">

<p>When you write a draft in Hashnode, you'll need to:</p>
<ol>
<li><p>Send us your photo for the cover image (if you'd like your photo included. If not, no worries - our designer will create a cover without your photo). Note that you just need to do this the first time you submit a draft. After that, we'll have the photo saved. If you ever want to change the photo we use for the covers, just send us a new one and we'll update it in our spreadsheet.</p>
</li>
<li><p>Add an article title (we <strong>don't use subtitles in freeCodeCamp's publication</strong>, so you can ignore that)</p>
</li>
</ol>
<p>And then you can start writing.</p>
<p>Once you've finished your article, make sure you click the "Publish" button. You'll see this menu (you'll be able to scroll down for more options, which I'll talk about below):</p>
<img src="https://www.freecodecamp.org/news/content/images/2024/04/Screenshot-2024-04-04-at-3.18.11-PM.png" alt="Settings menu" width="600" height="400" loading="lazy">

<p>Then you'll need to:</p>
<ol>
<li><p>Select the freeCodeCamp publication ("Select a blog")</p>
</li>
<li><p>Check your article slug and make sure it's nice and clear/concise (like javascript-array-tutorial or learn-python-by-building-projects)</p>
</li>
<li><p>Create a table of contents. Note that the auto-generate ToC feature in Hashnode won't work for our publication – so you'll need to manually create your own. <strong>More on that below.</strong></p>
</li>
<li><p>Select and add the tags you'd like your article to have. We recommend 3-5 tags, or as needed.</p>
</li>
<li><p>Finally, click "Submit for review", <strong>and then email the draft URL</strong> to <a href="mailto:editorial@freecodecamp.org">editorial@freecodecamp.org</a>. Again, both are required in order for us to be able to access and review your draft and send you feedback.</p>
</li>
</ol>
<p>The process after that will be pretty similar to our current process: we'll share any feedback or update requests, you'll make your updates and let us know via email that they're done, and we'll do our final review and either ask for more edits or we'll publish the article.</p>
<p>Note that the /news front end will remain the same – readers won't know the difference. It's just the back end/editor/writing experience that's changed a bit.</p>
<h3 id="heading-text-formatting-in-the-hashnode-editor">Text Formatting in the Hashnode Editor</h3>
<p>To access text formatting options, just type a forward slash and a pretty extensive menu will appear:</p>
<img src="https://www.freecodecamp.org/news/content/images/2024/04/Screenshot-2024-04-04-at-3.31.12-PM.png" alt="Formatting menu showing different options" width="600" height="400" loading="lazy">

<p>You can scroll down, click through the buttons along the top, or just start typing what you're looking for (like "table", "embed a link", "code", "quote" and so on) and the menu will filter through options accordingly.</p>
<p>There are a few things we'd like to call out that are a bit different from Ghost:</p>
<h3 id="heading-1-how-to-add-a-table-of-contents-to-your-articles-in-hashnode">1. How to Add a Table of Contents to Your Articles in Hashnode</h3>
<p>There are two ways to add a table of contents to your article: using a handy ToC generator that one of our contributors created, or manually (which we'll describe below).</p>
<h4 id="heading-how-to-use-the-toc-generator">How to use the ToC generator</h4>
<p><a href="https://www.freecodecamp.org/news/author/ashutoshkrris/">One of our contributors</a> created this <a href="https://toc-generator.ashutoshkrris.in/freecodecamp">freeCodeCamp Table of Contents (TOC) Generator</a> (thanks, Ashutosh!). It's designed to simplify your writing process by automatically generating a structured TOC based on the headings in your draft post.</p>
<p>To get started, simply paste the Hashnode Preview URL from your freeCodeCamp post into the input field. You can get this by clicking the "Preview" button in the top right of your draft, under the three dots, and copying the URL from your draft preview from the new tab.</p>
<img src="https://cdn.hashnode.com/uploads/covers/5e1e335a7a1d3fcc59028c64/06c1770a-c53b-4bc1-aee1-ad62dedca44e.png" alt="new preview button under three dots menu" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<p>The TOC generator works with both single-level (H2 headings only) and multi-level (H2 and H3) structures, so you can choose the level of detail you want for your TOC.</p>
<p>Once you've selected the TOC type and entered your post link, click the "Generate TOC" button. The generated TOC will appear in the output box on the right, ready for you to copy and paste directly into your article. The links in the TOC will automatically correspond to the headings in your post, making it easy for readers to navigate.</p>
<p>If you encounter any issues or have questions, refer to <a href="https://blog.ashutoshkrris.in/simplify-your-writing-workflow-with-table-of-contents-generator#heading-how-to-use-the-toc-generator-for-freecodecamp">this&nbsp;detailed guide</a> for further instructions on using the TOC Generator effectively.</p>
<h4 id="heading-how-to-add-your-toc-manually">How to add your ToC manually</h4>
<p>If you'd prefer to manually add a ToC to your Hashnode draft, you'll have to follow a bit of a workaround at the moment.</p>
<p>What you'll need to do is create the ToC in markdown <strong>in another editor of your choice</strong> (that is, NOT in Hashnode) and then paste it into your draft in Hashnode.</p>
<p>So, for example, it'll look like this:</p>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1725982556444/1a108baa-e982-44b9-aaa0-4fe7f1ba6d86.png" alt="Markdown ToC formatting" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<p>So, here are the steps to create the markdown ToC in your editor of choice (not Hashnode) with the headings (and, if necessary, subheadings) you'd like to include in the ToC:</p>
<ol>
<li><p>Open the article preview (in Hashnode) by clicking the three dots and selecting "see preview" in the top-right corner of the page. This will bring you to Preview mode. Scroll down until you see your first heading that you'd like to include.</p>
</li>
<li><p>Next, you'll need to get the IDs from the headings to create the internal links (just as you've likely done in Ghost). So just inspect each heading and grab the "heading id" text from the devtools:</p>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1725388013028/6e090d80-9809-470d-8846-df2d93222d1e.png" alt="Getting heading id in Hashnode by inspecting each heading in Preview mode" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<p>Format it like this: [Heading Text](#heading-heading-text). <strong>Yes - you do need that first "heading" term before the rest of the dasherized text.</strong> You'll get this automatically if you just copy the heading id text as shown above. Just paste it in after the #.</p>
<p>So again, it'll look like this in your other editor of choice:</p>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1725388071500/9241ae03-ae5e-43f2-b0d7-292486368b8f.png" alt="Markdown ToC example" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">
</li>
<li><p>Then, paste that directly into your Hashnode draft where you'd like the ToC to be (typically right after the intro). This should properly format as rich text in Hashnode with the internal ToC links!</p>
</li>
</ol>
<h3 id="heading-2-a-note-on-markdown-in-hashnodes-editor">2. A Note on Markdown in Hashnode's Editor</h3>
<p>At the moment, you shouldn't write in markdown directly in Hashnode's editor, as it doesn't fully support all markdown features.</p>
<p>You can use basic markdown formatting if you're used to writing that way – like using ## for headings, * or - for bullet points, and so on – and the editor will convert those into rich text.</p>
<p>But for now, <strong>links and images don't work in markdown</strong>. So if you go to add a markdown link, for example [freecodecamp.org](<a href="https://www.freecodecamp.org">https://www.freecodecamp.org</a>), it won't render properly as a link in the published article. It'll just look like what you typed. Same with images.</p>
<p>So for the time being, just <a href="http://freecodecamp.org">use in-line linking like this</a> (which you can do by highlighting the text you want to link and then choosing the little link symbol from the menu that pops up and pasting in the link there).</p>
<h4 id="heading-a-note-on-images">A note on images</h4>
<p>As for images, you can drag/drop them in where you want them, or use the / menu we talked about above and search for "image". Then you can upload whatever image you'd like to use.</p>
<p>And if you're looking for a way to add a caption, you won't find it at the moment. So instead, <strong>just add alt text to your images</strong>. You can do this by clicking on the image, and you'll see a menu appear. There's an uppercase "T" in that menu – click on that and there you can add your alt text:</p>
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1723400840775/36fdd7aa-e8a8-4185-a0d0-a30c45b02010.png" alt="Image showing menu with alt text option highlighted by an arrow" style="display:block;margin:0 auto" width="600" height="400" loading="lazy">

<p>Note that if you write the markdown elsewhere (in another text editor) and paste it into the Hashnode editor, it should work fine (including images and links). Hashnode's editor will convert the markdown into rich text.</p>
<h4 id="heading-adding-tables-in-the-hashnode-editor">Adding tables in the Hashnode editor</h4>
<p>If you'd like to include a table in your article, it's pretty easy to do in Hashnode. The editor's table builder is quite good for simple tables, and you can just copy and paste simple markdown tables into the editor directly.</p>
<p>If you need a more complex table - for example one that needs line breaks or a list within a cell - it's best just to put the markdown table into a code block. That will ensure that all the formatting renders properly.</p>
<h3 id="heading-3-how-to-format-math-equations-in-hashnode">3. How to Format Math Equations in Hashnode</h3>
<p>Hashnode uses a tool called MathJax to add properly formatted equations to articles (you may have heard of similar tools like LaTeX or KaTeX). You can read about how to use MathJax <a href="https://www.mathjax.org/">on their website here</a>.</p>
<p>So if you're using mathematical equations in your tutorials, please format them using MathJax. Don't include screenshots of equations, as this isn't accessible and won't be readable by screen readers.</p>
<p><a href="https://saxarona.github.io/mathjax-viewer/">Here's a helpful preview tool</a> for your MathJax equations so you can make sure they've turned out correctly.</p>
<p>You'll also need to add the "MathJax" tag as one of your article tags (just make it the last one). This lets the editor know to apply the proper formatting.</p>
<h2 id="heading-other-writing-tips">Other Writing Tips</h2>
<p>For more general writing tips and guidelines, you can still refer to our <a href="https://www.freecodecamp.org/news/developer-news-style-guide/">publication style guide here</a>.</p>
<p>Happy writing!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Add a Table of Contents to Your Article on Ghost ]]>
                </title>
                <description>
                    <![CDATA[ A table of contents (or TOC) is a list of chapters or section titles in an article. You'll usually find it at the beginning of an article, right after the introduction. When you write a long blog post or an article with independent sections, consider... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-add-a-table-of-contents-to-your-article-on-ghost/</link>
                <guid isPermaLink="false">66ba11df64fe3b6039f992a8</guid>
                
                    <category>
                        <![CDATA[ Ghost ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technical writing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ayu Adiati ]]>
                </dc:creator>
                <pubDate>Fri, 01 Dec 2023 19:47:28 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2023/11/How-to-Add-a-Table-of-Contents-to-Your-Article-on-Ghost-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>A table of contents (or TOC) is a list of chapters or section titles in an article. You'll usually find it at the beginning of an article, right after the introduction.</p>
<p>When you write a long blog post or an article with independent sections, consider adding a table of contents. It can help your readers understand your article's content and know what's coming. Providing hyperlinks to each title in the table of contents helps readers navigate between the sections they want to check out.</p>
<p>Having a table of contents in your articles also benefits you as a writer. First, you can easily see the flow of your article. Another benefit is that it can increase your blog's traffic. If your readers have a great experience reading your article, they will likely bookmark and return to it.</p>
<p>Some publications use <a target="_blank" href="https://ghost.org/">Ghost</a> to write and publish articles on their website, and freeCodeCamp is one of them. In this article, I will walk you through how to add a clickable table of contents to your article on Ghost.</p>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<ul>
    <li><a href="#understanding-headings">Understanding Headings</a></li>
    <li><a href="#how-to-add-a-table-of-contents">How to Add a Table of Contents</a>
        <ul>
            <li><a href="#step-1-create-a-list-of-headings">Step #1 - Create a List of Headings</a>
                <ul>
                    <li><a href="#create-a-list-of-one-level-headings">Create a List of One-Level Headings</a></li>
                    <li><a href="#create-a-list-with-subheadings">Create a List with Subheadings</a></li>
                </ul>
            </li>
            <li><a href="#step-2-inspect-a-heading-and-find-the-id">Step #2 - Inspect a Heading and Find the <code>id</code></a></li>
            <li><a href="#step-3-add-the-link">Step #3 - Add the Link</a>
                <ul>
                    <li><a href="#add-a-link-to-a-heading">Add a Link to a Heading</a></li>
                    <li><a href="#add-a-link-to-a-heading-in-html">Add a Link to a Heading in HTML</a></li>
                    <li><a href="#why-does-the-link-not-work">Why Does the Link Not Work?</a></li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="#final-words">Final Words</a></li>
</ul>

<h2 id="heading-understanding-headings">Understanding Headings</h2>
<p>Before we jump into how to add a table of contents, let's take a moment to understand "headings" because I will use this term going forward.</p>
<blockquote>
<p>Headings are titles of sections and subsections that are displayed on a website.</p>
</blockquote>
<p>There are six levels of headings based on the importance of the section.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/11/h1-h6.png" alt="Image" width="600" height="400" loading="lazy">
<em>Levels of headings – H1 - H6</em></p>
<p>Following best practices, a page on a website should only have one <code>heading level 1</code> (known as <code>h1</code>). It is the main title of the page. In your case, it'll be the main title of your article. (In this article, it's "How to Add a Table of Contents to Your Article on Ghost".)</p>
<p>So, writing an article on Ghost (or any other publication platform) leaves you with <code>h2</code> to <code>h6</code> for your section and subsection titles. And you can use as many of them as you need depending on the hierarchy and organization of your content.</p>
<h2 id="heading-how-to-add-a-table-of-contents">How to Add a Table of Contents</h2>
<p>You can create your table of contents whenever you want – before you write, during the process, or after you finish writing your article. </p>
<p>But you can only add the link to each chapter or section title after writing your article. This is because you'll need to know exactly how the text of the headings will appear in order to link to them properly, as you'll see below.</p>
<p>In this guide, I'll show you how to build a ToC in HTML, which allows you to add subheadings in addition to main headings/section titles. </p>
<h3 id="heading-step-1-create-a-list-of-headings">Step #1 - Create a List of Headings</h3>
<p>You can create a table of contents with a <a class="post-section-overview" href="#heading-create-a-list-of-one-level-headings-2">list of one-level headings</a> (<code>h2</code>) or <a class="post-section-overview" href="#heading-create-a-list-with-subheadings-2">include the subheadings</a> (<code>h3</code> to <code>h6</code>) if you want to.</p>
<p>You can also choose how you want to format your list:</p>
<ul>
<li><strong>Unordered List</strong>:  A list with bullet points.</li>
<li><strong>Ordered List</strong>: A list with numbers.</li>
</ul>
<h4 id="heading-create-a-list-of-one-level-headings">Create a List of One-Level Headings</h4>
<p>Follow these steps to create a one-level headings list:</p>
<ol>
<li>Insert a new line.</li>
<li>Type a dash (<code>-</code>) or an asterisk (<code>*</code>) for the unordered list. Or, type a number and add a period — for example, <code>1.</code> — for the ordered list.</li>
<li>Hit the spacebar.</li>
<li>Add the title.</li>
<li>Click enter to add a new item in the list.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/11/add-list-ghost.gif" alt="Image" width="600" height="400" loading="lazy">
<em>Add an unordered and an ordered list.</em></p>
<p><strong>Note</strong>: You can skip the next section and go directly to "<a class="post-section-overview" href="#heading-step-2-inspect-a-heading-and-find-the-id-1">Step #2 - Inspect a Heading and Find the <code>id</code></a>" if you want.</p>
<h4 id="heading-create-a-list-with-subheadings">Create a List with Subheadings</h4>
<p>If you wish to create a list with subheadings (nested list), you must use HTML to format it manually, as Ghost doesn't have nested list options built into the editor.</p>
<p>First, you need to add the HTML card:</p>
<ol>
<li>Start on a new line.</li>
<li>When your cursor is on the new line, you will see a plus (<code>+</code>) icon button in the circle on the left. Click this button.</li>
<li>Click the "HTML" option.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/11/ghost-primary-option-1.png" alt="Image" width="600" height="400" loading="lazy">
<em>A plus sign and an "HTML" option on Ghost.</em></p>
<p>Afterward, you will see the HTML card, as shown in the image below.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/11/ghost----html-card.png" alt="Image" width="600" height="400" loading="lazy">
<em>HTML card on Ghost.</em></p>
<p>Now, let's start adding the list of your headings and subheadings.</p>
<p>Add an HTML unordered list (<code>&lt;ul&gt;&lt;/ul&gt;</code>) or an ordered list (<code>&lt;ol&gt;&lt;/ol&gt;</code>) element.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>

or

<span class="hljs-tag">&lt;<span class="hljs-name">ol</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">ol</span>&gt;</span>
</code></pre>
<p>To add the list of your headings, add a space between the <code>ul</code> or <code>ol</code> tags. Put the cursor between the tags and hit enter twice.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>

<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</code></pre>
<p>Then, add list elements (<code>&lt;li&gt;&lt;/li&gt;</code>) in the empty line between the opening and closing <code>ul</code> or <code>ol</code> tags. Add these list elements based on the number of your section titles.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</code></pre>
<p>Afterward, put each of the titles between the <code>li</code> tags.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>Heading 2 - Part 1<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>Heading 2 - Part 2<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>Heading 2 - Part 3<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</code></pre>
<p>To add subheadings, repeat all the steps. But now, you should put the <code>ul</code> or <code>ol</code> element inside the <code>li</code> element(s) that hold the section title. Here's how to do it:</p>
<ol>
<li>Place your cursor between the end of the section title and the <code>&lt;/li&gt;</code> tag, then click enter.</li>
<li>Click enter again to add a space and add an <code>ul</code> or <code>ol</code> element for the subheadings.</li>
<li>Add an <code>ul</code> or <code>ol</code> element in the new line, put the cursor between the tags, and hit enter twice to add a space.</li>
<li>Add <code>li</code> element(s) in the new line between the <code>ul</code> or <code>ol</code> tags.</li>
<li>Put the subsection title between the <code>li</code> tags.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/11/walkthrough-nested-list.gif" alt="Image" width="600" height="400" loading="lazy">
<em>Creating a nested list in HTML.</em></p>
<p>Below is an example of a table of contents with subheadings in HTML.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>Heading 2 - Part 1
        <span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>Heading 3<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>Heading 3<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>Heading 2 - Part 2
        <span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>Heading 3
                <span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>Heading 4<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span>Heading 2 - Part 3<span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</code></pre>
<p>And the result will look like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/11/ghost----HTML-result.png" alt="Image" width="600" height="400" loading="lazy">
<em>A list of section and subsection titles.</em></p>
<h3 id="heading-step-2-inspect-a-heading-and-find-the-id">Step #2 - Inspect a Heading and Find the <code>id</code></h3>
<p>After creating the list, it's time to add the links to the titles in your table of contents.</p>
<p>But first, you need to find the <code>id</code> attribute of your heading using preview mode by inspecting the title with your browser's (Chrome or Firefox) developer tools.</p>
<p>So, let's open your preview mode:</p>
<ol>
<li>Click the gear icon on the top right of your Ghost editor.</li>
<li>Click the "Preview" link beside the "Post URL" input.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/11/ghost-preview-link.png" alt="Image" width="600" height="400" loading="lazy">
<em>The "Preview" link is in the "Post settings" on Ghost.</em></p>
<p>Now that you are in the preview mode, right-click your mouse. You will see some options. Click the "Inspect" option to open the developer tools.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/11/developer-tools-1.png" alt="Image" width="600" height="400" loading="lazy">
<em>"Inspect" option on Chrome.</em></p>
<p>In the developer tools, let's click the button with a box and arrow icon on the top left to select a heading element on the page and inspect it.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/11/select-element-tool.png" alt="Image" width="600" height="400" loading="lazy">
<em>"Select an element in the page to inspect it" button in the developer tools on Chrome.</em></p>
<p>Hover over a title and click on it. It will highlight the element you want to inspect in the developer tools. Inside the heading element (<code>h2</code> to <code>h6</code>), you will see an <code>id</code> (shown with a red line in the image below).</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/11/inspect-elelemet-devtool.png" alt="Image" width="600" height="400" loading="lazy">
<em>Inspect a heading with developer tools on Chrome.</em></p>
<p>Double-click on the value inside the quote marks of the <code>id</code> and copy it. You will use it to add the link to the title in the table of contents.</p>
<p><strong>Note</strong>: </p>
<ul>
<li>If you <a class="post-section-overview" href="#heading-create-a-list-of-one-level-headings-2">created a list of one-level headings</a>, head to the "<a class="post-section-overview" href="#heading-add-a-link-to-a-heading-1">Add a Link to a Heading</a>" section.</li>
<li>If you <a class="post-section-overview" href="#heading-create-a-list-with-subheadings-2">made a list with subheadings</a>, go to the "<a class="post-section-overview" href="#heading-add-a-link-to-a-heading-in-html-1">Add a Link to a Heading in HTML</a>" section.</li>
</ul>
<h3 id="heading-step-3-add-the-link">Step #3 - Add the Link</h3>
<h4 id="heading-add-a-link-to-a-heading">Add a Link to a Heading</h4>
<p>To add the link, return to your table of contents in the Ghost editor. Then, follow these steps:</p>
<ol>
<li>Highlight the title that you want to add the link to.</li>
<li>Click the chain icon.</li>
<li>Type a hashtag (<code>#</code>) in the input field and paste your copied <code>id</code> value.</li>
</ol>
<p>So, it will be like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/11/ghost-highlight-title.png" alt="Image" width="600" height="400" loading="lazy">
<em>Highlighting a list and a chain icon on Ghost.</em></p>
<pre><code class="lang-markdown"><span class="hljs-section">#understanding-headings</span>
</code></pre>
<p>After you refresh the preview page, check if the link works. It should take you to the target section when you click the title's link. If not, read the "<a class="post-section-overview" href="#heading-why-does-the-link-not-work-1">Why Does the Link Not Work?</a>" section.</p>
<h4 id="heading-add-a-link-to-a-heading-in-html">Add a Link to a Heading in HTML</h4>
<p>First, let's return to your Ghost editor and go to the <code>li</code> element that holds the title in the table of contents.</p>
<p>Then, wrap the title inside an anchor element (<code>&lt;a&gt;&lt;/a&gt;</code>) and add <code>href=""</code> attribute in the opening tag.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">""</span>&gt;</span>Understanding Headings<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</code></pre>
<p>The anchor element creates a hyperlink, and the <code>href</code> attribute is the placeholder for the link's destination.</p>
<p>Now, you will add the link's destination. Type a hashtag (<code>#</code>) and paste the <code>id</code> value you've copied inside the double quotes of the <code>href</code>.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#understanding-headings"</span>&gt;</span>Understanding Headings<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</code></pre>
<p>Repeat all the steps to add a link for each title.</p>
<p>Below is an example of section and subsection titles with links in HTML:</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#understanding-headings"</span>&gt;</span>Understanding Headings<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#adding-a-table-of-content"</span>&gt;</span>Adding a Table of Content<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">ul</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#step-1-create-a-list-of-titles"</span>&gt;</span>Step #1 - Create a List of Titles<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
</code></pre>
<p>After refreshing the preview page, you can now check if the link works by clicking it. If it doesn't work, read the next section.</p>
<h4 id="heading-why-does-the-link-not-work">Why Does the Link Not Work?</h4>
<p>If you click a link in your table of contents and it goes nowhere or redirects you to a "404 Page not found", return to the preview page. Refresh it, and try to click the link again.</p>
<p>If it still does the same, you need to check the link in the Ghost editor.</p>
<p>Sometimes, it can be a typo where you change the title but still need to update the link. Or there is a missing hashtag (<code>#</code>) in the link.</p>
<h2 id="heading-final-words"><strong>Final Words</strong></h2>
<p>If you liked and found this article helpful, please share it with others. You can find other works on my <a target="_blank" href="https://adiati.com/">blog</a>. Let's connect on <a target="_blank" href="https://twitter.com/@AdiatiAyu">X (formerly Twitter)</a> or <a target="_blank" href="https://www.linkedin.com/in/adiatiayu/">LinkedIn</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Smart Quotes – Single Quote and Double Quotation Mark for Copy + Paste ]]>
                </title>
                <description>
                    <![CDATA[ Smart quotes are commonly used punctuation marks in HTML and in writing. Knowing how to use them correctly can make a significant difference in the clarity and professionalism of your writing.  So in this article, you will get access to the commonly ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/smart-quotes-single-quote-and-double-quotation-mark-for-copy-paste/</link>
                <guid isPermaLink="false">66adf2146992d2a84c5d7942</guid>
                
                    <category>
                        <![CDATA[ HTML ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technical writing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kolade Chris ]]>
                </dc:creator>
                <pubDate>Wed, 10 May 2023 14:31:24 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2023/05/smartQuotes-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Smart quotes are commonly used punctuation marks in HTML and in writing. Knowing how to use them correctly can make a significant difference in the clarity and professionalism of your writing. </p>
<p>So in this article, you will get access to the commonly used quotation marks out there that you can copy and paste them into your articles, papers, and HTML.</p>
<p>It doesn’t end there. You will get access to the Unicode characters, HTML entities, and CSS entities of all the smart quotes. Make sure you check the end of this article so you can learn how to use the HTML and CSS entities and Unicode characters of the smart quotes.</p>
<p>Before showing you a table containing all the smart quotes, let's see how to use them in HTML and CSS first.</p>
<h2 id="heading-what-well-cover">What We'll Cover</h2>
<ul>
<li><a class="post-section-overview" href="#heading-how-to-use-smart-quotes-quotation-marks-in-html-and-css">How to Use Smart Quotes (Quotation Marks) in HTML and CSS</a></li>
<li><a class="post-section-overview" href="#heading-table-of-smart-quotes-their-unicode-characters-html-and-css-codes">Table of Smart Quotes, their Unicode Characters, HTML, and CSS Codes</a></li>
<li><a class="post-section-overview" href="#heading-conclusion">Conclusion</a></li>
</ul>
<h2 id="heading-how-to-use-smart-quotes-quotation-marks-in-html-and-css">How to Use Smart Quotes (Quotation Marks) in HTML and CSS</h2>
<p>To use smart quotes in HTML and CSS, you need their Unicode characters. For instance, the Unicode for quotation marks is <code>U+0022</code>. So, to use it in HTML, strip out the <code>U+</code> part, prepend the other letters or numbers with <code>&amp;#x</code>, and end them with semicolon (<code>;</code>) like this:</p>
<pre><code class="lang-bash">&amp;<span class="hljs-comment">#x0022;</span>
</code></pre>
<p>That translates to this: "</p>
<p>In CSS, you need to strip out the <code>U+</code> part again and replace them with a backslash (<code>\</code>). So this is how you'd use a quotation mark in CSS:</p>
<pre><code class="lang-bash">\0022
</code></pre>
<p>But there's a caveat to using Unicode characters in CSS. To make them visible on a web page, you need to create a pseudo-element and make the Unicode character the content:</p>
<pre><code class="lang-css"><span class="hljs-selector-tag">element</span><span class="hljs-selector-pseudo">::after</span> {
  <span class="hljs-attribute">content</span>: <span class="hljs-string">'\0022'</span>;
}
</code></pre>
<h2 id="heading-table-of-smart-quotes-their-unicode-characters-html-and-css-codes">Table of Smart Quotes, their Unicode Characters, HTML, and CSS Codes</h2>
<p>The table below contains the quotation marks available for use in HTML and other writings:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Quotation Mark Name</td><td>Symbol</td><td>Unicode</td><td>HTML Code</td><td>CSS Code</td></tr>
</thead>
<tbody>
<tr>
<td>Quotation Mark</td><td><code>"</code></td><td><code>U+0022</code></td><td><code>&amp;#x0022</code></td><td><code>\0022</code></td></tr>
<tr>
<td>Single High Reversed Quotation Mark</td><td><code>‛</code></td><td><code>U+201B</code></td><td><code>&amp;#x201B</code></td><td><code>\201B</code></td></tr>
<tr>
<td>Double High Reversed Quotation Mark</td><td><code>‟</code></td><td><code>U+201F</code></td><td><code>&amp;#x201F</code></td><td><code>\201F</code></td></tr>
<tr>
<td>Full Width Quotation Mark</td><td><code>＂</code></td><td><code>U+FF02</code></td><td><code>&amp;#xFF02</code></td><td><code>\FF02</code></td></tr>
<tr>
<td>Right Single Quotation Mark</td><td><code>’</code></td><td><code>U+2019</code></td><td><code>&amp;#x2019</code></td><td><code>\2019</code></td></tr>
<tr>
<td>Left Single Quotation Mark</td><td><code>‘</code></td><td><code>U+2018</code></td><td><code>&amp;#x2018</code></td><td><code>\2018</code></td></tr>
<tr>
<td>Single Low Quotation Mark</td><td><code>‚</code></td><td><code>U+201A</code></td><td><code>&amp;#x201A</code></td><td><code>\201A</code></td></tr>
<tr>
<td>Double Prime Quotation Mark</td><td><code>〞</code></td><td><code>U+301E</code></td><td><code>&amp;#x301E</code></td><td><code>\301E</code></td></tr>
<tr>
<td>Reversed Double Prime Quotation Mark</td><td><code>〝</code></td><td><code>U+301D</code></td><td><code>&amp;#x301D</code></td><td>\301D</td></tr>
<tr>
<td>Low Double Prime Quotation Mark</td><td><code>〟</code></td><td><code>U+301F</code></td><td><code>&amp;#x301F</code></td><td><code>\301F</code></td></tr>
<tr>
<td>Right Double Quotation Mark</td><td><code>”</code></td><td><code>U+201D</code></td><td><code>&amp;#x201D</code></td><td><code>\201D</code></td></tr>
<tr>
<td>Left Double Quotation Mark</td><td><code>“</code></td><td><code>U+201C</code></td><td><code>&amp;#x201C</code></td><td><code>\201C</code></td></tr>
<tr>
<td>Double Low Quotation Mark</td><td><code>„</code></td><td><code>U+201E</code></td><td><code>&amp;#x201E</code></td><td><code>\201E</code></td></tr>
<tr>
<td>Double Low Reversed Quotation Mark</td><td><code>⹂</code></td><td><code>U+2E42</code></td><td><code>&amp;#x2E42</code></td><td><code>\2E42</code></td></tr>
<tr>
<td>Heavy Right Pointing Angle Quotation Mark Ornament</td><td><code>❯</code></td><td><code>U+276F</code></td><td><code>&amp;#x276F</code></td><td><code>\276F</code></td></tr>
<tr>
<td>Heavy Left Pointing Angle Quotation Mark Ornament</td><td><code>❮</code></td><td><code>U+276E</code></td><td><code>&amp;#x27CE</code></td><td><code>\27CE</code></td></tr>
<tr>
<td>Single Right Pointing Angle Quotation Mark</td><td><code>›</code></td><td><code>U+203A</code></td><td><code>&amp;#x203A</code></td><td><code>\203A</code></td></tr>
<tr>
<td>Single Left Pointing Angle Quotation Mark</td><td><code>‹</code></td><td><code>U+2039</code></td><td><code>&amp;#x2039</code></td><td><code>\2039</code></td></tr>
<tr>
<td>Heavy Low Single Comma Quotation Mark Ornament</td><td><code>❟</code></td><td><code>U+275F</code></td><td><code>&amp;#x275F</code></td><td><code>\275F</code></td></tr>
<tr>
<td>Heavy Single Comma Quotation Mark Ornament</td><td><code>❜</code></td><td><code>U+275C</code></td><td><code>&amp;#x275C</code></td><td><code>\275C</code></td></tr>
<tr>
<td>Heavy Single Turned Comma Quotation Mark Ornament</td><td><code>❛</code></td><td><code>U+275B</code></td><td><code>&amp;#x275B</code></td><td><code>\275B</code></td></tr>
<tr>
<td>Heavy Double Turned Comma Quotation Mark Ornament</td><td><code>❝</code></td><td><code>U+275D</code></td><td><code>&amp;#x275D</code></td><td><code>\275D</code></td></tr>
<tr>
<td>Heavy Double Comma Quotation Mark Ornament</td><td><code>❞</code></td><td><code>U+275E</code></td><td><code>&amp;#x275E</code></td><td><code>\275E</code></td></tr>
<tr>
<td>Right Pointing Double Angle Quotation Mark</td><td><code>»</code></td><td><code>U+00BB</code></td><td><code>&amp;#x00BB</code></td><td><code>\00BB</code></td></tr>
<tr>
<td>Left Pointing Double Angle Quotation Mark</td><td><code>«</code></td><td><code>U+00AB</code></td><td><code>&amp;#x00AB</code></td><td><code>\00AB</code></td></tr>
<tr>
<td>Full Width Apostrophe</td><td><code>＇</code></td><td><code>U+FF07</code></td><td><code>&amp;#xFF07</code></td><td><code>\FF07</code></td></tr>
</tbody>
</table>
</div><p>Note: if you have a Mac, you may not be able to see the "Double low revesed quotation mark" and the "Heavy low single comma quotation mark". Here's what they're supposed to look like:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/05/Screenshot-2023-05-10-at-7.20.26-AM.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/05/Screenshot-2023-05-10-at-7.20.35-AM.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>I hope this article helps you learn about the smart quotes out there, and how to use them in your HTML and CSS files, and other writings.</p>
<p>Try to share the article with your friends and family so they can have access to the smart quotes.</p>
<p>Thank you.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Build a Custom Ghost CMS Theme ]]>
                </title>
                <description>
                    <![CDATA[ Ghost CMS is a platform specifically designed for bloggers and writers. Using Ghost, you can quickly get a blog website up and running.  Ghost targets primarily writers and all the features are specifically built for writing.  Ghost's new dashboard g... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-build-a-ghost-cms-theme/</link>
                <guid isPermaLink="false">66d038a8d6e6a35e9f8e6978</guid>
                
                    <category>
                        <![CDATA[ blog ]]>
                    </category>
                
                    <category>
                        <![CDATA[ cms ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Ghost ]]>
                    </category>
                
                    <category>
                        <![CDATA[ projects ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rajdeep Singh ]]>
                </dc:creator>
                <pubDate>Wed, 04 Jan 2023 15:20:24 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/08/ghost-theme-development-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Ghost CMS is a platform specifically designed for bloggers and writers. Using Ghost, you can quickly get a blog website up and running. </p>
<p>Ghost targets primarily writers and all the features are specifically built for writing. </p>
<p>Ghost's new dashboard gives you a user-friendly interface, and beginners can easily understand the functionality. In addition, Ghost's free tutorials will help you if you have any problems. </p>
<p><strong>Some cool Ghost features:</strong></p>
<ol>
<li>Open-source</li>
<li>Membership support</li>
<li>Rich text editor (Koenig editor)</li>
<li>Newsletters</li>
<li>Email subscriber support</li>
<li>Login functionality support</li>
<li>Integration plugin </li>
<li>Analytics dashboard</li>
<li>Inbuilt comment support</li>
<li>Inbuilt search support</li>
<li>Inbuilt search functionality</li>
<li>SEO and different types of metadata support social media</li>
<li>Custom theme design</li>
</ol>
<p>You can check out all <a target="_blank" href="https://github.com/frontendweb3/fastest">the code available for this project on GitHub here</a>.</p>
<h2 id="heading-heres-what-well-cover">Here's what we'll cover:</h2>
<ol>
<li><a class="post-section-overview" href="#heading-self-hosting-vs-hosting-with-ghost">Self-Hosting vs Hosting with Ghost</a></li>
<li><a class="post-section-overview" href="#heading-what-are-the-drawbacks-of-ghost-cms">What Are the Drawbacks of Ghost?</a></li>
<li><a class="post-section-overview" href="#heading-how-to-install-the-ghost-cms">How to Install the Ghost CMS</a></li>
<li><a class="post-section-overview" href="#heading-understanding-the-ghost-folder-structure">Understanding the Ghost Folder Structure</a></li>
<li><a class="post-section-overview" href="#heading-understanding-the-ghost-theme-folder-structure">Understanding the Ghost Theme Folder Structure</a></li>
<li><a class="post-section-overview" href="#heading-how-to-create-a-new-theme-with-the-npm-cli-tool">How to Create a New Theme with the npm CLI Tool</a></li>
<li><a class="post-section-overview" href="#heading-how-to-create-a-new-ghost-theme-from-scratch">How to Create a New Ghost Theme from Scratch</a></li>
<li><a class="post-section-overview" href="##how-to-install-ghost-cli-globally">How to Install ghost-cli Globally</a></li>
<li><a class="post-section-overview" href="#heading-how-to-install-ghost-locally">How to install Ghost locally</a></li>
<li><a class="post-section-overview" href="#heading-how-to-configure-tailwind-css">How to Configure Tailwind CSS</a></li>
<li><a class="post-section-overview" href="#heading-other-important-commands-in-the-ghost-cli">Other Important Commands in the Ghost CLI</a></li>
<li><a class="post-section-overview" href="#how-to-write-the-code-for-our-custom-ghost-theme">How to Write the Code for Our Custom Ghost Theme</a></li>
<li><a class="post-section-overview" href="#heading-how-to-add-theme-configuration-in-packagejson">How to add theme configuration in package.json</a></li>
<li><a class="post-section-overview" href="#heading-how-to-use-theme-helpers">How to Use Theme Helpers</a></li>
<li><a class="post-section-overview" href="#heading-what-is-the-partials-folder">What is the Partials Folder?</a></li>
<li><a class="post-section-overview" href="#heading-how-to-create-a-default-page">How to Create a Default Page</a></li>
<li><a class="post-section-overview" href="#heading-how-to-create-an-index-page">How to Create an Index Page</a></li>
<li><a class="post-section-overview" href="#heading-how-to-create-a-posts-page">How to Create a Posts Page</a></li>
<li><a class="post-section-overview" href="#heading-how-to-create-informational-pages">How to Create Information Pages</a></li>
<li><a class="post-section-overview" href="#heading-how-to-create-an-author-page">How to Create an Author Page</a></li>
<li><a class="post-section-overview" href="#heading-how-to-create-a-tags-page">How to Create a Tags Page</a></li>
<li><a class="post-section-overview" href="#heading-how-to-create-an-error-page">How to Create an Error Page</a></li>
<li><a class="post-section-overview" href="#heading-how-to-enable-comments">How to Enable Comments</a></li>
<li><a class="post-section-overview" href="#heading-how-to-set-up-search">How to Set Up Search</a></li>
<li><a class="post-section-overview" href="#heading-conclusion">Conclusion</a></li>
</ol>
<h2 id="heading-self-hosting-vs-hosting-with-ghost">Self-hosting vs Hosting with Ghost</h2>
<p>Ghost provides two ways to create/host your website:</p>
<ol>
<li>Self-hosting</li>
<li>With the Ghost cloud platform</li>
</ol>
<h3 id="heading-self-hosting">Self-hosting</h3>
<p>If you choose to self-host, you'll host your website on any cloud platform like <a target="_blank" href="https://cloud.google.com/">Google cloud</a>, <a target="_blank" href="https://aws.amazon.com/">AWS cloud,</a> <a target="_blank" href="https://azure.microsoft.com/">Azure cloud</a>, <a target="_blank" href="https://www.digitalocean.com/">Digital Ocean</a>, and so on. These are some of the most used cloud platforms in the market. </p>
<p>Most cloud platforms come with one click to deploy solutions. This means you can deploy your Ghost blog with a single click. </p>
<p>Before deploying your Ghost blog, you should compare all cloud platforms based on pricing before choosing one.  </p>
<p>Self-hosting your Ghost blog is free, and you do not need to pay anything to the Ghost platform. You'll just pay your cloud provider. </p>
<h3 id="heading-hosting-with-the-ghost-cloud-platform">Hosting with the Ghost Cloud Platform</h3>
<p>If you choose to host with Ghost, they'll help create the blog and host it on the Ghost platform itself. The Ghost team handles all the maintenance and security. You won't have to worry about updating Ghost and any themes you're using – the Ghost staff will handle that for you.</p>
<p>Self-hosting focuses more on developers, while hosting with the Ghost platform targets anyone who doesn't know about computers and programming.</p>
<p>Ghost hosting comes with a paid plan – it's not free. But they give you 14 day free trial period, after which you shift automatically into a paid plan.</p>
<h3 id="heading-what-should-you-choose-paid-or-self-hosting">What should you choose, paid or self-hosting?</h3>
<p>In my experience, hosting with the Ghost platform is the best solution for beginner developers, non-developers, and writers. The Ghost team handles everything for you. You do not worry about traffic, security, or maintenance and do not need to update the Ghost CMS. This lets you focus on writing. </p>
<p>As a developer, I always recommended that you self-host Ghost. I have run my self-hosted Ghost blog with Google Cloud for two years with a Bitnami one-click deployment.</p>
<p>After six months, I'd used up my $200 free credit, and then I started to pay monthly to Google Cloud hosting.</p>
<p>For a non-technical person, I highly recommended using the Ghost (pro) cloud platform and as well any other platform that provides Ghost-based cloud and shares hosting.</p>
<p>I found a <a target="_blank" href="https://geekflare.com/ghost-hosting-platforms/">list of Ghost-hosting platforms</a> on the internet. Perhaps one of these will solve your hosting issues or questions. If you plan to deploy Ghost with the G<a target="_blank" href="https://officialrajdeepsingh.dev/tags/ghost-cms/">oogle Cloud platform</a>, I have an article on that.</p>
<h2 id="heading-what-are-the-drawbacks-of-ghost-cms">What are the Drawbacks of Ghost CMS?</h2>
<p>The biggest drawback of Ghost is that web performance can feel slow. If you want good web performance, you'll likely need to use a CDN for media (images, videos, and PDFs) and also for CSS and JavaScript.  </p>
<p>The second biggest drawback is cost. I've been running my blog with Ghost for two years, and I pay 10 to 20 times extra to Google Cloud for hosting as a self-deploy. </p>
<p>My website has 4000 to 5000 active monthly users, and I pay 20 times extra. Because of this, I shifted my website to Hugo. </p>
<p>Now I still have 4000 to 5000 active users on the website, and I pay zero money to Netlify.</p>
<h3 id="heading-the-solution-for-developers">The Solution for Developers</h3>
<p>The best solution for developers is to use Ghost as a backend and, with the REST API, choose any JavaScript framework like Next.js, Fresh, Astro, and so on. </p>
<p>There are a lot of frameworks that can help you build a static website. In addition, static websites are fast and deploy with zero JavaScript.</p>
<p>In this method, you may not use all Ghost's features, but you can save a lot of money. Still, building the website with a JavaScript framework takes a lot of time just to run the essential version of the website. </p>
<p>My solution only works well for a small team. So if your team has a lot of writers and submits many articles in a single day, I'd recommend sticking with Ghost CMS as a frontend and backend.</p>
<p>Ghost version 5.0 is 20% faster than the old version. Suppose you use Ghost and want to design your own custom theme – then this article is for you. Let's get started.</p>
<h2 id="heading-how-to-install-the-ghost-cms">How to Install the Ghost CMS</h2>
<p>How you install Ghost CMS changes according to your operating system. We'll discuss installation for all operating systems in this guide. You can install Ghost with npm, yarn, and Docker.</p>
<p>Now let's look at how to install Ghost for:</p>
<ol>
<li>Windows, Linux, and macOS</li>
<li>Docker image</li>
</ol>
<h2 id="heading-how-to-install-ghost-on-windows-linux-and-macos">How to Install Ghost on Windows, Linux, and macOS</h2>
<p>Setting up the Ghost theme development environment in Windows and macOS is a straightforward process. But it's best if you've installed the npm or yarn package manager. If you don't have Node.js, npm, and yarn, yolu'll need to install them – Node.js comes with preinstalled npm and yarn. </p>
<p>To install Ghost CMS globally and locally, follow these basic steps:</p>
<h3 id="heading-how-to-install-ghost-cli-globally">How to install ghost-CLI globally</h3>
<p>First, you can install <code>ghost-cli</code> globally on your machine using npm or yarn. Here are the commands:</p>
<pre><code class="lang-bash">npm install ghost-cli@latest -g
    OR
yarn global add ghost-cli@latest
</code></pre>
<h3 id="heading-how-to-install-ghost-locally">How to install Ghost locally</h3>
<p>Next, when your ghost-CLI installation is complete, then run the <code>ghost local</code> command in your terminal. It looks like this:</p>
<pre><code class="lang-bash">ghost install <span class="hljs-built_in">local</span>
</code></pre>
<p>The command output looks like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/09/carbon--1-.png" alt="Ghost cms folder structure" width="600" height="400" loading="lazy">
<em>Ghost cms folder structure</em></p>
<p><strong>Note</strong>: you'll need to run the <code>ghost install local</code> command in an empty folder. Otherwise, you'll face an error:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/09/ghost-not-empty-error.png" alt="Not empty directory error with ghost-cli" width="600" height="400" loading="lazy">
<em>Not empty directory error with ghost-cli</em></p>
<p>To start the local development server, run the <code>ghost start</code> command in your terminal.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/09/ghost-start-command.png" alt="Ghost start command " width="600" height="400" loading="lazy">
<em>Ghost start command</em></p>
<p>If you get an error when running <code>ghost start</code> in Ubuntu, run the following command: <code>ghost start --no-setup-linux-user</code>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/09/not-readable-by-other-user.png" alt="The directory is not readable by other users' errors in ghost cms." width="600" height="400" loading="lazy">
<em>The directory is not readable by other users' error in Ghost CMS.</em></p>
<h2 id="heading-how-to-set-up-your-environment-using-a-docker-image">How to Set Up Your Environment Using a Docker Image</h2>
<p>Docker is also a great way to set up a theme development or production environment for Ghost. The Ghost team provides an official <a target="_blank" href="https://hub.docker.com/_/ghost">Ghost Docker image</a> on Docker Hub. </p>
<p>To start the setup, you'll need the <code>docker-compose.yml</code> file in your root project folder. Then run the <code>docker-compose up</code> command in your terminal. </p>
<pre><code>version: <span class="hljs-string">'3.8'</span>
<span class="hljs-attr">services</span>:
  blog:
    image: ghost
    <span class="hljs-attr">restart</span>: always
    <span class="hljs-attr">ports</span>:
      - <span class="hljs-number">8080</span>:<span class="hljs-number">2368</span>
    <span class="hljs-attr">volumes</span>:
      - ./custom-ghost-theme:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/custom-ghost-theme/
    environment:
      url: http:<span class="hljs-comment">//localhost:808</span>
      NODE_ENV: development
</code></pre><p>In the volume section, you pass your file. In my case, I added a specific file in my Ghost theme folder.</p>
<pre><code>version: <span class="hljs-string">'3.8'</span>
<span class="hljs-attr">services</span>:
  blog:
    image: ghost
    <span class="hljs-attr">restart</span>: always
    <span class="hljs-attr">ports</span>:
      - <span class="hljs-number">8080</span>:<span class="hljs-number">2368</span>
    <span class="hljs-attr">volumes</span>:
      - ./assets:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/assets
      - ./partials:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/partials
      - ./author.hbs:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/author.hbs
      - ./<span class="hljs-keyword">default</span>.hbs:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/<span class="hljs-keyword">default</span>.hbs
      - ./error<span class="hljs-number">-404.</span>hbs:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/error<span class="hljs-number">-404.</span>hbs
      - ./error.hbs:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/error.hbs
      - ./gulpfile.js:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/gulpfile.js
      - ./index.hbs:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/index.hbs
      - ./package-lock.json:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/package-lock.json
      - ./package.json:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/package.json
      - ./page.hbs:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/page.hbs
      - ./post.hbs:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/post.hbs
      - ./query.hbs:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/query.hbs
      - ./tag.hbs:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/tag.hbs
      - ./readme.md:<span class="hljs-regexp">/var/</span>lib/ghost/content/themes/fastest/readme.md
    <span class="hljs-attr">environment</span>:
      url: http:<span class="hljs-comment">//localhost:8080</span>
      NODE_ENV: development
</code></pre><p>In your custom-ghost-theme folder, you need the <code>index.hbs</code>, <code>post.hbs</code>, and <code>package.json</code> files to start theme development. But, you'll get an error when you activate your theme in the Ghost dashboard without requiring a file.</p>
<p><strong>Here's the GitHub repo if you want to follow along:</strong></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://github.com/officialrajdeepsingh/ghostthemewithdocker">https://github.com/officialrajdeepsingh/ghostthemewithdocker</a></div>
<h4 id="heading-errors">Errors</h4>
<p>In Ubuntu (22.04) or any other Linux distros, you'll get the <code>Message: The directory /home/rajdeepsingh/ is not readable by other users on the system</code> error. This means yours is old. So update your <code>ghost-cli</code> then run the <code>ghost start</code> command in your folder.</p>
<h2 id="heading-understanding-the-ghost-folder-structure">Understanding the Ghost Folder Structure</h2>
<p>The Ghost folder structure has three main folders and one file. They are:</p>
<ol>
<li>The <code>config.development.json</code> file contains the configuration for Ghost development.</li>
<li>The <code>current</code> folder is a link (symbolic link) that targets the install version.</li>
<li>The <code>version</code> folder contains all versions of Ghost cms.</li>
<li>The content folder is the main folder containing our database file, settings, theme, images, media, and so on.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/09/ghost-folder-sturture.png" alt="Ghost cms folder Structure" width="600" height="400" loading="lazy">
<em>Ghost CMS folder Structure</em></p>
<p>The folder structure might change according to the operating system but the <code>content</code> folder is the same in every operating system.</p>
<p>The content folder contains all the important files for Ghost.  They are:</p>
<ol>
<li>The data folder contains an SQLite3 database file. Ghost, by default, uses the SQLite3 database.</li>
<li>Files, images, and media folders contain all files which writers upload.</li>
<li>The public folder contains all public CSS and JavaScript files – for example, card and member JavaScript and CSS files.</li>
<li>Finally, the settings folder contains all the settings, for example, the <code>router.xml</code> file.</li>
<li>The theme folder contains all files and folders used to develop the theme.</li>
</ol>
<h2 id="heading-understanding-the-ghost-theme-folder-structure">Understanding the Ghost Theme Folder Structure</h2>
<p>You can build a new custom theme store in the <code>content/theme</code> folder. To develop a new theme, you'll always need to create a new folder with the theme name and store all files in the theme name folder.</p>
<pre><code><span class="hljs-comment">// theme structure</span>

content 
content/theme
content/theme/my-theme-name
content/theme/my-theme-name/index.hbs
content/theme/my-theme-name/post.hbs
content/theme/my-theme-name/package.json

<span class="hljs-comment">// rest of file created in my-theme-name folder</span>
</code></pre><p>Ghost CMS uses <strong>handlebars</strong> to build a Ghost theme. There are a number of files but only three files are required:</p>
<ol>
<li><code>index.hbs</code> in the main file (required) to design the home page of the website.</li>
<li><code>post.hbs</code> the file (required)  is used to read and design the full article.</li>
<li><code>package.json</code> file (required)  is used for Node.js config, and it also uses the theme name, description, version, custom config, and so on.</li>
<li>The <code>default.hbs</code> file is used to build the layout of the theme.</li>
<li>The assets folder contains all the JavaScript, CSS, fonts, and image files.</li>
<li>The partials folder helps divide files into small partials (parts) for better code readability.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/09/theme-struture.png" alt="Ghost theme folder structure" width="600" height="400" loading="lazy">
<em>Ghost theme folder structure</em></p>
<h2 id="heading-how-to-create-a-new-theme-with-the-npm-cli-tool">How to Create a New Theme with the npm CLI Tool</h2>
<p>The easiest way to start a new Ghost theme is with the <a target="_blank" href="https://www.npmjs.com/package/create-ghost-theme">create-ghost-theme CLI</a>. I built it, and I maintain it. The create-ghost-theme CLI helps you create the following folder structure that we'll discuss next. But currently, it only supports <strong>Tailwind CSS</strong>. </p>
<p>First, we'll create a new theme with the create-ghost-theme CLI and restart the Ghost CMS local server again.</p>
<h3 id="heading-folder-structure">Folder structure</h3>
<p>After creating a new theme with <a target="_blank" href="https://www.npmjs.com/package/create-ghost-theme">create-ghost-theme CLI</a>, your folder structure looks like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/09/ghost-theme-cli.png" alt="create-ghost-theme cli folder structure" width="600" height="400" loading="lazy">
<em>create-ghost-theme cli folder structure</em></p>
<h3 id="heading-understanding-the-new-website-layout">Understanding the New Website Layout</h3>
<p>After creating the theme with create-ghost-theme CLI, your theme looks like this. </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/09/default-hbs.png" alt="Image" width="600" height="400" loading="lazy">
<em>index.hbs</em></p>
<p>Your website reading page will look like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/09/index-hbs.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Your new tag page looks like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/09/tag-hbs.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-how-to-create-a-new-ghost-theme-from-scratch">How to Create a New Ghost Theme from Scratch</h2>
<p>When you're learning about Ghost theme development, my recommendation is to start creating a new theme from scratch. Then you can use the CLI tool I just showed you. This will be a lot easier for you.</p>
<p>So now, that's what we're going to cover in-depth: how to create a new Ghost CMS theme from scratch. </p>
<h3 id="heading-requirements">Requirements:</h3>
<p>To create a new theme, you'll need two libraries: the first is <code>ghost-cli</code> and the second is Tailwind CSS. </p>
<p>Here's what we'll go over in the coming sections:</p>
<ol>
<li>How to install <code>Ghost-cli</code> globally</li>
<li>How to configure Tailwind CSS</li>
<li>How to understand more commands in the Ghost CLI</li>
<li>Finally, we'll write the code</li>
</ol>
<h3 id="heading-how-to-install-ghost-cli-globally-1">How to Install ghost-cli Globally</h3>
<p>We went over how to do this above, but in case you need a reminder here it is:</p>
<p>First, you can install <code>ghost-cli</code> globally on your machine using npm or yarn. Here are the commands:</p>
<pre><code class="lang-bash">npm install ghost-cli@latest -g
    OR
yarn global add ghost-cli@latest
</code></pre>
<h3 id="heading-how-to-configure-tailwind-css">How to Configure Tailwind CSS</h3>
<p>Tailwind CSS is a powerful CSS library for designing the front end of a website. And you can easily use it with Ghost.</p>
<p>Install Tailwind CSS in your theme folder like this:</p>
<pre><code class="lang-bash">npm install -D tailwindcss postcss autoprefixer
</code></pre>
<p>After Tailwind and another package have been successfully installed, then run the following command to configure Tailwind for your theme development:</p>
<pre><code class="lang-bash">npx tailwindcss init
</code></pre>
<p>The <code>tailwindcss init</code> command creates a <code>tailwind.config.js</code> file. Here's what you'll see:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">/** <span class="hljs-doctag">@type <span class="hljs-type">{import('tailwindcss').Config}</span> </span>*/</span>
<span class="hljs-built_in">module</span>.exports = {
<span class="hljs-attr">content</span>: [],
  <span class="hljs-attr">theme</span>: {
    <span class="hljs-attr">extend</span>: {},
  },
  <span class="hljs-attr">plugins</span>: [],
}
</code></pre>
<p>Config your template path in the content section, so Tailwind CSS tracks the CSS classes. Then compile those classes in the production file.</p>
<pre><code class="lang-javascript"><span class="hljs-comment">/** <span class="hljs-doctag">@type <span class="hljs-type">{import('tailwindcss').Config}</span> </span>*/</span>
<span class="hljs-built_in">module</span>.exports = {
  <span class="hljs-attr">content</span>: [<span class="hljs-string">"*.hbs"</span>,<span class="hljs-string">"partials/*.hbs"</span>],
  <span class="hljs-attr">darkMode</span>: <span class="hljs-string">'class'</span>,
  <span class="hljs-attr">theme</span>: {
    <span class="hljs-attr">extend</span>: {},
  },
  <span class="hljs-attr">plugins</span>: [],
}
</code></pre>
<p>Create a <code>main.css</code> or <code>dev.css</code> and use any other file name to create the file for Tailwind directives. Then paste the following tailwind CSS directives code into the file:</p>
<pre><code class="lang-css"><span class="hljs-keyword">@tailwind</span> base;
<span class="hljs-keyword">@tailwind</span> components;
<span class="hljs-keyword">@tailwind</span> utilities;
</code></pre>
<p>Create the script for Tailwind CSS to check all the classes then create a production-ready CSS file for your theme. </p>
<pre><code class="lang-json">    <span class="hljs-string">"scripts"</span>: {
        <span class="hljs-attr">"start"</span>: <span class="hljs-string">"npx tailwindcss -i ./assets/css/dev.css -o ./assets/build/css/build.css --watch"</span>
    },
</code></pre>
<p>The last step is to link the production-ready CSS file to your theme like this:</p>
<pre><code class="lang-handlebars">&lt;head&gt;
    {{!-- link production ready css file  --}}
    &lt;link rel="stylesheet" href="{{asset 'build/css/build.css'}}" /&gt;
&lt;/head&gt;
</code></pre>
<p>The one problem you might face when you enable Tailwind CSS in a Ghost theme is that refreshing your site in the development process is manual. When you change anything related to Tailwind classes, you'll need manually refresh your website again. I haven't found a solution yet, but you can use the live server for that for now.</p>
<h3 id="heading-other-important-commands-in-the-ghost-cli">Other Important Commands in the Ghost CLI</h3>
<p>There are a number of other commands you'll use often when working in the Ghost CLI. Let's go through them now. Here's what we'll discuss:</p>
<ol>
<li>ghost stop</li>
<li>ghost ls</li>
<li>ghost doctor</li>
<li>ghost uninstall</li>
<li>ghost version</li>
<li>ghost restart</li>
<li>ghost update</li>
<li>ghost version</li>
<li>ghost --help</li>
</ol>
<h4 id="heading-how-to-use-the-ghost-stop-command">How to use the ghost stop command</h4>
<p>The <code>ghost stop</code> command stops the currently running instance.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/ghost-stop.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h4 id="heading-how-to-use-the-ghost-ls-command">How to use the ghost ls command</h4>
<p>The <code>ghost ls</code> command prints the current installs instance list in your machine.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/ghost-ls.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h4 id="heading-how-to-use-the-ghost-doctor-command">How to use the ghost doctor command</h4>
<p>The <code>ghost doctor</code> command checks the system's health to see if everything is fine before running the <code>ghost install</code> or <code>ghost update</code> command. </p>
<p>If you face any errors in Ghost, you can also use the ghost doctor command to check the errors.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/ghost-doctor.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h4 id="heading-how-to-use-the-ghost-uninstall-command">How to use the ghost uninstall command</h4>
<p>The <code>ghost uninstall</code> command removes the Ghost instance and related configuration files as well.</p>
<h4 id="heading-how-to-check-the-ghost-version">How to check the Ghost version</h4>
<p>You can use the <code>ghost version</code> command to check your currently installed version of Ghost.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/ghost-version.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h4 id="heading-how-to-use-the-ghost-restart-command">How to use the ghost restart command</h4>
<p>The <code>ghost restart</code> command restarts your currently running Ghost instance.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/ghost-restart.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h4 id="heading-how-to-use-the-ghost-update-command">How to use the ghost update command</h4>
<p>The ghost update command updates your old Ghost version to the new version.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/ghost-update.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h4 id="heading-how-to-use-the-ghost-help-command">How to use the ghost --help command</h4>
<p>The <code>ghost --help</code> command prints a help page:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/ghost---help.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-finally-well-write-the-code">Finally, we'll write the code</h3>
<p>Now we get to start writing the code. Here's what we'll cover in the coming sections:</p>
<ol>
<li>How to add theme configuration in <code>package.json</code> [required]</li>
<li>How to use theme helpers</li>
<li>What is the partials folder?</li>
<li>How to create a default page</li>
<li>How to create an index page [required]</li>
<li>How to create a posts page [required]</li>
<li>How to create informational page</li>
<li>How to create a tags page</li>
<li>How to set up comments</li>
<li>How to enable search</li>
</ol>
<h3 id="heading-how-to-add-theme-configuration-in-packagejson">How to add theme configuration in package.json</h3>
<p>The <code>package.json</code> file is the main file where you add or change the theme name, description, and custom configuration for the theme. </p>
<p>The <strong>first step</strong> is to create <code>package.json</code> file and add the theme name, description, version, and additional configuration. </p>
<p>The following properties are used by Ghost themes: <code>name</code>, <code>description</code>, <code>version</code>, <code>engines</code>, <code>card_assets</code>, <code>license</code>, <code>author</code>, <code>keywords</code>, <code>screenshots</code>, and <code>config</code> in the <code>package.json</code> file. </p>
<p>The most important properties are <code>name</code>, <code>description</code>, <code>version</code>,  <code>engines</code>, <code>card_assets</code>, and <code>config</code>. Here's what this looks like in the code:</p>
<pre><code class="lang-json">{
    <span class="hljs-attr">"name"</span>: <span class="hljs-string">"fastest"</span>,
    <span class="hljs-attr">"description"</span>: <span class="hljs-string">"Fastest ghost cms base theme. Fastest is light weight, modern open-source theme"</span>,
    <span class="hljs-attr">"version"</span>: <span class="hljs-string">"1.0.7"</span>,
    <span class="hljs-attr">"engines"</span>: {
        <span class="hljs-attr">"ghost"</span>: <span class="hljs-string">"&gt;=5.0.0"</span>
    },
    <span class="hljs-attr">"license"</span>: <span class="hljs-string">"MIT"</span>,
    <span class="hljs-attr">"scripts"</span>: {
        <span class="hljs-attr">"dev"</span>: <span class="hljs-string">"gulp"</span>,
        <span class="hljs-attr">"start"</span>: <span class="hljs-string">"npx tailwindcss -i ./assets/css/dev.css -o ./assets/build/css/build.css --watch"</span>
    },
    <span class="hljs-attr">"author"</span>: {
        <span class="hljs-attr">"name"</span>: <span class="hljs-string">"Rajdeep Singh"</span>,
        <span class="hljs-attr">"email"</span>: <span class="hljs-string">"officialrajdeepsingh@gmail.com"</span>,
        <span class="hljs-attr">"url"</span>: <span class="hljs-string">"https://officialrajdeepsingh.dev"</span>
    },
    <span class="hljs-attr">"keywords"</span>: [
        <span class="hljs-string">"ghost"</span>,
        <span class="hljs-string">"theme"</span>,
        <span class="hljs-string">"blog"</span>,
        <span class="hljs-string">"light weight"</span>,
        <span class="hljs-string">"ghost-theme"</span>
    ],
    <span class="hljs-attr">"screenshots"</span>: {
        <span class="hljs-attr">"desktop"</span>: [
            <span class="hljs-string">"assets/dark.png"</span>,
            <span class="hljs-string">"assets/light.png"</span>
        ],
        <span class="hljs-attr">"mobile"</span>: <span class="hljs-string">"assets/mobile.png"</span>
    },
    <span class="hljs-attr">"config"</span>: {
        <span class="hljs-attr">"posts_per_page"</span>: <span class="hljs-number">10</span>,
        <span class="hljs-attr">"card_assets"</span>: <span class="hljs-literal">true</span>,
        <span class="hljs-attr">"image_sizes"</span>: {},
        <span class="hljs-attr">"custom"</span>: {
            <span class="hljs-attr">"linkedin_url"</span>: {
                <span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>,
                <span class="hljs-attr">"default"</span>: <span class="hljs-string">"None"</span>
            },
            <span class="hljs-attr">"github_url"</span>: {
                <span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>,
                <span class="hljs-attr">"default"</span>: <span class="hljs-string">"None"</span>
            },
            <span class="hljs-attr">"instagram_url"</span>: {
                <span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>,
                <span class="hljs-attr">"default"</span>: <span class="hljs-string">"None"</span>
            },
            <span class="hljs-attr">"copyright"</span>: {
                <span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>,
                <span class="hljs-attr">"default"</span>: <span class="hljs-string">"Copy right by Rajdeep Singh"</span>
            },
            <span class="hljs-attr">"copyright_url"</span>: {
                <span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>,
                <span class="hljs-attr">"default"</span>: <span class="hljs-string">"https://officialrajdeepsingh.dev/pages/terms-and-conditions/"</span>
            },
            <span class="hljs-attr">"adsense_enable"</span>: {
                <span class="hljs-attr">"type"</span>: <span class="hljs-string">"select"</span>,
                <span class="hljs-attr">"options"</span>: [
                    <span class="hljs-string">"Disable"</span>,
                    <span class="hljs-string">"Enable"</span>
                ],
                <span class="hljs-attr">"default"</span>: <span class="hljs-string">"Disable"</span>
            }
        }
        },
    <span class="hljs-attr">"devDependencies"</span>: {
        <span class="hljs-attr">"@tailwindcss/typography"</span>: <span class="hljs-string">"^0.5.8"</span>,
        <span class="hljs-attr">"autoprefixer"</span>: <span class="hljs-string">"^10.4.13"</span>,
        <span class="hljs-attr">"cssnano"</span>: <span class="hljs-string">"^5.0.17"</span>,
        <span class="hljs-attr">"gscan"</span>: <span class="hljs-string">"^4.22.0"</span>,
        <span class="hljs-attr">"gulp"</span>: <span class="hljs-string">"4.0.2"</span>,
        <span class="hljs-attr">"gulp-autoprefixer"</span>: <span class="hljs-string">"^8.0.0"</span>,
        <span class="hljs-attr">"gulp-concat"</span>: <span class="hljs-string">"^2.6.1"</span>,
        <span class="hljs-attr">"gulp-cssnano"</span>: <span class="hljs-string">"^2.1.3"</span>,
        <span class="hljs-attr">"gulp-livereload"</span>: <span class="hljs-string">"4.0.2"</span>,
        <span class="hljs-attr">"gulp-sourcemaps"</span>: <span class="hljs-string">"^3.0.0"</span>,
        <span class="hljs-attr">"gulp-uglify"</span>: <span class="hljs-string">"^3.0.2"</span>,
        <span class="hljs-attr">"postcss"</span>: <span class="hljs-string">"^8.4.20"</span>,
        <span class="hljs-attr">"tailwindcss"</span>: <span class="hljs-string">"^3.2.4"</span>
    }
}
</code></pre>
<p>You can learn more about <a target="_blank" href="https://ghost.org/docs/themes/content/">card_assets</a> and <a target="_blank" href="https://ghost.org/docs/themes/structure/#packagejson">config</a> for the theme. The config section helps add configuration for Ghost. You can also add more <a target="_blank" href="https://ghost.org/docs/themes/custom-settings/">custom configuration</a> for Ghost and enable and disable it with the Ghost UI. </p>
<p>To check all configurations, go to Ghost &gt; Settings &gt; Design &gt; and click Site-wide. There you can check all configuration lists provided by the theme developer.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/customconfig.png" alt="custom config enable and disable in ghost cms" width="600" height="400" loading="lazy">
<em>custom config enable and disable in ghost cms</em></p>
<h3 id="heading-how-to-use-theme-helpers">How to Use Theme Helpers</h3>
<p>The Ghost team provide lots of helpful functions to add additional functionality to the Ghost theme with <a target="_blank" href="https://handlebarsjs.com/">handlebars</a>. Some of the functionality by default comes with handlebars and other functionality is built by the Ghost team and maintained by the community.  </p>
<p>The Ghost team uses handlebars to build the entire Ghost CMS and theme. Basically, handlebars.js is a template language that helps you build both static and dynamic websites. </p>
<p>There are lots of Ghost helpers like <a target="_blank" href="https://ghost.org/docs/themes/helpers/foreach/">foreach</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/get/">get</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/if/">if</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/is/">is</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/match/">match</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/config/">@config</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/comments/">comments</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/navigation/">navigation</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/post/">post</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/total_members/">total_members</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/total_paid_members/">total_paid_members</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/block/">block</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/asset/">asset</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/ghost_head_foot/">ghost_head</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/ghost_head_foot/">ghost_foot</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/pagination/">pagination</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/partials/">partials</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/body_class/">body_class</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/block/">block</a>, <a target="_blank" href="https://ghost.org/docs/themes/helpers/search/">search</a> and many more. </p>
<p>You can read about all of the <a target="_blank" href="https://ghost.org/docs/themes/helpers/">helpers on the official docs</a>. You can also copy-paste some of the code so you do not need to remember. </p>
<h3 id="heading-what-is-the-partials-folder">What is the Partials Folder?</h3>
<p>The partials folder is like a component folder where you define all components for your theme. Basically, components are reusable code that you can reuse as often as you need. In the theme structure, we call these partials. All the partials are created with handlebars.js.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/partials.png" alt="partials for ghost theme" width="600" height="400" loading="lazy">
<em>partials for ghost theme</em></p>
<p>I create more than 24 partials for my Ghost theme and you can easily reuse them across websites. You can use partials with the following syntax: <code>{{&gt; your-partials-file-name}}</code>.</p>
<h3 id="heading-how-to-create-a-default-page">How to Create a Default Page</h3>
<p>First, we need to built a <code>default.hbs</code> file. The <code>default.hbs</code> file helps us build a layout for the website. Here's the code:</p>
<pre><code class="lang-handlebars">&lt;!DOCTYPE html&gt;

&lt;html class="dark scroll-smooth overflow-x-hidden" lang="{{@site.locale}}"&gt;

&lt;head&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;

    {{!-- link production ready css file  --}}
    &lt;link rel="stylesheet" href="{{asset 'build/css/build.css'}}" /&gt;
   {{!-- ghost header --}}
      {{ghost_head}}

&lt;/head&gt;


&lt;body class="{{body_class}} bg-white dark:bg-slate-800 dark:text-white antialiased scroll-smooth "&gt;

  {{!-- partials/header --}}
    {{&gt; header}}

    &lt;main class="mt-6 flex flex-col"&gt;

{{!-- Render other pages  --}}
        {{{body}}}

    &lt;/main&gt;
{{!-- partials/footer --}}
    {{&gt; footer}}
    {{&gt; banner}}

{{!-- ghost header --}}
    {{ghost_foot}}

    &lt;script src="{{asset 'build/js/main.js'}}"&gt;&lt;/script&gt;

&lt;/body&gt;

&lt;/html&gt;
</code></pre>
<p>Let's see what's going on here:</p>
<ol>
<li><code>{{meta_title}}</code> provides the title from the website.</li>
<li>The <code>@site</code> is a global variable and you can access a title with <code>{{@site.title}}</code>. </li>
<li>Include a Ghost <code>{{ghost_head}}</code> in the head tag.</li>
<li>Include a Ghost <code>{{ghost_foot}}</code> in the footer tag.</li>
<li>Inserted all other templates with the <code>{{{body}}}</code> tag in index.hbs, post.hbs, and so on.</li>
<li>All other templates get inserted in index.hbs, post.hbs, and so on.</li>
<li>Include dynamic CSS classes with <code>{{body_class}}</code> in the <code>&lt;body&gt;</code> tag</li>
<li>Add footer partials in the default <code>{{&gt; footer}}</code> file</li>
<li>Add header partials in default <code>{{&gt; header}}</code> file</li>
<li>Include assets from the <code>{{asset "build/tailwind.css"}}</code> folder.</li>
</ol>
<h3 id="heading-how-to-create-an-index-page">How to Create an Index Page</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/index.png" alt="Create index.hbs in the ghost theme" width="600" height="400" loading="lazy">
<em>Create <code>index.hbs</code> in the Ghost theme</em></p>
<p>The index page is the main page of the website. You can create a similar index page with the following code:</p>
<pre><code class="lang-handlebars">{{!--  Add default.hbs layout file --}}
{{!&lt; default}} 

{{!-- loop all the posts and show on home page --}}

{{#foreach posts}} 

{{!--  check condition defined in config section in package.json and add adsense code after every third post --}}
    {{#has number="nth:3" }} 
        {{#match @custom.adsense_enable "Enable" }} 
            {{&gt; ads}}
        {{/match}}
    {{/has}}

    {{!-- partials/postCard.hbs --}}
    {{&gt; postCard }}

    {{/foreach}}

    {{!-- Add pagination --}}
    {{pagination}}

{{!--  check condition defined in config section in package.json and add adsense --}}
    {{#match @custom.adsense_enable "Enable"}}
        {{&gt; ads}}
    {{/match}}

{{!-- newsletter partials --}}
    {{&gt; newsletter}}
</code></pre>
<p>You can access all posts with a for each loop and pass them to the partials with the <code>{{&gt; postCard}}</code> template. The <code>@custom.adsense_enable</code> is a custom config written in the <code>package.json</code> file and used in the theme to check that the website owner has enabled AdSense on-site or not. The custom config enables you to go to Ghost &gt; Settings &gt; Design &gt; and to click on Site-wide and enable Adsense.</p>
<h3 id="heading-how-to-create-a-posts-page">How to Create a Posts Page</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/post.png" alt="Create post.hbs in the ghost theme" width="600" height="400" loading="lazy">
<em>Create <code>post.hbs</code> in the Ghost theme</em></p>
<p>The posts page is where readers will read your articles on your site. You can create a posts page with the following code.</p>
<pre><code class="lang-handlebars">{{!&lt; default}}

{{#post}}


{{!-- Pass reading_time time to authors partials with block , learn more about about block https://ghost.org/docs/themes/helpers/block/ --}}
{{#contentFor "fastestReadingTime"}}

 &lt;p class="text-slate-600 dark:text-slate-400 text-xs xs:text-xs sm:text-xs md:text-sm lg:text-sm xl:text-sm 2xl:text-sm "&gt;
    {{reading_time}}
 &lt;/p&gt;

{{/contentFor}}

{{#match @custom.adsense_enable "Enable"}}

    {{&gt; ads}}

{{/match}}

&lt;article class="{{post_class}} w-6/6 p-2"&gt;

    &lt;!-- Heading section --&gt;

    &lt;div class="m-auto mb-4 w-6/6 xs:w-5/6 sm:w-5/6 md:w-5/6 lg:w-5/6 xl:w-5/6 2xl:w-5/6"&gt;
        &lt;h1 class="mt-8 text-3xl xs:text-4xl sm:text-5xl md:text-5xl xl:text-5xl 2xl:text-5xl"&gt;
             {{title}} 
        &lt;/h1&gt;
        &lt;p class="text-slate-600 dark:text-slate-500 mt-2 text-1xl"&gt;
            {{excerpt}}
        &lt;/p&gt;
    &lt;/div&gt;

    &lt;!--  Author card partials/authors --&gt;
    {{&gt; authors}}



    &lt;!-- article thumbnail with partials/authors --&gt;
    {{&gt; featureImage}}


    &lt;!-- article body --&gt;
    &lt;div class="prose-lg prose-neutral m-auto p-2 my-10 w-10/12"&gt;
        {{content}}
    &lt;/div&gt;




&lt;/article&gt;


    {{!-- partials/comment --}}
    {{&gt; comment}}


{{!-- Add adsense  --}}
{{#match @custom.adsense_enable "Enable"}}

    {{&gt; ads}}

{{/match}}

{{!-- Show related posts --}}
{{#get "posts" filter="authors:{{primary_author.slug}}+id:-{{id}}" limit="3" include="authors"}}

{{!-- if post is available then show it --}}
{{#if posts}}

&lt;h2 class="mt-10 m-auto text-left w-5/6 text-xl xs:text-1xl sm:text-3xl md:text-4xl xl:text-5xl 2xl:text-6xl"&gt;
    Read more
&lt;/h2&gt;

{{!-- loop all post --}}
{{#foreach posts}}
    {{&gt; postCard }}
{{/foreach}}

{{/if}}

{{/get}}

{{!-- Add adsense  --}}
{{#match @custom.adsense_enable "Enable"}}

    {{&gt; ads}}

{{/match}}

{{/post}}

{{!-- newsletter partials --}}
{{&gt; newsletter}}
</code></pre>
<p>The fastestReadingTime block is to pass the reading time to the author partials. The <code>@custom.adsense_enable</code> is a custom config written in the <code>package.json</code> file and used in the theme to check that the website owner has enabled AdSense on-site or not. The custom config enables you to go to Ghost &gt; Settings &gt; Design &gt; and to click to Site-wide and enable Adsense.</p>
<h3 id="heading-how-to-create-informational-pages">How to Create Informational Pages</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/page.png" alt="Create page.hbs in the ghost theme" width="600" height="400" loading="lazy">
<em>Create <code>page.hbs</code> in the ghost theme</em></p>
<p>The <code>page.hbs</code> file helps you create informational pages for your website. For example, you can create an about, contact, privacy policy, or disclaimer page on your site. </p>
<pre><code class="lang-handlebars">{{!&lt; default}} 

{{#post}} 

    {{!--Pass reading_time time to authors partials with block , learn more about about block https://ghost.org/docs/themes/helpers/block/     --}}
    {{#contentFor "fastestReadingTime"}}

    &lt;p class="text-grey-600 text-xs xs:text-xs sm:text-xs md:text-sm lg:text-sm xl:text-sm 2xl:text-sm "&gt;
        {{reading_time}}
    &lt;/p&gt;
    {{/contentFor}}

{{!-- Add adsense base of if enable on theme  --}}
    {{#match @custom.adsense_enable "Disable"}}

        {{&gt; ads}}

    {{/match}}

    &lt;article class="{{post_class}}  w-6/6 p-2"&gt;

        &lt;!-- Heading section --&gt;
        &lt;div class=" m-auto mb-16 w-6/6 xs:w-5/6 sm:w-5/6 md:w-5/6 lg:w-5/6 xl:w-5/6 2xl:w-5/6"&gt;
            &lt;h1 class="text-gray-800 mt-8 text-3xl xs:text-4xl sm:text-4xl md:text-5xl xl:text-6xl 2xl:text-8xl"&gt;
                {{title}}
            &lt;/h1&gt;
            &lt;p class="text-gray-600 text-xl xs:text-xl sm:text-xl md:text-1xl xl:text-2xl 2xl:text-2xl"&gt;
                {{excerpt}}
            &lt;/p&gt;
        &lt;/div&gt;

        &lt;!--  partials/authors --&gt;
        {{&gt; authors}}


        {{!--  partials/featureImage  --}}
        {{&gt; featureImage}}



        &lt;!-- article body --&gt;
        &lt;div class=" prose-xl prose-neutral m-auto p-2 my-10 w-10/12"&gt;
            {{content}}
        &lt;/div&gt;



    &lt;/article&gt;


    {{!-- Add adsense  --}}
    {{#match @custom.adsense_enable "Disable"}}

        {{&gt; ads}}

    {{/match}}

    {{/post}}
</code></pre>
<p>The fastestReadingTime block is to pass the reading time to the author partials. The <code>@custom.adsense_enable</code> is a custom config written in the <code>package.json</code> file and used in the theme to check that the website owner has enabled AdSense on-site or not. The custom config enables you to go to Ghost &gt; Settings &gt; Design &gt; and to click to Site-wide and enable Adsense.</p>
<h3 id="heading-how-to-create-an-author-page">How to Create an Author Page</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/author.png" alt="Create author.hbs in the ghost theme" width="600" height="400" loading="lazy">
<em>Create <code>author.hbs</code> in the ghost theme</em></p>
<p>Author pages let you describe the author. You can show the author's name, bio, and related articles.</p>
<pre><code class="lang-handlebar">{{!&lt; default}}

{{#author}}

{{!--  Author Section pass with block learn more about about block https://ghost.org/docs/themes/helpers/block/ --}}
   {{#contentFor "authorName"}}
      {{name}}
    {{/contentFor}}

&lt;div class="container mt-20 mb-16 flex flex-col justify-between mx-auto"&gt;

    &lt;div class="flex flex-col mt-6 w-6/6 xs:w-5/6 sm:w-5/6  md:w-3/6 lg:w-3/6 xl:w-3/6 2xl:w-3/6 xs:mt-6 sm:mt-6 md:mt-6 lg:mt-0 xl:mt-0 2xl:mt-0 "&gt;

        &lt;h1 class="text-3xl mt-5 xs:text-3xl sm:text-3xl md:text-4xl xl:text-5xl 2xl:text-6xl"&gt; {{name}} &lt;/h1&gt;

        {{#if bio}}
            &lt;p class="mt-0 xs:mt-0 sm:mt-0 md:mt-1 lg:mt-3 xl:mt-3 2xl:mt-3 text-md"&gt;
                {{bio}}
            &lt;/p&gt;
        {{/if}}

        &lt;ul class="flex flex-row my-3"&gt;

            &lt;li class="text-md"&gt;{{location}}&lt;/li&gt;

               {{#if facebook}}

                    &lt;li class="mx-3 text-sm flex items-center"&gt;
                        &lt;a target="_blank" href="https://facebook.com/{{facebook}}" &gt;

                        {{!-- Pass partials/Icons/facebook --}}
                            {{&gt; Icons/facebook}}

                        &lt;/a&gt;
                    &lt;/li&gt;

                {{/if}}
                {{#if twitter}} 
                    &lt;li class="mx-3 text-sm flex items-center"&gt;
                        &lt;a target="_blank" href="https://twitter.com/{{twitter}}" &gt;

                        {{!-- Pass partials/Icons/twitter --}}
                            {{&gt; Icons/twitter}}

                        &lt;/a&gt;
                    &lt;/li&gt;
                {{/if}}
                {{#if website}} 
                    &lt;li class="mx-3 text-sm flex items-center"&gt;
                        &lt;a target="_blank" href="{{website}}" &gt;

                            {{!-- Pass partials/Icons/website --}}
                            {{&gt; Icons/website}}

                        &lt;/a&gt;
                    &lt;/li&gt;
                {{/if}}
        &lt;/ul&gt;
    &lt;/div&gt;
&lt;/div&gt;


{{!--  get posts related to author base on author Id --}}
    {{#get "posts" limit="all" filter="authors:{{slug}}+id:-{{id}}" order="published_at desc"   }}

        {{#if posts}}
                {{#foreach posts}}
                    {{&gt; authorCard}}
                {{/foreach}}
        {{/if}}

    {{/get}}

{{/author}}
</code></pre>
<h3 id="heading-how-to-create-a-tags-page">How to Create a Tags Page</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/tag.png" alt="Create tag.hbs in the ghost theme " width="600" height="400" loading="lazy">
<em>Create tag.hbs in the ghost theme</em></p>
<p>You can use the <code>tag.hbs</code> file to show articles related to the tag used.</p>
<pre><code>{{!&lt; <span class="hljs-keyword">default</span>}}


{{#tag}}

&lt;div <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"container m-auto mt-32  mb-16  w-5/6 xs:w-5/6 sm:w-5/6 md:w-5/6 lg:w-5/6 xl:w-5/6 2xl:w-5/6"</span>&gt;

    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">class</span>=<span class="hljs-string">" text-gray-800 text-4xl xs:text-5xl sm:text-6xl md:text-7xl xl:text-8xl 2xl:text-9xl"</span>&gt;</span>{{name}}<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span></span>

    {{#<span class="hljs-keyword">if</span> description}}
        &lt;p <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">" text-gray-600 text-xl xs:text-xl sm:text-xl md:text-1xl xl:text-2xl 2xl:text-2xl"</span>&gt;
            {{description}}       
        &lt;/p&gt;
    {{/<span class="hljs-keyword">if</span>}}


&lt;/div&gt;

{{!--  get posts related to tag base on  tag slug --}}

    {{#get <span class="hljs-string">"posts"</span> include=<span class="hljs-string">"authors,tags"</span> limit=<span class="hljs-string">"3"</span> filter=<span class="hljs-string">"tag:{{slug}}"</span> <span class="hljs-keyword">as</span> |related|}}

   {{!-- loop posts base on article --}}
        {{#foreach related}}

    {{!--  check condition define <span class="hljs-keyword">in</span> config section <span class="hljs-keyword">in</span> package.json and add adsense code after every third post --}}
            {{#has number=<span class="hljs-string">"nth:3"</span>  }}
                {{#match @custom.adsense_enable <span class="hljs-string">"Enable"</span>}}
                    {{&gt; ads}}
                {{/match}}
            {{/has}}

        {{!-- partials/postCard.hbs --}}
            {{&gt; postCard }}

        {{/foreach}}

    {{/get}}

{{/tag}}
</code></pre><h3 id="heading-how-to-create-an-error-page">How to Create an Error Page</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/404error-1.png" alt="Create error.hbs in the ghost theme" width="600" height="400" loading="lazy">
<em>Create <code>error.hbs</code> in the ghost theme</em></p>
<p>You use the <code>error.hbs</code> file to show when any errors occur on the website. Error pages help your website not break in production. The most common error is a 404 (not found) error.</p>
<pre><code>{{!&lt; <span class="hljs-keyword">default</span>}} 
&lt;div <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"flex flex-col m-auto p-10 w-5/6 xs:w-5/6 sm:w-5/6 md:w-5/6 lg:w-5/6 xl:w-5/6 2xl:w-5/6"</span>&gt;
    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">h1</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"font-size: 10.8rem;"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-black text-center"</span>&gt;</span>
        {{statusCode}}
    <span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span></span>

    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-4xl -m-6 text-center"</span>&gt;</span>
        {{message}}
    <span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span></span>

    <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"text-center w-32 m-auto my-20 p-3 bg-black text-white items-center rounded-full"</span>&gt;</span>
        Home
    <span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span></span>
&lt;/div&gt;
</code></pre><h3 id="heading-how-to-enable-comments">How to Enable Comments</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/comment-1.png" alt="enable comment in the ghost theme" width="600" height="400" loading="lazy">
<em>enable comments in the ghost theme</em></p>
<p>Ghost 5 officially supports <a target="_blank" href="https://ghost.org/docs/themes/helpers/comments/">the commenting system</a> (it's built-in) and you can just enable comments on the theme by copying and pasting the code – you never need any configuration. Ghost itself handles all the configurations. Here's the code:</p>
<pre><code class="lang-handlebars">&lt;div class="m-auto my-8 w-10/12"&gt;
    &lt;p class="text-right text-xs xs:text-xs sm:text-xs md:text-sm lg:text-sm xl:text-sm 2xl:text-sm "&gt;
        Before comment read our &lt;a style='text-decoration: underline' href="https://officialrajdeepsingh.dev/terms-and-conditions/"&gt;term and condition &lt;/a&gt;
    &lt;/p&gt;
    &lt;div class="mt-5 mb-5 p-4"&gt;

   {{!--  Enable comment on theme --}}
       {{comments}}
    &lt;/div&gt;
&lt;/div&gt;
</code></pre>
<h3 id="heading-how-to-set-up-search">How to Set Up Search</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/serach-bar.png" alt="enable the search bar in the ghost theme" width="600" height="400" loading="lazy">
<em>enable the search bar in the ghost theme</em></p>
<p>Ghost 5 comes with the <a target="_blank" href="https://ghost.org/docs/themes/helpers/search/">official support of search functionality</a>. You do not need any other configuration. Just paste the following code into your theme and the search functionally will start working on your site. </p>
<pre><code class="lang-handlebars">{{!-- partials/Icons/search --}}
&lt;button class="gh-search" data-ghost-search&gt;{{&gt; Icons/search}}&lt;/button&gt;
</code></pre>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Building a theme with Ghost is a relatively straightforward process compared to WordPress. The Ghost team has created well-defined documentation that you can easily follow as a beginner with examples. </p>
<p>They also provide many ready-made components, like search functionality, amp page, comments, and so on.</p>
<p>You can create your Ghost theme by copy-pasting the code. For beginner developers, it might seem a bit complicated, but you'll get the hang of it with some time and work. </p>
<p>The Ghost team has created a well-defined folder structure for theme development. It is the easiest way to manage the theme development process. You can also use npm packages to enhance the development process and add more functionality to the theme. In my theme, I use tailwind CSS and the Gulp package to speed up the development process.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Contribute to Open Source – a Guide for Technical Writers ]]>
                </title>
                <description>
                    <![CDATA[ Contributing to open source can be a daunting prospect, especially if you haven't done so before, or if you're used to working on documentation rather than code. This guide will help technical writers get started contributing to open-source projects,... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-contribute-to-open-source-for-technical-writers/</link>
                <guid isPermaLink="false">66ba6113ab373929106a5c39</guid>
                
                    <category>
                        <![CDATA[ open source ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technical writing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ valentine Gatwiri ]]>
                </dc:creator>
                <pubDate>Mon, 24 Oct 2022 21:20:33 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/10/pexels-william-fortunato-6393024.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Contributing to open source can be a daunting prospect, especially if you haven't done so before, or if you're used to working on documentation rather than code.</p>
<p>This guide will help technical writers get started contributing to open-source projects, and outline some of the common pitfalls you might encounter when starting to contribute.</p>
<p>It'll also highlight some of the benefits of contributing to open source, and provide some additional resources for getting started with contributing to open source as a technical writer.</p>
<h2 id="heading-what-you-will-learn">What You Will Learn</h2>
<p>This post will cover how technical writers can contribute to open source, what the benefits are, and some of the potential drawbacks. We'll also go over a few resources for getting started.</p>
<h2 id="heading-what-is-open-source">What is Open Source?</h2>
<p>Open source is a collaborative way of developing and distributing software. People all over the world contribute to open-source projects by adding features, fixing bugs, answering questions, translating text, or writing tutorials.</p>
<h2 id="heading-why-contribute">Why Contribute?</h2>
<p>Contributing to open-source software is one of the best ways for technical writers and other knowledge workers to give back and make a difference.</p>
<p>You can help improve the software you use every day, or you can learn from the example of others who have contributed before you. Plus, it's a great way to meet people with common interests. And when your contributions are appreciated, you'll feel like part of the community.</p>
<p>You might be wondering – when should you contribute? Well, if you're new to open source, contribute at your own pace—don't worry about trying to do too much too soon. You'll find what you're comfortable with.</p>
<p>Contributing to open-source will not only increase your skill set but also allow you to develop contacts within the community and even create opportunities for freelance work. </p>
<p>It takes some time to build up the knowledge and skills necessary to become an active contributor (especially because documentation often requires a different skill set than programming), but it’s worth the investment.</p>
<h2 id="heading-challenges-of-contributing">Challenges of Contributing</h2>
<p>Technical writers can face several challenges when they start contributing to open-source projects. One of the most common is not being sure how best to contribute, especially if you don't know anything about the project yet.</p>
<p>You might also be unsure about where your work should go or what is expected from contributors. There are a couple of ways around this problem: you can read the project's <code>README</code> file and/or documentation to see if they have contribution guidelines. You can also get in touch with the team behind the project and ask for help.</p>
<h2 id="heading-how-to-contribute-to-open-source-projects">How to Contribute to Open-Source Projects</h2>
<p>First, you'll want to find a project on <a target="_blank" href="https://github.com/">GitHub</a> you want to contribute to. You can <a target="_blank" href="https://www.freecodecamp.org/news/github-search-tips/">read this tutorial</a> about how to search GitHub and find projects.</p>
<p>Next, you'll want to open the README and make sure you understand the given instructions.</p>
<p>Then, fork the repo by clicking on Fork located at the top right corner of your screen.</p>
<p><img src="https://lh5.googleusercontent.com/x3IyU70meecZi1qYS4_CCZW0cOZqpcTdVfKjG3_TpM1TJj_tH15FhNaKmrAL2bl8fTU7fcUAditd6AzqJbJItmCavBxQObpD2bAJCRlYds-sX-Z3iyA4b_pajXsOnAJM1_8tbPdbyOGNrXyxCfu1Qk-x3AyDrtDrFxbbxlmIaSSwaj3kYX87ELMUSQ" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Clone the forked repo in your local computer using the following command:</p>
<pre><code class="lang-bash">git <span class="hljs-built_in">clone</span> &lt;LINK TO THE REPO&gt;
</code></pre>
<p>You'll see the repo link when you click on the code dropdown.</p>
<p>Once you've cloned it, open up the directory containing your new fork and start adding your contribution.</p>
<p>When done push your changes on GitHub by using the following instructions:</p>
<pre><code class="lang-bash">git status //displays <span class="hljs-built_in">which</span> modifications have been staged.
git add . // adds changes to the cloned repo
git commit -m <span class="hljs-string">"changes"</span> //performs a commit to the cloned repo
git branch -M changes //creates a new branch
git push -u origin changes //pushes the changes
</code></pre>
<p>You will be prompted by GitHub to create a pull request after pushing your changes to the cloned repo. Go ahead and create the pull request and wait for the maintainers to merge your cloned repo to the main repo.</p>
<p><strong>Make sure to incorporate upstream modifications into your local repository</strong> if you forked the project a while ago.</p>
<p>If you encounter a large file, install <code>git-lfs</code> if it is not already installed with the following command:<code>brew install git-lfs</code></p>
<p>By downloading the appropriate versions of huge files slowly, the Git LFS (Large File Storage) extension, created by Atlassian, GitHub, and a few other open-source contributors, lessens the impact of large files in your repository</p>
<p>You can also use the following <a target="_blank" href="https://docs.github.com/en/repositories/working-with-files/managing-large-files/installing-git-large-file-storage">documentation</a> to install <code>git-lfs</code>.</p>
<h3 id="heading-best-practices-when-contributing-to-open-source">Best practices when contributing to open-source</h3>
<ol>
<li>Identify an area where you could be of assistance and find the relevant project on GitHub.</li>
<li>Read the documentation for any projects or programs that may be similar to the one you're interested in. This will give you a better understanding of what is involved in contributing and what other people have contributed.</li>
<li>Search for issues labeled good first issue and read through them – these are typically fairly easy to solve.</li>
<li>Get your code ready by following the contribution guidelines of the project.</li>
<li>Write up a pull request with your solution and explain why it solves the problem at hand. Include links to related resources like tutorials if necessary.</li>
<li>Submit your pull request for review. The team will discuss whether it should be accepted into the repository and update you about their decision.</li>
<li>If they decide not to accept your pull request ask them how you might go about addressing their concerns so that they'll reconsider acceptance at a later date.</li>
<li>If they do accept your pull request then thank them!</li>
<li>Continue searching for new problems to solve and share your progress along the way!</li>
</ol>
<h2 id="heading-what-types-of-contributions-can-i-make">What Types of Contributions Can I Make?</h2>
<p>You can contribute to these projects in many ways, including submitting pull requests for bug fixes or feature additions, writing documentation about how to use the software, improving the current documentation, translating the text into another language, and fixing typos.</p>
<p>You should get involved by picking a project you're interested in and reading through its documentation before diving right in.</p>
<p>Writing for an open-source project is a great way to establish yourself as an expert in your field and position yourself for future freelance opportunities.</p>
<p>One thing that technical writers should always keep in mind when writing for open-source projects is that their audience is primarily developers. This means that they need more technical details than what you would find in other types of writing.</p>
<h2 id="heading-where-can-i-find-open-source-projects">Where Can I Find Open Source Projects?</h2>
<p>There are a variety of places you can find open-source projects. GitHub is the most popular place for open-source projects, but there are also repositories on BitBucket, Gitlab and other sites.</p>
<p>If you have an idea for an open-source project that doesn't exist yet, start by putting together your plan in a <code>README</code> file. If you're not sure how to get started with contributing to an existing project, check out its documentation or read through some pull requests before submitting one of your own.</p>
<h2 id="heading-sample-projects"><strong>Sample Projects</strong></h2>
<ul>
<li><a target="_blank" href="https://github.com/h5bp/html5-boilerplate">The HTML5 Boilerplate project</a> is a popular open-source project for web developers that provides HTML, CSS, and Javascript code for building a website or web application.</li>
<li><a target="_blank" href="https://github.com/twbs">The Bootstrap framework,</a> also an open-source project, is a collection of tools to help developers quickly create responsive websites.</li>
<li><a target="_blank" href="https://jekyllrb.com/docs/contributing/">Jekyll</a> is a static site generator written in Ruby, designed for personal blogs.</li>
<li><a target="_blank" href="https://github.com/reactjs/reactjs.org">React.js  documentation</a> - React.js documentation provides official information on how to use react.js</li>
<li><a target="_blank" href="https://github.com/github/docs">GitHub pages</a> - They contain everything you need to know about GitHub.</li>
<li><a target="_blank" href="https://github.com/galaxyproject/training-material">Galaxy project (training material)</a> -A collection of training materials about the Galaxy project which is a web-based open platform for data-intensive computational research that extends beyond the biological sciences.</li>
<li><a target="_blank" href="https://github.com/cncf">CNCF (Cloud Native Computing Foundation)</a> -CNCF is open-source cloud-native computing that hosts projects such as Kubernetes and Prometheus to make cloud-native ubiquitous and sustainable.</li>
</ul>
<p>You can also check out <a target="_blank" href="https://developers.google.com/season-of-docs">Google Season of Docs</a> which provides assistance to open-source projects in improving their documentation and allows skilled technical writers to acquire experience in open-source.</p>
<p>There are many different ways you can contribute, which means there is something out there for everyone.</p>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>Contributing to open source is a great way for technical writers and other content creators to share their knowledge with the world. </p>
<p>There are many different ways you can contribute, which means there is something out there for everyone.   </p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Choose a Topic for Your Technical Article ]]>
                </title>
                <description>
                    <![CDATA[ By Paul Akinyemi After you write your first couple of articles, a problem most technical writers face is: "So, what do I write about next?" It can be a frustrating question, so I wrote this article to help. In it, I will give you tips that will save ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/choose-a-topic-for-your-next-article/</link>
                <guid isPermaLink="false">66d4608c677cb8c6c15f3169</guid>
                
                    <category>
                        <![CDATA[ technical writing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 14 Mar 2022 23:52:03 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/03/topic_article_head.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Paul Akinyemi</p>
<p>After you write your first couple of articles, a problem most technical writers face is: "So, what do I write about next?"</p>
<p>It can be a frustrating question, so I wrote this article to help. In it, I will give you tips that will save you the headache the next time you need to pick a topic for an article.</p>
<p>Here's an overview of what this article will cover:</p>
<ul>
<li>Brainstorming</li>
<li>Decide why you want to write</li>
<li>Follow your interests</li>
<li>Everything has already been written about</li>
<li>Don't rehash the docs</li>
</ul>
<h2 id="heading-intended-audience">Intended Audience</h2>
<p>This article is intended for technical writers who write about programming topics and are trying to figure out what to write about next.</p>
<p>The article doesn't include any advice about actually writing articles – just what to write about.</p>
<h2 id="heading-brainstorm-ideas">Brainstorm Ideas</h2>
<p>One of the best ways to generate ideas of any kind is brainstorming. The more ideas you can come up with, the great your chances are of finding a good one.</p>
<p>You can brainstorm in a bunch of different ways, including as a group, but here's the approach to it that works best for me:</p>
<ol>
<li>Get a pen and paper.</li>
<li>Write down every topic idea that comes to your mind, even if you think it's a bad idea.</li>
<li>Keep going until you can't think of anything else.</li>
<li>If you've found an idea you're happy with, stop.</li>
<li>If you haven't, look for some more input. You can ask people for suggestions, check out things other people have written, or do some research on the ideas you already have.</li>
<li>Take a break of some kind. Sleep for a while, go for a walk, or work on something else for at least 30 minutes.</li>
<li>Get a new piece of paper, and write your ideas on it until you can't think of anything else.</li>
<li>Repeat until you have ideas you're happy with.</li>
</ol>
<h2 id="heading-decide-why-you-want-to-write">Decide Why You Want to Write</h2>
<p>It may sound like an obvious tip, but it's worth checking in with yourself: do you know <em>exactly</em> what you want to gain by writing your article?</p>
<p>There is an endless list of topics to write about, which is part of what makes it hard to decide on something. One of the best ways to narrow it down is to consider why exactly you're writing: what's your end goal?</p>
<p>Once you have that firmly in mind, what you should write about becomes much more apparent, at least in general terms.</p>
<p>For example:</p>
<ul>
<li>If you're writing to submit to a publication, you should focus on topics that go well with what they've already published.</li>
<li>If you just want to practice your writing, the topic doesn't matter too much.</li>
<li>If you're writing to learn something specific, you can stop reading. You've answered your question.</li>
<li>If you're writing to show your competence, focus on what you know a lot about and feel confident writing about.</li>
</ul>
<p>People write for more reasons than the above, but often, confirming your personal reason brings a lot of clarity.</p>
<h2 id="heading-follow-your-interests">Follow Your Interests</h2>
<p>Your best writing usually comes from topics you're genuinely interested in for their own sake.</p>
<p>Here's advice from Chris Coyier from his article on advice for technical writing:</p>
<blockquote>
<p>If you want to write for CSS-Tricks and you ask me what you should write about, I'm probably going to turn that question around on you. It's likely I don't know you well enough to pick the perfect topic for you.   </p>
<p>More importantly, <strong>what I really want you to write about is something that is <em>personal</em> and <em>important</em> to you.</strong> Articles rooted in recent excitement about a particular idea or technology always come out better than dictated assignments. (Source: <a target="_blank" href="https://css-tricks.com/advice-for-technical-writing/">advice on technical writing</a>)</p>
</blockquote>
<p>If you're having difficulty deciding on a topic, try and start with the topics that interest you, even if you're not an expert.</p>
<p>Maybe you've always wanted to learn about web automation, CSS art, or game development. Do some research into your interests, and pick something to write from there.</p>
<h2 id="heading-everything-has-already-been-written-about">Everything Has Already Been Written About</h2>
<p>Even when you have a topic in mind, a common frustration is that it can sometimes feel like everyone has already written about the topic you want to write about.</p>
<p>And that's probably true. Unless you're writing about a very new or unpopular framework or language, the odds are good that someone has already covered the subject in some way.</p>
<p>That doesn't mean you can't still write about your topic of choice, but you have to get a little creative.</p>
<p>Here's Quincy Larson's advice on the subject (the relevant snippet stops at 5:20):</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/YODPgBadj80" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<p>As you can see, even if other people have already written something about your topic, there's a good chance you can still write about it.</p>
<p>This is Chris Coyier's best advice on picking something to write about:</p>
<div class="embed-wrapper">
        <blockquote class="twitter-tweet">
          <a href="https://twitter.com/chriscoyier/status/925081793576837120?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E925081793576837120%7Ctwgr%5E%7Ctwcon%5Es1_c10&amp;ref_url=https%3A%2F%2Fcss-tricks.com%2Fadvice-for-technical-writing%2F"></a>
        </blockquote>
        <script defer="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
<p>Personally, I apply this advice by googling my topic to see what people have already written about it. After that, I check if I can find anything missing from what I read:</p>
<ul>
<li>Does it go into enough detail?</li>
<li>Was it explained clearly enough?</li>
<li>Would it benefit from a more practical approach?</li>
<li>Is the content out of date?</li>
<li>Is there another way to apply this content?</li>
</ul>
<p>Sometimes, you won't find anything missing, especially with very old or foundational topics. But often enough, you can find a way to contribute something of value to the existing writing.</p>
<p>Also, keep in mind that the way you explain things might resonate with someone in a way that nothing else out there does.</p>
<h2 id="heading-dont-rehash-the-docs">Don't Rehash the Docs</h2>
<p>I know I just said you shouldn't rehash the docs, but it's actually okay in a few scenarios:</p>
<ul>
<li>You're writing mainly to help yourself learn the concept or practice writing</li>
<li>The official documentation is glaringly deficient in detail or clarity</li>
<li>Your writing offers a significantly different perspective or substantial improvement</li>
</ul>
<p>On the other hand, if you're writing for other people to read, and the official docs are already reasonably good, it's probably a better idea to build a tutorial showcasing the concept or write about your experience using it than to simply explain it again.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>I hope you had fun reading this and that you'll find choosing a topic to write about much easier from here on out.</p>
<p>This article didn't cover how to actually write once you've come up with a topic. If you'd like to read advice on turning your idea into an article, check out the following links:</p>
<ul>
<li><a target="_blank" href="https://css-tricks.com/advice-for-technical-writing/">Advice for technical writing</a></li>
<li><a target="_blank" href="https://www.youtube.com/watch?v=YODPgBadj80">How to write technical blog posts people will actually read</a></li>
<li><a target="_blank" href="https://developers.google.com/tech-writing/one">Technical Writing One</a></li>
</ul>
<p>Good luck, and follow me on <a target="_blank" href="https://twitter.com/apexPaul09">Twitter</a> to see more of my writing.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Recover an Unsaved Word Document – Restore a Deleted Word File ]]>
                </title>
                <description>
                    <![CDATA[ Sometimes you might accidentally close your Word application without saving your file. You might think that your progress has been lost, but there's actually a way to recover the file without losing any of your content. And that is exactly what this ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-recover-an-unsaved-word-document-restore-a-deleted-word-file/</link>
                <guid isPermaLink="false">66b0a2de3ac4671a1e5802f4</guid>
                
                    <category>
                        <![CDATA[ beginners guide ]]>
                    </category>
                
                    <category>
                        <![CDATA[ how-to ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ihechikara Abba ]]>
                </dc:creator>
                <pubDate>Mon, 31 Jan 2022 15:17:51 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/01/how-to-recover-an-unsaved-word-document.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Sometimes you might accidentally close your Word application without saving your file. You might think that your progress has been lost, but there's actually a way to recover the file without losing any of your content.</p>
<p>And that is exactly what this article will show you how to do.</p>
<p>To follow along with this tutorial, it'll be helpful if you have a Word document you can work with. Here is the one I'll be using:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/01/word.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>I have closed the application without saving the document. Now let's start the easy restoration process.</p>
<h3 id="heading-step-1-create-a-blank-document-in-word"><strong>Step 1 – Create a blank document in Word</strong></h3>
<ul>
<li>Launch the application again.</li>
<li>On the startup page, click on "Blank document".</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/01/blank.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-step-2-use-the-open-option"><strong>Step 2 – Use the Open option</strong></h3>
<ul>
<li>Press <strong>Ctrl+O</strong>. </li>
<li>Alternatively, you can click on the <strong>File</strong> option in your blank document's header and then click <strong>Open</strong> on the sidebar.</li>
</ul>
<h3 id="heading-step-3-click-on-recover-unsaved-documents"><strong>Step 3 – Click on "Recover Unsaved Documents"</strong></h3>
<ul>
<li>Click on the <strong>Recover Unsaved Documents</strong> which is usually at the bottom of the page.</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/01/recover.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>If you do not see the <strong>Recover Unsaved Documents</strong> button, then follow these steps to see the options:</p>
<ol>
<li>In your blank document, press <strong>Ctrl+O</strong> or click on <strong>File</strong> which is at the header section.</li>
<li>Click on <strong>Info</strong> which you will find in the sidebar.</li>
<li>Click on <strong>Manage Document</strong>.</li>
<li>Click on <strong>Recover Unsaved Document</strong>.</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/01/recover-unsaved-document.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-step-4-choose-unsaved-documents"><strong>Step 4 – Choose unsaved documents</strong></h3>
<p>After you have clicked the <strong>Recover Unsaved Documents</strong> button, a new window should pop up with a list of unsaved documents. Go through the list and open your document and all your progress should still be intact.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/01/pop-up.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>In this article, we went over the steps required to recover an unsaved Word document. These steps can be used anytime you close Word without saving a document. </p>
<p>Don't forget to save this time!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Get Headings and IDs for Your freeCodeCamp Blog Post Table of Contents ]]>
                </title>
                <description>
                    <![CDATA[ By Scott Spence In this post we're going to get all the headings from a freeCodeCamp blog post to make a Table of Contents (ToC) in Ghost CMS. I recently published quite a large post here on freeCodeCamp and needed to add a table of contents to the p... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-get-headings-and-ids-for-your-freecodecamp-blog-posts/</link>
                <guid isPermaLink="false">66d8522a981549ab9e803f07</guid>
                
                    <category>
                        <![CDATA[ Blogging ]]>
                    </category>
                
                    <category>
                        <![CDATA[ freeCodeCamp.org ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technical writing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing tips ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 07 Jan 2022 21:31:15 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/01/brett-jordan-M9NVqELEtHU-unsplash-1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Scott Spence</p>
<p>In this post we're going to get all the headings from a freeCodeCamp blog post to make a Table of Contents (ToC) in Ghost CMS.</p>
<p>I recently published <a target="_blank" href="https://www.freecodecamp.org/news/build-your-developer-portfolio-from-scratch-with-sveltekit-and-graphcms/">quite a large post</a> here on freeCodeCamp and needed to add a table of contents to the post.</p>
<p>There's a really good supporting post written by Colby Fayock on how to do this. It details the process really clearly.</p>
<p>You can check out the video and really comprehensive guide on that for all the details: </p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.freecodecamp.org/news/how-to-add-a-table-of-contents-to-your-blog-post-or-article/">https://www.freecodecamp.org/news/how-to-add-a-table-of-contents-to-your-blog-post-or-article/</a></div>
<p>Colby's post details why you would want a Table of Contents (ToC) and how to create one using the Ghost editor (the editor used for writing this post in the Ghost CMS).</p>
<p>The thing is, I had 33 headings in the post I needed to add links for. And the thought of scrolling through a 10,000 word document to get a heading then scroll to the top to add it to the table of contents made me wonder if there was a better way to do it!</p>
<h3 id="heading-table-of-contents">Table of contents:</h3>
<ul>
<li><a class="post-section-overview" href="#heading-javascript-to-the-rescue">JavaScript to the rescue!</a></li>
<li><a class="post-section-overview" href="#heading-get-the-element-properties">Get the element properties</a></li>
<li><a class="post-section-overview" href="#heading-get-the-element-id-and-innertext">Get the element id and <code>innerText</code></a></li>
<li><a class="post-section-overview" href="#heading-filter-on-the-localname">Filter on the <code>localName</code></a></li>
<li><a class="post-section-overview" href="#heading-conclusion">Conclusion</a></li>
</ul>
<h2 id="heading-javascript-to-the-rescue">JavaScript to the rescue!</h2>
<p>With this thought in mind I did a quick search and found a <a target="_blank" href="https://stackoverflow.com/a/7115083/1138354">Stack Overflow</a> answer that I could use. Here's the snippet:</p>
<pre><code class="lang-js"><span class="hljs-keyword">var</span> ids = <span class="hljs-built_in">document</span>.querySelectorAll(<span class="hljs-string">'[id]'</span>);

<span class="hljs-built_in">Array</span>.prototype.forEach.call( ids, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> el, i </span>) </span>{
  <span class="hljs-comment">// "el" is your element</span>
  <span class="hljs-built_in">console</span>.log( el.id ); <span class="hljs-comment">// log the ID</span>
});
</code></pre>
<p>So, let's hop on over to the browser now and try that out.</p>
<p>I'll go over to that published post now in the browser and open the developer tools. (In Chrome and Edge it's F12 to open the dev tools.) Then I'll paste in that example code into the console and hit enter, here's the output:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/01/image-42.png" alt="The browser window with the dev tools open and the code snippet run showing all the element ids on the page" width="600" height="400" loading="lazy"></p>
<h2 id="heading-get-the-element-properties">Get the element properties</h2>
<p>Not bad but I want the heading title as well, so one quick way to see the properties of the elements is to wrap the <code>el</code> in some curly braces:</p>
<pre><code class="lang-js"><span class="hljs-keyword">let</span> ids = <span class="hljs-built_in">document</span>.querySelectorAll(<span class="hljs-string">'[id]'</span>);

<span class="hljs-built_in">Array</span>.prototype.forEach.call(ids, <span class="hljs-function">(<span class="hljs-params">el</span>) =&gt;</span> {
  <span class="hljs-built_in">console</span>.log({el});
});
</code></pre>
<p>You'll notice I've cleaned up the function a bit, replacing the inline function with an arrow function and replaced <code>var</code> with <code>let</code> so the syntax is more modern.</p>
<p>Running that snippet in the browser now gives me the object for each element:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/01/image-43.png" alt="The browser page with the dev tools open on the console showing the individual elements as objects" width="600" height="400" loading="lazy"></p>
<p>I can then expand out one of the elements now to get all the properties relating to it. From here I'm going to want to get the <code>id</code> (which I already know was there) and also the <code>innerText</code> which is the heading title:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/01/image-45.png" alt="The browser page with the dev tools open on the console with one of the element objects expanded to show all the properties" width="600" height="400" loading="lazy"></p>
<h2 id="heading-get-the-element-id-and-innertext">Get the element <code>id</code> and <code>innerText</code></h2>
<p>Let's add the <code>innerText</code> element to the snippet we're working with and see what that looks like now. Here's the snippet:</p>
<pre><code class="lang-js"><span class="hljs-keyword">let</span> ids = <span class="hljs-built_in">document</span>.querySelectorAll(<span class="hljs-string">'[id]'</span>);

<span class="hljs-built_in">Array</span>.prototype.forEach.call(ids, <span class="hljs-function">(<span class="hljs-params">el</span>) =&gt;</span> {
  <span class="hljs-built_in">console</span>.log(el.id);
  <span class="hljs-built_in">console</span>.log(el.innerText);
});
</code></pre>
<p>And here's the output we get from that:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/01/image-46.png" alt="The browser page with the dev tools open on the console showing all the innerText from every element with an id" width="600" height="400" loading="lazy"></p>
<p>Ok, so that is really noisy as it's showing the <code>innerText</code> of every element in the document with a lot of irrelevant information on there. All we're really interested in is the title of the heading and it's id.</p>
<h2 id="heading-filter-on-the-localname">Filter on the <code>localName</code></h2>
<p>All the headings I use in the post are <code>h2</code> headings so I want a way to filter that. So from the <code>{el}</code> properties I'll need to grab the <code>localName</code> which denotes the type of the element <code>h2</code> in the case here.</p>
<p>So let's use an <code>if</code> function to see if the <code>localName</code> includes <code>h2</code> and if it does log that out. I'll also use a template literal to add the anchor id <code>#</code> to the beginning of the id:</p>
<pre><code class="lang-js"><span class="hljs-keyword">let</span> ids = <span class="hljs-built_in">document</span>.querySelectorAll(<span class="hljs-string">'[id]'</span>);

<span class="hljs-built_in">Array</span>.prototype.forEach.call(ids, <span class="hljs-function">(<span class="hljs-params">el</span>) =&gt;</span> {
  <span class="hljs-keyword">if</span> (el.localName.includes(<span class="hljs-string">`h2`</span>)) {
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`#<span class="hljs-subst">${el.id}</span>`</span>);
    <span class="hljs-built_in">console</span>.log(el.innerText);
  }
});
</code></pre>
<p>Let's take a look at the output now:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/01/image-47.png" alt="The browser page with the dev tools open on the console with the if function to filter on h2 elements" width="600" height="400" loading="lazy"></p>
<p>Much nicer!</p>
<p>Now I can use that output to start making my ToC!</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/8UnglHuuVTA" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<h2 id="heading-conclusion">Conclusion</h2>
<p>We took what could be quite an extended process and turned it into a handy snippet we can use in the browser console every time we need to create a ToC for our blog posts.</p>
<p>That's it, hope you found it useful! 🙏</p>
<p>If you like the content you can check out much more from me on my <a target="_blank" href="https://scottspence.com/">blog</a> and you can follow me on <a target="_blank" href="https://twitter.com/spences10">Twitter</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Spell Check Not Working in Word [Fixed on Windows 10 PC] ]]>
                </title>
                <description>
                    <![CDATA[ Spell check in Microsoft Word and other Word Processing apps is a powerful feature. With spell check, you don’t have to worry too about making small grammatical and typographical errors, because the program will point them out for you in real-time as... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/spell-check-not-working-in-word-fixed-on-windows-10-pc/</link>
                <guid isPermaLink="false">66adf21ffebac312b73075d3</guid>
                
                    <category>
                        <![CDATA[ beginner ]]>
                    </category>
                
                    <category>
                        <![CDATA[ how-to ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Windows 10 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kolade Chris ]]>
                </dc:creator>
                <pubDate>Mon, 29 Nov 2021 14:53:48 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/11/word.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Spell check in Microsoft Word and other Word Processing apps is a powerful feature. With spell check, you don’t have to worry too about making small grammatical and typographical errors, because the program will point them out for you in real-time as you type.</p>
<p>But sometimes, the spell check feature in word processors stops working for various reasons, mostly to do with your Settings.</p>
<p>So, in this article, I will show you 4 ways you can fix the problem on a Windows 10 PC. The first 2 solutions work for the Word app in general, while the last 2 work for a particular Word document.</p>
<p>I will be using Microsoft Word 2016 in this tutorial, but everything applies to Word 2010, 2013, 2019, and some other versions.</p>
<h2 id="heading-how-to-fix-spell-check-not-working-in-word-with-language-settings">How to Fix Spell Check Not Working in Word with Language Settings</h2>
<p>If you are writing in English and your Word app language is set to French or Spanish, then spell check might not work.</p>
<p><strong>The steps below takes you through how to select the right language:</strong></p>
<p><strong>Step 1</strong>: Click on File in the menu bar and select Options.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-5-11.jpg" alt="ss-5-11" width="600" height="400" loading="lazy"></p>
<p><strong>Step 2</strong>: Head over to the Language tab.</p>
<p><strong>Step 3</strong>: Under “Office authoring language and proofing”, select your preferred language and click Ok.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-1-14.jpg" alt="ss-1-14" width="600" height="400" loading="lazy"></p>
<p>If your preferred language is not available in the list, click on “Add a language” and look for your language.</p>
<h2 id="heading-how-to-fix-spell-check-not-working-in-word-by-turning-off-disabling-add-ins">How to Fix Spell Check Not Working in Word by Turning off Disabling Add-ins</h2>
<p>Firstly, you need to test if an add-in is preventing spell-check from working. </p>
<p>To do this, hold <code>CTRL</code> and open your Word app. If spell check isn't working, then an add-in might be the culprit.</p>
<p><strong>To disable an add-in, follow the steps below:</strong></p>
<p><strong>Step 1</strong>: Click on the File tab in the menu bar and select Options.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-5-11.jpg" alt="ss-5-11" width="600" height="400" loading="lazy"></p>
<p><strong>Step 2</strong>: Select add-in on the left.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-4-12.jpg" alt="ss-4-12" width="600" height="400" loading="lazy"></p>
<p><strong>Step 3</strong>: Left-click on the add-in you want to remove and click “Go”.</p>
<p><strong>Step 4</strong>: Check the add-in, then click “Remove”.</p>
<p>Do this for the individual add-ins you have and cross-check if spell check is working after each one. This way you'll know which add-in is the culprit.</p>
<h2 id="heading-how-to-fix-spell-check-not-working-in-word-by-turning-off-the-hide-spelling-error-and-hide-grammar-error">How to Fix Spell Check Not Working in Word by Turning off the Hide Spelling Error and Hide Grammar Error</h2>
<p><strong>Step 1</strong>: Make sure you have the Word document open where spell check is not working.</p>
<p><strong>Step 2</strong>: Click on the File tab and select Options.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-5-12.jpg" alt="ss-5-12" width="600" height="400" loading="lazy"></p>
<p><strong>Step 4</strong>: Select Proofing.</p>
<p><strong>Step 5</strong>: Uncheck both “Hide spelling error in this document only” and “Hide grammar error in this document only”, then select “Ok”.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-7real.jpg" alt="ss-7real" width="600" height="400" loading="lazy"></p>
<h2 id="heading-how-to-fix-spell-check-not-working-in-word-by-turning-on-check-spelling-as-you-type">How to Fix Spell Check Not Working in Word by Turning on Check Spelling as you Type</h2>
<p><strong>Step 1</strong>: Make sure the file is opened.</p>
<p><strong>Step 2</strong>: Click on the File tab in the menu bar and select Options.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-5-12.jpg" alt="ss-5-12" width="600" height="400" loading="lazy"></p>
<p><strong>Step 3</strong>: Select Proofing.</p>
<p><strong>Step 4</strong>: Make sure “Check "spelling as you type" is checked under “When Correcting Spelling and Grammar in Word”, then click Ok.
<img src="https://www.freecodecamp.org/news/content/images/2021/11/ss-8-5.jpg" alt="ss-8-5" width="600" height="400" loading="lazy"></p>
<h2 id="heading-final-thoughts">Final Thoughts</h2>
<p>Spell check is a cool feature of Word that speeds up your productivity. And now you know how to fix it if it fails. </p>
<p>You can also apply these fixes to other Windows OS versions as Word works the same way in them.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Create a Customizable Table of Contents in Word ]]>
                </title>
                <description>
                    <![CDATA[ By MaximeF It's tricky to make a good-looking and functional table of contents in Microsoft Word. You might often encounter documents that have messy tables of contents along with navigation panes with links to missing headings, non harmonized styles... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-create-customizable-table-of-contents-in-microsoft-word/</link>
                <guid isPermaLink="false">66d460128812486a37369d03</guid>
                
                    <category>
                        <![CDATA[ how-to ]]>
                    </category>
                
                    <category>
                        <![CDATA[ organization ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 23 Nov 2021 15:34:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/11/pexels-skitterphoto-1005324.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By MaximeF</p>
<p>It's tricky to make a good-looking and functional table of contents in Microsoft Word.</p>
<p>You might often encounter documents that have messy tables of contents along with navigation panes with links to missing headings, non harmonized styles, and badly structured sections. </p>
<p>This wouldn't be a big problem for smaller documents, but with hundreds of pages in a file it ruins the user experience and makes it painful to navigate from one section to another. Not to mention that non-harmonized styles throughout the file can mess with the overall hierarchy of titles.</p>
<p>So how can you build a customizable and structured table of contents with pretty personalized titles and numbering? You'll learn how in this guide.</p>
<h2 id="heading-how-to-build-a-table-of-contents-in-microsoft-word">How to Build a Table of Contents in Microsoft Word</h2>
<h3 id="heading-how-to-define-numbering-styles-in-word">How to Define Numbering Styles in Word</h3>
<p>What we're going to do first is define a new list style to create a personalized numbering for our titles. Go to the <strong>Home</strong> tab &gt; <strong>Paragraph</strong> section and click the multilevel list button. Choose <strong>Define New List Style</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-72.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>This will open the <strong>Define New List Style</strong> window which we will use to customize the numbering style and format of our titles.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-77.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Name your style however you want (here MyNewListStyle), then click the <strong>Format</strong> button &gt; <strong>Numbering...</strong> This will open the <strong>Modify Multilevel list</strong> window.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-79.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>We will only define the numbering ("1)","a)") and no format or style will be applied at this level. We'll define and apply font styles and formats later on.</p>
<p>Let's take the following numbering for our titles "1.","1.1","1.1.1","2.","2.1","2.2" and so on. </p>
<p>First replace the parenthesis character with a dot character in the <strong>Enter formatting for number</strong> field. This will change the level 1 numbering format to "1.". </p>
<p>Then we'll define the second level of numbering by clicking the number 2 in the <strong>Click level to modify</strong> list.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-80.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Change the <strong>Number style for this level</strong> by clicking the associated dropdown menu then select <strong>1,2,3, ...</strong> You should get this result:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-82.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Erase the parenthesis character in the <strong>Enter formatting for number</strong> field and place a dot before the "1". You should have ".1". </p>
<p>Now how do I get the numbering style 1.1 at level 2? Pretty simple! Place your mouse before the ".1" in the <strong>Enter formatting for number</strong> field. Then open the <strong>Include level number from</strong> dropdown menu and select <strong>Level 1</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-88.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>This will insert the numbering for level 1 before your numbering for level 2. You should get this result:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-86.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Inserting numbers manually in this field will give you static numbers which won't be linked to any dynamic numbering in your document. These numbers won't be highlighted in grey in the <strong>Enter formatting for number</strong> field.</p>
<p>Let's repeat the same steps for level 3. Select level <strong>3</strong> in the <strong>Click level to modify</strong> list. Select the right <strong>Number style for this level</strong> in the dropdown menu. Remove unwanted characters and add a dot before the "1". </p>
<p>Then place your mouse before the ".1" in the <strong>Enter formatting for number</strong> field and open the <strong>Include level number from</strong> dropdown menu and select <strong>level 2</strong>. Add a dot before the level 2 "1" in the <strong>Enter formatting for number</strong> field. Then open <strong>Include level number from</strong> and select <strong>level 1</strong>. You should get this result:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-89.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>You can modify the space character following the number by clicking <strong>More &gt;&gt;</strong> then <strong>Follow number with</strong> and select what you want. Here I am going to use <strong>Tab character</strong> for all my levels.</p>
<p>Click the <strong>OK</strong> button and you're all set for the numbering part! You won't have to do these steps again as the styles you define can be available from one Word document to another. We'll talk more about that later.</p>
<p>Your list style should be available by clicking the <strong>Multilevel list</strong> button in the <strong>Paragraph</strong> section of the <strong>Home</strong> tab.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-90.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>We will now define our title styles.</p>
<h3 id="heading-how-to-define-title-styles-in-word">How to Define Title Styles in Word</h3>
<p>In the <strong>Home</strong> tab and under the <strong>Style</strong> section, click the down arrow next to the different styles available.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/2021-11-20-11_57_32-Document1---Word.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Then click <strong>Create a Style</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-92.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Give your new style a name. It's good practice to include the level number where you're going to apply this title so it's easier to follow your title hierarchy. I am going to name mine NewStyle1 for level 1. Then click <strong>Modify</strong>. </p>
<p>If you've clicked <strong>OK</strong> too fast don't worry – you can find your style and modify at anytime in the style section. You can edit it by right clicking on it and clicking <strong>Modify...</strong></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-94.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-95.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>We are going to apply formatting to our title style.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-96.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Start by opening the <strong>Style based on</strong> dropdown menu and select <strong>Heading 1</strong> for level 1. This is an important step for Word to understand the title hierarchy level. You'll apply this step to each level (Heading 2 for your level 2 style, Heading 3 for your level 3 style...).</p>
<p>Then open the <strong>Style for following paragraph</strong> and select Normal. This will prevent any formatting from applying automatically to the following lines of text you type. </p>
<p>Open the <strong>Format</strong> menu and open the <strong>Numbering...</strong> menu. Make sure that None is selected then click <strong>OK</strong>. This will prevent any conflict between the numbering we defined earlier.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-97.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>You can then select any font formatting that you want. This is what I picked:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-98.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Let's create a style for level 2 and 3 by following the same steps. Be sure to have the numbering set to <strong>None</strong> each time. This is what I have for level 2:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-99.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>And level 3:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-100.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>We are now going to link our title styles with our numbering style.</p>
<p>Go to the <strong>Home</strong> tab, <strong>Paragraph</strong> section, <strong>Mutlilevel list</strong>. Then right click on the Numbering list style we created in the first part and click <strong>Modify</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-101.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Open the Numbering window by clicking <strong>Format.</strong> Select the level 1 and in the <strong>Link level to style</strong> dropdown menu select the level 1 style you created for your level 1 title. You should get this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-102.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Repeat these steps for level 2 and 3.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-103.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Then click OK.</p>
<h3 id="heading-how-to-apply-your-new-title-styles">How to Apply Your New Title Styles</h3>
<p>Now let's try to apply our new title styles. Type in Title 1 in your document without any formatting applied. </p>
<p>If you already have a format applied you can remove it by clicking in the paragraph and applying the <strong>Normal</strong> style in the <strong>Styles</strong> section. This is useful to remove any unwanted formatting or styles you may find.</p>
<p>Now click in the Title 1 text and click on your newly created style for level 1. This will apply your level 1 style to the whole paragraph.</p>
<p>If you go to the <strong>View</strong> tab you can check the <strong>Navigation pane</strong> and see that "1. Title 1" just appeared as a selectable heading on the left Navigation panel, allowing you to go to it quickly.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-105.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Let's try our other titles styles as well. Type in the text without formatting, place your mouse in the relevant paragraph, and then click on your newly created styles to apply them. You should get something like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-106.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>As you can see on the left panel, all my titles are appearing in a structured way with harmonized numbering. You can collapse are expand these to navigate faster. There is also a search engine available on top of this panel.</p>
<p>You can now insert a structured table of contents by going to the <strong>References</strong> tab &gt; <strong>Table of Contents</strong> &gt; <strong>Automatic table 1.</strong> You should now have something like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-110.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>You can customize this table of contents to only display titles down to a certain level by clicking <strong>Table of Contents</strong> &gt; <strong>Custom table of Contents</strong> &gt; decrease the <strong>Show levels</strong> number &gt; <strong>OK</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-111.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-how-to-preserve-your-styles-in-word">How to Preserve Your Styles in Word</h3>
<p>At the moment, these title styles are only available in this Word file. We are going to make them available every time we open Word as well as make them transferable to other people.</p>
<p>Open the Developer tab in Word. If you can't see it displayed click <strong>File</strong> &gt; <strong>Options</strong> &gt; <strong>Customize Ribbon</strong> &gt; Check <strong>Developer</strong> in the right panel &gt; <strong>OK</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-107.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Once you're in the <strong>Developer</strong> tab go to <strong>Document Template</strong> &gt; <strong>Organizer</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-108.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>In the left panel (in Document1 for me) you can see the styles available in this file. In the right panel are the styles available in the Normal.dotm which allows you to store styles that will be available every time you open Word.</p>
<p>Let's select all our newly created styles then click <strong>Copy-&gt;</strong>. You should get something like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-109.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Now if you open another file your styles will be directly available in the styles section. This can be useful if you want to transfer styles among your group and harmonize the structure and format of your files.</p>
<h3 id="heading-thats-it">That's it!</h3>
<p>Voilà! You are now able to build a structured Word document with customizable titles styles and a reliable navigation panel.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Delete a Page in Word – Remove Blank or Extra Pages ]]>
                </title>
                <description>
                    <![CDATA[ If you're using Microsoft Word, you don't want blank pages appearing in the middle of your document, or extra pages at the end.  These extra pages could be caused by tables, hitting the ENTER key too many times, unnecessary section breaks, unintentio... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-delete-a-page-in-word-remove-blank-or-extra-pages/</link>
                <guid isPermaLink="false">66adf114f452caf50fb1fdf9</guid>
                
                    <category>
                        <![CDATA[ beginners guide ]]>
                    </category>
                
                    <category>
                        <![CDATA[ how-to ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing tips ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kolade Chris ]]>
                </dc:creator>
                <pubDate>Fri, 15 Oct 2021 16:49:29 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/10/blank-page-in-word.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>If you're using Microsoft Word, you don't want blank pages appearing in the middle of your document, or extra pages at the end. </p>
<p>These extra pages could be caused by tables, hitting the <code>ENTER</code> key too many times, unnecessary section breaks, unintentional page breaks, extra paragraph markers, and more.</p>
<p>You don’t want your Word document to look unprofessional because of this quirk, so in this article I'll show you how to delete blank and extra pages in Word.</p>
<p>I will be using Microsoft Office 2016 in this tutorial, but you can follow along with any version, as pretty much the same thing applies to all versions.</p>
<h2 id="heading-how-to-delete-a-blank-page-in-the-middle-of-a-word-document">How to Delete a Blank Page in the Middle of a Word Document</h2>
<p>If you are working with a large word document and you are about to present it or print it, it’s a good idea to check for blank pages and an extra final page. </p>
<p>To do this, press <code>CTRL</code> + <code>SHIFT</code> + <code>8</code>, or go to the Home tab and click the paragraph icon.
<img src="https://www.freecodecamp.org/news/content/images/2021/10/ss-1-4.jpg" alt="ss-1-4" width="600" height="400" loading="lazy"></p>
<p>This key combination displays paragraph markers (¶) at the end of every paragraph and each blank line – basically, whenever you hit the <code>ENTER</code> key, and at the beginning of the extra blank page. </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/show-blank-pages.gif" alt="show-blank-pages" width="600" height="400" loading="lazy"> </p>
<p>To remove these extra pages, highlight the paragraph markers with your mouse or trackpad and hit the <code>DELETE</code> button. If one of the markers remains there, remove it with the <code>BACKSPACE</code> key.
<img src="https://www.freecodecamp.org/news/content/images/2021/10/remove-the-blank-pages.gif" alt="remove-the-blank-pages" width="600" height="400" loading="lazy"></p>
<p>If you have the patience, you can also remove the blank page(s) by going to the blank pages and hitting the <code>BACKSPACE</code> key until the paragraph markers disappear.</p>
<h2 id="heading-how-to-delete-an-extra-blank-page-in-a-word-document">How to Delete an Extra Blank Page in a Word Document</h2>
<p><strong>Step 1</strong>: To delete an extra blank page that might get added at the end of your document, click the <code>View</code> tab:
<img src="https://www.freecodecamp.org/news/content/images/2021/10/ss-2-5.jpg" alt="ss-2-5" width="600" height="400" loading="lazy"></p>
<p><strong>Step 2</strong>: Go to the Navigation Pane. This will display a sidebar containing 3 tabs – <code>Headings</code>, <code>Pages</code>, and <code>Results</code>. Click on <code>Pages</code> to display all the pages of the document in the sidebar.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/ss-3b.jpg" alt="ss-3b" width="600" height="400" loading="lazy"></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/ss-4-4.jpg" alt="ss-4-4" width="600" height="400" loading="lazy"></p>
<p><strong>Step 3</strong>: The active page will be automatically selected. Click the extra blank page to select it and hit the <code>DELETE</code> button on your keyboard to remove it.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/delete-extra-page.gif" alt="delete-extra-page" width="600" height="400" loading="lazy"></p>
<p>You can also remove this extra blank page by simply pressing the <code>BACKSPACE</code> key.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>In this article, you learned how to remove blank pages in Word, so you can make your documents appear more professional.</p>
<p>Thank you for reading. If you find this article helpful, please share it with your friends and family.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Start a Blog [Free 70-Page Book] ]]>
                </title>
                <description>
                    <![CDATA[ What follows is a full-length book on how to create a successful blog. I am a software developer and I've written 1,500 posts on my blog over the past few years. Millions of people have read my writing. And my blog is now one of the top 20,000 websit... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-start-a-blog-book/</link>
                <guid isPermaLink="false">66bb5a7eb6e566d0c2aea609</guid>
                
                    <category>
                        <![CDATA[ blog ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Blogging ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Flavio Copes ]]>
                </dc:creator>
                <pubDate>Mon, 11 Oct 2021 17:21:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/10/how-to-start-a-blog.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>What follows is a full-length book on how to create a successful blog.</p>
<p>I am a software developer and I've written 1,500 posts on my blog over the past few years. Millions of people have read my writing. And my blog is now one of the top 20,000 websites on earth (according to Amazon's Alexa website ranking tool).</p>
<p>In this book, we will not focus on the "how to install WordPress" aspect of blogging. We will also not discuss how to build your own blogging software. (That's a fun exercise, but not as important as what I'd like to discuss.)</p>
<p>This book will instead focus on developing the right mindset. It will also show you how to get systems in place so that you can run your blog over a long period of time.</p>
<p>The hard part of blogging is doing it sustainably. How do you blog in such a way that you can publish consistently? How do you become a household name in your field? How do you hold your audience's attention over time?</p>
<p>A lot of bloggers struggle with these challenges. There are so many blogs out there with 1 or 2 posts. Or the last post is from 2018 saying "Sorry I haven't published for a long time." With planning and execution, you can prevent this from happening to your blog.</p>
<p>Also, you may be wondering how relevant blogging is in the 2020s. After all, YouTube, TikTok, and Instagram get a lot of headlines in the news. Well I'm here to tell you that blogs are still powerful when it comes to content marketing and getting organic traffic from Google.</p>
<p>The main goal of the book (and yes, you can read the book in its entirety here) is to help you get started with blogging in the right way. So grab a beverage and a comfortable chair. And bookmark this page so you can come back and review, in case you can't finish it in one sitting.</p>
<p>And if you prefer, <a target="_blank" href="https://flaviocopes.com/page/book-blog/">you can download a PDF and ePub version of this <strong>How to Start a Blog</strong> book here</a>.</p>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<ol>
<li><a class="post-section-overview" href="#heading-framing-your-blog-for-success">Framing your blog for success</a></li>
<li><a class="post-section-overview" href="#heading-the-benefits-of-having-a-successful-blog">The benefits of having a successful blog</a></li>
<li><a class="post-section-overview" href="#heading-pick-a-goal-for-your-blog">Pick a goal for your blog</a></li>
<li><a class="post-section-overview" href="#heading-own-your-platform">Own your platform</a></li>
<li><a class="post-section-overview" href="#heading-make-the-first-step">Make the first step</a></li>
<li><a class="post-section-overview" href="#heading-solutions-to-common-problems">Solutions to common problems</a></li>
<li><a class="post-section-overview" href="#heading-content-is-king">Content is king</a></li>
<li><a class="post-section-overview" href="#heading-practical-content-suggestions">Practical content suggestions</a></li>
<li><a class="post-section-overview" href="#heading-create-a-system">Create a system</a></li>
<li><a class="post-section-overview" href="#heading-how-to-get-people-to-your-blog">How to get people to your blog</a></li>
<li><a class="post-section-overview" href="#heading-expand-your-reach-with-an-email-list">Expand your reach with an email list</a></li>
<li><a class="post-section-overview" href="#heading-ups-and-downs">Ups and downs</a></li>
<li><a class="post-section-overview" href="#heading-making-money-with-a-blog">Making money with a blog</a></li>
<li><a class="post-section-overview" href="#heading-final-words">Final words</a></li>
</ol>
<h2 id="heading-framing-your-blog-for-success">Framing your blog for success</h2>
<p>People communicate and share information over the internet. We use it to look for help. Maybe we try to find the perfect recipe for dinner or the best book we should read this month.</p>
<p>A blog is a tiny website, made by one or a handful of people, with the goal of creating information that will help people.</p>
<p>On this blog, you will write posts. A post is a single page of the website containing some information.</p>
<p>The concept of a blog I'll talk about in this book is different from a diary, where you write about everyday things as they happen. That is something you can definitely do, but it's not what I'll be talking about here.</p>
<p>By blog, I mean a personal site, or a product/company site, where you regularly produce interesting content that can be beneficial to other people.</p>
<p>You want people to be able to find the solution to their problem on your blog.</p>
<p>I want to highlight this point because it's central. Your blog should be useful to other people. Without this fundamental concept, your blog has no reason to exist.</p>
<h3 id="heading-why-a-blog-does-matter">Why a blog does matter</h3>
<p>Blogs are the fundamental building block of today's internet. Think about it: we have giant corporations that create walled gardens that people are constantly drawn to, like Facebook, YouTube, Instagram, and Twitter.</p>
<p>Those are places that are engineered get you addicted so that you consume, debate, consume, debate, consume. And if you are in the lucky 1‰, you will be one of the stars of those walled gardens, and you will profit from other people consuming, debating, consuming, debating, consuming.</p>
<p>What are those people consuming? Well, aside from the content, they're consuming their time.</p>
<p>With notable exceptions, much of the content created and shared on the internet isn't useful. </p>
<p>But a blog is one of those rare places on the Internet where you can create something of value without a giant corporation benefitting from your work. You are the owner of your little corner of the world.</p>
<p>I'll soon tell you more about the "own your platform" concept, but here's the gist: a blog matters because it's 100% yours.</p>
<h3 id="heading-is-blogging-still-relevant">Is blogging still relevant?</h3>
<p>This is a legit question. Is blogging still relevant in today's world, dominated by social media and big platforms?</p>
<p>Can the underdog still find some space on the Internet? Don't we have too many sites already?</p>
<p>First, we'll never have too many sites. There's less than 1 person creating content for every 100 people. This is a rule for all media consumption: there are ~100 TV or radio stations in a country with 100 million people. Same for newspapers.</p>
<p>The same goes for the Internet. If you start creating, and you do your job well, eventually your content will surface and you will have success. Whatever success means to you.</p>
<p>This is possible with videos on YouTube, podcasts, and blogs, of course.</p>
<p>So why should you start a blog instead of making videos? It's a choice. We can't all be good at making videos, and we can't all have a voice made for podcasts. Similarly, we can't all be good at writing.</p>
<p>But if you happen to enjoy writing and you like the idea of having your own little corner on the Internet, then creating a blog might be what you are looking for.</p>
<h3 id="heading-should-i-have-a-personal-blog-or-a-companyproduct-blog">Should I have a personal blog or a company/product blog?</h3>
<p>If you are a freelancer, working solo, or you are a solopreneur, a company of one, you might have a tough decision ahead: should you create a personal blog or a company blog?</p>
<p>There's a big distinction in this. In my opinion, a personal blog is way better because companies and projects come and go. You might sell your company in 3 years.</p>
<p>Your personal brand, however, will stick with you wherever you go. The advantage I find in a personal brand is that you have the ability to experiment and pivot, if necessary. </p>
<p>If you create a brand that's too tied to a product or area, you can't switch without changing the name and domain, so it can be very confusing to people and it's very hard to make it work nicely.</p>
<p>And most likely you'll have a hard time finding a good idea, at first, so it’s always good to have more than one option. That way you don't have to start from zero.</p>
<h3 id="heading-why-a-blog-and-not-videos-or-podcasts">Why a blog and not videos or podcasts?</h3>
<p>In the last few years, videos and podcasts have grown tremendously.</p>
<p>Videos, in particular, are very popular. Kids want to become YouTubers when they grow up.</p>
<p>Both videos and podcasts are awesome. I watch YouTube every day and I am subscribed to several podcasts, too.</p>
<p>There's one thing I noticed about those platforms, however. Podcasts are very hard to discover. I only discover new podcasts if I see one mentioned somewhere. Or by word of mouth.</p>
<p>And in addition to having great content, as a podcast owner, a person's voice tone is a differentiating factor that makes me like a podcast or not. You are either born with a great podcasting voice, or you're not.</p>
<p>With videos, it's the same thing. A creator's personality is a unique differentiating factor in a great YouTube channel.</p>
<p>Plus, videos, if made well, require a huge effort in time, energy and equipment you need.</p>
<p>A blog, on the other hand, is something you can make no matter who you are, as long as you can write. You don't need to have that uniqueness that makes you liked on YouTube, and you are not trapped on one platform (YouTube). You also have a great channel for organic discovery of your blog posts (Google). More on this later.</p>
<p>But you don't have to choose one over the other, of course.</p>
<p>Many times creators use a blog alongside a YouTube channel, or a podcast. This is helpful if you use it more than just to cross-post content from one channel to another, but as a complementary tool.</p>
<p>When done well, it's a powerful combination.</p>
<h3 id="heading-define-who-your-blogs-readers-are">Define who your blog's readers are</h3>
<p>A blog that's successful and useful to other people is a blog that has a readership in mind.</p>
<p>I'm sure you've stumbled upon those blogs or sites that talk about a little bit of everything.</p>
<p>It all seems very random, and you don't find a reason for coming back to that site, so you forget about it.</p>
<p>If you happen to visit a website that talks just about your favorite topic, you might save it for later in your bookmarks, or leave the tab open to go back to it later.</p>
<p>This happens because the owner of the site is not just writing about everything that comes to mind: they have a specific kind of person they are talking to.</p>
<p>And this is what you should do, as well. Carefully define the kind of person you want to talk to with your blog.</p>
<p>You have to pick a niche.</p>
<h3 id="heading-how-to-pick-a-blogging-niche">How to Pick a Blogging Niche</h3>
<p>Picking a niche is how you can define what your little corner of the internet will be all about.</p>
<p>It can be all about you, your hobbies, passions, and stories. But then not many people will find it very useful. Maybe one post can solve their problems, but will they ever come back? Probably not.</p>
<p>Because your blog's not about you, it's about your readers.</p>
<p>Pick a niche. A small subject.</p>
<p>Say you're a programmer. You can write a blog about the C++ programming language, write 2 posts a week, and never run out of topics for 20 years. It's probably even a niche that's too broad, not much of a niche.</p>
<p>A better niche would be C++ programming for embedded devices. Or using C++ to build games.</p>
<p>Then filter out this group of people a little bit more. Using C++ to build a 2D game engine. </p>
<p>You can write about that for years, too, but this time if a person is interested in this subject, they will bookmark the site and download everything they can because you are the expert (or at least more of an expert than they are) and they can get a lot of value from you.</p>
<h3 id="heading-blogging-is-a-a-marathon-not-a-sprint">Blogging is a a marathon, not a sprint</h3>
<p>I want to give you another concept that will frame your blog for success: it’s not a sprint, it's a marathon.</p>
<p>As with everything in life, creating a successful blog takes time.</p>
<p>Creating a blog, per se, is a matter of hours if not minutes. This is why everyone can start a blog.</p>
<p>But creating a successful blog, depending on what you consider "success", can take years, and not many people welcome this fact with joy.</p>
<p>People like immediate, fast success. It almost never happens, unless you are very lucky.</p>
<p>Consider blogging to be your marathon.</p>
<h2 id="heading-the-benefits-of-having-a-successful-blog">The benefits of having a successful blog</h2>
<p>We all have limited time to dedicate to our hobbies, families, and friends. So why should you set aside a number of hours every week to work on your blog? And it's not just a few hours here and there. If you want the blog to be successful, you have to dedicate a lot of time.</p>
<p>As with everything in life, you have to evaluate the pros and cons.</p>
<p>Let's analyze the benefits.</p>
<h3 id="heading-personal-satisfaction-and-gratification">Personal satisfaction and gratification</h3>
<p>First, blogging gives you personal satisfaction and gratification.</p>
<p>Many people like to build puzzles or to do crosswords during their free time. Or they like to tinker with woodworking or electronic gadgets.</p>
<p>Writing on your blog can give you the same feeling.</p>
<p>Plus, it gives you a sense of accomplishment.</p>
<p>Writing a blog post can be easy sometimes.</p>
<p>Other times it's really hard, maybe because of the subject, or maybe because you can't find your way through your writing.</p>
<p>But when you finally finish it, it's a really good feeling.</p>
<h3 id="heading-you-can-get-your-name-out">You can get your name out</h3>
<p>Another thing that a blog can give you is discoverability.</p>
<p>When people search your name on Google, if you write under your own name people will find your blog as the first result. This gives a great impression at a job interview, for example. </p>
<p>And even if you are currently employed, having a blog is like an extension of your personal brand that can help you be perceived as a more knowledgeable person.</p>
<p>It's like writing a book. A book that no one reads is one thing – but writing a successful book that is read by many people is a completely different thing.</p>
<p>Blogs follow the same rule. Some blogs are not very popular, maybe due to the subject or other factors (we'll see more about this later). But some blogs are successful, and others are wildly successful.</p>
<h3 id="heading-you-can-get-in-touch-with-more-people">You can get in touch with more people</h3>
<p>By writing on your blog, you can publish things that are read by people all around the world, and your work can possibly help them achieve what they want.</p>
<p>Not only this is great for personal satisfaction and fulfillment. It's also a great way to be perceived as an expert in your field.</p>
<p>And the more people you can reach and impact, the better it is for you (and them!).</p>
<h3 id="heading-a-blog-is-your-platform">A blog is your platform</h3>
<p>Your platform, your launchpad. In today's world, there's just too much noise.</p>
<p>We are bombarded with information from every medium, and it's really hard, as a creator, to stand out.</p>
<p>A blog can be a great starting point for your next project, your next adventure, your next (or first) company. It's yours.</p>
<p>The goal of any product is to be used by people.</p>
<p>Lots of people, possibly. Not everything can "change the world" Silicon Valley-style, but your little project, product, or service can have a big impact on a tiny slice of the people it targets.</p>
<p>But the first steps are always hard, including finding a good idea.</p>
<p>Your blog can be the way you find the initial users for something that you find worth creating.</p>
<p>Put the idea out there. See how people react to it.</p>
<h3 id="heading-you-can-become-an-active-part-of-the-community">You can become an active part of the community</h3>
<p>In every community, there is a small number of people that lead, a slightly bigger number of people that contribute, and a larger number of people following.</p>
<p>Think about the community you are in. The 1%, or 0.1%, work on the "core". They organize an event,  build a software project, host a podcast, work on a product. Another 9% will participate and be an active part of the community around it. 90% of the people will just consume.</p>
<p>As a blogger, even if you're not in the 1% that lead, because you don't want that responsibility or power or you can't make the commitment, you can still contribute. You can add your input, and be heard in a world that is eager for people that want to stand out.</p>
<p>Write about that thing you are so enthusiastic about. Create a helpful resource. People will be really grateful for that. Including the 1% or 0.1% that lead but that do not have time, resources, or will to create those resources.</p>
<p>A notable example is Jeffrey Way. He created Laracasts to build training screencasts for Laravel, a programming framework that was gaining traction.</p>
<p>He’s now an integral part of the framework ecosystem and a driving force for its popularity.</p>
<h2 id="heading-pick-a-goal-for-your-blog">Pick a goal for your blog</h2>
<p>You can start a blog for multiple reasons. No one has the same ambitions, the same drive, or the same starting point.</p>
<h3 id="heading-you-want-to-get-a-job">You want to get a job</h3>
<p>One goal for a blog might be to help to get your first job.</p>
<p>Suppose you are getting ready for your first rounds of interviews as a Junior Frontend Developer. As you are learning the technology and experimenting, maybe following an online course, you document everything you are learning.</p>
<p>I think this is great for 3 reasons:</p>
<ol>
<li>you reinforce your learning</li>
<li>you build up an online presence</li>
<li>you get better at documenting and explaining technology</li>
</ol>
<p>As you approach the interview and send out applications, companies will see that you have a website. They'll find that you are great at explaining technology, you know how to communicate, and you definitely know your stuff.</p>
<p>And this is a great advantage over any other job applicant that does not have a website.</p>
<h3 id="heading-you-want-to-get-a-raise-or-a-better-job">You want to get a raise or a better job</h3>
<p>If you already have a job, you might want to step up your career and get better pay, or switch to another niche in the field you are interested in.</p>
<p>Having a blog that positions you as an expert in the thing you want to work on is definitely a big plus.</p>
<p>You can leverage your blog at your current company to reposition yourself as a senior developer.</p>
<p>Your colleagues will look up to you and your writing and will perceive you as an authority in the field.</p>
<h3 id="heading-you-want-to-get-bettermore-clients">You want to get better/more clients</h3>
<p>If you are not interested in getting a job and prefer being the independent freelancer with a queue of prospect clients lined up, blogging can be a game-changer for you.</p>
<p>I experienced this first-hand when I started my career in tech.</p>
<p>I started my career by finding work on freelancing sites. It was hard to compete with freelancers all around the world who were much more experienced than I was in many cases. And sometimes they were located in a lower cost of living area, which allowed them to provide the same service at a fraction of my rates.</p>
<p>I started a blog about the subject I was specializing on, an open-source CMS, written in Italian, my own language, and people from Italy slowly started to perceive me as an expert. They were more than willing to pay a premium to work with a person that spoke their language, worked in their timezone, and was one of the few experts in the field in the country.</p>
<p>My blog was key to this because people searched for topics they knew they needed help with – and they found me.</p>
<p>At some point, I was even able to turn down client proposals because I had too many requests. I could choose the ones that I believed were better for my business and more interesting to me.</p>
<h3 id="heading-you-want-to-demonstrate-your-expertise">You want to demonstrate your expertise</h3>
<p>A common benefit to either getting a job or freelancing clients is this: a blog helps you demonstrate your expertise and expose what you know to other people.</p>
<p>Some people are more naturally inclined to show off their abilities.</p>
<p>Sometimes, depending on culture and perception, we can even think of them as more capable than what they really are.</p>
<p>Some other people are less inclined, perhaps because of introversion or shyness.</p>
<p>Blogging is a great way to demonstrate your expertise even if you're not naturally inclined to raise your hand in public. This is because it's a medium that has very low friction compared to, for example, creating videos that show your face on YouTube.</p>
<h3 id="heading-you-want-to-document-your-learning">You want to document your learning</h3>
<p>A great goal for your blog could be to document your learning. Perhaps being more competitive in the job market is not something you are interested in right now, or you just want to write about your hobby.</p>
<p>A blog is a great track record for everything you learn.</p>
<p>I have a terrible memory, for example, and sometimes I just create a blog post to remember how I made something work.</p>
<p>I used to write notes on an app on my computer, but now I default to blog posts because I realized I can help other people by publishing my notes on the Internet.</p>
<h3 id="heading-you-want-to-structure-your-thoughts-and-learn-more">You want to structure your thoughts and learn more</h3>
<p>The way I used to learn best back in school was by creating very detailed notes about a subject.</p>
<p>However I only made them for subjects I was interested in, which in retrospect explains why I was good in some classes and bad in others.</p>
<p>You can use your blog as a way to learn better.</p>
<p>I am a huge proponent of learning through blogging because it works.</p>
<p>I use blogging as a way to learn a subject and at the same time help other people.</p>
<p>When I write a new blog post I am forced to create a mind map of the subject and I try to frame it, before writing about it.</p>
<p>In this way I learn much more than I do when I read a book or watch a course without taking organized notes about it. And as a side benefit, I end up with a new blog post I can publish.</p>
<h3 id="heading-you-want-to-become-better-at-explaining-things">You want to become better at explaining things</h3>
<p>A great benefit of blogging is that over time you'll become better at explaining things.</p>
<p>You will take fewer things for granted, and you'll think more from the point of view of the person who is listening to you, rather than just writing a bunch of words to be perceived as an expert.</p>
<p>This will help you tremendously in your career and as a person.</p>
<h3 id="heading-you-want-to-grow-your-audience">You want to grow your audience</h3>
<p>A great benefit of having your own blog is that over time you'll start to build an audience.</p>
<p>As with many things, the more time you dedicate to it, the more your audience will likely grow.</p>
<p>People might get to know you. Recognize your name. You will not become famous (except in rare cases), but this might not be what you want, either.</p>
<p>That's not what an audience is for. And honestly, I see many developers raise an eyebrow when marketing subjects come into play.</p>
<p>An audience is a great place to test your ideas. An audience can help you figure out something. An audience is your group of people, the people that trust you and that can help you move to the next level.</p>
<h3 id="heading-you-want-to-express-yourself">You want to express yourself</h3>
<p>A blog does not need to be a means to an end.</p>
<p>My favorite blogs are the ones that are playgrounds for creativity and expression. Especially when applied to programming and computers in general.</p>
<p>A blog is a great way to have a track record of all your past creative projects.</p>
<p>Your own centralized creative hub.</p>
<h2 id="heading-own-your-platform">Own your platform</h2>
<p>Your blog is the operational center for your future. Your platform, your headquarters. Everything else should bring you to your site. </p>
<p>Your Facebook page, YouTube channel, Twitter, Medium, your guest posts on other blogs, and the content you stream – all are tools to connect people with the content of your site on the Internet.</p>
<p>The website can be made with any technology you want. It does not really matter, provided that it’s on a domain that you own, and that you can change as desired.</p>
<p>You should have complete freedom over it: you have to be able to contact your users whenever you want, you must be able to extract all the data from this platform. Also, whenever you want to, you should be able to move away to a different platform with all your content.</p>
<p>Lastly, you do not have to be at the mercy of other people decisions.</p>
<h3 id="heading-the-platforms-of-other-people">The platforms of other people</h3>
<p>There are many ways to sell online. For each type of product, there are a number of options, and while sometimes you can sell things in the way you want, sometimes you need to work with a platform managed by someone else.</p>
<p>For example, if you sell digital books, you will, of course, sell them on Amazon Kindle, which probably represents 80% of the market.</p>
<p>Do you sell physical products? In addition to your own e-commerce, you will want to sell them on Amazon too, as it’s a huge market opportunity.</p>
<p>Do you make mobile apps? You will need to sell them on the App Store if you target Apple users, or on Google Play for Android.</p>
<p>Here, in some of these examples, it is clear that sometimes you have choices and sometimes you have to take a mandatory road to actually sell something. </p>
<p>You can’t distribute iPhone apps through your site. If you build desktop applications for Mac, on the other hand, this is possible, but you might also want to join the Mac App Store, which in this case is optional. Apple sets the rules, but it gives you some visibility that you would not get without being in the App Store.</p>
<p>All these great distribution systems such as the App Store, Amazon, Kindle, and many others like Etsy or Alibaba, are platforms. Other people’s platforms.</p>
<h3 id="heading-benefits-of-using-a-platform-managed-by-other-people">Benefits of using a platform managed by other people</h3>
<p>There are, of course, benefits to using a platform managed by other people. It provides a virtually limitless user base, customers visiting the platform already have an account, and in many cases they just need to press the buy button.</p>
<p>In general, not managing your own platform saves you worry about having to manage a huge number of things.</p>
<h3 id="heading-disadvantages-of-using-a-platform-managed-by-other-people">Disadvantages of using a platform managed by other people</h3>
<p>But there are disadvantages of using a platform, as well. You have to comply with the rules the owners impose, and the customers are not yours – they are the platform's customers. So you might struggle to create a relationship with your customers.</p>
<p>You also have little room for your branding, as everything could change from one day to the next. In some cases you have little control over your prices, and you'll have to pay commission to the platform for each sale you make.</p>
<h3 id="heading-the-platform-sets-the-rules">The platform sets the rules</h3>
<p>A platform is not just the place where people turn into customers, but it is also the place where you can find and interact with them. Facebook, Instagram, and Twitter are platforms, phenomenal platforms, but still platforms built by others.</p>
<p>A few years ago, having a Facebook page with 10,000 fans and writing a message on the page was enough to show this message to a vast percentage of those people. Unfortunately, this has changed today because the Facebook platform has changed. Now we are lucky if we reach 10% of our audience.</p>
<p>The only way to reach more people who like your page is to sponsor posts. So you have to pay Facebook to communicate with your own fans: this is an example of what it means to build on another property.</p>
<p>This is not to say that you should not have a Facebook page, that you don’t have to invest in Facebook Ads, or that you do not have to interact with people on Twitter.</p>
<p>You should do these things if you're trying to build an audience. The market imposes them on you, because you find people in these places. But always try to use these large containers to find people and bring them to you. </p>
<p>And it's important to always have a way out of a platform, and not to be completely dependent on it.</p>
<p>To do this, you have to push users to come to you through all the channels you can take advantage of.</p>
<p>You have to create your own platform.</p>
<h3 id="heading-use-your-own-domain-name">Use your own domain name</h3>
<p>Your domain name is very important. I use my own name for the domain: <a target="_blank" href="http://flaviocopes.com">flaviocopes.com</a>.</p>
<p>Your domain is like your address.</p>
<p>Except that a real-world address changes when you move somewhere else.</p>
<p>Your domain, on the other hand, is yours forever, regardless of your physical location. Like your email address.</p>
<p>When you publish things on your own website, under your own domain name, you are building virtual real estate and generating value that can last for years if not decades.</p>
<p>The way things work for search engines, now and for the foreseeable future, is that quality links pointing to your website make the domain more valuable.</p>
<p>If you publish under a domain name that's not yours, you are effectively working for other people, in exchange for something that might appear convenient for you, like a nice way to create the first page. </p>
<p>But if you take the time and put in some work beforehand to set up your own site and get your own domain, it can pay you a lot more in the future.</p>
<h2 id="heading-make-the-first-step">Make the first step</h2>
<p>The first step is always the hardest. In anything you want to do. Running. Coding. Cooking. Blogging.</p>
<p>In this chapter, I want to make sure you are well equipped for your first step when you’re ready to dive into blogging.</p>
<h3 id="heading-pick-a-domain-name">Pick a domain name</h3>
<p>There is one very important thing you need to do before you can create your blog. You need to choose a domain name.</p>
<p>You can notice 3 patterns for domain names. People have their own name/surname combination like I do with <a target="_blank" href="http://flaviocopes.com">flaviocopes.com</a>. Some people like to have a fantasy name or their nickname. Totally fine, too.</p>
<p>If it's cool and you can create a brand out of it, it's great. Like <a target="_blank" href="http://codinghorror.com">codinghorror.com</a>. Other people like to have a more general brand, like <a target="_blank" href="http://css-tricks.com">css-tricks.com</a>.</p>
<p>The good aspect of this is that people know the content of the blog just by looking at the domain. The downside is that you are kind of forced to stick to that topic forever. </p>
<p>For example, <a target="_blank" href="http://css-tricks.com">css-tricks.com</a> has long stopped talking exclusively about CSS, and other topics like JavaScript, SVG and others are very often covered.</p>
<p>This is kind of controversial, but I think your own name, or brand name with no direct attachment to anything specific, is the best and most future-proof way to create a domain name.</p>
<p>With one caveat: if you use your own name, you'll never be able to sell the site to someone else, or transform it into something "more" than just yourself with some guest posts here and there. But there are notable exceptions as well, like <a target="_blank" href="http://raywenderlich.com">raywenderlich.com</a>.</p>
<p>If you create a specific domain name that reminds people of a technology or hobby in particular, on the plus side you'll be able to sell it when it's successful to a bigger brand.</p>
<p>I started posting on my blog frequently by talking about the Go programming language. I later switched to a completely different programming language, JavaScript. </p>
<p>But because I used my own name and domain, I did not have to change anything. If I had a domain name like <em>startprogrammingingo.com</em> or something similar, there's no way I could've just switched to talking about JavaScript, or Arduino. </p>
<p>The whole project would have sunk because the day I stopped my work on Go, the site would just end its life with that very specific domain.</p>
<p>Since I use my own name for the domain, whatever I want to write about 10 or 20 years from now will be perfectly fine.</p>
<p>If you already have a domain, maybe used in old projects, and you think it can work fine, that's even better.</p>
<h3 id="heading-domain-authority">Domain Authority</h3>
<p>There's something called domain authority that is really important. Because that's how Google determines your site's value, and it's fundamental in how Google ranks web pages in its results.</p>
<p>One factor in domain authority is the domain's age. Older is more stable and more trustworthy to Google. </p>
<p>And when you're creating your domain, try to get the longest expiration date you can. That's a factor, too. Google basically detects your seriousness with the project. If your domain expires in 3 years and a competitor's in 3 days, maybe your domain is better in the long term. </p>
<p>I mean, we can't really know how the Google algorithms work, but we can try and make sure we tick all the checkboxes.</p>
<p>That can make the difference between a site that's never visited, and one that gets 10 visitors a day. Or one that gets a few hundred visits a day to one that gets tens of thousands.</p>
<h3 id="heading-choose-a-blogging-software-dont-build-it">Choose a blogging software (don't build it!)</h3>
<p>I personally use Hugo to power my blog. It is built using Go, it is very fast, and has some limitations on the things you can do. This means I can avoid distractions and I can focus on the writing.</p>
<p>I see many people, especially developers, who start creating their own blogging software from scratch.</p>
<p>I think that this a bad idea.</p>
<p>Why?</p>
<p>Because the moment you start is the time that you have the most energy. There will not be another moment in the lifetime of your blog where you'll have the same enthusiasm and drive to work on it.</p>
<p>And if you channel this energy towards something so futile, in this case, like building the software, then when it's time to actually write the content you'll have very little time, very little energy, and very little drive to craft great content.</p>
<p>Plus, you'll have to work on bugs, handle updates, and more, on your own. It's much easier to let others work on maintaining popular software used by thousands of people rather than reinventing the wheel.</p>
<h3 id="heading-choose-a-minimalistic-stock-design">Choose a minimalistic stock design</h3>
<p>The second mistake, I think, is to work on the design before working on the content.</p>
<p>Just as developers like to build their own software, design-oriented people want to create their own design. It's logical, I get it. But in this scenario, at the beginning, it's just a distraction.</p>
<p>My suggestion is: pick a stock theme, the simplest you can find.</p>
<p>The more minimal the theme is, the better.</p>
<p>Remember to keep the focus on the content. Not on the blog engine, not on the theme, not on plugins...on the content.</p>
<p>I have a couple blogs built using the default Ghost theme, which look very professional. In the niche they are built in no one knows what Ghost is – let alone do they know that it's the default theme.</p>
<p>Also, no one cares. Except you.</p>
<p>You can work on the design later on. There's always time for that.</p>
<h3 id="heading-create-the-first-3-posts">Create the first 3 posts</h3>
<p>Right after you have your blog idea, write the first 3 posts. You can write them in a normal plain text editor, and move them later to the blog platform you chose. </p>
<p>I like to use Bear (<a target="_blank" href="https://bear.app">https://bear.app</a>) to create my drafts. It autosaves, it is beautiful and intuitive to use. But it does not really matter. The thing I want you to focus on is those 3 posts.</p>
<p>Why exactly 3 posts?</p>
<p>Because now that you are so pumped to create your blog, it's the easiest time to write 3 great posts. If you create only one, maybe the second will be deferred until tomorrow, then to the day after.. and you'll be left with a blog with a single post.</p>
<p>Two posts... kinda the same. 3 posts seem like a good number to me.</p>
<p>Once you have those 3 posts, it's time to publish them. My advice, in this case, is not to publish them all together at the same time. Instead, you should schedule them.</p>
<h3 id="heading-schedule-the-first-3-posts-in-advance">Schedule the first 3 posts in advance</h3>
<p>I've had several people ask me how can I be so consistent with my blogging. The best suggestion I have is to create a habit. Habits are a very hip and popular topic nowadays, with many books published on the subject.</p>
<p>I'm not an expert, but I noticed that once a habit is established, it's really hard to break it.</p>
<p>Use this little hack to force yourself to write blog posts. Once you decide your perfect schedule (twice a week, once a week, twice a month, once a month...) then schedule the 3 posts you wrote so that you make a little buffer. </p>
<p>Suppose you write once a week. Publish the first post immediately, the second next week, the third the following week.</p>
<p>Now, you can relax and have a little party because you can launch the blog. Plus, you already have content written for the next 2 weeks and you can start planning other posts.</p>
<p>All the other posts you will write will be queued after the posts you wrote in the beginning.</p>
<p>Don't be tempted to add a new post in the middle of your planned schedule: there will be times when you can't write due to limited time, or you will have a low energy week. The buffer will be helpful to keep a consistent publishing schedule.</p>
<p>One thing that is key here is this: once the schedule gets full enough and you can look back at a long streak of posts, all very consistent in their publishing date, and you will start to feel a little pressure to not break the streak.</p>
<p>Transform this little pressure into a positive push towards staying consistent. If you have a weekly publishing routine, at the end of the year you will have 52 blog posts written, which would be a major accomplishment.</p>
<h3 id="heading-keep-going-this-way">Keep going this way</h3>
<p>If you do the things I mentioned in this chapter and you just keep going, you will have 99% more success with your blog than anyone else.</p>
<h2 id="heading-solutions-to-common-problems">Solutions to common problems</h2>
<h3 id="heading-who-am-i-to-write-about-this">Who am I to write about this?</h3>
<p>Let's say you are a student. By writing about the subject you are studying, you can reinforce your learning. Writing things down forces you to learn it really well.</p>
<p>Put your ego in chains: people don't care about you. People care about solving their problems. At least on their first point of contact with you, opinions, politics and controversial statements are detrimental to the user experience.</p>
<h3 id="heading-i-dont-know-enough-of-the-subject">I don't know enough of the subject</h3>
<p>You don't need to be an expert.</p>
<p>When I write a technical blog post, it does not really matter if I'm an expert at it. On the contrary, if I'm an expert in a field and I'm trying to write an introductory or beginner-friendly topic, I might not be able to explain that topic very well. This is because I cannot think like a beginner might when they don't know a topic, and so I might assume too many things and not explain that topic well.</p>
<p>If you're not an expert, do your best to absorb a topic and explain it to people that don't know about it. If you're an expert, on the other hand, writing content for other experts might be a good approach. Then you can mostly leave the entry-level content to people that might be in a position to explain it better.</p>
<h3 id="heading-analysis-paralysis">Analysis paralysis</h3>
<p>Just get it out there. Publishing a piece of content is much better than keeping it for months, revisiting it, thinking and thinking about it. Just do it.</p>
<p>It's ok to plan, but make sure you don't get trapped by analysis paralysis. The longer you think about it, the longer it will take you to start. Focus that energy on finding 3 good articles to write. That's the start.</p>
<h3 id="heading-dont-be-afraid-of-failing">Don't be afraid of failing</h3>
<p>Resistance is telling yourself that you are not good enough, that you will fail. This happens because you're about to do some creative work, you are about to be exposed to the public, to the opinions of others, and others will think you are not good enough.</p>
<p>Resistance is a powerful force. Especially if you write opinions or personal facts in your blog.</p>
<p>I have two suggestions.</p>
<p>The first is to talk about a topic that cannot be judged. Pick facts. No one can rant that a fact is not correct. Explain something you learned recently.</p>
<p>The second suggestion is to read <em>The War of Art</em> by Steven Pressfield, which is a mandatory read, in my opinion, for everyone trying to do creative work. It really goes into the root causes of resistance, and why you feel it.</p>
<h3 id="heading-i-am-not-good-at-writing">I am not good at writing</h3>
<p>Are you sure? Or is this just an excuse to bail out of the work that will open so many doors for you, and get back to your room?</p>
<p>This might be resistance kicking in, giving you a nice excuse for not writing.</p>
<p>Are you good at making videos, or feel great at talking to a microphone? Then make videos or start a podcast instead, but don't try to avoid any work that makes you vulnerable to the other people, just because you fear it.</p>
<p>But if you are <em>really</em> not good at writing, your writing will get better in just one way: by writing more.</p>
<h3 id="heading-i-dont-know-english-very-well">I don't know English very well</h3>
<p>If you want to write for an international audience in the western world, then you should blog in English. I highly recommend doing so, but in some cases, it might make more sense to write in your native language. </p>
<p>For example, if the niche you chose is too crowded and there's no one talking about it in your native language, then it might be an interesting opportunity to position yourself as an expert</p>
<p>If you'd like to blog in English, don't take a lack of English knowledge as an excuse. First, if you are reading this book, then it means you can read English and if you can read it, you can write it.</p>
<p>Also, unless you explicitly write for native English speakers, most of your readers might not be native English speakers, either.</p>
<p>If you are afraid your English is not good enough, and never start practicing, it will never become good.</p>
<p>My suggestion is to just start, and have someone who's really good at English review your posts, so you can learn over time.</p>
<h3 id="heading-dont-give-up-too-early">Don't give up too early</h3>
<p>Most blogs fail. This is a harsh truth. Blogs are abandoned, people forget to renew the domain name, people move on.</p>
<p>Blogs get into this situation because people gave up. They gave up on writing content consistently and frequently, because they did not see immediate gratification from doing so.</p>
<p>If you want your blog to have the chance to become successful, you have to give it the time it needs, and you need to be prepared right from the start.</p>
<h3 id="heading-dont-be-overwhelmed">Don’t be overwhelmed</h3>
<p>It's too easy to be overwhelmed by all the things you need to do. In addition to your day job and your family and friends, you need to find the time to blog. </p>
<p>But blogging is not just writing. You need to find the perfect image for that post, you need to share the post on social media, you need to reply to comments, think about future post topics, craft that perfect and eye-catching post title...the list never ends.</p>
<p>It's easy to feel overwhelmed.</p>
<p>That's why I take a minimalistic approach to blogging, which involves no pictures at all unless they're needed in the content of the post, and no comments. </p>
<p>Not having to manage comments frees up a lot of time and mental energy. It also has a nice side effect: I don't have to worry about what people think of my articles. I just focus on the writing.</p>
<h3 id="heading-one-step-at-a-time">One step at a time</h3>
<p>Don't think you have to rush and do everything at once: open the blog, write 100 posts, create a Twitter account, a Facebook page, an Instagram account, make YouTube videos… it's just too much. </p>
<p>Start with the simplest thing you can do, create a habit, make that habit stick in your day to day and expand from there.</p>
<h2 id="heading-content-is-king">Content is king</h2>
<p>Content matters. Content is the thing that matters the most, in the context of your blog.</p>
<p>Let's discuss some of the things I believe are fundamental pillars in a content-centered blog strategy.</p>
<h3 id="heading-write-to-your-people">Write to your people</h3>
<p>Let's say you are great at cooking. Write about your craft: cooking tips, ingredients, recipes, talking to other people that love cooking. Do you love knitting? Write for other knitters about techniques and everything new that you learn about knitting. Love dogs? Create a blog for dog owners.</p>
<p>Anything you do, the important thing is that you identify a group of people that are as passionate as you about a subject, and you write for them.</p>
<p>There's no value in what you write if it's not valuable to other people. Sure, you can write about something that's only appreciated by you, perhaps. But then there's no purpose in spending so much time and effort creating blog posts, is there?</p>
<h3 id="heading-focus-on-creating-value">Focus on creating value</h3>
<p>Once you identify the people you want to write to, it's key for you to focus on creating value. </p>
<p>Value can take many different forms, of course. It could be how-to posts. It could be sharing your specific experience with some technology. It could be teaching other people how your raw meat diet for your dog works. </p>
<p>It could be telling everyone about your recent trip and what you visited, in detail, so that when someone is searching for tips as they are organizing a vacation, they can find your useful information.</p>
<p>There is no fixed rule on what creates value.</p>
<p>Here's what I do to create value for the readers of my blog: I create easy-to-follow tutorials, written with a beginner's mindset. I do not take the perspective of an expert while writing them. </p>
<p>To do so, I learn a new thing, so I'm not an expert in it, and I create a practical guide. </p>
<p>I know it's very difficult as an expert to write for beginners about the thing we're expert in. This is because we've forgotten what it means to be a beginner and we make too many assumptions, forgetting to mention essential things that are key to understanding a topic.</p>
<p>Other times I describe how I fixed a problem that I just solved while working on some coding project. My memory is very fresh and I can remember what it's like to have the problem, so I can describe it very clearly.</p>
<p>Sometimes I create less practical posts where I talk about things that relate to my experience as a developer, or common struggles, or tips for productivity, for example. Those are the posts that are normally appreciated the most by my readers.</p>
<h3 id="heading-focus-on-being-useful-and-solving-problems">Focus on being useful and solving problems</h3>
<p>Your posts must solve a problem: each post on your blog must have a very specific goal.</p>
<p>This is key, and the post title must perfectly address the problem and solution.</p>
<p>When people search for how to solve that problem, you want your post to be in the top results.</p>
<p>And your content must be awesome.</p>
<p>Exactly what they are looking for.</p>
<p>Focus on creating the absolute best, most valuable content.</p>
<h3 id="heading-write-the-blog-post-that-would-have-helped-past-you">Write the blog post that would have helped past you</h3>
<p>One of my favorite things is writing a blog post that contains the solution to a problem I just solved.</p>
<p>Everyone else solves a problem and moves on.</p>
<p>If you dedicate 10 minutes to document how you solved the problem you had, you are helping other people that might have this problem next week, or next year, or 10 years from now.</p>
<p>They will be thankful that you wrote something that helped them.</p>
<p>And perhaps you can even help yourself in the future.</p>
<p>Sometimes I google for a problem and I find my own post, written many months ago. I completely forgot that I wrote it.</p>
<h3 id="heading-what-not-to-write-about">What not to write about</h3>
<p>One thing I recommend that you not write about is anything that doesn't help other people.</p>
<p>It's difficult to draw a line in the sand, but you should think about what you are writing.</p>
<p>Don't think of a blog like a diary. You <em>can</em> use it like a diary, posting your rants or opinions or what you ate for dinner.</p>
<p>But is it really helping or creating any value for other people?</p>
<p>I personally only try to write about things that I assume will help anyone. Even if a post helps just one person, then it's a good post for the blog.</p>
<h3 id="heading-teach-everything-you-know">Teach everything you know</h3>
<p>I learned this mantra, or motto, from Nathan Barry. He's famous for his book <em>Authority</em> and for being the founder of ConvertKit, a great tool for bloggers that have the need to build a newsletter.</p>
<p>He has this notion that building an audience is the secret hack to creating a successful business, and I really believe that. And to build an audience, the best way is to share, in one way or another, everything you know.</p>
<p>He did that in the form of books, first with two books about design, as that was his specialty. Then he wrote everything he learned about selling those books in another book.</p>
<p>I make my living teaching everything I know, and since there's a finite amount of things I do know at any finite point in time, I had to transition to teaching everything I learn. </p>
<p>I found that many people like the way I talk about stuff, with a very simple approach, and this beginner-oriented point of view has been beneficial to me.</p>
<p>Your approach can be different, but the “teach everything you know” mantra is one that you need to seriously think about.</p>
<h2 id="heading-practical-content-suggestions">Practical content suggestions</h2>
<p>After discussing why content matters, and why you should focus on creating great content, it's time to talk about some practical suggestions.</p>
<h3 id="heading-content-length-how-much-is-enough">Content length, how much is enough?</h3>
<p>It does not matter how long your articles are.</p>
<p>The Internet is full of marketing blogs that tell you the content must be 2000+ words long, 10000+ words long, and so on.</p>
<p>But it does not matter as long as your content solves a problem for a person.</p>
<p>I have posts that solve the problem in 50 words, and if this is the solution to someone's needs, that's great!</p>
<p>There is no need to dilute the content with useless words, and I'm sure you immediately notice when a blog post is trying to transform a 5-line answer into a 200-line one.</p>
<p>The same thing happens with videos, right? You are looking for something, but you need to watch 15 minutes of intro to get to the meat of the subject.</p>
<p>Do the opposite. Do what's great for your readers.</p>
<p>Plus, Google does not care.</p>
<h3 id="heading-keep-posts-focused">Keep posts focused</h3>
<p>When I say that Google does not care about content length, it's because I've observed this first-hand.</p>
<p>Some of my most visited blog posts are very short, yet they take a problem and they solve it, quickly.</p>
<p>And Google notices it. The key is solving a problem. Google notices that you are helping it help its users, and that's what happens when you keep your posts focused on a specific topic.</p>
<p>Some topics will perform better than others, some might be less popular, but as long as it's focused on a little problem and it solves it, it's great.</p>
<h3 id="heading-dont-try-to-appeal-to-everyone">Don't try to appeal to everyone</h3>
<p>You can't write great content for everyone. Pick your ideal person, or group of people, and write for them.</p>
<p>Pick your crowd.</p>
<p>Pick your tribe.</p>
<p>Ignore everything else.</p>
<h3 id="heading-dont-aim-for-perfection">Don't aim for perfection</h3>
<p>Done is better than perfect.</p>
<p>This is my mantra. As long as what I do is technically correct and does not have errors, it's all fine.</p>
<p>You don't need to overthink it. Focus on being good enough. That's when the point of diminishing returns starts.</p>
<p>Most of the time, good enough is already better than 95% of what's out there.</p>
<p>Don't let chasing perfection limit your production volume.</p>
<h3 id="heading-it-does-not-matter-if-someone-already-wrote-about-it">It does not matter if someone already wrote about it</h3>
<p>There are thousands of water brands. Thousands of brands of wine and beer. Thousands and thousands of hotels.</p>
<p>The more people write about a subject, the more interest there is around it, and the more people read about that subject.</p>
<p>If no one wrote about something, it might not mean you are a pioneer or “first", it might just mean no one cares about that topic.</p>
<h3 id="heading-you-dont-need-to-bring-something-new-to-the-table">You don't need to bring something new to the table</h3>
<p>If you worry that you don't have a unique spin on something, or a revolutionary idea, you might be limiting yourself.</p>
<p>Often, a 1% or 5% improvement over something that's already out there is enough.</p>
<p>Google was not the first search engine. It just worked better.</p>
<p>Basecamp was not the first project management tool. It just worked better.</p>
<p>Focus on being better, not new.</p>
<h3 id="heading-you-can-blog-about-anything">You can blog about anything</h3>
<p>I am a programmer and I blog about programming. If you’re a programmer too, you don’t just have to blog about programming.</p>
<p>There’s space for everything.</p>
<p>The topic does not matter, as long as you are passionate about it. There's no way you can force yourself to write about one subject for a long time without burning out.</p>
<p>Anywhere there’s a problem, you can bring solutions.</p>
<p>For me the niche was programming, for you it might be something else. Also, programming is even a bad niche as most developers consider even a little bit of marketing to be spam and mostly hate receiving emails (as they're using email every day and probably already receive a lot of it).</p>
<p>I think blogging, properly done, can be even more successful in less technical topics. It can work, as long as people search for those topics on the internet and have a place where you can find them like a big subreddit, a big Facebook group, or a popular online forum.</p>
<h2 id="heading-create-a-system">Create a system</h2>
<p>I am an engineer and I believe in systems. Humans are weak. Systems are strong. Humans with a system are on a good track.</p>
<p>If only we could have a system for our blog, everything would be simpler.</p>
<p>Turns out that we can definitely have a system, and in this section, I'm going to explain the system I use.</p>
<p>It might not be the perfect system for you, and I won’t pretend it’s a system that works in 100% of the cases. But it's a starting point, and by tweaking it you can create your own perfect system.</p>
<p>A system makes you consistent.</p>
<h3 id="heading-consistency-is-key">Consistency is key</h3>
<p>Why is consistency so important?</p>
<p>Because consistency is deeply entrenched in our lizard brains.</p>
<p>You are the one that makes one blog post every Tuesday. You're not the one that <em>tries</em> to write a blog post consistently each week. You're the one that just <em>does</em>.</p>
<p>It's not me, Flavio, saying so.</p>
<p>Let me share something from Robert Cialdini, author of the amazing book <em>Influence</em>: </p>
<blockquote>
<p><em>Once we have made a choice [...] we will encounter personal and interpersonal pressures to behave consistently with that behavior</em>.</p>
</blockquote>
<p>Once you have a series of 5, 10, 20 weeks of posting, you automatically become the one that posts every week. Or twice a week, or whatever schedule you chose.</p>
<p>That's the key to the system: consistency.</p>
<p>Have you ever heard of Rand Fishkin's Whiteboard Friday? That was a great video series about SEO that came out every Friday. Do you know about FunFunFunction? MPJ releases one video every Monday. Every one of his fans knows and waits for his "good Monday morning" every week. </p>
<p>I’m sure you know YouTubers that post on a pre-determined day. Like Saturday or Tuesday.</p>
<p>Everyone can find the time to create a blog post every week. But not everyone is willing to put in the work to create something every week. Will you?</p>
<h3 id="heading-schedule-posts-ahead-of-time">Schedule posts ahead of time</h3>
<p>As we just discussed, the single best thing you can do with your blog is stay consistent.</p>
<p>But staying consistent is hard.</p>
<p>One of the easiest ways to become inconsistent is to miss a day because you were sick, or because you went to a party, or because you took a vacation.</p>
<p>When you miss a day, and you forgive yourself for this, you will miss other days.</p>
<p>That's what I would do. If I let one day slip by without a post, well… nothing bad happens and I have a track record of missing one post.</p>
<p>Before I realize it, I am sure I will miss other posts, too. Just because I was too lazy one day, I ruined the consistency of my blog and now it's impossible to get that perfect streak of posts back.</p>
<p>How do you prevent that? By scheduling posts ahead of time.</p>
<p>Before you start publishing your blog, before unveiling it to the world and announcing it everyone, write 3 posts as we discussed before, and start building up your queue.</p>
<h3 id="heading-have-a-queue">Have a queue</h3>
<p>When I first started my blog, I discovered the notion of creating a queue by accident.</p>
<p>I happened to work on another project of mine, one that didn't take off as I expected it to.</p>
<p>This project involved creating some long guides, about topics I cared about.</p>
<p>So when I decided to shut down the project, I thought that it was a shame to abandon those long guides to their unknown fate.</p>
<p>So I cut each chapter into several blog posts, and I got about 15-20 of them.</p>
<p>I could have published them all on that day, but I randomly decided to queue them up. One today, one tomorrow, and so on.</p>
<p>A couple of days after that, I had an idea for a new post. I was a blogger now, right? And I queued it after all those posts.</p>
<p>The queue has never dried up since then, over 700 days ago. Some days I reached the end of the queue and I had to fill it up again from zero, but I never missed a day.</p>
<p>I just attribute this result to the system – the queue I've built up, and the shame that would result from having written all those posts in the past and then stopping.</p>
<p>I could not stop.</p>
<h3 id="heading-pick-a-schedule-frequency-you-can-sustain-over-the-long-run">Pick a schedule frequency you can sustain over the long run</h3>
<p>One key part of this scheduling and queuing system is frequency.</p>
<p>How frequently should you post?</p>
<p>My recommendation is to post with a frequency you can maintain over time, consistently.</p>
<p>Start with one day per week. Create a queue, as I suggested, and see if you can maintain this frequency over 2-3 months. Once you start having a queue that's too long, say a blog post you write today will be published 3 months from now, then you can start increasing the frequency.</p>
<p>It's always best to scale up the frequency than to post less frequently because you can't sustain the frequency you initially set.</p>
<p>The reason I focus a lot on consistency and frequency is that people get used to it and they learn to expect a post from you, and they look for it.</p>
<p>If you start missing posts and not sharing information as frequently, then people don't know when to expect a new post from you, and they feel lost and disconnected.</p>
<p>This happens with everything. I notice it with videos.</p>
<p>If you watch YouTube videos frequently, what do you think when a YouTuber that posts every day, and you watch every day, suddenly stops posting for a week?</p>
<p>I subscribe to a YouTuber that posts every Saturday, and every Saturday, unless I am out doing something, I'm there, at noon, watching his video.</p>
<h3 id="heading-ignore-quantity">Ignore quantity</h3>
<p>If you know beforehand that you have 3 hours a week to dedicate to blogging, don't force yourself to create too many posts.</p>
<p>Do one post a week, but do it well. Don't create many posts that are irrelevant or low quality, create one that you can be proud of.</p>
<p>Quality is perceived, and people will associate your worth with the quality of your work.</p>
<p>Be known for creating high quality and helpful content.</p>
<h3 id="heading-focus-on-the-process-not-the-outcome">Focus on the process, not the outcome</h3>
<p>One recommendation I have to be productive is to focus on the process.</p>
<p>I am focused on creating the blog post.</p>
<p>I am focused on creating ebooks.</p>
<p>I am not focused on how many people will read the blog post, or if they will like it.</p>
<p>That's not something I have control over. The best thing I can do is focus on my work and make sure it is the best work I can perform today.</p>
<h3 id="heading-keep-the-process-lean">Keep the process lean</h3>
<p>When thinking about my process, I like to simplify it.</p>
<p>I want to remove all the friction I can remove.</p>
<p>It all needs to be simple, fast, streamlined.</p>
<p>I don't want roadblocks.</p>
<p>I try my best to remove all the resistance and all that powers resistance.</p>
<p>There should be nothing between me and writing a great blog post.</p>
<h3 id="heading-keep-a-list-of-topics">Keep a list of topics</h3>
<p>I don't always have the time to write about something.</p>
<p>Sometimes I have an idea for a topic, and I write down the title of the article in my favorite writing application.</p>
<p>When it's time to write a new blog post, and I don't have an idea ready, I go through the list of titles and find one that is appealing to me in that specific moment.</p>
<h3 id="heading-capitalize-high-energy-days">Capitalize high energy days</h3>
<p>Some days I have really high energy for writing blog posts. Some days I have very little, if any, energy.</p>
<p>On those days when I have the fire, I can write a few blog posts in a row and code the rest of the day (as that's my job). I have fuel for everything.</p>
<p>I capitalize on those days. I sit there and I might write 5 posts, and put them in the queue.</p>
<p>The days I have low energy I am thankful for those high energy days and I am thankful that I did everything I could to get the most out of them.</p>
<h2 id="heading-how-to-get-people-to-your-blog">How to get people to your blog</h2>
<p>Having a blog is great and all, but having a blog that people actually read is deeply satisfying.</p>
<p>There’s a problem though: how do you get people to read your blog?</p>
<h3 id="heading-how-blog-traffic-works">How Blog Traffic Works</h3>
<p>In today's world, if you are not producing valuable and consistent content, you are invisible. There are just too many things pushed at us every day.</p>
<p>I dedicate from 30 minutes to 1 hour every day to the Internet. That means Social Media, mostly Twitter, RSS and content aggregators.</p>
<p>I always see the same people. Those people that are highly successful keep pushing out great content.</p>
<p>It might be an inspiring tweet, a great blog post that's shared a lot, or something that's just worth reading.</p>
<p>Unless you perform at the same level, you are not appearing in my feed because I only give it limited time. And I assume the vast majority of people do the same. People don't just spend the whole day on social media waiting for you.</p>
<h3 id="heading-share-your-work-where-the-people-are">Share your work where the people are</h3>
<p>Sharing your content is a great motivator especially when your blog is young and you don't have an audience yet (more on this later).</p>
<p>In this situation, you can't rely on organic traffic. To avoid losing motivation, it's key to get your first views by sharing your content. </p>
<p>You can do 2 things: share it with your own audience on social media, if you have an audience already, or use sites that provide an audience and try your luck.</p>
<p>Those sites include Reddit, Hacker News, Medium, and forums that specialize in the topic you are talking about. Word of caution: you might have your feelings hurt in some of those venues, so just be prepared for criticism.</p>
<h3 id="heading-organic-growth-is-the-only-reliable-solution-for-long-term-traffic">Organic growth is the only reliable solution for long term traffic</h3>
<p>You might have the proverbial lucky day, and your blog post goes viral in places like Reddit, Hacker News, or on Social Media.</p>
<p>But the key factor for your blog is organic traffic.</p>
<p>Organic traffic means Google will receive a search from a user and will decide that it should show them your blog post.</p>
<p>Organic traffic is a key factor to every website. Social media traffic is generally low quality, hard to get, and hard to maintain over time.</p>
<p>This is a long process. Google needs to trust you, and it can take some time.</p>
<p>My best suggestion to give Google a reason to show your blog posts is to consistently solve people’s problems.</p>
<h3 id="heading-solve-peoples-problems">Solve people’s problems</h3>
<p>How do you get Google (and other search engines) to send loads of traffic to your website?</p>
<p>What matters to Google is that it satisfies its own users.</p>
<p>And those are people searching.</p>
<p>People search in order to solve their own problems.</p>
<p>I see SEO people who suggest that you write 3000+ posts to rank on Google.</p>
<p>That’s a great tip if their goal is to discourage you from writing more. They call it long-form content.</p>
<p>Now, as a non-SEO person, but as a person that does things and observes what works and what doesn’t, I can say that if you solve a problem for a person with a 4-line blog post, Google will thank you by sending you more people who have that problem.</p>
<p>They know using their algorithms when a person found the answer they needed. This is Google’s job. Their job is to solve people’s problems by providing the perfect content they are looking for.</p>
<p>If you can provide that, Google will help you.</p>
<p>Not every post on your blog can solve a problem, of course. But if you have posts that solve problems, you’ll start to notice, as those are the posts that will get the most visitors.</p>
<p>Not every post must be small of course, and if long-form content is best for you, do that.</p>
<h3 id="heading-the-importance-of-links">The importance of links</h3>
<p>When we were talking before about choosing a good domain name, I mentioned domain authority. I said that an old domain name will likely have more domain authority.</p>
<p>What is domain authority?</p>
<p>Domain authority is a sort of score that search engines use to set the importance of a website, and it's determined by many different factors. The specific algorithms and metrics used are not publicly available, but there's one thing which is key to domain authority: links.</p>
<p>The more links to it that a website has, the more authority it has. But it's not that simple. The more authority the domain has that the link comes from, the more important the link is.</p>
<p>Links have very different weights. A link coming from Wikipedia has more power than a link from a random tweet. And search engines do take social metrics into consideration, too. We can't know for sure, but a link in a tweet from an influencer in your field has more weight than a tweet from a Twitter bot account.</p>
<p>Google (I say Google because it's the most important search engine, but others might do a similar thing) is also careful about the topic. If I link to a kitchen recipe site from my computer programming blog, that link is not going to have much value. </p>
<p>If a famous kitchen recipe blog links to a smaller kitchen recipe blog, then that's more relevant for Google, and it will give that link more meaning.</p>
<p>When it comes to links, it's important to get links from relevant and on-topic websites.</p>
<p>This is only something you can get by providing great and useful content.</p>
<h2 id="heading-expand-your-reach-with-an-email-list">Expand your reach with an email list</h2>
<p>Let’s discuss how to augment the experience you create for your blog visitors by using an email list.</p>
<h3 id="heading-what-is-an-email-list">What is an email list?</h3>
<p>Blogs are closely linked to newsletters and email lists. The two often go hand in hand.</p>
<p>A newsletter is the most effective way you can get in touch with your blog readers over time.</p>
<p>If you are not already familiar with the email list concept, you may be wondering whether in the era of Facebook, Instagram, Snapchat, and Twitter if you still need to use an old-style system like email.</p>
<p>In fact, email is a fundamental tool for any online business. Blogs are no exception.</p>
<p>Sending emails to a list of customers is not a system by which people commonly spam, as you might be thinking.</p>
<p>Especially if you're a developer, you need to realize that email is useful, you are not evil for sending emails, and that people want to hear from you.</p>
<p>Email is a cool system where people interested in your content or products can have more information about them, or about new products that you could provide in the future.</p>
<p>Email marketing is one of the most effective systems with which people are converted over time from visitors to customers: people in your list have explicitly asked to receive more information from you in the future.</p>
<p>This does not mean sending an email after 8 months asking them to buy your new product. Instead, the right way to approach this is to ask yourself how you can help your customers, in a consistent way.</p>
<p>Through the list, over time you can build customer loyalty, you create a relationship, and you keep in touch.</p>
<p>Your task with the list is to train people on the subject you are talking about, and to foster anticipation about upcoming news. But try to keep the focus on the customer rather than on you. Remember that a person will not be on your list forever – just as long as you can keep interest high.</p>
<p>So how do you get a person to join your email list in the first place?</p>
<p>With a small gift, called the lead magnet, which can be for example a report, a free ebook, exclusive access to premium content, an email course, or really any gift you can make.</p>
<p>The concept is simple, but it is crucial that the gears that make up this mechanism are calibrated to perfection and oiled regularly. Don't leave anything to chance if you do not want to be amateurish in the eyes of your customers.</p>
<p>It’s fundamental that you offer people what they want. The email list is considered by most online business owners as the most important asset of a business, and the only one that really is 100% yours.</p>
<h3 id="heading-a-typical-use-of-an-email-list">A typical use of an email list</h3>
<p>Let's look at an example. This is the system that most successful blogs use: </p>
<p>a person reaches your site coming from search engines or Facebook. Then a popup appears (more or less invasive) with the request that they enter their email to get a small gift. Then you’ll send them the gift via email, and the person enters this cycle where they will be offered a variety of products over time.</p>
<p>Usually, when a person gets on your list, they enter a phase called the <em>funnel</em>. The funnel is an automated process of warming, that is, the person get "heated" and is brought from being a random visitor to becoming a possible customer via a series of emails.</p>
<p>As soon as the person signs up, they will receive an email. The next day they will receive another, after 3 days another one, all according to predetermined logic. </p>
<p>Typically, these e-mail series terminate after 7-8 mails where a story is told and in the end, they will be offered a product to purchase. If the person doesn't buy right away, emails will continue to flow, and so on until the automated sequence ends.</p>
<p>There are many kinds of different sequence types and usually people do not invent anything new. Instead they use well-tested systems (which you can easily recognize once you are trained).</p>
<p>Once this sequence is over, the person's email is placed in another sequence, or in the general list, which is no longer automated. Then, the person managing the list (you, for example), will send an update email from time to time, say once a month, to make sure the person don’t forget about them.</p>
<p>In short, the author of the list tries to sell a product but if the recipient does not buy it, they will still remain in the list until they cancel the subscription. Because you never know – in the future they could decide to buy and become a customer.</p>
<h3 id="heading-how-to-use-an-email-list">How to use an email list</h3>
<p>Of course, there are several approaches to the list. Let's see some situations that you could apply in your case.</p>
<p>If you sell an ebook: your users are therefore your readers. You could add a link to your site, and use as a lead magnet a free ebook on a topic that you know the user is interested in. </p>
<p>On the list, you could initially present an upsell of other ebooks you've already written. Then you could insert the person into your monthly email, where you'll publish interesting links to the topic, and from time to time promote your new ebooks.</p>
<p>If you sell a product: for an info-product, it's the same process as a typical example used on blogs. Maybe as a lead magnet you use one or more chapters, or you have a video or something else related to the subject.</p>
<p>If you have a software product: the list could be made up of all the people who bought your software if you sell to them directly, which gets you their emails. Or you may want them to sign up for your application. </p>
<p>You could use the list to share updates, inform about the latest releases, cross-promote with other developers, and raise awareness on new products you’ll build over time.</p>
<h3 id="heading-where-to-host-your-email-list">Where to host your email list</h3>
<p>To manage an email list you need a specialized software.</p>
<p>There are many different kinds of email newsletter management tools.</p>
<p>Some are simple. Some are way too complex for your needs. You just need to find the perfect one for you.</p>
<p>The first separation I want to make is between self-hosted software and SAAS. Sendy (<a target="_blank" href="https://sendy.co">https://sendy.co</a>) is an example of a self-hosted software. You don't pay a monthly fee to use it, but you have to manage your own server, and you use a service, typically AWS, to actually send the emails.</p>
<p>ConvertKit is an example of a tool that is SAAS based. You pay them a monthly fee, and they take care of everything.</p>
<p>That tool, in particular, is targeted at bloggers, and it's really well made. I have used it for almost 2 years, and it's really great.</p>
<p>I have recently moved to Sendy, self-hosting my newsletter, because at some point the price, for me, was not sustainable.</p>
<p>To start with, I would definitely recommend ConvertKit. You don't need to overthink spending $29 or $49 a month if that's valuable to you.</p>
<p>But my list became big enough and I was not comfortable spending a lot of money on my email list hosting software.</p>
<p>And it's a business tool: I know several top-performing bloggers with great audiences that use it for lists in the hundreds of thousands, and I'm sure that the ROI (Return on Investment) is well worth not having to manage your own server.</p>
<p>Especially if you are new to managing servers.</p>
<p>ConvertKit is not the only service, of course. There's Mailchimp, Drip, and others.</p>
<p>Some tools let you start free. I think of TinyLetter (https://tinyletter.com/). That's what I started with, in the beginning, until I reached a few hundred subscribers. Then I moved to a tool called ButtonDown and I went from there.</p>
<h3 id="heading-keep-it-alive">Keep it alive</h3>
<p>As with blog posts frequency and consistency, the best advice I can give about mailing lists is to keep them consistent.</p>
<p>Do you write every 2 weeks? Fine. Keep doing it.</p>
<p>Do you write every month? Fine. Keep doing it.</p>
<p>The exact frequency is really personal. Some people write a new email for every post they make on their blog.</p>
<p>Some people email once a month with the list of posts. If you write once a month, however, people might forget who you are. This happened to me: I might subscribe to a newsletter and forget about it if you don't email me quite frequently.</p>
<p>Since I write one post per day, I found my sweet spot at one email every week, on Tuesday, and I always respect this frequency.</p>
<p>People know that Tuesday is "email from me" day.</p>
<h3 id="heading-the-lead-magnet">The lead magnet</h3>
<p>We discussed how having a newsletter is essential. It's also essential to have people signed up for it.</p>
<p>How can you have people decide to give a thing so precious as their email address to you?</p>
<p>The best way I know is to give them something in return. Don't expect people to sign up without a clear gain for them</p>
<p>You need to give an incentive to people to sign up for your newsletter.</p>
<p>This is the lead magnet that we discussed briefly earlier.</p>
<p>It can be a 1-page PDF cheat sheet. A report. A short mini-course of 10 videos. An email-based course.</p>
<p>The sky is the limit when it comes to what the lead magnet should be.</p>
<p>And there is no reason you should only have one lead magnet. You can have multiple.</p>
<p>In the ideal case, every blog post should have a specific lead magnet, but this is of course not always possible. I tend to create a lead magnet for each category of posts I'm writing.</p>
<h3 id="heading-how-i-discovered-lead-magnets">How I discovered lead magnets</h3>
<p>At the beginning of my blogging adventure (a little more than 2 years ago), my blog had zero traffic and Google ignored me.</p>
<p>I shared my posts on Reddit, and some people came and saw the site. I shared my posts on Twitter, where I had like 500 followers, many of them probably bots or inactive followers that I had collected in the 10 years I had been on Twitter.</p>
<p>If I had 10 or 15 visits a day, that was a good day.</p>
<p>After a while, I decided to create a newsletter, with a simple promise: every 2 weeks I'd send you links to all the posts I published. Like everyone does. That was good to get an email subscriber every other day, but that was it.</p>
<p>After some months, traffic grew a little and I was getting 4-5 subscribers every day. This was better.</p>
<p>Then I realized that people will not subscribe to a newsletter if they don't gain an advantage from that. This is a key point. I rarely subscribe to a newsletter just to “stay in touch”. Sometimes I do, and when this happens to you, that’s a quality email subscriber. Someone that really wants to hear from you.</p>
<p>But to get to this level requires people to have received a lot of value from you already, in one way or another. Maybe they already subscribe to your YouTube videos or your podcast. It’s hard for a complete stranger to subscribe.</p>
<p>So I changed my strategy from asking to "Join my newsletter" to offering people something of value. This lets the conversation begin with me offering a valuable asset.</p>
<p>In my case, the valuable asset, in the beginning, was a little PDF with a collection of the best blog posts I had written on a subject, nicely organized as an ebook. </p>
<p>Most people coming to my blog didn’t read more than one page, so I thought that creating a nice little ebook was a good way to show them what I had to offer. This increased signups a lot.</p>
<h2 id="heading-ups-and-downs">Ups and downs</h2>
<p>Having a blog is not all fun and games. There are many things that might give you a hard time on your journey.</p>
<p>Realizing this is a first step in the right direction.</p>
<h3 id="heading-writers-block">Writer's block</h3>
<p>Writer's block is a thing. I have no general advice on this, and whole books were written on the subject so there's a lot of better advice out there than what I could come up with.</p>
<p>My solution when it comes to not knowing what to write about is to pick a subject I want to learn, and start learning it in public. Right as I write this, I am learning a completely new thing (Arduino and electronics sensors) while re-discovering the old electronics topics I studied back in school.</p>
<p>I am shooting videos while I learn this thing, and writing blog posts on the topics that are better suited for blog posts (no, I'm not limiting myself to blogging, I also like doing videos).</p>
<p>If a topic is boring to me, I just don't write about it because if I'm bored writing, I will write a boring article. So I try to write about things I'm interested in and excited about.</p>
<h3 id="heading-imposter-syndrome">Imposter syndrome</h3>
<p>Every person, sooner or later, is going to suffer from this thing which we label <em>imposter syndrome.</em> You might have this feeling now, but you don’t know that it has a name attached.</p>
<p>Let me describe some situations where you might find imposter syndrome in the wild.</p>
<p>You are a developer, have no Computer Science degree, and you feel people that have the CS degree know a lot more than you, and you should get one too in order to be called a developer.</p>
<p>You work on a project and you call it a little side project, not a real project, because – you know – it’s just a simple app.</p>
<p>You constantly belittle yourself, and have low confidence in your abilities.</p>
<p>You think other developers know a lot more than you do.</p>
<p>You think someday someone will find out that you are not worth your job position, as you can’t solve the coding interview quiz #423 from a random book.</p>
<p>You think you don’t belong to the <em>coder’s club.</em></p>
<p>In the case of blogging, you’d like to start blogging but you fear other’s opinions and even think that you can’t add anything new to the table, so you don’t even start.</p>
<p>What's the solution to this problem?</p>
<p>I don't know if it applies to you, but when I start to feel this way, I try to put myself in the learner's shoes. I am not teaching. I am learning in public. Most of the time.</p>
<p>If this is not enough, realize how far you have come from where you started. Look back. There was a day when you could not even figure out how to start the computer. What code even was. You didn’t know you could actually create programs and make the computer do what you want.</p>
<p>Look at you now. You are the best version of yourself and yet you can be perfectly sure that tomorrow you’ll be an even better version. You are improving. Just like your blog posts.</p>
<h3 id="heading-working-in-public">Working in public</h3>
<p>Working in public can be nerve-wracking. Well, it <em>is</em> for me. You don't really know who is watching your work, and what they really think of it.</p>
<p>You're one step away from an intolerant expert judging your work as not relevant.</p>
<p>And maybe the creator of a library is looking at your tutorial on it, thinking you didn't get it right.</p>
<p>But looking at the opposite side of the spectrum, by learning in public you are forced to grow.</p>
<p>Step up the game.</p>
<p>You need to put a lot of effort to make your work great in the eyes of a lot of people.</p>
<h3 id="heading-burnout">Burnout</h3>
<p>It's easy to feel overwhelmed by all the things you are doing. Thinking about new content, writing the actual content, writing guest posts, trying to promote the content as much as you can – but without being spammy, and replying to comments and feedback.</p>
<p>This is not unique to blogging, of course. I have seen this even more in the YouTube space. There, it's even worse to me. You are putting your face and voice in front of a lot of people, instead of just your words and pictures like in a blog post.</p>
<p>My best advice to avoid burnout is to choose a minimalistic approach and to pick a topic that deeply interests you.</p>
<p>If you write about things you are passionate about, you will never have a shortage of things to write about. Your list will be 3 miles long.</p>
<p>Choosing a minimalistic approach means that you have to cut down anything that's not essential. I do not have comments on my blog. I need to care less about what people <em>think</em>, which has the drawback of creating less community, but also has the positive of causing me less stress.</p>
<p>Also, I do not generally promote the content I write on social media or other outlets, except if it is a special article that I really want to be seen, and I do not usually write guest posts on other blogs.</p>
<p>Such activities can be limited once the blog is up and running and you get a fair share of visits every day. So with the increase of views and stress given by many people looking at your work every day, you get the benefit of focus.</p>
<h3 id="heading-lower-your-expectations">Lower your expectations</h3>
<p>If you keep your expectations low, you will never be deluded. Don't expect your blog to be an overnight success. It will not happen. Just like it does not happen with a YouTube channel or a podcast. It's hard. Except for some lucky ones, maybe.</p>
<p>This is why blogging about things you are passionate about is beneficial. If you write about things you always wanted to write about, and will even write if no one is reading, then you are on the right track.</p>
<p>Then if success will ever come to you, you'll be more than ready for it.</p>
<h3 id="heading-trolls-and-negative-feedback">Trolls and negative feedback</h3>
<p>The Internet can be a wild place, and I am sure I don't have to explain this to you. When people write comments online, they can be mean. Sometimes. Most of the time they are not. </p>
<p>I do not have comments on my blog directly, but I do receive feedback via email and on Twitter. And on YouTube videos.</p>
<p>And the rare day I get one blog post featured on Reddit or Hacker News, two sites relevant for my content, I get very stressed about looking at comments.</p>
<p>It must be me, and most of the times comments are wildly positive, which is great. But I heard somewhere that our brain is much more receptive to negative feedback, and I can certainly confirm that I remember bad feedback more than positive feedback. It can take 10 positive comments to make up for a single negative one.</p>
<p>I might be over-sensitive but removing comments altogether from my blog removed the handbrake. I do not have to worry if some content does not resonate with people.</p>
<p>I wrote it, it's like that, I did my best to make sure it's "correct" to my best judgment, and I am off to the next one.</p>
<p>Your mileage might vary.</p>
<h3 id="heading-ignore-vanity-metrics">Ignore vanity metrics</h3>
<p>I have the incredible experience of having enough visitors to be surprised every day of the number of people visiting the blog. </p>
<p>I open Google Analytics at a random point in time during the day and I see the number of people. Then I get back to whatever I was doing. It's kind of addictive, but also useless.</p>
<p>Does that affect my day? No.</p>
<p>Does that change what I'm going to do next? No.</p>
<p>Same for email subscribers. Does it really matter how many people are on the list? No.</p>
<p>What matters the most is that people resonate with your ideas and learn from your work.</p>
<p>Even if it is just a handful of people.</p>
<p>The rest is useless.</p>
<h3 id="heading-blogging-is-lonely">Blogging is lonely</h3>
<p>Blogging is lonely, in the same way that writing a book is lonely. Also working in your secret laboratory is lonely. Being a YouTuber is lonely. Being a remote freelancer is lonely.</p>
<p>There's not much of a solution for this.</p>
<p>Other than accept it, and realize that some people might be more happy to be lonely. I am definitely an introvert and I thrive in a lonely environment, spending days in the silence.</p>
<p>That's probably why I like blogging.</p>
<h3 id="heading-it-takes-time">It takes time</h3>
<p>Let's say it out loud: it's going to take a lot of time. There is no way that your blog will be an overnight success. It will take many months and possibly years before you will see a rising tide of visitors to your blog. Maybe. If you did it alright.</p>
<p>This is a harsh truth, but it's one I think is necessary because I don't want you to believe that success is easy to achieve, and I want to set the right expectations. Time, persistence, showing up every day. This is what it takes, for any kind of success in any kind of activity.</p>
<p>It's a long game, but one that will eventually give you a lot of satisfaction.</p>
<h2 id="heading-making-money-with-a-blog">Making money with a blog</h2>
<p>A blog can be a great launch point for various projects that can make you money.</p>
<p>There’s absolutely no need for your blog to make money if you don’t want it to. But it’s good to know what your options are. In this last chapter, I’m going to explain at a high level the main options for “monetizing” a blog.</p>
<h3 id="heading-get-more-clients-for-your-business">Get more clients for your business</h3>
<p>The first and easiest way, I'd say, is to offer your services.</p>
<p>This especially works with non-location specific services. For example, if you are a plumber it might be harder. Not impossible, especially in large cities, but other channels could work better.</p>
<p>But if your business or activity is not linked to a specific location, a blog can be a great promotion for your business.</p>
<p>You can write articles that position you as an expert in the field you work in, and people will get in touch using the tools you give them: email, chat, or whatever you want.</p>
<p>I’ve seen this applied countless times, and it can lead to big opportunities in consulting. I have also experimented this first-hand when I started my career.</p>
<h3 id="heading-advertising-affiliates-and-sponsors">Advertising, affiliates, and sponsors</h3>
<p>When your blog starts to gain a consistent number of visitors, that’s when it can make you some money in what’s usually called “passive income”.</p>
<p>There are 3 ways, mostly: advertising, affiliates, and sponsors. This is the difference: advertising is banner or text ads that appear on your page. You typically add a code to the site and then forget about it.</p>
<p>There is a broker, like Google Ads or Mediavine or BuySellAds that will take care of everything for you. They'll find companies that want to show their ads, and their ads will be displayed on your blog. You get paid by ad views and/or ad clicks. It’s the simplest method you can find, although it usually requires a high number of page views to work.</p>
<p>Affiliates work in a different way: you get paid when people purchase a product coming from a link put on your website. </p>
<p>A common affiliate system is Amazon affiliate links. I’m sure you’ve seen them everywhere, under YouTube videos, under Instagram posts, and so on. </p>
<p>When Amazon makes a sale, you get a percentage of that. Same works for other smaller affiliate programs. </p>
<p>For affiliate links, you need to generate a specific link and depending on the frequency you have to do that, and the number of products or programs you promote, it will require more work on your part.</p>
<p>Sponsors work in a different way, and you typically need to get in touch with companies via email or phone. They will usually pay a flat fee for a month (or more) of sponsoring. You typically need to put a banner on the site or talk about their products in your posts.</p>
<h3 id="heading-selling-your-own-products">Selling your own products</h3>
<p>The system I like the most is using the blog to promote your own products.</p>
<p>It’s similar to promoting your services, but with products, it requires less work on your part and it can scale very easily.</p>
<p>Sure, you need a product beforehand. And you need a product that you know will be relevant and useful to people who read your posts.</p>
<p>But once you have it, you can promote it to your readers, without paying for ads, and without having to run an affiliate program yourself. Then, all your work – your blog and your products – are all aligned in the same direction: making useful things for the people you want to interact with.</p>
<h2 id="heading-final-words">Final words</h2>
<p>I hope this book was useful to you, and I really hope it might be the inspiration you need to create your own blog.</p>
<p><a target="_blank" href="https://flaviocopes.com/page/book-blog/">Download a PDF and ePub version of the <strong>How to Start a Blog</strong> book here</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Why You Should Share Your Knowledge as a Developer ]]>
                </title>
                <description>
                    <![CDATA[ Sharing your knowledge can help you improve your skills and level up your career as a developer. Many developers are already doing it, and if you aren't, this article is for you. In it, I will show you why you should share your coding expertise by lo... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/why-you-should-share-your-knowledge-as-a-developer/</link>
                <guid isPermaLink="false">66bb9223add24ba427325105</guid>
                
                    <category>
                        <![CDATA[ community ]]>
                    </category>
                
                    <category>
                        <![CDATA[ community building ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technical writing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gaël Thomas ]]>
                </dc:creator>
                <pubDate>Mon, 27 Sep 2021 17:41:26 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/09/why-you-should-share-your-knowledge-as-a-developer.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Sharing your knowledge can help you improve your skills and level up your career as a developer. Many developers are already doing it, and if you aren't, this article is for you.</p>
<p>In it, I will show you why you should share your coding expertise by looking at five extraordinary benefits.</p>
<p>I have always enjoyed sharing content online and helping others. But today, as a software engineer, I can tell you that it helps me even more.</p>
<p>Recently, I started asking myself about the benefits of doing sharing knowledge. That's how I found five reasons that will motivate you to start today.</p>
<p>Let’s discover them!</p>
<h2 id="heading-youll-gain-a-deeper-understanding-of-what-youre-learning">You'll gain a deeper understanding of what you’re learning</h2>
<p>One of the main benefits of sharing what you know is that you will deep dive into the subjects you want to share with everyone.</p>
<p>This means that you will repeat your learning process in order to best write your technical content. By doing so, you strengthen your knowledge of the subject, and you may even learn something new.</p>
<p>For example, when I'm creating new content, I like to read similar resources before I start writing. This helps me to understand the concept better and write something more accurate and useful.</p>
<p>Then when I publish my content, sometimes I receive feedback that gives me better ways of solving my issue.</p>
<p>This happens to me often when I'm sharing articles about JavaScript, and it's super useful in my own learning process.</p>
<h2 id="heading-youll-help-others">You’ll help others</h2>
<p>Always remember that you're not alone! Many developers encounter the same issue as you and will benefit from your specific way of explaining that issue.</p>
<p>In the beginning, you might feel like you're writing only for yourself. But one day people will start finding your content and they'll learn from and enjoy it.</p>
<p>I recommend using an open publishing platform like Hashnode, Dev.to, or Twitter if you want to get started. These have significant developer communities built around them. People there will support you and give you feedback on your content. It can be an excellent motivation to start!</p>
<p>And once you've done some writing, you can apply to publications like freeCodeCamp's and share your knowledge with the large community they've built as well.</p>
<p>One side note: even if there is plenty of content about a particular topic, please write your own article about it. There is considerable potential that your article will complete or complement what's already out there. Everyone explains things and brings value in their own way.</p>
<h2 id="heading-youll-have-fun-and-discover-new-opportunities">You’ll have fun and discover new opportunities</h2>
<p>Creating content takes time, but it's a fun way to learn. You will improve your skills while building an audience of people with the same interests as you.</p>
<p>I've seen a lot of great stories from developers sharing content on Twitter. The good thing is that the Tech community is generally supportive, and everyone helps each other.</p>
<p>Also, building an audience, or at least sharing content online, can bring you new opportunities. For example, it can help you find and apply for a new job, create a side-project, and even more.</p>
<h2 id="heading-youll-create-a-piece-of-knowledge-for-your-future-self">You’ll create a piece of knowledge for your future self</h2>
<p>Sharing your knowledge is like writing documentation for your work. It helps others – but it also helps you! You can refer later to what you documented and shared if you can't remember how you solved a bug or issue.</p>
<p>As an example, I like to take notes whenever I repetitively search for something on Google. And I know that others are probably searching for the same thing. </p>
<p>So later, I often write an article about that search. It allows me to refer to my content when I need a reminder.</p>
<p>It’s very gratifying when you find your article on Google, and at the same time it helps you and others.</p>
<p>You should give it a try :)</p>
<h2 id="heading-youll-be-more-motivated">You’ll be more motivated</h2>
<p>Last but not least – creating content will help you stay motivated. Sharing your journey as a developer can help you feel like you're making progress in your learning.</p>
<p>I think this is the case because:</p>
<ul>
<li>you will have concrete pieces of content based on what you learned, tested, and built (it helps to keep track of your progress)</li>
<li>you will help others and have their support</li>
<li>you will have fun (enjoying the process = motivation)</li>
</ul>
<h2 id="heading-ready-to-start">Ready to start?</h2>
<p>Hopefully, this article can motivate you to start sharing your knowledge. Start today by sharing your learning journey with the community.</p>
<p>I have primarily written up these benefits based on my experience. I'm pretty sure you can find even more. In any case, you'll have a lot of fun getting started.</p>
<p><strong>If you're interested, <a target="_blank" href="https://twitter.com/gaelgthomas/">follow me on Twitter 🐦</a>! I'll help you to improve your skills as a web developer.</strong></p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
