<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yunus Ertürk</title>
    <description>The latest articles on DEV Community by Yunus Ertürk (@yunuserturk).</description>
    <link>https://dev.to/yunuserturk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F884617%2F54ecbf94-45e2-4f4f-87b5-39dbea0ae71c.png</url>
      <title>DEV Community: Yunus Ertürk</title>
      <link>https://dev.to/yunuserturk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yunuserturk"/>
    <language>en</language>
    <item>
      <title>Use Custom Domain Email On Gmail, with ImprovMX and Sendgrid</title>
      <dc:creator>Yunus Ertürk</dc:creator>
      <pubDate>Sun, 29 Sep 2024 09:50:16 +0000</pubDate>
      <link>https://dev.to/yunuserturk/use-custom-domain-email-on-gmail-with-improvmx-and-sendgrid-168f</link>
      <guid>https://dev.to/yunuserturk/use-custom-domain-email-on-gmail-with-improvmx-and-sendgrid-168f</guid>
      <description>&lt;p&gt;Creating a professional email address using your domain or company's domain name is crucial to publishing credibility for your business or personal brand. In this guide, we'll walk you through setting up a custom email using ImprovMX for email forwarding and SendGrid for sending emails. This approach is straightforward, cost-effective, and doesn't require you to host your own mail server. You can make it totally for free. And i will make you with this guide to my own domain &lt;a href="http://yunuserturk.com/" rel="noopener noreferrer"&gt;yunuserturk.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use ImprovMX and SendGrid?
&lt;/h2&gt;

&lt;p&gt;ImprovMX is a fantastic tool for email forwarding. It allows you to receive emails sent to your custom domain and forward them to your existing email address, all for free. On the other hand, SendGrid provides a robust and reliable solution for sending emails, with powerful APIs that allow you to manage email sending easily. And these are not too much technical stuff to achieve.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You'll Need
&lt;/h2&gt;

&lt;p&gt;Before we dive into the setup, here are the prerequisites:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;A registered domain name&lt;/strong&gt;: If you don't have one, you can purchase one from domain registrars like Namecheap or GoDaddy.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;ImprovMX account&lt;/strong&gt;: &lt;a href="https://improvmx.com/" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; for a free account.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;SendGrid account&lt;/strong&gt;: &lt;a href="https://sendgrid.com/" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; for a free account.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Gmail account.&lt;/strong&gt; I'm sure that you already have 🙂&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 1: Set Up Email Forwarding with ImprovMX
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1. Sign in to ImprovMX&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;After signing up, log in to your ImprovMX account.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;2. Add your domain&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Enter your domain name in the ImprovMX dashboard. ImprovMX will provide you with MX records that you'll need to add to your domain's DNS settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F00d87qa6hwd5aorpib5t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F00d87qa6hwd5aorpib5t.png" alt="Set Up Email Forwarding with ImprovMX" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;3. Update DNS records&lt;/strong&gt;:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fojfhyv2w27ibnuteqcwr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fojfhyv2w27ibnuteqcwr.png" alt="Update DNS records" width="800" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You will see this screen on ImprovMX.&lt;/li&gt;
&lt;li&gt;  Go to your domain registrar's DNS settings (this is usually found in the domain management section).&lt;/li&gt;
&lt;li&gt;  Add the MX records provided by ImprovMX. These records should look something like:

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;MX1.improvmx.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;MX2.improvmx.com&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvuskwowzgv56k0aohghe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvuskwowzgv56k0aohghe.png" alt="Add the MX records provided by ImprovMX" width="800" height="661"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Set the priority to the values you see.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Create forwarding rules&lt;/strong&gt;:
&lt;/h4&gt;

&lt;p&gt;Back in ImprovMX, create a forwarding rule. This will typically be something like &lt;code&gt;hello@yourdomain.com&lt;/code&gt; forwarding to your personal email address.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F493af9lqbynh1j3gnzqz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F493af9lqbynh1j3gnzqz.png" alt="Create forwarding rules" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Verify your setup&lt;/strong&gt;: Once the DNS records propagate (this can take a few minutes to 48 hours), you can send a test email to your new custom address to ensure it's being forwarded correctly.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2 (Easy Way): Set Up Gmail for Sending Emails
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Yo need your account 2FA enabled
&lt;/h4&gt;

&lt;p&gt;For this method to work, first enable your google accounts 2FA and follow this link to create an app password -&amp;gt; &lt;a href="https://myaccount.google.com/apppasswords" rel="noopener noreferrer"&gt;https://myaccount.google.com/apppasswords&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://security.google.com/settings/security/apppasswords" rel="noopener noreferrer"&gt;Create an app password&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Create an App Password&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Google will verify your ownership with this app password. Select "Other (Custom name)" under app, and type "My Domain" as the name. Hit "Generate". Copy and keep it in a safe place!&lt;/p&gt;

&lt;p&gt;Add your email to GmailGo to Gmail -&amp;gt; Settings -&amp;gt; Accounts and Import. Then, select "Add another email address you own" under Aliases.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2t1efjcnhijdzbugbs8j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2t1efjcnhijdzbugbs8j.png" alt="Create an App Password" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Fill in your sender's information
&lt;/h4&gt;

&lt;p&gt;Set your forwarded email (your alias) and your sender's name. Untick "treat as an alias".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjb6hvf95togne7g24ljy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjb6hvf95togne7g24ljy.png" alt="Fill in your sender's information" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Fill in your email informations
&lt;/h4&gt;

&lt;p&gt;SMTP: &lt;strong&gt;smtp.gmail.com&lt;/strong&gt;, port is right already.\&lt;br&gt;
Username: &lt;strong&gt;your gmail address&lt;/strong&gt; (incl. @gmail.com)\&lt;br&gt;
Password: It is the password you generated on Step 2.&lt;/p&gt;

&lt;h4&gt;
  
  
  Confirm ownership
&lt;/h4&gt;

&lt;p&gt;You will receive an email from Gmail asking you to confirm ownership with a code. Open the link, click &lt;strong&gt;Confirm&lt;/strong&gt;, and you are all set!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falc91mggckyrga14vogb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falc91mggckyrga14vogb.png" alt="Confirm ownership" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Send emails from your alias
&lt;/h4&gt;

&lt;p&gt;Now you can just select your alias in the list when you compose a new message.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 (Harder but Better) : Set Up SendGrid for Sending Emails
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Sign in to SendGrid&lt;/strong&gt; and &lt;strong&gt;Verify your domain&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Log in to your SendGrid account.:&lt;/p&gt;

&lt;p&gt;In SendGrid, navigate to the "Sender Authentication" section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fushxgg8o0hoskos04fi1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fushxgg8o0hoskos04fi1.png" alt="SendGrid Sender Authentication" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose "Authenticate Your Domain" and follow the prompts to add the necessary DNS records to your domain.&lt;/p&gt;

&lt;p&gt;These will include CNAME, TXT, and possibly MX records depending on your setup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fin47w784t91hl0ash5mj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fin47w784t91hl0ash5mj.png" alt="DNS Records" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you edit your DNS settings with these setup you will verify and see this message&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3l9h6ekh4zf8itqyxpb4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3l9h6ekh4zf8itqyxpb4.png" alt="Verify Your Domain" width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Create an API key:
&lt;/h4&gt;

&lt;p&gt;Go to "API Keys" under the Settings menu in SendGrid.&lt;/p&gt;

&lt;p&gt;Click "Create API Key" and give it a name (e.g., "Custom Email API Key").&lt;/p&gt;

&lt;p&gt;Save the generated key somewhere secure; you'll need it later.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabr7j9v47jr7knnz5hph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabr7j9v47jr7knnz5hph.png" alt="Create API Key" width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Setup Your Custom Email on Gmail
&lt;/h3&gt;

&lt;p&gt;Now that you've set up ImprovMX for forwarding and configured SendGrid for sending emails, the final step is to add your custom email address to Gmail. This will allow you to send and receive emails using your new domain directly from your Gmail interface. You can see the images above for gmail settings.&lt;/p&gt;

&lt;h4&gt;
  
  
  Open Gmail Settings
&lt;/h4&gt;

&lt;p&gt;Log in to your Gmail account.\&lt;br&gt;
Click on the gear icon in the upper right corner and select See all settings.&lt;/p&gt;

&lt;h4&gt;
  
  
  Go to the Accounts and Import Tab
&lt;/h4&gt;

&lt;p&gt;In the settings menu, click on the Accounts and Import tab.\&lt;br&gt;
Scroll down to the Send mail as section and click Add another email address.&lt;/p&gt;

&lt;h4&gt;
  
  
  Enter Your Custom Email Address
&lt;/h4&gt;

&lt;p&gt;A new window will pop up. Enter your name and the custom email address you set up (e.g., &lt;a href="mailto:hello@yourdomain.com"&gt;hello@yourdomain.com&lt;/a&gt;).\&lt;br&gt;
Uncheck the option to Treat as an alias if you want to keep this email separate from your primary Gmail account.&lt;/p&gt;

&lt;h4&gt;
  
  
  Configure SMTP Settings
&lt;/h4&gt;

&lt;p&gt;In the next step, you'll need to enter your SMTP server settings:\&lt;br&gt;
SMTP Server: smtp.sendgrid.net\&lt;br&gt;
Port: 587 (or 465 for SSL)\&lt;br&gt;
Username: apikey\&lt;br&gt;
Password: Enter your SendGrid API Key here.\&lt;br&gt;
Click Add Account to save the settings.&lt;/p&gt;

&lt;h4&gt;
  
  
  Verify Your Email Address
&lt;/h4&gt;

&lt;p&gt;Gmail will send a verification email to your custom email address.\&lt;br&gt;
Since you've set up ImprovMX for forwarding, this email should arrive in your Gmail inbox.\&lt;br&gt;
Open the email and click the verification link, or enter the confirmation code provided.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0bjwpq7n1k3q4w7iuc2u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0bjwpq7n1k3q4w7iuc2u.png" alt="Gmail Confirmation" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Set as Default (Optional)
&lt;/h4&gt;

&lt;p&gt;If you want to use your custom email as the default sending address, go back to the Accounts and Import tab in Gmail settings.\&lt;br&gt;
Find your custom email under the Send mail as section and click Make default.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Test and Verify Your Setup
&lt;/h3&gt;

&lt;p&gt;With everything set up, send a test email from your custom domain to ensure it's working correctly. You should be able to send and receive emails from your custom address directly within Gmail.&lt;/p&gt;

&lt;p&gt;Now I can both send with my custom domain using both gmail and sendgrid services. If you are not a tech guy you can use gmails service, but I recommend to go with sendgrid!&lt;/p&gt;

&lt;p&gt;Write me anything if you need! Happy good days.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>twilio</category>
      <category>gmail</category>
      <category>mail</category>
    </item>
    <item>
      <title>How to Host WordPress for Free on Vercel: A Step-by-Step Guide</title>
      <dc:creator>Yunus Ertürk</dc:creator>
      <pubDate>Wed, 20 Dec 2023 12:57:47 +0000</pubDate>
      <link>https://dev.to/yunuserturk/how-to-host-wordpress-for-free-on-vercel-a-step-by-step-guide-8cd</link>
      <guid>https://dev.to/yunuserturk/how-to-host-wordpress-for-free-on-vercel-a-step-by-step-guide-8cd</guid>
      <description>&lt;p&gt;Are you tired of the huge bills that come with hosting your WordPress website and want to host WordPress for free? The world of website hosting is evolving, and I'm here to guide you into host WordPress for free. In this comprehensive guide, I'll explore the exciting possibilities of hosting a WordPress site on Vercel using a Static Headless approach---revolutionizing your web hosting experience without denting your budget.&lt;/p&gt;

&lt;p&gt;By the way, I'm &lt;a href="https://yunuserturk.com/" rel="noopener noreferrer"&gt;Yunus&lt;/a&gt;, a passionate tech enthusiast, I'm writing about tech, building digital products and design. for fellow enthusiasts, aspiring digital creators, and design enthusiasts. &lt;a href="https://blog.yunuserturk.com/" rel="noopener noreferrer"&gt;Join me&lt;/a&gt; and &lt;a href="https://twitter.com/yunuserturk" rel="noopener noreferrer"&gt;Follow me on twitter&lt;/a&gt; on this journey of exploring the intersections of technology, product development, and design, as every piece unfolds a narrative of creativity and functionality in the digital realm.&lt;/p&gt;

&lt;p&gt;Traditionally, hosting a dynamic WordPress website could burn a hole in your pocket. Due to the infrastructure needed to handle dynamic content and database queries. However, the landscape is changing, and we're about to embark on a journey that transforms your WordPress site into a lean, mean, static machine hosted on Vercel's serverless platform.&lt;/p&gt;

&lt;p&gt;Join us as we unravel the secrets of static websites, explore the concept of a Static Headless WordPress, and delve into the powerful world of Vercel. By the end of this guide, you'll not only understand the benefits of this approach but also have the knowledge to successfully host WordPress for free on Vercel without spending a dime. Let's turn the page on expensive hosting and usher in a new era of cost-effective, high-performance WordPress websites. Welcome to the future of hosting---welcome to hosting WordPress for free on Vercel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkh9avm39xz2do8893ul.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkh9avm39xz2do8893ul.png" alt="How to Host WordPress for Free" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Understanding Static Websites: Embracing Simplicity for Speed and Security&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now that we've set the stage for a budget-friendly WordPress hosting adventure, let's dive into the fascinating realm of static websites. Imagine a website that doesn't rely on complex server-side processing for every user request---a website that is lightning-fast, secure, and remarkably efficient. That's the essence of a static website.&lt;/p&gt;

&lt;p&gt;In simpler terms, a static website is like a snapshot of a traditional website. It consists of pre-rendered HTML, CSS, and JavaScript files, eliminating the need for on-the-fly content generation with every user interaction. This simplicity brings forth a multitude of advantages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Speed:&lt;/strong&gt; Static websites load faster because there's no server-side processing delay. Your visitors experience quicker page loads, making for a smoother and more enjoyable browsing experience.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Security:&lt;/strong&gt; With reduced dynamic functionality, static sites have a smaller attack surface, making them inherently more secure. Say goodbye to many common security vulnerabilities associated with dynamic content.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Scalability:&lt;/strong&gt; Scaling a static website is a breeze. Whether you have ten or ten thousand visitors, the response time remains consistently high.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Is WordPress a Static Platform?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now, you might be wondering, "How does this relate to WordPress?" Traditionally, WordPress relies on dynamic content, generating pages on-the-fly from a database each time a user requests them. While this approach is flexible, it can lead to slower load times and increased server loads, especially as your website grows.&lt;/p&gt;

&lt;p&gt;However, the magic lies in transforming your dynamic WordPress site into a static one. By doing so, you retain the simplicity and speed of a static website while still enjoying the familiar WordPress experience. This shift not only enhances performance but also opens the door to cost-effective hosting solutions, which we'll explore further in this guide.&lt;/p&gt;

&lt;p&gt;So, buckle up as we navigate the transformative journey of making WordPress static and unleash the full potential of a faster, more secure, and budget-friendly website hosting experience on Vercel. The days of compromise between performance and affordability are over; let's make your WordPress site truly dynamic without breaking the bank.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Making WordPress Static: Transforming Dynamism into Simplicity&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;So, you're ready to embark on the journey of making your WordPress site static? Fantastic! Let's break down the process step by step, transforming your dynamic WordPress website into a sleek and efficient static version.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Setting Up a Local WordPress Environment with Local by Flywheel:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;&lt;a href="https://localwp.com/" rel="noopener noreferrer"&gt;Download and Install Local&lt;/a&gt;:&lt;/strong&gt; Download and install the Local by Flywheel application on your computer. This user-friendly tool makes it easy to create and manage local WordPress environments.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Create a New WordPress Site:&lt;/strong&gt; Using Local, set up a new WordPress site locally on your computer. This step allows you to work on your website without affecting the live version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5wquc02l8i53g10yi00c.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5wquc02l8i53g10yi00c.jpg" alt="Click the left green " width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs44p4gojmzq1xx53p8ln.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs44p4gojmzq1xx53p8ln.jpg" alt="Create a new site with Local" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Developing Your WordPress Website Locally:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Customize Your WordPress Site:&lt;/strong&gt; Build and customize your WordPress site according to your preferences. This is your opportunity to design, tweak, and perfect your website's look and feel.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Migrate Your WordPress Site:&lt;/strong&gt; If your WordPress site is currently hosted elsewhere, use the "&lt;a href="https://wordpress.org/plugins/all-in-one-wp-migration/" rel="noopener noreferrer"&gt;All-in-One WP Migration&lt;/a&gt;" plugin to seamlessly migrate it to your local environment. Install the plugin on your existing WordPress site, export the site as a file, and then import it into your local environment using Local.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Get Done with Local WP&lt;/strong&gt;: I created an example WordPress website and will show you the steps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxeqt3yf6ufeoiaar9n74.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxeqt3yf6ufeoiaar9n74.png" alt="New Static WordPress" width="800" height="767"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Exporting Your WordPress Site to Static Files with WP2Static:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We will use the WP2Static plugin for it. There are some other plugins for it, but I will use this one in this path.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://wp2static.com/" rel="noopener noreferrer"&gt;Download and Install WP2Static Plugin&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;In your WordPress dashboard, install the WP2Static plugin. This tool is crucial for converting your dynamic site into a static one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd488plzr6khiiu2gc5rm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd488plzr6khiiu2gc5rm.png" alt="Add plugin to Host WordPress for Free" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure WP2Static:&lt;/strong&gt; Set up WP2Static to export your WordPress site as static files. The most important thing in this step is to fill your new WordPress domain. Because we need to change the page domains to the actual domain that we will use for the WordPress website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faek3l90g7zxro5th0eli.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faek3l90g7zxro5th0eli.png" alt="Static WordPress domain" width="800" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generate Static Files:&lt;/strong&gt; Let WP2Static do its magic. It will generate static HTML files, CSS, and other assets that represent your WordPress site without the need for server-side processing.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Creating a GitHub Repository:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Set Up a GitHub Account:&lt;/strong&gt; If you don't have one, create a GitHub account. This will be the platform where you store and manage the static files of your WordPress site.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Create a New Repository:&lt;/strong&gt; Initialize a new repository on GitHub. This will serve as the central hub for your static WordPress site's files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8iy4b4x4yjiitehnyoma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8iy4b4x4yjiitehnyoma.png" alt="Create your WordPress github repo" width="800" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;5. Pushing Static Files to the GitHub Repository:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Commit and Push Changes:&lt;/strong&gt; Using Git commands or a GUI client, commit and push the static files to your GitHub repository. This step makes your static WordPress site accessible from anywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6uxj39tv5k047a1dh2k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6uxj39tv5k047a1dh2k.png" alt="Push your Static WordPress" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;6. Deploying Your WordPress Site on Vercel and Host WordPress for Free:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Create a Vercel Account:&lt;/strong&gt; If you haven't already, sign up for a Vercel account. It's free and provides an excellent platform for hosting static sites.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create A New Project:&lt;/strong&gt; On your vercel dashboard, create a project for the WordPress website.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Import Your GitHub Repository to Vercel:&lt;/strong&gt; Connect your GitHub repository to Vercel. This establishes a link between your static WordPress files and the Vercel hosting platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprsktb9dhp44hf1nhwto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprsktb9dhp44hf1nhwto.png" alt="Deploy Static WordPress" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure Deployment Settings:&lt;/strong&gt; Fine-tune deployment settings on Vercel according to your requirements. This includes specifying the branch to deploy and setting up custom domains if needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0zub5arv4j7pignd0yk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0zub5arv4j7pignd0yk.png" alt="Deployment Settings for Publishing WordPress on Vercel" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploy Your WordPress Site:&lt;/strong&gt; Initiate the deployment process on Vercel. Watch as your static WordPress site goes live on the Vercel platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtv6clb0wq2dlhmnvldt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtv6clb0wq2dlhmnvldt.png" alt="Host WordPress for Free" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations! You've successfully transformed your dynamic WordPress site into a static masterpiece and deployed it on Vercel---all without spending a penny on hosting. Now you can Host WordPress for Free. In the next sections, we'll explore the nuances of GitHub, version control, and the deployment process in more detail. Let's keep the momentum going!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;FAQ: Navigating the Host WordPress for Free Journey&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Q1: Why should I consider hosting my WordPress site on Vercel?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;A: Hosting your WordPress site on Vercel brings tones of benefits, including speed, scalability, and cost-effectiveness. Vercel's serverless platform ensures high performance without the traditional hosting expenses. You can Host WordPress for Free on Vercel.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Q2: Is the migration process complex, especially for non-tech-savvy users?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;A: Not at all. The migration process is designed to be user-friendly. With plugins like "All-in-One WP Migration" and step-by-step guides, even those without extensive technical knowledge can successfully navigate the transition. But still you have to knowledge of github version control and how-to make commit, push and deploy.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Q3: Can I still use WordPress plugins and themes on a static site?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;A: While some dynamic functionality may be limited in a static environment, many plugins and themes are compatible. The key is to choose those that enhance static site performance. If you want to Host WordPress for Free on Vercel, you won't create a dynamic website, like comments, e-commerce etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Q4: What happens to my database during the migration to a static site?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;A: The static site approach removes the need for a dynamic database. During migration, the content is pre-rendered and stored as static files, eliminating the need for constant database queries and updates.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Q5: How does version control benefit my WordPress site on GitHub?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;A: Version control with GitHub allows you to track changes, collaborate efficiently, and roll back to previous versions if needed. It provides a secure and organized way to manage your WordPress site's evolution.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Q6: Are there limitations to the types of websites that work well with Host WordPress for Free on Vercel?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;A: Static Headless WordPress on Vercel is versatile and suitable for various types of websites, from blogs to portfolios. However, websites heavily reliant on real-time dynamic content may need additional considerations.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Q7: Is Vercel's Host WordPress for Free is sufficient for my site?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;A: Vercel's free hosting tier is excellent for small to medium-sized websites. For larger sites with high traffic, consider their affordable paid plans for enhanced performance and additional features.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Q8: Can I still use Vercel if my WordPress site relies on e-commerce plugins?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;A: While certain e-commerce plugins may have limitations in a static environment, there are static-friendly alternatives. Consider evaluating plugins compatible with static sites or explore separate solutions for dynamic features.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Q9: What if I encounter issues during deployment on Vercel?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;A: Vercel offers comprehensive documentation and a helpful community. If issues persist, their support team is responsive and ready to assist, ensuring a smooth deployment process.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Q10: Is it possible to revert to a dynamic WordPress site after migrating to static on Vercel?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;A: While the migration is generally one-way, keeping a backup of your dynamic WordPress site is advisable if you ever decide to revert. Be sure to plan and test thoroughly before making significant changes. But always the static website will be rendered by the main dynamic website of WordPress. So you need to have the dynamic website allways. In this case it will be on your own local system.&lt;/p&gt;

&lt;p&gt;Feel free to reach out if you have additional questions or need further clarification on any aspect of the Host WordPress for Free journey. I will be happy to guide you!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What Kind of Websites Work Best with Static Headless WordPress?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Static Headless WordPress on Vercel is a powerful solution that suits a variety of website types, but it's essential to understand its strengths and limitations. Here's a guide on which types of websites work best and where you might encounter challenges:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Personal Websites:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Ideal:&lt;/em&gt; Static Headless WordPress is exceptionally well-suited for personal websites. The static nature enhances speed and security, providing an excellent user experience for readers.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Portfolio Websites:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Ideal:&lt;/em&gt; If you're showcasing your work or building a portfolio, a static site offers a fast and reliable way to display your content. Vercel's hosting ensures your portfolio loads quickly, impressing potential clients or employers.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Business Websites:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Ideal:&lt;/em&gt; Business websites with static content, such as service descriptions, contact information can benefit from the simplicity and speed of Static Headless WordPress.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Informational Websites:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Ideal:&lt;/em&gt; Websites providing information without the need for real-time updates or user-generated content can leverage the efficiency of a static approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Landing Pages:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Ideal:&lt;/em&gt; Static sites are perfect for landing pages where quick loading times are crucial. Whether you're promoting a product, event, or service, the speed of a static site enhances user engagement.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Documentation Sites:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Ideal:&lt;/em&gt; Static Headless WordPress is an excellent choice for documentation sites, providing a fast and reliable platform for users to access information.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Educational Websites:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Ideal:&lt;/em&gt; Websites offering educational content, course descriptions, and general information can benefit from the speed and security of a static environment.&lt;/p&gt;

&lt;p&gt;However, there are scenarios where a static approach may not be the best fit:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;E-commerce Websites:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Challenges:&lt;/em&gt; E-commerce sites with dynamic product listings, real-time inventory updates, and interactive shopping carts might face limitations with the static approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;User-Generated Content (UGC) Websites:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Challenges:&lt;/em&gt; Websites heavily reliant on user-generated content, such as forums or social platforms, may find it challenging to implement real-time updates and dynamic interactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Websites with Dynamic Comments:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Challenges:&lt;/em&gt; If your website relies on dynamic comments on posts or pages, a static approach may not be the most suitable, as it lacks the real-time interaction required for comment sections.&lt;/p&gt;

&lt;p&gt;In summary, Static Headless WordPress on Vercel excels in scenarios where content remains relatively static and doesn't require constant updates or real-time interactions. Understanding the nature of your website's content and functionalities will help you determine whether the static approach aligns with your goals.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>vercel</category>
      <category>webdev</category>
      <category>github</category>
    </item>
    <item>
      <title>8 Best Tips for Finding Freelance Developer Jobs</title>
      <dc:creator>Yunus Ertürk</dc:creator>
      <pubDate>Sat, 19 Nov 2022 18:17:21 +0000</pubDate>
      <link>https://dev.to/yunuserturk/8-best-tips-for-finding-freelance-developer-jobs-6gb</link>
      <guid>https://dev.to/yunuserturk/8-best-tips-for-finding-freelance-developer-jobs-6gb</guid>
      <description>&lt;p&gt;There are a number of ways to get started in freelancing, but finding quality development jobs can be a challenge. Here are a few tips to get you started on the right track:&lt;/p&gt;

&lt;h3&gt;
  
  
  Job postings on online job boards or freelancing websites.
&lt;/h3&gt;

&lt;p&gt;Online freelancing job boards are the quickest way of finding projects. There are many different online job boards and freelancing websites available. Some popular online job boards include Indeed, Monster, and Dice. To find freelancing developer jobs on these websites, enter relevant keywords, mainly freelance, into the search bar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Network with other developers and let them know you're looking for freelancing work
&lt;/h3&gt;

&lt;p&gt;You can connect with other developers through online forums or social media platforms such as GitHub or Twitter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Search for companies that use the technology you're proficient in
&lt;/h3&gt;

&lt;p&gt;If you're skilled in a particular technology or programming language, you can search for companies that use that technology on job boards or freelancing websites. You can also search for companies that use that technology on LinkedIn.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reach out to companies or organizations directly and inquire about freelancing opportunities
&lt;/h3&gt;

&lt;p&gt;Another option is to reach out to companies or organizations directly and inquire about any freelance opportunities that may be available. This can be done by sending a cold email or LinkedIn message to the company.&lt;/p&gt;

&lt;h3&gt;
  
  
  Attend industry events or meetups relevant to your skillset
&lt;/h3&gt;

&lt;p&gt;You can also attend developer meetups or events in your area. This is a great way to network with other developers and let them know you're available for freelance work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a solid online presence by having an up-to-date portfolio website or blog
&lt;/h3&gt;

&lt;p&gt;Ensure your portfolio or website is up-to-date and includes examples of your work. This will help you showcase your skillset and attract potential clients.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep your skills up-to-date.
&lt;/h3&gt;

&lt;p&gt;Use online resources such as online courses or tutorials to keep your skills up-to-date. This will make you more attractive to potential clients.&lt;/p&gt;

&lt;h3&gt;
  
  
  Be active on social media.
&lt;/h3&gt;

&lt;p&gt;Make sure you're active on social media platforms such as Twitter and LinkedIn. This will help you build your online presence and attract potential clients.&lt;/p&gt;

&lt;p&gt;This post firstly published on &lt;a href="https://freelancerpath.com" rel="noopener noreferrer"&gt;freelancerpath&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>beginners</category>
      <category>career</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Build Your Own Cloud Storage</title>
      <dc:creator>Yunus Ertürk</dc:creator>
      <pubDate>Tue, 08 Nov 2022 20:51:45 +0000</pubDate>
      <link>https://dev.to/yunuserturk/build-your-own-cloud-storage-6b3</link>
      <guid>https://dev.to/yunuserturk/build-your-own-cloud-storage-6b3</guid>
      <description>&lt;p&gt;Building a strong brand is something every business or individual needs to do. It's not just about having a memorable logo or tagline, but ensuring that you are remembered by your audience and clients for the right reasons. We're here to help you develop an effective branding strategy and create an identity that will make you stand out from the crowd.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Focstsnd1wkzjcylg5p6z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Focstsnd1wkzjcylg5p6z.jpg" alt="For freelancing" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your personal brand and freelancing business are only as strong as the tools you have available to communicate your value with potential clients. This makes an online storage solution like nextcloud that much more valuable, because it allows you to store, organize and share all of your files from any device and add security features such as two-factor authentication through services like Google Authenticator. Best of all, it's simple to get set up, and in this article we'll take you through all of the steps necessary to use nextcloud to build your own cloud storage on your own domain.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Cloud Storage?
&lt;/h3&gt;

&lt;p&gt;Cloud storage is a type of web hosting. Like traditional hosting, it involves storing files on a server and making them accessible to the public. Unlike traditional hosting, however, cloud storage enables you to store your data remotely and access it from anywhere as long as you have an internet connection. You can also create private accounts that are only accessible by the account's owner.&lt;/p&gt;

&lt;p&gt;Cloud storage is ideal for businesses because they need to store their data without having to worry about managing hardware or setting up servers. And when you communicate with your clients you always need to send big files. In this scenario, cloud systems are the only way. If you don't want to send files with google drive, onedrive, or use the systems like wetransfer you need to build your own branded cloud storage.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are the Differences Custom Cloud Storage vs Others
&lt;/h3&gt;

&lt;p&gt;Cloud storage is the backbone of any freelancer brand's business efforts. But there are many types of cloud systems with different features and limitations that can make it difficult to decide which one is best. Some services offer limited storage space, others only allow you to upload a few files at a time, and some charge per gigabyte. DIY custom cloud storage with nextcloud offers much more flexibility, allowing you to scale your storage up or down as needed without any cost increases. And the most important point is when you send a file to a customer, you are sending it under your own domain and your own cloud system. It's a nice action to show your customers your brand's strong identity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of Building Own Cloud
&lt;/h3&gt;

&lt;p&gt;Building your own cloud storage is like having your own private wetransfer -- only branded on your own domain. You'll be in complete control, and it'll cost you less money than paying for cloud systems monthly fee. To create your own cloud, you'll need the help of server and client software. There are several solutions that you can choose from the market but we'll discuss NextCloud in this post. I'm personally used this solution about 4-5 years and I like it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom Cloud Solution: Nextcloud
&lt;/h3&gt;

&lt;p&gt;Nextcloud is similar to &lt;a href="https://owncloud.com/" rel="noopener noreferrer"&gt;ownCloud&lt;/a&gt;, but with a few differences. Nextcloud is an upgraded version of ownCloud, created by duplicating (forking) it and developing the new version separately. It offers some great collaboration tools, allowing you to use one of their DIY cloud storage systems. They also have apps for smartphones on both Android and iOS -- which is perfect if you want to access your data wherever you are. It is different from other services like Google Drive and Dropbox because it's not hosted on servers outside of your direct control. For users seeking more control over how and where their data is stored, Nextcloud is a great choice.&lt;/p&gt;

&lt;h4&gt;
  
  
  Is it Free
&lt;/h4&gt;

&lt;p&gt;Yes, you can install it on your own server and can use free. It has its own premium pricing but I'm writing this post for freelancers and solo business owners. So you don't need team pricing or extra features. Just upload your files and send them to your customers. It is my usage also.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to Install
&lt;/h4&gt;

&lt;p&gt;NextCloud has a huge documentation on their website, here is the link: &lt;a href="https://docs.nextcloud.com/server/latest/admin_manual/installation/index.html" rel="noopener noreferrer"&gt;https://docs.nextcloud.com/server/latest/admin_manual/installation/index.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But if I make it summarize, here is the installation steps with web installer file;&lt;/p&gt;

&lt;p&gt;The Web Installer is the easiest way to install Nextcloud on a web space. It checks the dependencies, downloads Nextcloud from the official server, unpacks it with the right permissions and the right user account. Finally, you will be redirected to the Nextcloud installer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Right-click &lt;a href="https://download.nextcloud.com/server/installer/setup-nextcloud.php" rel="noopener noreferrer"&gt;here&lt;/a&gt; and save the file to your computer&lt;/li&gt;
&lt;li&gt;  Upload setup-nextcloud.php to your web space&lt;/li&gt;
&lt;li&gt;  Point your web browser to setup-nextcloud.php on your webspace&lt;/li&gt;
&lt;li&gt;  Follow the instructions and configure Nextcloud&lt;/li&gt;
&lt;li&gt;  Login to your newly created Nextcloud instance!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can find further instructions in the &lt;a href="https://docs.nextcloud.com/server/latest/admin_manual/" rel="noopener noreferrer"&gt;Nextcloud Admin Manual&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Installer uses the same Nextcloud version as available for the built in updater in Nextcloud. After a major release it can take up to a month before it becomes available through the web installer and the updater. This is done to spread the deployment of new major releases out over time.&lt;/p&gt;

&lt;h4&gt;
  
  
  Features
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  Share files very quickly with your own domain.&lt;/li&gt;
&lt;li&gt;  Create folders for your different clients.&lt;/li&gt;
&lt;li&gt;  Share files with password.&lt;/li&gt;
&lt;li&gt;  Easy collaboration.&lt;/li&gt;
&lt;li&gt;  Store on your own server.&lt;/li&gt;
&lt;li&gt;  Built-in apps. (More than 100+)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Using
&lt;/h4&gt;

&lt;p&gt;I don't tell you how to use it here, but it's very easy. Just create a file, upload your file, and copy the share link. Here is a huge documentation about usage of nextcloud. &lt;a href="https://nextcloud.com/files/" rel="noopener noreferrer"&gt;https://nextcloud.com/files/&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Pros and Cons of NextCloud
&lt;/h4&gt;

&lt;p&gt;First, let me tell you that these pros and cons are just my thoughts. You can search and find your own pros and cons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Very easy to use&lt;/li&gt;
&lt;li&gt;  Quick installation&lt;/li&gt;
&lt;li&gt;  Smooth process&lt;/li&gt;
&lt;li&gt;  Security options&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Enterprise pricing is too expensive.&lt;/li&gt;
&lt;li&gt;  You use your own hosting storage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Nextcloud is a great solution if you want to build your own cloud storage and make your personal brand powerful. It is very easy to start and creates a huge difference to your personal brand in a positive way.&lt;/p&gt;

&lt;p&gt;If you have a different process for using cloud systems please mention it and let us talk about that.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>freelance</category>
      <category>nextcloud</category>
      <category>storage</category>
    </item>
    <item>
      <title>How to Create a Blog with NextJS, Notion, and Notion API</title>
      <dc:creator>Yunus Ertürk</dc:creator>
      <pubDate>Fri, 28 Oct 2022 14:41:55 +0000</pubDate>
      <link>https://dev.to/yunuserturk/how-to-create-a-blog-with-nextjs-notion-and-notion-api-4fnm</link>
      <guid>https://dev.to/yunuserturk/how-to-create-a-blog-with-nextjs-notion-and-notion-api-4fnm</guid>
      <description>&lt;p&gt;In this post, I want to try how we can create a blog management system using notion as a database. I have created a post on &lt;a href="https://dev.to/yunuserturk/how-to-create-a-blog-with-using-airtable-as-a-database-3dfa"&gt;how to create a blog with airtable&lt;/a&gt;, I used airtable in that project. Now I'm doing it with notion.&lt;/p&gt;

&lt;p&gt;I wrote &lt;a href="https://blog.yunuserturk.com/how-to-create-a-blog-with-nextjs-notion-and-notion-api/" rel="noopener noreferrer"&gt;this post&lt;/a&gt; to my own blog first, and I want to publish it here too.&lt;/p&gt;

&lt;p&gt;At first, we can find everything about notion; &lt;a href="https://developers.notion.com/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://developers.notion.com/" rel="noopener noreferrer"&gt;https://developers.notion.com/&lt;/a&gt; address&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a Notion Integration for Our Blog
&lt;/h3&gt;

&lt;p&gt;I have looked at the documentation and let's start. Firstly we should create an integration from &lt;a href="https://www.notion.so/my-integrations" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.notion.so/my-integrations" rel="noopener noreferrer"&gt;https://www.notion.so/my-integrations&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5llipi5eqcmekf9pvhe2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5llipi5eqcmekf9pvhe2.png" alt="notion" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a new integration on this page. I have created an integration named myblog, and these are my settings;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpgw5d0l168jy25du7f8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpgw5d0l168jy25du7f8.png" alt="basic information" width="800" height="774"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After these steps notion will give you a notion token, copy this token to a secure place, and we will use it for connecting our data.&lt;/p&gt;

&lt;p&gt;After that, we have to create a page and convert it to a database to use for our blog. I have created a notion page -- database full page. This is what I get;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feyez32rlw6ru3r5hnnqr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feyez32rlw6ru3r5hnnqr.png" alt="new" width="800" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a share button top right, Click on the &lt;code&gt;Share&lt;/code&gt;button and use the selector to find your integration by its name, then click &lt;code&gt;Invite&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Our integration has an access to our database now, last step we need the database id. It's the part of your URL;&lt;/p&gt;

&lt;p&gt;Mine is; &lt;a href="https://www.notion.so/yunuserturk/f9dfc334e89e4c2289b9bc98884b5e80" rel="noopener noreferrer"&gt;https://www.notion.so/yunuserturk/f9dfc334e89e4c2289b9bc98884b5e80&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the database id is; &lt;code&gt;f9dfc334e89e4c2289b9bc98884b5e80&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now we have to create our app and we can use these notion access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a NextJS App
&lt;/h3&gt;

&lt;p&gt;The easiest way to get started with Next.js is by using &lt;code&gt;create-next-app&lt;/code&gt; .&lt;/p&gt;

&lt;p&gt;Create a project with VS Code, open the terminal and use the command; &lt;code&gt;npx create-next-app&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Install tailwindcss;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a sketchy UI, I copied the code from the airtable project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Head from "next/head";

export default function Home() {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;Head&amp;gt;
        &amp;lt;title&amp;gt;Create Next App&amp;lt;/title&amp;gt;
        &amp;lt;meta name="description" content="Generated by create next app" /&amp;gt;
        &amp;lt;link rel="icon" href="/favicon.ico" /&amp;gt;
      &amp;lt;/Head&amp;gt;

      &amp;lt;main&amp;gt;
        &amp;lt;div className="container mx-auto w-full sm:w-10/12 md:w-8/12 lg:w-6/12 xl:w-6/12 p-4"&amp;gt;
          &amp;lt;h1 className="font-bold text-2xl"&amp;gt;Welcome to my blog&amp;lt;/h1&amp;gt;
          &amp;lt;div className="flex flex-col p-5 rounded-lg border-2 border-gray-200 mt-10"&amp;gt;
            &amp;lt;h2 className="text-xl font-bold"&amp;gt;Post Title&amp;lt;/h2&amp;gt;
            &amp;lt;div&amp;gt;Post Content will be here&amp;lt;/div&amp;gt;
            &amp;lt;span className="text-sm mb-6"&amp;gt;Post Date&amp;lt;/span&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/main&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How to Use Notion API and Show the Content
&lt;/h3&gt;

&lt;p&gt;Our homepage is ready, now we have to fetch the data to show it on our page. Let's install notion client SDK with &lt;code&gt;npm install @notionhq/client&lt;/code&gt;, run this command on terminal. Create a file &lt;code&gt;lib&amp;gt;notion.js&lt;/code&gt; and we will use our database here. With the help of the documentation, I created a starter code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Client } from "@notionhq/client";

const notion = new Client({
  auth: process.env.NEXT_PUBLIC_NOTION_TOKEN,
});

export const getDatabase = async (databaseId) =&amp;gt; {
  const response = await notion.databases.query({
    database_id: databaseId,
  });
  return response.results;
};

export const getPage = async (pageId) =&amp;gt; {
  const response = await notion.pages.retrieve({ page_id: pageId });
  return response;
};

export const getBlocks = async (blockId) =&amp;gt; {
  const blocks = [];
  let block;
  while (true) {
    const { results, next_block } = await notion.blocks.children.list({
      start_block: block,
      block_id: blockId,
    });
    blocks.push(...results);
    if (!next_block) {
      break;
    }
    block = next_block;
  }
  return blocks;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We'll import this to the index page and fetch the data and show the posts on the home page. With the notion API, getpage function only fetches the properties of the page. We can't retrieve the page blocks. We have to create another function and use API for retrieving page content. Notion called them blocks and has another function for it.&lt;/p&gt;

&lt;p&gt;My final index.js page is like that;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Head from "next/head";
import { getDatabase } from "../lib/notion";
import Link from "next/link";

export default function Home({ posts }) {

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;Head&amp;gt;
        &amp;lt;title&amp;gt;Create Next App&amp;lt;/title&amp;gt;
        &amp;lt;meta name="description" content="Generated by create next app" /&amp;gt;
        &amp;lt;link rel="icon" href="/favicon.ico" /&amp;gt;
      &amp;lt;/Head&amp;gt;

      &amp;lt;main&amp;gt;
        &amp;lt;div className="container mx-auto w-full sm:w-10/12 md:w-8/12 lg:w-6/12 xl:w-6/12 p-4"&amp;gt;
          &amp;lt;h1 className="font-bold text-2xl"&amp;gt;Welcome to my blog&amp;lt;/h1&amp;gt;
          {posts.map((post) =&amp;gt; {
            const date=new Date(post.created_time).toLocaleString("en-Us",{
              month: "long",
              day: "numeric",
              year: "numeric",
              })
            return (
              &amp;lt;div className="flex flex-col p-5 rounded-lg border-2 border-gray-200 mt-10" key={post.id}&amp;gt;
                &amp;lt;h2 className="text-xl font-bold"&amp;gt;{post.properties.Name.title[0].plain_text}&amp;lt;/h2&amp;gt;
                &amp;lt;span className="text-sm"&amp;gt;{date}&amp;lt;/span&amp;gt;
                &amp;lt;Link href="/[post]" as={`/${post.id}`}&amp;gt;
                  &amp;lt;a className="text-sm"&amp;gt;Read more&amp;lt;/a&amp;gt;
                &amp;lt;/Link&amp;gt;
              &amp;lt;/div&amp;gt;
            );
          })}
        &amp;lt;/div&amp;gt;
      &amp;lt;/main&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export const getStaticProps = async () =&amp;gt; {
  const database = await getDatabase("f9dfc334e89e4c2289b9bc98884b5e80");

  return {
    props: {
      posts: database,
    },
    revalidate: 1,
  };
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notion gives us the blocks with API with plenty of properties. As you wish you can use which of them you want. But I just use the text and just for these blocks; paragraphs and headers. You can adjust the blocks you will use according to the project you are doing. (We will use it on the single post page.)&lt;/p&gt;

&lt;p&gt;Here is the single post page file;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { getDatabase, getPage, getBlocks } from "../lib/notion";
import Head from "next/head";

const renderBlock = (block) =&amp;gt; {
  const { type } = block;
  const value = block[type];

  switch (type) {
    case "paragraph":
      return &amp;lt;p className="mb-4"&amp;gt;{value.rich_text[0].plain_text}&amp;lt;/p&amp;gt;;
    case "heading_1":
      return &amp;lt;h1 className="font-bold text-3xl  mb-2"&amp;gt;{value.rich_text[0].plain_text}&amp;lt;/h1&amp;gt;;
    case "heading_2":
      return &amp;lt;h2 className="font-bold text-2xl  mb-2"&amp;gt;{value.rich_text[0].plain_text}&amp;lt;/h2&amp;gt;;
    case "heading_3":
      return &amp;lt;h3 className=" font-bold text-xl mb-2"&amp;gt;{value.rich_text[0].plain_text}&amp;lt;/h3&amp;gt;;
  }
};

export default function Post({ post, content }) {
  const date = new Date(post.created_time).toLocaleString("en-Us", {
    month: "long",
    day: "numeric",
    year: "numeric",
  });
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;Head&amp;gt;
        &amp;lt;title&amp;gt;{post.properties.Name.title[0].plain_text}&amp;lt;/title&amp;gt;
        &amp;lt;link rel="icon" href="/favicon.ico" /&amp;gt;
      &amp;lt;/Head&amp;gt;

      &amp;lt;main&amp;gt;
        &amp;lt;div className="container mx-auto w-full sm:w-10/12 md:w-8/12 lg:w-6/12 xl:w-6/12 p-4"&amp;gt;
          &amp;lt;h1 className="font-bold text-2xl"&amp;gt;{post.properties.Name.title[0].plain_text}&amp;lt;/h1&amp;gt;
          &amp;lt;span className="text-sm"&amp;gt;{date}&amp;lt;/span&amp;gt;
          &amp;lt;img src="&amp;lt;https://picsum.photos/800/200&amp;gt;" alt="random image" className=" max-w-full" /&amp;gt;
          &amp;lt;div className="mt-10"&amp;gt;
            {content.map((block) =&amp;gt; {
              console.log(block);
              return &amp;lt;div key={block.id}&amp;gt;{block.type === "page_break" ? &amp;lt;hr /&amp;gt; : &amp;lt;div&amp;gt;{renderBlock(block)}&amp;lt;/div&amp;gt;}&amp;lt;/div&amp;gt;;
            })}
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/main&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export const getStaticPaths = async () =&amp;gt; {
  const database = await getDatabase("f9dfc334e89e4c2289b9bc98884b5e80");
  const paths = database.map((post) =&amp;gt; {
    return {
      params: {
        post: post.id,
      },
    };
  });
  return {
    paths,
    fallback: false,
  };
};

export const getStaticProps = async ({ params }) =&amp;gt; {
  const postId = params.post;
  const post = await getPage(postId);
  const content = await getBlocks(postId);

  return {
    props: {
      post,
      content,
    },
    revalidate: 1,
  };
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is the final post page;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzogn0hsdm13goeubu3xs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzogn0hsdm13goeubu3xs.png" alt="final" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment and the result&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I deployed it to vercel finally. It's a very basic use of Nation API, If you create something more different you can use it this way.&lt;/p&gt;

&lt;p&gt;You can see al the code from the github repo: &lt;a href="https://github.com/yunuserturk/notion-blog" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://github.com/yunuserturk/notion-blog" rel="noopener noreferrer"&gt;https://github.com/yunuserturk/notion-blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the demo of final result: &lt;a href="https://notion-blog-yunuserturk.vercel.app/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://notion-blog-yunuserturk.vercel.app/" rel="noopener noreferrer"&gt;https://notion-blog-yunuserturk.vercel.app/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>notion</category>
      <category>webdev</category>
      <category>react</category>
    </item>
    <item>
      <title>How to create a blog with using airtable as a database</title>
      <dc:creator>Yunus Ertürk</dc:creator>
      <pubDate>Wed, 20 Jul 2022 17:19:22 +0000</pubDate>
      <link>https://dev.to/yunuserturk/how-to-create-a-blog-with-using-airtable-as-a-database-3dfa</link>
      <guid>https://dev.to/yunuserturk/how-to-create-a-blog-with-using-airtable-as-a-database-3dfa</guid>
      <description>&lt;p&gt;In this post, I want to try how we can create a blog management system using airtable as a database. Airtable is perfect for creating and managing your content. It’s easy to get started and the possibilities are endless! We’ll use react, NextJS as our frontend, and tailwindcss for CSS. We’ll also use git to store all our code in GitHub and deploy it to Vercel. Keep reading to learn how to create your own blog!&lt;/p&gt;

&lt;p&gt;I wrote &lt;a href="https://blog.yunuserturk.com/how-to-create-a-blog-with-airtable/" rel="noopener noreferrer"&gt;this post&lt;/a&gt; to my own blog first, and I want to publish it here too.&lt;/p&gt;

&lt;p&gt;You can see all the code from the GitHub repo: &lt;a href="https://github.com/yunuserturk/airtable-blog" rel="noopener noreferrer"&gt;https://github.com/yunuserturk/airtable-blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the demo of the final result: &lt;a href="https://airtable-blog-ruby.vercel.app/" rel="noopener noreferrer"&gt;https://airtable-blog-ruby.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Airtable?
&lt;/h2&gt;

&lt;p&gt;Airtable is a cloud-based, all-in-one platform that combines the power of a traditional database with the flexibility of a spreadsheet. You can use Airtable to store data, track projects, and collaborate with team members.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why tailwindcss, react, and nextJS?
&lt;/h2&gt;

&lt;p&gt;Tailwind is a utility-first CSS framework that offers a low-level, atomic approach to building interfaces. In other words, it gives you the raw building blocks (utilities) you need to create designs, without any opinionated styles of their own.&lt;/p&gt;

&lt;p&gt;NextJS is a React framework that makes it easy to create server-side rendering React apps. It’s also lightweight and fast, and very effective for websites with lots of pages, which makes it ideal for creating static websites and blogs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a NextJS App
&lt;/h2&gt;

&lt;p&gt;The easiest way to get started with Next.js is by using &lt;code&gt;create-next-app&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Create a project with VS Code, open the terminal, and use the command; &lt;code&gt;npx create-next-app&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6homqpjyygwov48z7oy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6homqpjyygwov48z7oy.png" alt="NextJS Project" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is our first app. First, we’ll edit index.js and create a blog home page, and after that create a post page.&lt;/p&gt;

&lt;p&gt;I’m creating a very basic UI with tailwindcss;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;main&amp;gt;
  &amp;lt;div className="container mx-auto w-full sm:w-10/12 md:w-8/12 lg:w-6/12 xl:w-6/12 p-4"&amp;gt;
    &amp;lt;h1 className="font-bold text-2xl"&amp;gt;Welcome to my blog&amp;lt;/h1&amp;gt;
    &amp;lt;div className="flex flex-col p-5 rounded-lg border-2 border-gray-200 mt-10"&amp;gt;
      &amp;lt;h2 className="text-xl font-bold"&amp;gt;Post Title&amp;lt;/h2&amp;gt;
      &amp;lt;div&amp;gt;Post Content will be here&amp;lt;/div&amp;gt;
      &amp;lt;span className="text-sm mb-6"&amp;gt;Post Date&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/main&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4yua6pbb61fa315bhm3d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4yua6pbb61fa315bhm3d.png" alt="Basic Blog UI" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Airtable as a database
&lt;/h2&gt;

&lt;p&gt;Our blog home page is ready, and we need the airtable as a database. I have created an airtable document named myblog and I’ll use these 3 columns; title, content, and date.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8t2arzsq5pmzjt9wy3o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8t2arzsq5pmzjt9wy3o.png" alt="airtable database" width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How can we fetch the data from airtable?
&lt;/h2&gt;

&lt;p&gt;Airtable has a nice documented API service. &lt;a href="https://airtable.com/api" rel="noopener noreferrer"&gt;https://airtable.com/api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, you can check the documentation and see how can you create something different. For now, we just fetch the post title, content, and date.&lt;/p&gt;

&lt;p&gt;Airtable has an npm package for development. Firstly we install it on our project. Open the terminal and run this code npm install airtable. After installing the airtable package I’ve created a file under components named getPosts.js, and this is for fetching the data from the airtable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Airtable from "airtable";

const AirtableBase = new Airtable({ apiKey: process.env.NEXT_PUBLIC_API_KEY });
const AirtableBase_ = AirtableBase.base(process.env.NEXT_PUBLIC_API_BASE);

const table = AirtableBase_.table("myblog");
let posts = [];

const getPosts = async () =&amp;gt; {
  posts = await table.select({}).all();
  const posts_ = posts.map((post) =&amp;gt; {
    return {
      id: post.id,
      title: post.fields.title,
      content: post.fields.content,
      date: post.fields.date,
    };
  });

  return posts_;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;export default getPosts;&lt;br&gt;
You must change your airtable table name and API variables.&lt;/p&gt;

&lt;p&gt;Now we have to create a post page to show a single post. Created a [posts].js in the pages folder. And created a sketchy post UI. For now, I’ve created post pages with post IDs. But it’s not the best practice, I will change this function when I’m implementing SEO functions.&lt;/p&gt;

&lt;p&gt;This is how is the [posts].js after airtable fetch codes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export default function post({ post }) {
  return (
    &amp;lt;main&amp;gt;
      &amp;lt;div className="container mx-auto w-full sm:w-10/12 md:w-8/12 lg:w-6/12 xl:w-6/12 p-4"&amp;gt;
        &amp;lt;h1 className="font-bold text-2xl"&amp;gt;{post.title}&amp;lt;/h1&amp;gt;
        &amp;lt;span className="text-sm"&amp;gt;{post.date}&amp;lt;/span&amp;gt;
        &amp;lt;img src="https://picsum.photos/800/200" alt="random image" className=" max-w-full" /&amp;gt;

        &amp;lt;div dangerouslySetInnerHTML={{ __html: marked(post.content) }} className="mt-10"&amp;gt;&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/main&amp;gt;
  );
}

export async function getStaticPaths() {
  const posts = await getPosts();
  const paths = posts.map((post) =&amp;gt; ({
    params: {
      post: post.id,
    },
  }));

  return {
    paths,
    fallback: false,
  };
}

export async function getStaticProps({ params }) {
  const posts = await getPosts();
  const post = posts.find((post) =&amp;gt; post.id === params.post);
  return {
    props: {
      post,
    },
    revalidate: 1,
  };
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you create a rich text cell in airtable, airtable gives you the data as markdown data. This is great for us but we have to do some specifications to show it smoothly. First I have installed a package named marked, it helps us to fix that. Open terminal and run command &lt;code&gt;npm install marked&lt;/code&gt;. As you can see in the code we should call the package and use it for the blog content data. This works great; &lt;code&gt;&amp;lt;div dangerouslySetInnerHTML={{ __html: marked(post.content) }} className="mt-10"&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnnk0dlp9n2xeqc44gayl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnnk0dlp9n2xeqc44gayl.png" alt="Final result" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment and the result
&lt;/h2&gt;

&lt;p&gt;Finally, I deployed it to vercel. It’s a very basic method of using airtable. Anybody can build very different projects like these.&lt;/p&gt;

&lt;p&gt;You can see all the code from the Github repo: &lt;a href="https://github.com/yunuserturk/airtable-blog" rel="noopener noreferrer"&gt;https://github.com/yunuserturk/airtable-blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the demo of the final result: &lt;a href="https://airtable-blog-ruby.vercel.app/" rel="noopener noreferrer"&gt;https://airtable-blog-ruby.vercel.app/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>nextjs</category>
      <category>airtable</category>
    </item>
  </channel>
</rss>
