<?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: Ayush Saran</title>
    <description>The latest articles on DEV Community by Ayush Saran (@ayush_saran).</description>
    <link>https://dev.to/ayush_saran</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%2F1504274%2F17a02d40-48f8-4f93-ae07-d1e253f01584.png</url>
      <title>DEV Community: Ayush Saran</title>
      <link>https://dev.to/ayush_saran</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ayush_saran"/>
    <language>en</language>
    <item>
      <title>Building a Trend Analysis Tool with the FeedRika API - Part I - Setup</title>
      <dc:creator>Ayush Saran</dc:creator>
      <pubDate>Fri, 19 Jul 2024 14:21:00 +0000</pubDate>
      <link>https://dev.to/ayush_saran/building-a-trend-analysis-tool-with-the-feedrika-api-part-i-setup-50dp</link>
      <guid>https://dev.to/ayush_saran/building-a-trend-analysis-tool-with-the-feedrika-api-part-i-setup-50dp</guid>
      <description>&lt;h1&gt;
  
  
  Building a Trend Analysis Tool with the &lt;a href="https://feedrika.com/" rel="noopener noreferrer"&gt;FeedRika&lt;/a&gt; API
&lt;/h1&gt;

&lt;p&gt;I recently came across this cool News API service called &lt;a href="https://feedrika.com/" rel="noopener noreferrer"&gt;FeedRika&lt;/a&gt; that gives you the latest world news along with a sentiment score and relevant categories. It has a Free usage tier so I thought of trying it out and seeing what I can build with it.&lt;/p&gt;

&lt;p&gt;One of my ideas was so build a tool to see how a company or topic has fared in the news. &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%2Fi.postimg.cc%2FZqZ69xnb%2Fgoogletrends.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%2Fi.postimg.cc%2FZqZ69xnb%2Fgoogletrends.png" alt="https://i.postimg.cc/ZqZ69xnb/googletrends.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see a chart from Google Trends that shows you how popular a term is in the public space but that only reflects the search volume. It does not give you an idea of whether the sentiment around it is positive or negative. So let's build a tool that scours the news to see if the topic is being written about favorably or not and display a similar graph.&lt;/p&gt;

&lt;h3&gt;
  
  
  Here are the broad steps we will take to build this tool:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Collect the topic to search for, from the user&lt;/li&gt;
&lt;li&gt;Fetch news articles from Feedrika that match the topic&lt;/li&gt;
&lt;li&gt;Loop through the returned articles and extract the sentiment score for each article&lt;/li&gt;
&lt;li&gt;Plot these scores to a chart to display visually&lt;/li&gt;
&lt;li&gt;Do some math to generate additional stats for the topic, such as average sentiment, total positive/negative, etc...&lt;/li&gt;
&lt;li&gt;Show the source news articles to the user so they can explore the topic in further detail.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Before We Start
&lt;/h1&gt;

&lt;p&gt;Let's get an API key from the Feedrika website so we can fetch news articles to work with.&lt;br&gt;
Head over to &lt;a href="https://feedrika.com/" rel="noopener noreferrer"&gt;feedrika.com&lt;/a&gt; and sign up for an account. &lt;/p&gt;

&lt;p&gt;Once you sign up you will find your API key on your profile page &lt;a href="https://feedrika.com/profile" rel="noopener noreferrer"&gt;feedrika.com/profile&lt;/a&gt; along with your credit balance and a request log showing what requests you have made.&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%2Fi.postimg.cc%2FtJ7MKjGM%2Ffeedrika-dashboard.jpg" 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%2Fi.postimg.cc%2FtJ7MKjGM%2Ffeedrika-dashboard.jpg" alt="https://i.postimg.cc/tJ7MKjGM/feedrika-dashboard.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Choosing the platform
&lt;/h2&gt;

&lt;p&gt;We could build this tool in just HTML, CSS and Javascript but it involves using a private API key and it's not a good idea to transmit that openly over the internet so let's use node and express to hide the API key on the server side as an environment variable and keep it private. &lt;/p&gt;

&lt;p&gt;I'm going to tailor this tutorial to absolute beginners so if you're already familiar with node and express feel free to skip ahead to the more interesting parts.&lt;/p&gt;
&lt;h2&gt;
  
  
  Setup:
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Node and Express
&lt;/h3&gt;

&lt;p&gt;Make sure you have the Node runtime environment installed. If not you can get it &lt;a href="https://nodejs.org/en" rel="noopener noreferrer"&gt;here.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Create a directory for this project on your local machine and navigate inside it.&lt;/p&gt;

&lt;p&gt;Run : &lt;code&gt;npm init -y&lt;/code&gt; in the terminal to initialize a node project with the defaults.&lt;/p&gt;

&lt;p&gt;Run: &lt;code&gt;npm i express&lt;/code&gt; to install the express framework. &lt;br&gt;
Express is a simple webserver that will allow us to serve the pages and api routes within our application. It's easy to setup and widely used so finding help online and troubleshooting is easy.&lt;/p&gt;

&lt;p&gt;Open up the folder in VSCode or your favorite IDE and look inside.&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%2Fi.postimg.cc%2FVsr9VRS6%2Fscreenshot-2.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%2Fi.postimg.cc%2FVsr9VRS6%2Fscreenshot-2.png" alt="https://i.postimg.cc/Vsr9VRS6/screenshot-2.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should have a node_modules folder, a package.json file and a package-lock.json file. &lt;/p&gt;
&lt;h3&gt;
  
  
  2. Creating our first Route
&lt;/h3&gt;

&lt;p&gt;Let's make an index page that welcomes users to our app&lt;br&gt;
Make a new file 'welcome.html in' the root of your project. Fill it with just the basic information to get started&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;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
    &amp;lt;title&amp;gt;Welcome&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;This is my news trends app!&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's setup our first route and return this welcome.html page when someone opens the app&lt;/p&gt;

&lt;p&gt;Create an 'index.js' file in the root of your app and import the express framework.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Import the express framework
express = require("express");

// tell node that we are creating an express app
const app = express();

// define the port that the server will run on
const port = 3000;

// define the route for the index page
app.get("/", (req, res) =&amp;gt; {
 res.sendFile(__dirname + "/welcome.html");
});

// Start the server and tell the app to listen for incoming connections on the port
app.listen(port, () =&amp;gt; {
  console.log(`Server running at http://localhost:${port}`);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's test our progress. &lt;br&gt;
From the terminal run &lt;code&gt;node index.js&lt;/code&gt;. You should see a confirmation message saying the server is running&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%2Fi.postimg.cc%2FW44n5PLF%2Fscreenshot-5.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%2Fi.postimg.cc%2FW44n5PLF%2Fscreenshot-5.png" alt="https://i.postimg.cc/W44n5PLF/screenshot-5.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the link in the terminal or paste it into the browser to confirm that you can see the welcome page&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%2Fi.postimg.cc%2FSKmLJbN1%2Fscreenshot-4.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%2Fi.postimg.cc%2FSKmLJbN1%2Fscreenshot-4.png" alt="https://i.postimg.cc/SKmLJbN1/screenshot-4.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Environment Variables
&lt;/h3&gt;

&lt;p&gt;Let's setup an environment variable to save our API key.&lt;br&gt;
Create a new file '.env' in the root of your project.&lt;br&gt;
Copy and paste your API key from the Feedrika profile page 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%2Fi.postimg.cc%2FFzxkt709%2Fscreenshot-6.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%2Fi.postimg.cc%2FFzxkt709%2Fscreenshot-6.png" alt="https://i.postimg.cc/Fzxkt709/screenshot-6.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's also add a '.gitignore' file so we don't accidently upload this private key to the web&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%2Fi.postimg.cc%2F25BqkHn9%2Fscreenshot-7.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%2Fi.postimg.cc%2F25BqkHn9%2Fscreenshot-7.png" alt="https://i.postimg.cc/25BqkHn9/screenshot-7.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Now for some housekeeping
&lt;/h4&gt;

&lt;p&gt;We don't want to start and stop the server from the terminal every time we make an edit to the app so let's setup auto reloading.&lt;/p&gt;

&lt;p&gt;Open your package.json file and add these lines to the script object&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"start": "node index.js",
"dev": "nodemon index.js -w"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fi.postimg.cc%2FSNsxQThL%2Fscreenshot-8.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%2Fi.postimg.cc%2FSNsxQThL%2Fscreenshot-8.png" alt="https://i.postimg.cc/SNsxQThL/screenshot-8.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are using nodemon with the '-w' flag to watch for changes in our root folder and restart the server. &lt;/p&gt;

&lt;p&gt;Now we can start our server with the &lt;code&gt;npm run dev&lt;/code&gt; command and it will automatically watch for changes and restart the server for us.&lt;/p&gt;

&lt;p&gt;If you get an error about not recognizing nodemon run this to install it globally and try again:&lt;br&gt;
&lt;code&gt;npm i nodemon -g&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Okay that completes the setup, lets move on to building out our App!
&lt;/h2&gt;

&lt;p&gt;Let's update the welcome page and add a search box to ask for topics&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;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
    &amp;lt;title&amp;gt;Welcome&amp;lt;/title&amp;gt;
    &amp;lt;link rel="stylesheet" href="styles.css"&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
    &amp;lt;div id="container"&amp;gt;
        &amp;lt;h1&amp;gt;News trends&amp;lt;/h1&amp;gt;
        &amp;lt;h3&amp;gt;Search for a topic to get started&amp;lt;/h3&amp;gt;
        &amp;lt;form class="search-form" action="/search" method="get"&amp;gt;
            &amp;lt;input type="text" name="topic" placeholder="Search for a topic"&amp;gt;
            &amp;lt;button type="submit"&amp;gt;Search&amp;lt;/button&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setup Stylesheets
&lt;/h3&gt;

&lt;p&gt;Create a 'public' folder in the root of your project that will host our client side javascript, css and image files.&lt;br&gt;
Add a 'styles.css' file to the public folder and add some basic styles for the welcome page&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%2Fi.postimg.cc%2FnLzLr3Bf%2Fscreenshot-10.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%2Fi.postimg.cc%2FnLzLr3Bf%2Fscreenshot-10.png" alt="https://i.postimg.cc/nLzLr3Bf/screenshot-10.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;styles.css:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* Import the Inter font */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;700&amp;amp;display=swap');

body {
    margin: 0;
    padding: 0;
    font-family: 'Inter', sans-serif;
}

#container {
    width: 100%;
    height: 100vh;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
}

/* SEARCH FORM */

.search-form input {
    padding: 1em;
    border: 1px solid #ccc;
    border-radius: 8px;
}

.search-form button {
    padding: 1em;
    border: 1px solid #ccc;
    border-radius: 8px;
    background-color: #313131;
    cursor: pointer;
    color: #fff;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we need to tell express how to serve these static files so open 'index.js' and add this line:&lt;br&gt;
&lt;code&gt;app.use(express.static("public"));&lt;/code&gt;&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%2Fi.postimg.cc%2FW4FPxC0z%2Fscreenshot-11.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%2Fi.postimg.cc%2FW4FPxC0z%2Fscreenshot-11.png" alt="https://i.postimg.cc/W4FPxC0z/screenshot-11.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should be able to see the changes reflected right away, refresh the page in your browser and confirm&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%2Fi.postimg.cc%2Fd3JpQxZ8%2Fscreenshot-13.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%2Fi.postimg.cc%2Fd3JpQxZ8%2Fscreenshot-13.png" alt="https://i.postimg.cc/d3JpQxZ8/screenshot-13.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Great! Let's now tell express how to handle this form submission
&lt;/h3&gt;

&lt;p&gt;If you notice the form it submits to a '/search' endpoint so let's setup this route and handle the form submission&lt;/p&gt;

&lt;p&gt;Open up your 'index.js' file and add these lines&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// define the route for the /search endpoint
app.get("/search", (req, res) =&amp;gt; {
  // get the query string from the request
  let query = req.query.topic;
  // send the query string back as the response
  res.send(query);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fi.postimg.cc%2FnhkhkypD%2Fscreenshot-14.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%2Fi.postimg.cc%2FnhkhkypD%2Fscreenshot-14.png" alt="https://i.postimg.cc/nhkhkypD/screenshot-14.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's test it out, go to your browser and enter a search term in the box and click submit&lt;br&gt;
You should see a response from the server which shows your search term, like this&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%2Fi.postimg.cc%2FNfttzdN7%2Fscreenshot-15.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%2Fi.postimg.cc%2FNfttzdN7%2Fscreenshot-15.png" alt="https://i.postimg.cc/NfttzdN7/screenshot-15.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Good Job!
&lt;/h2&gt;

&lt;p&gt;Now that we have a search route working let's plug-in the FeedRika API and fetch news for the topic.&lt;/p&gt;

&lt;p&gt;Coming soon Part II - Fetching Data&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>beginners</category>
      <category>express</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Dark Interfaces. The Why?</title>
      <dc:creator>Ayush Saran</dc:creator>
      <pubDate>Mon, 15 Jul 2024 17:11:22 +0000</pubDate>
      <link>https://dev.to/ayush_saran/dark-interfaces-the-why-293l</link>
      <guid>https://dev.to/ayush_saran/dark-interfaces-the-why-293l</guid>
      <description>&lt;p&gt;Continuing in my experiments in simplicity I decided to see what the Matomo analytics dashboard would look like in dark mode.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxizjw9il30x5psrb2lw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxizjw9il30x5psrb2lw.png" alt="Image description" width="800" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the original dashboard, in it's dated color scheme:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4p9p1hwvgyht2iomhztp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4p9p1hwvgyht2iomhztp.png" alt="Image description" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here is a quick draft of the dashboard in a modern dark theme:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0z7e2nyfy92tr5hty1hy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0z7e2nyfy92tr5hty1hy.png" alt="Image description" width="800" height="676"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Works?
&lt;/h2&gt;

&lt;p&gt;Every visual element requires processing and removing the shadows and colors allows for the eyes to quickly find information because of the lack of competing elements to separate out.&lt;/p&gt;

&lt;p&gt;Reducing the color scheme to only the essentials increases the contrast and makes the page look less daunting at first glance.&lt;/p&gt;

&lt;p&gt;The higher contrast of white text on a black background makes it easy to direct focus to the data instead of the box-backgrounds and shadows which are no longer competing against the text for attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  What doesn't ?
&lt;/h2&gt;

&lt;p&gt;Some of the branding of the original interface is lost in dark mode, it now looks like every other dark-ui dashboard.&lt;/p&gt;

&lt;p&gt;This may not be a huge issue as the decision to prioritize readability, legibility and information clarity seems like the right trade-off in this case.&lt;/p&gt;

&lt;p&gt;Overall I'm happy with the direction this is taking and I will continue to refine this draft and see if I can get to a finished design for the other screens also, then compare the whole set vs the original to see if it aids usability..&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A Simple One-Page Portfolio Template</title>
      <dc:creator>Ayush Saran</dc:creator>
      <pubDate>Mon, 15 Jul 2024 17:00:21 +0000</pubDate>
      <link>https://dev.to/ayush_saran/a-simple-one-page-portfolio-template-2b0i</link>
      <guid>https://dev.to/ayush_saran/a-simple-one-page-portfolio-template-2b0i</guid>
      <description>&lt;p&gt;This week I worked on simplifying my personal website. Although I loved the character of the old design I wanted to boil the page down to it's basics to make the vital information easier to scan and process.&lt;/p&gt;

&lt;p&gt;It's tempting to get caught up in visual elements when you're designing something but it's important to question the why? Like who is this page for? What are they looking for? How can I get them to the information they want faster and easier.&lt;/p&gt;

&lt;p&gt;Here is my new minimal one-page template:&lt;br&gt;
&lt;a href="http://www.ayushsaran.info" rel="noopener noreferrer"&gt;www.ayushsaran.info&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I decided to release a freebie version on GitHub so anyone can use this for their own portfolio or personal one-pager.&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%2Fhnauu738jd4v22xu698d.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%2Fhnauu738jd4v22xu698d.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's just a single .html file with CSS included so you can host it anywhere and if you host it on github pages then your hosting and CI/CD is taken care of automatically for free.&lt;/p&gt;

&lt;p&gt;Get it on GitHub: &lt;a href="https://github.com/ayushsaranGithuB/one-page-portfolios" rel="noopener noreferrer"&gt;https://github.com/ayushsaranGithuB/one-page-portfolios&lt;/a&gt;&lt;/p&gt;

</description>
      <category>portfolio</category>
      <category>onepage</category>
      <category>template</category>
      <category>freebie</category>
    </item>
    <item>
      <title>Building A SimpleNote to Obsidian notes converter</title>
      <dc:creator>Ayush Saran</dc:creator>
      <pubDate>Tue, 09 Jul 2024 21:57:06 +0000</pubDate>
      <link>https://dev.to/ayush_saran/building-a-simplenote-to-obsidian-notes-converter-33j9</link>
      <guid>https://dev.to/ayush_saran/building-a-simplenote-to-obsidian-notes-converter-33j9</guid>
      <description>&lt;h1&gt;
  
  
  Building A SimpleNote to Obsidian notes converter
&lt;/h1&gt;

&lt;h1&gt;
  
  
  See it in action:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://simplenote-to-obsidian.fly.dev/" rel="noopener noreferrer"&gt;https://simplenote-to-obsidian.fly.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://simplenote-to-obsidian.fly.dev/" rel="noopener noreferrer"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9yPc2kxT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/ayushsaranGithuB/simplenote-to-obsidian/assets/112019897/a3e65e5b-a9a3-4715-9d71-3f59418d6a82" alt="https://simplenote-to-obsidian.fly.dev/" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  WHY?
&lt;/h1&gt;

&lt;p&gt;I like quickly jotting down notes in SimpleNote but after seeing &lt;a href="https://obsidian.md" rel="noopener noreferrer"&gt;Obsidian&lt;/a&gt; pop up all over the web I was curious and decided to try it out. And I liked it, the ability to add more structure and link documents seemed like a great way to build up to a longer post by referencing snippets and sections that I had saved up as un-related notes in SimpleNote.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;SimpleNotes saves notes in .txt files and while it's easy to export out of SimpleNotes there's no direct way to transfer the notes over to Obsidian.&lt;/p&gt;

&lt;p&gt;I tried looking into the official migration guide at: &lt;br&gt;
&lt;a href="https://help.obsidian.md/import" rel="noopener noreferrer"&gt;https://help.obsidian.md/import&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I even tried looking for community plugins that would handle this: &lt;br&gt;
&lt;a href="https://obsidian.md/plugins" rel="noopener noreferrer"&gt;https://obsidian.md/plugins&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It seemed bizarre that there was no official way to import from SimpleNotes, which is quite a popular platform. Then I stumbled across this python script from &lt;a href="https://github.com/philgyford/simplenote-to-obsidian/blob/main/convert_notes.py" rel="noopener noreferrer"&gt;https://github.com/philgyford/simplenote-to-obsidian/blob/main/convert_notes.py&lt;/a&gt; and decided to build my own web version in JavaScript.&lt;/p&gt;

&lt;h1&gt;
  
  
  HOW IT WORKS
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Upload the JSON file from SimpleNote that contains an export of all the notes&lt;/li&gt;
&lt;li&gt;Parse each note and convert the Tags into Obsidian compatible #Tags&lt;/li&gt;
&lt;li&gt;Export this updated note into its own .md file&lt;/li&gt;
&lt;li&gt;Change the modified date to reflect the date from the original SimpleNote file&lt;/li&gt;
&lt;li&gt;Save these .md notes into a folder&lt;/li&gt;
&lt;li&gt;Create a Zip for export that can be downloaded to import into Obsidian&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  The stack
&lt;/h1&gt;

&lt;p&gt;Usually I'd build this in NEXT.js and host it on Vercel but having recently run into a API route timeout I knew that Vercel allows only ~5-10 seconds for script execution in API routes (on the Hobby Tier) and I was worried that parsing the notes could take some time in larger collections so I built this as a simple Node + Express App and decided to try hosting it on Fly.io&lt;/p&gt;

&lt;p&gt;It wasn't AS easy as connecting a github repo to Vercel, but within 20 mins I had my account setup on fly.io and the app deployed&lt;/p&gt;

&lt;h1&gt;
  
  
  Challenges
&lt;/h1&gt;

&lt;h3&gt;
  
  
  File Upload in Express v4
&lt;/h3&gt;

&lt;p&gt;I just couldnt get the uploaded file through to the controller. The POST data from the form looked okay on the front-end and all my code looked ok on the Express end but any calls to req.body came up as an empty object {}!&lt;/p&gt;

&lt;p&gt;I cracked my head around this for an hour before stumbling across this StackOverflow post where a kind poster pointed out that file uploads in forms are no longer handled by Express as of v4 and require an external library. I went with 'express-fileupload' &lt;a href="https://www.npmjs.com/package/express-fileupload" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/express-fileupload&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creation Date
&lt;/h3&gt;

&lt;p&gt;There is a function to update the 'Modified by' and 'Last Accessed' date in 'fs' for node that works across platforms but changing the 'Created At' date is trickier.&lt;/p&gt;

&lt;p&gt;The fs-futimessync function does not handle 'Created At' dates&lt;br&gt;
&lt;a href="https://www.geeksforgeeks.org/node-js-fs-futimessync-method/?ref=lbp" rel="noopener noreferrer"&gt;https://www.geeksforgeeks.org/node-js-fs-futimessync-method/?ref=lbp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I did stumble upon &lt;a href="https://github.com/baileyherbert/utimes" rel="noopener noreferrer"&gt;https://github.com/baileyherbert/utimes&lt;/a&gt;.&lt;br&gt;
A Cross-platform native addon to change the btime, mtime, and atime of files in Node.js.&lt;br&gt;
It seems to fix the issue for Win + Mac systems so I might give it a try for the next iteration of this tool&lt;/p&gt;

&lt;h1&gt;
  
  
  Finally...
&lt;/h1&gt;

&lt;p&gt;And that's it. I was finally able to build the tool and test it and it works great!&lt;br&gt;
I was able to import all my SimpleNote data into Obsidian easily and the tags were preserved&lt;/p&gt;

&lt;h1&gt;
  
  
  See it in action:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://simplenote-to-obsidian.fly.dev/" rel="noopener noreferrer"&gt;https://simplenote-to-obsidian.fly.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://simplenote-to-obsidian.fly.dev/" rel="noopener noreferrer"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9yPc2kxT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://github.com/ayushsaranGithuB/simplenote-to-obsidian/assets/112019897/a3e65e5b-a9a3-4715-9d71-3f59418d6a82" alt="https://simplenote-to-obsidian.fly.dev/" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give it a go and let me know if it helps you.&lt;/p&gt;

&lt;h1&gt;
  
  
  + BONUS
&lt;/h1&gt;

&lt;p&gt;I've shared the tool as a github-repo for other people to mess around with&lt;br&gt;
&lt;a href="https://github.com/ayushsaranGithuB/simplenote-to-obsidian" rel="noopener noreferrer"&gt;https://github.com/ayushsaranGithuB/simplenote-to-obsidian&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comments, criticisms, suggestions are welcome&lt;br&gt;
Please file an issue if you find a bug: &lt;a href="https://github.com/ayushsaranGithuB/simplenote-to-obsidian/issues" rel="noopener noreferrer"&gt;https://github.com/ayushsaranGithuB/simplenote-to-obsidian/issues&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>simplenote</category>
      <category>obsidian</category>
      <category>converter</category>
    </item>
    <item>
      <title>Using 11ty and DecapCMS for 'non-blog' static websites -pt 2 Pages</title>
      <dc:creator>Ayush Saran</dc:creator>
      <pubDate>Sat, 18 May 2024 22:51:53 +0000</pubDate>
      <link>https://dev.to/ayush_saran/using-11ty-and-decapcms-for-non-blog-static-websites-pt-2-pages-5d4i</link>
      <guid>https://dev.to/ayush_saran/using-11ty-and-decapcms-for-non-blog-static-websites-pt-2-pages-5d4i</guid>
      <description>&lt;p&gt;While there are plenty of examples for using 11ty and Decap CMS in blog settings, I struggled to find a way to make it work for a non-blog static website.&lt;/p&gt;

&lt;p&gt;Leaving these tips out on the internet for anybody else looking to do the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making a static landing page editable in DecapCMS
&lt;/h2&gt;

&lt;p&gt;This tip is for non markdown pages, such as landing pages that have unique structure and content that cant be edited in a WYSIWYG editor because of the complex underlying HTML structure that goes with the landing page.&lt;/p&gt;

&lt;p&gt;I still needed to make all the text on this page editable so I decided to make them into strings that can be edited via the DecapCMS admin UI.&lt;/p&gt;

&lt;p&gt;There might be a simpler approach but I went with loading all the text as frontmatter in a markdown file. Here is what my home landing page looks like &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;index.md&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

---
title: "Uplocal - Homepage"
layout: home.liquid
hero-tagline: THE MARKETING OS for MULTI LOCATION BUSINESSES
hero-h1-firstline: Accelerate Local Demand
hero-h1-secondline: Elevate Customer Experience
hero-h1-thirdline: Collaborate Seamlessly
hero-signup-cta: See how &amp;lt;strong class="handwritten"&amp;gt;XXXX&amp;lt;/strong&amp;gt; can transform your local marketing
hero-signup-button: Try &amp;lt;strong&amp;gt;XXXX&amp;lt;/strong&amp;gt;
leading-brands-headline: Trusted by Leading Brands
local-marketing-callout: Customer journeys are non-linear. Every touch point matters
// ... and so on


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

&lt;/div&gt;

&lt;p&gt;Every instance of text that should be editable in the admin is saved as a field in the front-matter. The rest of the file has no body content, just front-matter&lt;/p&gt;

&lt;p&gt;The relevant template to use to render this page is also mentioned in the front-matter: &lt;br&gt;
&lt;code&gt;layout: home.liquid&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then I added this page and all these fields to the collections array in the config.yml file for Decap under admin/config.yml&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

collections:
  - label: "Pages"
    name: "pages"
    files:
      - label: "Home"
        name: "home"
        file: "index.md"
        fields:
          - { label: Title, name: title, widget: string }
          - { label: Layout, name: layout, widget: hidden, default: home.html }
          - { label: hero-tagline, name: hero-tagline, widget: string }
          - {
              label: hero-h1-firstline,
              name: hero-h1-firstline,
              widget: string,
            }
          - {
              label: hero-h1-secondline,
              name: hero-h1-secondline,
              widget: string,
            }
          - {
              label: hero-h1-thirdline,
              name: hero-h1-thirdline,
              widget: string,
            }
          - { label: hero-signup-cta, name: hero-signup-cta, widget: string }
          - {
              label: hero-signup-button,
              name: hero-signup-button,
              widget: string,
            }
//... and so on


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

&lt;/div&gt;

&lt;p&gt;That makes these fields editable in the Admin UI&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%2Fhj9iurarpjonoe2tqt9l.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%2Fhj9iurarpjonoe2tqt9l.png" alt="Fields show up as strings in the Admin UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On the template side:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the template for this page, the fields are referenced using template tags. EJS in my case&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

---
layout: layout.ejs
---
&amp;lt;section class="hero"&amp;gt;
    &amp;lt;div class="content"&amp;gt;
        &amp;lt;h2 class="callout"&amp;gt;
            {{ hero-tagline }}
        &amp;lt;/h2&amp;gt;
        &amp;lt;h1&amp;gt;
            &amp;lt;span&amp;gt;{{ hero-h1-firstline }}&amp;lt;/span&amp;gt;
            &amp;lt;span&amp;gt;{{ hero-h1-secondline }}&amp;lt;/span&amp;gt;
            &amp;lt;span&amp;gt;{{ hero-h1-thirdline }}&amp;lt;/span&amp;gt;
        &amp;lt;/h1&amp;gt;
        &amp;lt;div class="signup"&amp;gt;
            &amp;lt;p&amp;gt;
                {{ hero-signup-cta }}
            &amp;lt;/p&amp;gt;
            &amp;lt;form action="/signup"&amp;gt;
                &amp;lt;input type="text" placeholder="Enter Email Address!" /&amp;gt;
                &amp;lt;button type="submit"&amp;gt;
                    {{ hero-signup-button }}
                &amp;lt;/button&amp;gt;
            &amp;lt;/form&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
//... and so on


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

&lt;/div&gt;

&lt;p&gt;This line at the top in the front-matter of the template&lt;br&gt;
&lt;code&gt;layout: layout.ejs&lt;/code&gt;&lt;br&gt;
tells 11ty that this template extends the layout.ejs tenplate to nest the landing page content inside the common header/footer frame that is also used for the rest of the site.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>jamstack</category>
      <category>javascript</category>
      <category>11ty</category>
    </item>
    <item>
      <title>Using 11ty and DecapCMS for 'non-blog' static websites -pt 1 Menus</title>
      <dc:creator>Ayush Saran</dc:creator>
      <pubDate>Sat, 18 May 2024 22:32:03 +0000</pubDate>
      <link>https://dev.to/ayush_saran/using-11ty-and-decapcms-for-non-blog-static-websites-pt-1-menus-1mof</link>
      <guid>https://dev.to/ayush_saran/using-11ty-and-decapcms-for-non-blog-static-websites-pt-1-menus-1mof</guid>
      <description>&lt;p&gt;While there are plenty of examples for using 11ty and Decap CMS in blog settings, I struggled to find a way to make it work for a non-blog static website.&lt;/p&gt;

&lt;p&gt;Leaving these tips out on the internet for anybody else looking to do the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making Menus editable in DecapCMS
&lt;/h2&gt;

&lt;p&gt;To make menus that you can edit and update in DecapCMS you need to start with a collection in your config.yml file for DecapCmS [found under admin/config.yml]&lt;/p&gt;

&lt;p&gt;mine looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Menus&lt;/span&gt;
    &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Menus&lt;/span&gt;
    &lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;_data&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;mainMenu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;
        &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Main&lt;/span&gt; &lt;span class="nx"&gt;Navigation&lt;/span&gt;
        &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;navigation&lt;/span&gt;
        &lt;span class="nx"&gt;extension&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Primary&lt;/span&gt; &lt;span class="nx"&gt;Menu&lt;/span&gt; &lt;span class="nx"&gt;Items&lt;/span&gt;
            &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nav_items&lt;/span&gt;
            &lt;span class="nx"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;
            &lt;span class="nx"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
              &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
              &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The menu items are saved in a JSON file (mainMenu.json) as an object&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nav_items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Products"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/products"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Solutions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/solutions"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Success Stories"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/successStories"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Resources"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/resources"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"About"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/about"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file is placed in the '_data' directory in the root of the 11ty folder. This makes it accessible in templates as a Global Data File. &lt;a href="https://www.11ty.dev/docs/data-global/" rel="noopener noreferrer"&gt;See 11ty - Global Data Files&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Then inside your template you can access this array and loop over the entries to output your links. I use EJS in my template, it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;   &lt;span class="nt"&gt;&amp;lt;ul&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"menu"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- Load Nav items from mainMenu.json file --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;let&lt;/span&gt; &lt;span class="na"&gt;i=&lt;/span&gt;&lt;span class="s"&gt;0;&lt;/span&gt; &lt;span class="na"&gt;i&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt; &lt;span class="na"&gt;mainMenu.nav_items.length&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt; &lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="err"&gt;++)&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;%= mainMenu.nav_items[i].path %&amp;gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;mainMenu.nav_items&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="err"&gt;].&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also use this for Mega Menus, with nested lists&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;_data&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;footerMenu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;
        &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Footer&lt;/span&gt; &lt;span class="nx"&gt;Links&lt;/span&gt;
        &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;footer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;navigation&lt;/span&gt;
        &lt;span class="nx"&gt;extension&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Footer&lt;/span&gt; &lt;span class="nx"&gt;Menu&lt;/span&gt; &lt;span class="nx"&gt;Items&lt;/span&gt;
            &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nav_items&lt;/span&gt;
            &lt;span class="nx"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;
            &lt;span class="nx"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
              &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
              &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Links&lt;/span&gt;
                &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;links&lt;/span&gt;
                &lt;span class="nx"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;
                &lt;span class="nx"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
                  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Notice the nested 'fields:' arrays in two levels&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Then loop over them like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt; &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;let&lt;/span&gt; &lt;span class="na"&gt;i=&lt;/span&gt;&lt;span class="s"&gt;0;&lt;/span&gt; &lt;span class="na"&gt;i&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt; &lt;span class="na"&gt;footerMenu.nav_items.length&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt; &lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="err"&gt;++)&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;ul&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"footer-links"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;h5&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;footerMenu.nav_items&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="err"&gt;].&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/h5&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;for&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;let&lt;/span&gt; &lt;span class="na"&gt;j=&lt;/span&gt;&lt;span class="s"&gt;0;&lt;/span&gt; &lt;span class="na"&gt;j&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt; &lt;span class="na"&gt;footerMenu.nav_items&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="err"&gt;].&lt;/span&gt;&lt;span class="na"&gt;links.length&lt;/span&gt;&lt;span class="err"&gt;;&lt;/span&gt; &lt;span class="na"&gt;j&lt;/span&gt;&lt;span class="err"&gt;++)&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;%= footerMenu.nav_items[i].links[j].path %&amp;gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;footerMenu.nav_items&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="err"&gt;].&lt;/span&gt;&lt;span class="na"&gt;links&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;j&lt;/span&gt;&lt;span class="err"&gt;].&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>webdev</category>
      <category>jamstack</category>
      <category>11ty</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
