<?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>Forem: Bulent Osman Yusuf</title>
    <description>The latest articles on Forem by Bulent Osman Yusuf (@bulentyusuf).</description>
    <link>https://forem.com/bulentyusuf</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%2F853091%2F39ffac6b-375f-470f-8aee-45b308b4fcbe.jpg</url>
      <title>Forem: Bulent Osman Yusuf</title>
      <link>https://forem.com/bulentyusuf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/bulentyusuf"/>
    <language>en</language>
    <item>
      <title>Create a bot with RSS and webhooks for Mastodon, a Twitter alternative</title>
      <dc:creator>Bulent Osman Yusuf</dc:creator>
      <pubDate>Tue, 22 Nov 2022 14:07:09 +0000</pubDate>
      <link>https://forem.com/contentful/create-a-bot-with-rss-and-webhooks-for-mastodon-a-twitter-alternative-l4o</link>
      <guid>https://forem.com/contentful/create-a-bot-with-rss-and-webhooks-for-mastodon-a-twitter-alternative-l4o</guid>
      <description>&lt;p&gt;&lt;strong&gt;Looking for a Twitter alternative? Here's two ways to set up a bot to automatically publish content from your Contentful space to your Mastodon server.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;NB: This post was &lt;a href="https://www.contentful.com/blog/create-bot-rss-webhooks-mastodon-twitter-alternative/" rel="noopener noreferrer"&gt;first published on the Contentful Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In recent weeks there’s been a huge surge in interest for an alternative to Twitter. Whether folks want to stretch their wings by learning about new social media platforms, or they’re looking for a simple Twitter replacement, an open source service called Mastodon is trending as the clear favorite.&lt;/p&gt;

&lt;p&gt;But there are things to take into account when using Mastodon for the first time. It has its own rules, vocabulary, and ways of operation. Tweets are now “toots.” You no longer have a universal timeline like Twitter, for example, but a thing called a federated timeline. And there’s even an edit button!&lt;/p&gt;

&lt;p&gt;In this post, we’ll take a quick tour of Mastodon – and, by extension, a mysterious place called the fediverse (oooooooh). We’ll also show you two simple ways to set up a bot to automatically publish content from your Contentful space to your Mastodon server of choice. Ready? Let’s go!&lt;/p&gt;

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

&lt;p&gt;The &lt;a href="https://joinmastodon.org/" rel="noopener noreferrer"&gt;Mastodon&lt;/a&gt; project first went live in October 2016, and is the creation of software engineer &lt;a href="https://mastodon.online/@Gargron@mastodon.social" rel="noopener noreferrer"&gt;Eugen Rochko&lt;/a&gt;. The mascot of the service is an adorable wooly mammoth. The concept is a decentralized social network built from free and open source software, where individuals have the ability to quickly spin up and self-host their own social networking services – while still being able to interact and communicate with one another. &lt;/p&gt;

&lt;p&gt;Growth in the past few weeks has been absolutely stellar. &lt;a href="https://mastodon.social/@Gargron/109300967725833789" rel="noopener noreferrer"&gt;According to a toot by Eugen on 7 November&lt;/a&gt;, “Hey, so, we’ve hit 1,028,362 monthly active users across the network today. 1,124 new Mastodon servers since Oct. 27, and 489,003 new users. That’s pretty cool.”&lt;/p&gt;

&lt;p&gt;Cool is an understatement!&lt;/p&gt;

&lt;h2&gt;
  
  
  What about the Fediverse?
&lt;/h2&gt;

&lt;p&gt;Mastodon as a service embodies all the characteristics of a &lt;a href="https://en.wikipedia.org/wiki/Fediverse" rel="noopener noreferrer"&gt;fediverse&lt;/a&gt;, which is shorthand for federated universe; a set of distinct but interconnected web publishing servers (also known as a node or instance) sharing the same protocols for communication. You have the option to follow and interact with people within your own server (your local timeline) but also with the denizens of neighboring servers which might be dedicated to different interests and specialisms (a federated timeline).&lt;/p&gt;

&lt;p&gt;For example, Person A could start a social media node using the Mastodon protocol dedicated to lovers of apples, while Person B could start one dedicated to those who prefer oranges. Users of either social network can freely interact with each other, talk about the joys of fruit salad, and attract followers and comments from both places. But they can also choose to confine themselves to their own network about their preferred fruit. Either option is entirely valid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is it free to use Mastodon?
&lt;/h2&gt;

&lt;p&gt;Yes. Mastodon is funded entirely by &lt;a href="https://joinmastodon.org/sponsors" rel="noopener noreferrer"&gt;sponsors&lt;/a&gt; who cover the cost of operating individual servers or the salaries of volunteers running them. It’s ad-free and there are definitely no algorithms – no mathematical alchemy behind the scenes serving up content it thinks you might like – just a stream of toots that you’ll see posted in real time. &lt;/p&gt;

&lt;p&gt;But there are enough similarities to Twitter to make it recognizable to users of that other service, for example, the use of hashtags, notifications, and followers. And you can access it from your desktop or use mobile apps available for iOS and Android devices, both of the official and unofficial variety.&lt;/p&gt;

&lt;p&gt;Free speech is pivotal to Mastodon, but there are guardrails against hate speech and misinformation. The &lt;a href="https://joinmastodon.org/covenant" rel="noopener noreferrer"&gt;Mastodon Server Covenant&lt;/a&gt; is a list of server owners who pledge to provide active moderation against racism, sexism, homophobia and transphobia, plus several other user-first commitments on privacy and terms of service. This offers newcomers reassurance up front that they’re venturing into a safe space, free from trolls and fake news.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s build a bot for Mastodon!
&lt;/h2&gt;

&lt;p&gt;Now that you know a little bit about what makes this Twitter alternative so intriguing in its own right, let’s roll up our sleeves and build something for it! &lt;/p&gt;

&lt;p&gt;We’re not ready to create a server of our own on Mastodon just yet, but let’s kick it off with functionality that’s smaller and simpler (but no less useful): a bot that automagically notifies the community when a new post is published to the Contentful blog. &lt;/p&gt;

&lt;p&gt;This is a relatively straightforward process because Mastodon provides access to its data over a &lt;a href="https://www.contentful.com/blog/what-is-a-rest-api/" rel="noopener noreferrer"&gt;REST API&lt;/a&gt;, just like Contentful does. You have either the option of webhooks or RSS fields (or both) to tie it all together. With some simple alterations, you can follow these same steps to sync your content between other social or microblogging services like Twitter, Instagram, Tumblr, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wait, what’s a bot?
&lt;/h3&gt;

&lt;p&gt;Did you know? More than half of all web traffic is generated by bots. Why? Because internet bots are able to perform tasks that are simple and repetitive much faster than a human ever could. &lt;a href="https://en.wikipedia.org/wiki/Internet_bot" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt; has a good definition: a bot is a software application that runs automated tasks (scripts) over the internet, such as messaging or publishing content. &lt;/p&gt;

&lt;h3&gt;
  
  
  What’s a webhook?
&lt;/h3&gt;

&lt;p&gt;Webhooks are unidirectional mechanisms that applications can use to talk to each other when a particular event occurs. Think of a webhook as an automated, one-way communication from one application to another. The first application sends the information to the receiver without waiting for a response. Then, it relies on the receiver to process this information. &lt;a href="https://www.contentful.com/blog/ultimate-guide-contentful-webhooks/" rel="noopener noreferrer"&gt;Read all about it in our ultimate guide to webhooks.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What’s an RSS feed?
&lt;/h3&gt;

&lt;p&gt;RSS (RDF Site Summary or Really Simple Syndication) allows people to subscribe to newly published content via an RSS reader so that they don’t need to manually check websites or channels. An RSS feed takes the form of a standard XML (Extensible Markup Language) file, built of content and tags that define the content, and it looks a bit like HTML. XML is both human and machine readable. &lt;a href="https://www.contentful.com/blog/feed.xml" rel="noopener noreferrer"&gt;Check out the Contentful blog RSS feed here.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Sign up for a Mastodon account and choose a server
&lt;/h2&gt;

&lt;p&gt;Let’s start by signing up for an account with Mastodon. The first thing you need to do is pick a server. There are multiple servers available, filterable by topic (&lt;a href="https://socel.net/about" rel="noopener noreferrer"&gt;Animation&lt;/a&gt;! &lt;a href="https://astrodon.social/about" rel="noopener noreferrer"&gt;Astronomy&lt;/a&gt;! &lt;a href="https://fosstodon.org/about" rel="noopener noreferrer"&gt;FOSS&lt;/a&gt;!) and region, and the ones on &lt;a href="https://joinmastodon.org/servers" rel="noopener noreferrer"&gt;this index&lt;/a&gt; belong to the Mastodon Server Covenant. &lt;/p&gt;

&lt;p&gt;You can always switch servers later if you change your mind. We’re going with &lt;a href="https://mastodon.online/getting-started" rel="noopener noreferrer"&gt;mastodon.online&lt;/a&gt;, a newer server administered by Mastodon directly. &lt;a href="https://mastodon.online/@contentful" rel="noopener noreferrer"&gt;This is the account we have created for the bot&lt;/a&gt; (which, being a bot, is limited only to republishing content from the blog and is not moderated by a human).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Generate a token in Mastodon
&lt;/h2&gt;

&lt;p&gt;Now that you have a Mastodon account and have familiarized yourself with the service, go to settings &amp;gt; profile &amp;gt; development and select “New Application.” &lt;/p&gt;

&lt;p&gt;Fill out some fields describing your project, then, under “Scopes” only select &lt;code&gt;write:statuses&lt;/code&gt; among all the checkboxes that you see. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F4k1yh4gewg8akaf39763.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F4k1yh4gewg8akaf39763.png" alt="Fill out some fields describing your project, then, under “Scopes” only select  raw `write:statuses` endraw  among all the checkboxes that you see. &amp;lt;br&amp;gt;
"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click “submit,” then a unique token will be generated. Hang on to this information, you’ll need it in a bit.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3  / Option A: Create a webhook in Contentful
&lt;/h2&gt;
&lt;h3&gt;
  
  
  a) Sign up for a Contentful account
&lt;/h3&gt;

&lt;p&gt;Our assumption for this tutorial is that you already have a Contentful account, together with a Space that’s already populated with a content model. &lt;/p&gt;

&lt;p&gt;If you don’t already have one, &lt;a href="https://www.contentful.com/sign-up/" rel="noopener noreferrer"&gt;then this is the place to go to sign up for an account.&lt;/a&gt; And if you want to quickly spin up a blog, &lt;a href="https://www.contentful.com/blog/developer-showcase-low-code-examples-blog/" rel="noopener noreferrer"&gt;we have a roundup of some useful templates here.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Come back when you’re ready to syndicate your content!&lt;/p&gt;
&lt;h3&gt;
  
  
  b) Create a webhook in Contentful
&lt;/h3&gt;

&lt;p&gt;So, let’s summarize. Our goal is to notify our Mastodon account of changes within specific parameters, e.g. that we have added a new post to the Contentful blog.&lt;/p&gt;

&lt;p&gt;The most straightforward approach is to create a webhook in your Contentful Space that communicates directly with Mastodon through the magic of APIs.&lt;/p&gt;

&lt;p&gt;Go to your webhooks via your “Settings” menu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fy3fbs63ftny5bd5acvl6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fy3fbs63ftny5bd5acvl6.png" alt="Go to your webhooks via your “Settings” menu."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’ll see a list of your webhooks; create a new one using the “Add Webhook” button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F3kvsljhhqaclwn09wh3x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F3kvsljhhqaclwn09wh3x.png" alt="You’ll see a list of your webhooks; create a new one using the “Add Webhook” button."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, this is where you’ll configure your webhook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fho1wlrnfuaww5lh5eni1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fho1wlrnfuaww5lh5eni1.png" alt="Now, this is where you’ll configure your webhook."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; Whatever you want! We chose “Contentful blog post to Mastodon.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Webhook URL:&lt;/strong&gt; This is the URL to the Mastodon API. Use the following format, replacing &lt;code&gt;[YOUR_INSTANCE]&lt;/code&gt; and &lt;code&gt;[YOUR_MASTODON_TOKEN]&lt;/code&gt; with the values from Steps 1 and 2.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[YOUR_INSTANCE]/api/v1/statuses?access_token=[YOUR_MASTODON_TOKEN]&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Trigger:&lt;/strong&gt; By default, “Trigger for all events” is selected. DO NOT leave it as it is. Change it to “Select specific triggering events” and make it trigger only when an entry is published. You can see what it looks like below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fxer9ovzbkwxtw5s4por4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fxer9ovzbkwxtw5s4por4.png" alt="By default, “Trigger for all events” is selected. DO NOT leave it as it is. Change it to “Select specific triggering events” and make it trigger only when an entry is published."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers:&lt;/strong&gt; You don’t need to add additional headers, but you need to change the “Content type” to application/json.&lt;/p&gt;

&lt;p&gt;💡Heads up — you can do all the above steps to set up your webhook programmatically using the Contentful API. You can find the code to do this in &lt;a href="https://github.com/contentful/mastodon-webhook" rel="noopener noreferrer"&gt;this repo&lt;/a&gt;.💡&lt;/p&gt;

&lt;p&gt;Finally, and this is a crucial step, you need to figure out what you will “toot” every time the webhook triggers. &lt;/p&gt;

&lt;p&gt;Remember, we want to automatically send a toot every time an entry is published. You define the text of your toot by using a &lt;em&gt;custom payload&lt;/em&gt; on your webhook.&lt;/p&gt;

&lt;p&gt;This depends on your content model. In our example, this is what our content model looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fsylgjcplsc2fjnlu2xia.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fsylgjcplsc2fjnlu2xia.png" alt="This depends on your content model. In our example, this is what our content model looks like:&amp;lt;br&amp;gt;
"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Based on our content model, this would be our payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "status": "New post! {/payload/fields/title/en-US}. \n [YOUR_WEBSITE]/{/payload/fields/slug/en-US}"
}

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

&lt;/div&gt;



&lt;p&gt;The values between the brackets will be replaced by dynamic data from Contentful. Make sure to replace &lt;code&gt;YOUR_WEBSITE&lt;/code&gt; with the URL of your blog, e.g., contentful.com/blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 / Option B: Use a third-party automation service
&lt;/h2&gt;

&lt;p&gt;In some scenarios, you may prefer to sync up the two services using a third-party automation tool. &lt;/p&gt;

&lt;p&gt;This might be because your &lt;a href="https://www.contentful.com/help/content-" rel="noopener noreferrer"&gt;content model&lt;/a&gt; is in the middle of being revised, for example, or environmental governance rules in your org won’t permit you to create webhooks willy-nilly. We get it, it happens.&lt;/p&gt;

&lt;p&gt;For the purposes of this tutorial, we’ll go ahead and create an account with &lt;a href="https://ifttt.com/" rel="noopener noreferrer"&gt;IFTTT&lt;/a&gt;, though &lt;a href="https://zapier.com/" rel="noopener noreferrer"&gt;Zapier&lt;/a&gt; would be equally effective.&lt;/p&gt;

&lt;p&gt;We’ll need to specify two things for our project to work properly; a trigger and the action. Then we’ll top it off with some details for the web request.&lt;/p&gt;

&lt;h3&gt;
  
  
  a) This is the trigger
&lt;/h3&gt;

&lt;p&gt;Within IFTTT, click on “Create” or visit &lt;a href="https://ifttt.com/create" rel="noopener noreferrer"&gt;https://ifttt.com/create&lt;/a&gt;, and follow the prompts to create a dedicated applet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fk577mgwo2iz1jwnm4ddl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fk577mgwo2iz1jwnm4ddl.png" alt="Within IFTTT, click on “Create” and follow the prompts to create a dedicated applet."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the list of services, search for “RSS.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fo6gppry0ceycs2xsrrt0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fo6gppry0ceycs2xsrrt0.png" alt="In the list of services, search for “RSS.”"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose “New feed item” as your trigger.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F8y8m12aueocwh27il753.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F8y8m12aueocwh27il753.png" alt="Choose “New feed item” as your trigger."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste the URL of your RSS feed (&lt;a href="https://www.contentful.com/blog/feed.xml" rel="noopener noreferrer"&gt;ours is here&lt;/a&gt;), and then create the trigger.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fjolrdnjyrluqwrr8v10j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fjolrdnjyrluqwrr8v10j.png" alt="Paste the URL of your RSS feed and then create the trigger."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  b) And this is the action
&lt;/h3&gt;

&lt;p&gt;Now onto choosing an action; this is what IFTTT will do whenever there’s a new item added to your RSS feed.&lt;/p&gt;

&lt;p&gt;We’ll choose “webhook” to send the contents of our RSS entry to the Mastodon API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fia7deq7d5dqj1apcmkac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fia7deq7d5dqj1apcmkac.png" alt="We’ll choose “webhook” to send the contents of our RSS entry to the Mastodon API."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, choose the “webhook action” to “Make a web request” (it’s the only option), because as we said earlier, we’ll be sending a request to the Mastodon API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fp52c8zvswf1w1ttl5or4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fp52c8zvswf1w1ttl5or4.png" alt="Choose the “webhook action” to “Make a web request”, because we’ll be sending a request to the Mastodon API."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  c) Make a web request
&lt;/h3&gt;

&lt;p&gt;Just a few more things you need to add and then we’re done.&lt;/p&gt;

&lt;p&gt;First, the URL that will receive the web request, it will be something like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://[YOUR_INSTANCE]/api/v1/statuses?access_token=[YOUR_MASTODON_TOKEN]&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Then, change the “Method” to “POST” by selecting in the drop down.&lt;/p&gt;

&lt;p&gt;Then, for the “Content Type,” select &lt;code&gt;application/json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then, in the “Body” section, put a JSON object with the “status” property, that will define a template for what your toots will look like.&lt;/p&gt;

&lt;p&gt;In our example, &lt;code&gt;{ "status": "{{EntryTitle}} -&amp;gt; {{EntryUrl}}" }&lt;/code&gt;, our toots will have a simple format of blog post title and then the URL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fe1c5a08is1lbyftu3udj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fe1c5a08is1lbyftu3udj.png" alt="Our toots will have a simple format of blog post title and then the URL."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Testing, testing
&lt;/h2&gt;

&lt;p&gt;To test your new bot, you should go ahead and publish a sample blog post. &lt;/p&gt;

&lt;p&gt;Alternatively, you can live by the seat of your pants and wait until the next time you publish something for real...&lt;/p&gt;

&lt;p&gt;Either way, if everything has been set up correctly, you should now have a working bot that fires off a toot every time a new post appears on your site. &lt;/p&gt;

&lt;p&gt;Here’s a screenshot of our &lt;a href="https://mastodon.online/@contentful" rel="noopener noreferrer"&gt;Contentful bot&lt;/a&gt; working its magic on Mastodon – and hey, it’s already got some followers!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fhih777s4fvimadi4xhf3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fhih777s4fvimadi4xhf3.png" alt="Here’s a screenshot of our Contentful bot working its magic on Mastodon – and hey, it’s already got some followers!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up: Is Mastodon the best Twitter alternative?
&lt;/h2&gt;

&lt;p&gt;So there you have it. Now you know what Mastodon is, what the fediverse is, and how to tie it all together with your Contentful space. &lt;/p&gt;

&lt;p&gt;Is Mastodon really the best Twitter alternative available? We’ll leave that to you to judge, but with this simple little project you can really get your teeth into this intriguing platform and evaluate it for yourself.&lt;/p&gt;

&lt;p&gt;Get started! Start building with a free Contentful account, no credit card required. &lt;a href="https://www.contentful.com/sign-up/" rel="noopener noreferrer"&gt;Sign up.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mastodon</category>
      <category>contentful</category>
      <category>bots</category>
      <category>webhooks</category>
    </item>
    <item>
      <title>Developer Showcase Spotlight: Low-code examples of building blogs</title>
      <dc:creator>Bulent Osman Yusuf</dc:creator>
      <pubDate>Thu, 06 Oct 2022 11:21:26 +0000</pubDate>
      <link>https://forem.com/contentful/developer-showcase-spotlight-low-code-examples-of-building-blogs-pg6</link>
      <guid>https://forem.com/contentful/developer-showcase-spotlight-low-code-examples-of-building-blogs-pg6</guid>
      <description>&lt;p&gt;&lt;strong&gt;Wanna create a blog? Tools are readily available that make it super easy and fun. Contentful, Gatsby and Netlify are your building blocks for building blogs, and in this post I show a few examples.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was &lt;a href="https://www.contentful.com/blog/2022/09/27/developer-showcase-low-code-examples-blog/" rel="noopener noreferrer"&gt;first published&lt;/a&gt; on the Contentful Blog.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My role at Contentful is to manage the company blog, and I love it. We have a dedicated team of developers, designers, writers, and editors all working together to deliver great content –– and I get to pester all of them on a daily basis.&lt;/p&gt;

&lt;p&gt;But when the &lt;a href="https://www.contentful.com/developers/showcase/" rel="noopener noreferrer"&gt;Developer Showcase&lt;/a&gt; was launched early this summer, it got me thinking about building a &lt;a href="https://jamstack.org/" rel="noopener noreferrer"&gt;Jamstack&lt;/a&gt; site of my own; a sandbox to play in, learn something new, and occasionally break stuff.&lt;/p&gt;

&lt;p&gt;The idea was simple: to create a basic blog from modular components, and to do it using existing resources without getting too deep into the code. I wanted to bring together standalone elements like a content management system, a static site generator and hosting provider through the &lt;a href="https://www.contentful.com/blog/2021/08/12/what-is-an-api/" rel="noopener noreferrer"&gt;magic of APIs&lt;/a&gt;. The grand result would be a site that was performant and secure.&lt;/p&gt;

&lt;p&gt;In the end, I got a bit carried away and wound up creating several blogs plus a portfolio to bring them all together. The result is called &lt;a href="https://www.contentful.com/developers/showcase/author/bulent-yusuf/" rel="noopener noreferrer"&gt;Get Some Jam&lt;/a&gt;. And that’s what’s been so utterly delightful about this project.&lt;/p&gt;

&lt;p&gt;Approaching it as a content editor searching for low-code solutions, I found many options for achieving my goal and couldn’t settle on just one. I’m going to tell you all about it in this post, so pull up a seat and make yourself comfortable.&lt;/p&gt;

&lt;h2&gt;
  
  
  First things first, set up a GitHub account
&lt;/h2&gt;

&lt;p&gt;If you leave here with only one takeaway (other than the fact that Contentful is amazing and you should totally be using it for your next project), it’s that a &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;GitHub account&lt;/a&gt; is your passport to many exotic locations on the magical electronic interwebs.&lt;/p&gt;

&lt;p&gt;I used to think that GitHub was just a place where developers would store code and collaborate, but it’s a lot more than that. What’s also wonderful about GitHub is that an account functions as a universal identifier on the web, so you don’t need to create accounts with multiple services and then try to remember passwords for each of them. One GitHub account will grant you secure access to everything.&lt;/p&gt;

&lt;p&gt;From my personal GitHub account, for example, I created and synced up free accounts with &lt;a href="https://www.contentful.com/sign-up/" rel="noopener noreferrer"&gt;Contentful&lt;/a&gt; (content platform), &lt;a href="https://www.gatsbyjs.com/" rel="noopener noreferrer"&gt;Gatsby&lt;/a&gt; (static site generation and deployment), &lt;a href="https://www.netlify.com/" rel="noopener noreferrer"&gt;Netlify&lt;/a&gt; (deployment), and &lt;a href="https://vercel.com/" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt; (deployment), and between those four entities I was able to build four different websites in about a week. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Ffz7dz3bnw800ljc6kq32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ffz7dz3bnw800ljc6kq32.png" alt="A GitHub account is your passport to many exotic locations on the magical electronic interwebs."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The only outlier to this process was Google, which has its own authentication protocol for their services. That came into play for this project when it came to &lt;a href="https://domains.google/v2/" rel="noopener noreferrer"&gt;buying and managing domains&lt;/a&gt;. But Google makes doing this so easy that I really can’t object.&lt;/p&gt;

&lt;p&gt;Oh yes, and the OTHER useful thing about GitHub is that it’s your de-facto place for storing and delivering files that go into the upkeep of a website. Which leads us to my first example.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Building a low-code blog with Gatsby and Gatsby Cloud
&lt;/h2&gt;

&lt;p&gt;The tech stack for this &lt;a href="https://bulentyusuf.com/" rel="noopener noreferrer"&gt;first blog&lt;/a&gt; is very simple and consists of two components: Gatsby and Contentful.&lt;/p&gt;

&lt;p&gt;This is because Gatsby offers more than a &lt;a href="https://www.contentful.com/blog/2022/08/16/what-is-a-framework/" rel="noopener noreferrer"&gt;framework&lt;/a&gt; for static site generation, there’s also the option of a fully featured deployment and hosting service called Gatsby Cloud.&lt;/p&gt;

&lt;p&gt;So, my first port of call was the &lt;a href="https://github.com/contentful/starter-gatsby-blog" rel="noopener noreferrer"&gt;official GitHub repository where Contentful maintains a starter blog template built using Gatsby&lt;/a&gt;, which has push button deployment for Gatsby Cloud. This template is basic but properly formatted with all the necessary features of a functional blog. Things like an index page, formatting for individual posts and key visuals, plus timestamps, authors, and tagging.&lt;/p&gt;

&lt;p&gt;It also comes with a preconfigured content model to populate your Contentful space, and sample posts you can delete later. Much of the heavy lifting is done already for those who are still learning the concept of structured content. My thanks to &lt;a href="https://www.contentful.com/blog/author/david-fateh/" rel="noopener noreferrer"&gt;David Fateh&lt;/a&gt; for maintaining this great resource. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fd8zr50bmio1kcxye25zu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fd8zr50bmio1kcxye25zu.png" alt="The tech stack for this first blog is very simple and consists of two components: Gatsby and Contentful.&amp;lt;br&amp;gt;
"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Bonus: How to add inline images
&lt;/h3&gt;

&lt;p&gt;While adding some sample entries of my own to this blog, I found a setting that wasn’t to my liking. You’re not able to show inline images in the body of a post. This is because images are a Rich Text Asset that’s not defined (and therefore not queryable) in the content model when setting up the blog for the first time.&lt;/p&gt;

&lt;p&gt;After a bit of Googling, I found some helpful blog posts articulating how to resolve the issue. One by &lt;a href="https://www.contentful.com/blog/author/paul-scanlon/" rel="noopener noreferrer"&gt;Paul Scanlon&lt;/a&gt; over on the &lt;a href="https://www.gatsbyjs.com/blog/how-to-use-the-contentful-rich-text-field-with-gatsby/" rel="noopener noreferrer"&gt;Gatsby blog&lt;/a&gt; and another by &lt;a href="https://javascript.plainenglish.io/rendering-contentful-rich-text-components-in-gatsby-4744d4940cea" rel="noopener noreferrer"&gt;Andreea Macoveiciuc&lt;/a&gt; on Medium. After a bit of trial and error, I wedged an approximation of their code into my &lt;code&gt;blog-post.js&lt;/code&gt; file in &lt;code&gt;starter-gatsby-blog/src/templates/blog-post.js&lt;/code&gt; and now images are visible.&lt;/p&gt;

&lt;p&gt;Here it is if you’d like to use it yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body {
   raw
   references {
      ... on ContentfulAsset {
         contentful_id
         title
         description
         gatsbyImage(width: 1000)
          __typename
      }
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I did attempt to have this merged into the main Starter Gatsby Blog repo on GitHub, but it causes issues at startup because it’s an unexpected element in the schema. As long as you use this code after the blog has been generated you’ll be golden.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Would you like to build something more elaborate with Contentful and Gatsby? &lt;a href="https://www.contentful.com/gatsby-starter-guide/" rel="noopener noreferrer"&gt;Check out this guide for a fully featured homepage starter.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. Building a low-code blog with NextJS and Vercel
&lt;/h2&gt;

&lt;p&gt;Moving on to something slightly more complicated — but not by much — the tech stack for this &lt;a href="https://www.nextblog.net/" rel="noopener noreferrer"&gt;second blog&lt;/a&gt; is three components: Contentful, NextJS and Vercel. In this instance, we’re switching to a new framework and a new deployment service.&lt;/p&gt;

&lt;p&gt;Again, this is a basic but functional blog, with a pre-populated content model which looks like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;title&lt;/code&gt; – Text field (type short text)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;content&lt;/code&gt; – Rich Text field&lt;/p&gt;

&lt;p&gt;&lt;code&gt;excerpt&lt;/code&gt; – Text field (type Long text, full-text search)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;coverImage&lt;/code&gt; – Media field (type one file)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;date&lt;/code&gt; – Date and time field&lt;/p&gt;

&lt;p&gt;&lt;code&gt;slug&lt;/code&gt; – Text field. You can optionally go to the settings of this field, and under Appearance, select Slug to display it as a slug of the title field.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;author&lt;/code&gt; – Reference field (type one reference)&lt;/p&gt;

&lt;p&gt;If you really want to dig into the process yourself, you can &lt;a href="https://github.com/vercel/next.js/tree/canary/examples/cms-contentful" rel="noopener noreferrer"&gt;follow the instructions on the GitHub repo&lt;/a&gt; and create the content model manually from within your Contentful space. OR you could just hit that big blue “deploy” button and have it taken care of for you. Can you guess which option I chose? =D&lt;/p&gt;

&lt;p&gt;Not much else to add here, except that this template might be really useful if you’re intent on showcasing high-definition images for each post. You can see our very own &lt;a href="https://www.contentful.com/blog/author/brittany-walker/" rel="noopener noreferrer"&gt;Brittany Walker&lt;/a&gt; spinning up this same template in a &lt;a href="https://www.contentful.com/nextjs-starter-guide/" rel="noopener noreferrer"&gt;video tutorial&lt;/a&gt; here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Ffbipr7kilsdrtrck3onz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ffbipr7kilsdrtrck3onz.png" alt="The tech stack for this second blog is three components: Contentful, NextJS and Vercel."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Building a low-code blog with RemixJS and Vercel
&lt;/h2&gt;

&lt;p&gt;At first glance, this &lt;a href="https://www.remixblog.net/" rel="noopener noreferrer"&gt;third blog&lt;/a&gt; looks exactly the same as the Gatsby Starter Blog. It’s actually a fork and &lt;a href="https://github.com/marcolink/contentful-remix-starter-blog" rel="noopener noreferrer"&gt;rebuilt from the ground up using the RemixJS framework&lt;/a&gt;. For this site, I opted to host it again on Vercel.&lt;/p&gt;

&lt;p&gt;This starter blog template is the work of Contentful Software Engineer &lt;a href="https://www.contentful.com/developers/showcase/author/marco-link/" rel="noopener noreferrer"&gt;Marco Link&lt;/a&gt;, and has pride of place on the Developer Showcase alongside some other projects of his making. &lt;/p&gt;

&lt;p&gt;One tweak that I made to the blog after creating it was to change the date formatting from DE to EN. You can do that by visiting the file &lt;code&gt;to-readable-date.ts&lt;/code&gt; in &lt;code&gt;contentful-remix-starter-blog/app/utils&lt;/code&gt; and changing the value “de-DE” to “en-GB”.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Would you like to build something more elaborate with Contentful and RemixJS? &lt;a href="https://www.contentful.com/remix-tutorial/" rel="noopener noreferrer"&gt;Check out this guide for a fully featured portfolio starter.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. Building a low-code portfolio with Gatsby and Netlify
&lt;/h2&gt;

&lt;p&gt;Phew, that’s a lot of blogs! The last piece of the project is to bring them all together in one place, with all the relevant links and a bit of discourse about how they were made and the technologies used. This &lt;a href="https://getsomejam.net/" rel="noopener noreferrer"&gt;portfolio site&lt;/a&gt; is called “Get Some Jam,” and the pun is very much intended.&lt;/p&gt;

&lt;p&gt;I’d been searching the web for a suitable template, and eventually I found the &lt;a href="https://github.com/EmaSuriano/gatsby-starter-mate" rel="noopener noreferrer"&gt;Mate portfolio starter&lt;/a&gt; by software engineer &lt;a href="https://emasuriano.com/" rel="noopener noreferrer"&gt;Ema Suriano&lt;/a&gt;. This is a beautiful single page site with a customizable and responsive design regardless of whether you access it on a desktop, smartphone, or magic mirror. If you end up using this template yourself, &lt;a href="https://www.buymeacoffee.com/emasuriano" rel="noopener noreferrer"&gt;be sure to buy them a coffee&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It also has a handy feature to import posts from a Medium account, so that I could offer meta-commentary on the process of creating these posts and lessons learned alongside the links to the sites themselves. I expect that no one will find these posts interesting except perhaps my mother (and even that’s a stretch), but it felt good to document the personal eureka moments as I went along.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Facwmxpc61cc54ojeof74.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Facwmxpc61cc54ojeof74.png" alt="The last piece of the project is to bring them all together in one place, with all the relevant links and a bit of discourse about how they were made and the technologies used."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Next steps after the sites are built
&lt;/h2&gt;

&lt;p&gt;That’s the story behind my submission of &lt;a href="https://getsomejam.net/" rel="noopener noreferrer"&gt;Get Some Jam&lt;/a&gt; to the Developer Showcase. Thank you for your attention. And since you’ve made it this far, I’ve two more nuggets of wisdom to share from these low-code examples.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add webhooks for automating previews and updates
&lt;/h3&gt;

&lt;p&gt;We recently published a detailed guide to using webhooks in Contentful. &lt;a href="https://www.contentful.com/blog/2022/08/25/ultimate-guide-contentful-webhooks/" rel="noopener noreferrer"&gt;The ultimate guide, in fact&lt;/a&gt;. Just to add my two cents; this is one of the first things to investigate after you’ve set up your site with Contentful and your framework/deployment service of choice. It automates many of the key steps you would normally take when managing a site, such as web page previews or pushing them live when you hit the publish button in Contentful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep an eye on Lighthouse scores
&lt;/h3&gt;

&lt;p&gt;Another fantastic feature that’s available on Gatsby Cloud and Netlify is Lighthouse scores. Essentially, Lighthouse is a tool from Google that analyzes web apps and web pages, collecting modern performance metrics and insights to guide developer best practices. Each time you deploy an update, your new build is given a score between 1–100 for each of the following criteria: Performance, Accessibility, Best Practices, Search Engine Optimization and Progressive Web Apps. &lt;a href="https://www.netlify.com/blog/view-google-lighthouse-scores-visualizations/" rel="noopener noreferrer"&gt;This post on the Netlify blog is a great introduction&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Sitting on the other side of my little project, I have a renewed appreciation for the Contentful content platform. Yes, it’s scalable and versatile and fast and reliable — all of these things are true. But it’s also accessible enough that a non-technical person can roll up their sleeves and build something for themselves. &lt;/p&gt;

&lt;p&gt;And this is made possible thanks to a terrific group of developers and creatives who have shared their efforts for the betterment of the community. I proffer a tip of the hat to them all.&lt;/p&gt;

&lt;p&gt;Get started! Start building with a free Contentful account, no credit card required.&lt;a href="https://www.contentful.com/sign-up/" rel="noopener noreferrer"&gt; Sign up.&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Content migration from Drupal 7 to Contentful: A step-by-step guide</title>
      <dc:creator>Bulent Osman Yusuf</dc:creator>
      <pubDate>Wed, 20 Jul 2022 14:36:51 +0000</pubDate>
      <link>https://forem.com/contentful/content-migration-from-drupal-7-to-contentful-a-step-by-step-guide-12ol</link>
      <guid>https://forem.com/contentful/content-migration-from-drupal-7-to-contentful-a-step-by-step-guide-12ol</guid>
      <description>&lt;p&gt;&lt;em&gt;NOTE: This article originally appeared on the &lt;a href="https://www.contentful.com/blog/2022/07/19/content-migration-from-drupal-7-to-contentful/"&gt;Contentful Blog&lt;/a&gt;. Sharing here on behalf of the author Patrick Geers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Folks, we have an important question. Are you considering migrating your content from Drupal to Contentful? Then this post will show you how. &lt;em&gt;Carpe diem!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.drupal.org/psa-2022-02-23"&gt;Drupal 7 is officially reaching end of life on November 1, 2023&lt;/a&gt;. After that point, all support for this legacy content management system will come to a close. &lt;/p&gt;

&lt;p&gt;So how should you plan for the change? Sure, you could start using the latest version of Drupal. Or — and maybe this is a wild and crazy idea, but hear us out — you could move everything over to a new CMS. &lt;/p&gt;

&lt;p&gt;After all, if you’ve taken this long to move on from Drupal 7, there’s likely a good reason why you were taking your time.&lt;/p&gt;

&lt;p&gt;Let’s hazard a guess: Was it a feeling of dissatisfaction with using a monolithic CMS? Is it too complex to maintain? Do you desire a conscious uncoupling? To upgrade to something more versatile for your content needs?&lt;/p&gt;

&lt;p&gt;It’s time to use Contentful! We have a lot of resources on this site to outline the benefits of adopting a &lt;a href="https://www.contentful.com/r/knowledgebase/what-is-headless-cms/"&gt;headless CMS&lt;/a&gt;. But rather than dive into a discussion about content strategy and data migration, this post explains how to migrate content from Drupal 7 to Contentful. &lt;/p&gt;

&lt;p&gt;We’ll be outlining the workflow of a migration project step by step, together with examples, migration tools, and command line prompts. &lt;/p&gt;

&lt;p&gt;Before we dive in, there are two prerequisites in order for this guide to be useful. First, you have worked with Drupal 7. Second, you have some knowledge of the command line interface in Contentful. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.contentful.com/blog/2022/07/19/content-migration-from-drupal-7-to-contentful/"&gt;Ready? Let’s go!&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

</description>
      <category>drupal</category>
      <category>contentful</category>
      <category>php</category>
    </item>
  </channel>
</rss>
