<?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: KIRANSARATHI K</title>
    <description>The latest articles on DEV Community by KIRANSARATHI K (@kiransarathi_k_2f6880e39e).</description>
    <link>https://dev.to/kiransarathi_k_2f6880e39e</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4125489%2Ff4f7868f-0341-4cc3-9ae2-1268095a1d7b.png</url>
      <title>DEV Community: KIRANSARATHI K</title>
      <link>https://dev.to/kiransarathi_k_2f6880e39e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kiransarathi_k_2f6880e39e"/>
    <language>en</language>
    <item>
      <title>Day1-Cloud Workshop</title>
      <dc:creator>KIRANSARATHI K</dc:creator>
      <pubDate>Tue, 15 Sep 2026 08:38:32 +0000</pubDate>
      <link>https://dev.to/kiransarathi_k_2f6880e39e/day1-cloud-workshop-31kp</link>
      <guid>https://dev.to/kiransarathi_k_2f6880e39e/day1-cloud-workshop-31kp</guid>
      <description>&lt;p&gt;Permissions&lt;br&gt;
    ↓&lt;br&gt;
Static Website Hosting&lt;/p&gt;

&lt;p&gt;I configured static website hosting and worked through the public-access configuration and bucket policy.&lt;/p&gt;

&lt;p&gt;The important part of the bucket policy was allowing public GetObject access:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "Version": "2012-10-17",&lt;br&gt;
  "Statement": [&lt;br&gt;
    {&lt;br&gt;
      "Sid": "PublicReadGetObject",&lt;br&gt;
      "Effect": "Allow",&lt;br&gt;
      "Principal": "&lt;em&gt;",&lt;br&gt;
      "Action": "s3:GetObject",&lt;br&gt;
      "Resource": "arn:aws:s3:::kiran-2403717674421023-15092026/&lt;/em&gt;"&lt;br&gt;
    }&lt;br&gt;
  ]&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;But then I ran into another issue.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;My Bucket Name Wasn't What I Thought&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At one point I was working with:&lt;/p&gt;

&lt;p&gt;kiransarathi k-bucket-portfolio&lt;/p&gt;

&lt;p&gt;But when I looked at my AWS console, the actual bucket I was configuring was:&lt;/p&gt;

&lt;p&gt;portfolio-nith&lt;/p&gt;

&lt;p&gt;That caused confusion while creating the bucket policy.&lt;/p&gt;

&lt;p&gt;AWS was telling me:&lt;/p&gt;

&lt;p&gt;Policy has invalid resource&lt;/p&gt;

&lt;p&gt;The reason was simple.&lt;/p&gt;

&lt;p&gt;The policy resource has to reference the actual bucket name.&lt;/p&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;p&gt;arn:aws:s3:::kiran-2403717674421023-15092026/*&lt;/p&gt;

&lt;p&gt;instead of:&lt;/p&gt;

&lt;p&gt;arn:aws:s3:::kiran-2403717674421023-15092026/*&lt;/p&gt;

&lt;p&gt;That was a small mistake, but it taught me something important:&lt;/p&gt;

&lt;p&gt;Don't blindly copy AWS configuration. Understand what resource you're actually configuring.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Then I Wanted to Use React&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once I had the basic portfolio working, I decided to convert it into a React application.&lt;/p&gt;

&lt;p&gt;Instead of one large HTML file, I moved to a React + Vite structure:&lt;/p&gt;

&lt;p&gt;portfolio/&lt;br&gt;
│&lt;br&gt;
├── index.html&lt;br&gt;
├── package.json&lt;br&gt;
│&lt;br&gt;
└── src/&lt;br&gt;
    ├── main.jsx&lt;br&gt;
    └── style.css&lt;/p&gt;

&lt;p&gt;I used React to render the portfolio sections and JavaScript arrays for things like skills and projects.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;const skills = [&lt;br&gt;
    "Python",&lt;br&gt;
    "C / C++",&lt;br&gt;
    "Data Structures &amp;amp; Algorithms",&lt;br&gt;
    "Machine Learning",&lt;br&gt;
    "TensorFlow",&lt;br&gt;
    "NumPy",&lt;br&gt;
    "Pandas",&lt;br&gt;
    "Docker"&lt;br&gt;
];&lt;/p&gt;

&lt;p&gt;And projects were represented as data:&lt;/p&gt;

&lt;p&gt;const projects = [&lt;br&gt;
    {&lt;br&gt;
        title: "CLOTE",&lt;br&gt;
        description: "...",&lt;br&gt;
        tech: "Private Cloud • File Management"&lt;br&gt;
    }&lt;br&gt;
];&lt;/p&gt;

&lt;p&gt;This was my first step toward understanding how a real frontend project is structured rather than putting everything into one HTML file.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understanding npm run build&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This was another important part.&lt;/p&gt;

&lt;p&gt;I initially thought:&lt;/p&gt;

&lt;p&gt;"Since it's React, I need a server running on AWS."&lt;/p&gt;

&lt;p&gt;Not necessarily.&lt;/p&gt;

&lt;p&gt;React can be built into static files.&lt;/p&gt;

&lt;p&gt;I ran:&lt;/p&gt;

&lt;p&gt;npm install&lt;/p&gt;

&lt;p&gt;and then:&lt;/p&gt;

&lt;p&gt;npm run build&lt;/p&gt;

&lt;p&gt;Vite generated:&lt;/p&gt;

&lt;p&gt;dist/&lt;br&gt;
│&lt;br&gt;
├── index.html&lt;br&gt;
└── assets/&lt;br&gt;
    ├── ...&lt;br&gt;
    └── ...&lt;/p&gt;

&lt;p&gt;This was a major realization for me.&lt;/p&gt;

&lt;p&gt;The browser doesn't need my React source code or Node.js running on S3.&lt;/p&gt;

&lt;p&gt;The production build becomes static assets that can be served by a web server.&lt;/p&gt;

&lt;p&gt;So the deployment becomes:&lt;/p&gt;

&lt;p&gt;React source&lt;br&gt;
     ↓&lt;br&gt;
npm run build&lt;br&gt;
     ↓&lt;br&gt;
dist/&lt;br&gt;
     ↓&lt;br&gt;
AWS S3&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Adding CloudFront&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then I wanted to put CloudFront in front of S3.&lt;/p&gt;

&lt;p&gt;The architecture became:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                ┌──────────────┐
                │    Browser   │
                └──────┬───────┘
                       │
                       ▼
                ┌──────────────┐
                │  CloudFront  │
                └──────┬───────┘
                       │
                       ▼
                ┌──────────────┐
                │      S3      │
                │   index.html │
                │    assets/   │
                └──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This was the point where things got interesting.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The CloudFront 404 Error&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead of my portfolio, CloudFront returned:&lt;/p&gt;

&lt;p&gt;404 Not Found&lt;/p&gt;

&lt;p&gt;Code: NoSuchKey&lt;/p&gt;

&lt;p&gt;Message: The specified key does not exist.&lt;/p&gt;

&lt;p&gt;Key: index.html/index.html&lt;/p&gt;

&lt;p&gt;At first I had no idea why AWS was asking for:&lt;/p&gt;

&lt;p&gt;index.html/index.html&lt;/p&gt;

&lt;p&gt;My S3 bucket clearly contained:&lt;/p&gt;

&lt;p&gt;index.html&lt;/p&gt;

&lt;p&gt;not:&lt;/p&gt;

&lt;p&gt;index.html/index.html&lt;/p&gt;

&lt;p&gt;So I started looking at the CloudFront configuration.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Finding the Actual Problem&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I checked the CloudFront origin configuration.&lt;/p&gt;

&lt;p&gt;And there it was.&lt;/p&gt;

&lt;p&gt;My origin looked like:&lt;/p&gt;

&lt;p&gt;Origin type: S3 static website&lt;br&gt;
Origin path: /index.html&lt;/p&gt;

&lt;p&gt;That was the mistake.&lt;/p&gt;

&lt;p&gt;CloudFront already knew that the default root object was:&lt;/p&gt;

&lt;p&gt;index.html&lt;/p&gt;

&lt;p&gt;And I had also told the origin to use:&lt;/p&gt;

&lt;p&gt;/index.html&lt;/p&gt;

&lt;p&gt;So CloudFront effectively ended up requesting:&lt;/p&gt;

&lt;p&gt;/index.html/index.html&lt;/p&gt;

&lt;p&gt;S3 obviously couldn't find that object.&lt;/p&gt;

&lt;p&gt;The error suddenly made sense.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Fix&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I changed the CloudFront origin path from:&lt;/p&gt;

&lt;p&gt;/index.html&lt;/p&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;p&gt;(empty)&lt;/p&gt;

&lt;p&gt;And kept the CloudFront default root object as:&lt;/p&gt;

&lt;p&gt;index.html&lt;/p&gt;

&lt;p&gt;So the configuration became conceptually:&lt;/p&gt;

&lt;p&gt;CloudFront&lt;/p&gt;

&lt;p&gt;Default root object:&lt;br&gt;
index.html&lt;/p&gt;

&lt;p&gt;Origin:&lt;br&gt;
portfolio-nith S3 website endpoint&lt;/p&gt;

&lt;p&gt;Origin path:&lt;br&gt;
(empty)&lt;/p&gt;

&lt;p&gt;Now the request flow made sense:&lt;/p&gt;

&lt;p&gt;/&lt;br&gt;
 ↓&lt;br&gt;
CloudFront&lt;br&gt;
 ↓&lt;br&gt;
index.html&lt;br&gt;
 ↓&lt;br&gt;
S3&lt;br&gt;
 ↓&lt;br&gt;
portfolio&lt;/p&gt;

&lt;p&gt;instead of:&lt;/p&gt;

&lt;p&gt;/&lt;br&gt;
 ↓&lt;br&gt;
CloudFront&lt;br&gt;
 ↓&lt;br&gt;
index.html&lt;br&gt;
 ↓&lt;br&gt;
/index.html&lt;br&gt;
 ↓&lt;br&gt;
index.html/index.html ❌&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Why I Had to Invalidate CloudFront&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Even after fixing the configuration, CloudFront can still have cached responses.&lt;/p&gt;

&lt;p&gt;So I created a CloudFront invalidation:&lt;/p&gt;

&lt;p&gt;/*&lt;/p&gt;

&lt;p&gt;This tells CloudFront to remove the cached objects so that the next request can fetch the updated content.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What I Actually Learned&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The biggest thing I learned from this wasn't React.&lt;/p&gt;

&lt;p&gt;It wasn't S3.&lt;/p&gt;

&lt;p&gt;It wasn't even CloudFront.&lt;/p&gt;

&lt;p&gt;It was debugging.&lt;/p&gt;

&lt;p&gt;Before this, when something didn't work, my first instinct was often:&lt;/p&gt;

&lt;p&gt;"The code must be wrong."&lt;/p&gt;

&lt;p&gt;But this project showed me that problems can exist at completely different layers.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Frontend&lt;br&gt;
   ↓&lt;br&gt;
React&lt;br&gt;
   ↓&lt;br&gt;
Build&lt;br&gt;
   ↓&lt;br&gt;
Static files&lt;br&gt;
   ↓&lt;br&gt;
S3&lt;br&gt;
   ↓&lt;br&gt;
Permissions&lt;br&gt;
   ↓&lt;br&gt;
CloudFront&lt;br&gt;
   ↓&lt;br&gt;
Caching&lt;br&gt;
   ↓&lt;br&gt;
Browser&lt;/p&gt;

&lt;p&gt;A website can have perfectly valid React code and still return a 404 because the infrastructure configuration is wrong.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;My Struggles&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These were some of the problems I faced:&lt;/p&gt;

&lt;p&gt;S3&lt;/p&gt;

&lt;p&gt;AccessDenied&lt;/p&gt;

&lt;p&gt;I had to understand bucket permissions and public access.&lt;/p&gt;

&lt;p&gt;Bucket policy&lt;/p&gt;

&lt;p&gt;Policy has invalid resource&lt;/p&gt;

&lt;p&gt;I was referencing the wrong bucket name.&lt;/p&gt;

&lt;p&gt;CloudFront&lt;/p&gt;

&lt;p&gt;NoSuchKey&lt;br&gt;
Key: index.html/index.html&lt;/p&gt;

&lt;p&gt;I had incorrectly configured the origin path.&lt;/p&gt;

&lt;p&gt;Caching&lt;/p&gt;

&lt;p&gt;Even after fixing the configuration, CloudFront could still serve an old cached response.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What I Would Do Differently Next Time&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If I were starting this deployment again, my process would be:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build React application
    ↓&lt;/li&gt;
&lt;li&gt;Test locally
    ↓&lt;/li&gt;
&lt;li&gt;npm run build
    ↓&lt;/li&gt;
&lt;li&gt;Check dist/
    ↓&lt;/li&gt;
&lt;li&gt;Upload dist contents to S3
    ↓&lt;/li&gt;
&lt;li&gt;Configure S3
    ↓&lt;/li&gt;
&lt;li&gt;Configure CloudFront
    ↓&lt;/li&gt;
&lt;li&gt;Test CloudFront
    ↓&lt;/li&gt;
&lt;li&gt;Check logs/errors if something fails
    ↓&lt;/li&gt;
&lt;li&gt;Invalidate cache when required&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And most importantly:&lt;/p&gt;

&lt;p&gt;I would change one configuration at a time and test after each change.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Final Architecture&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The final concept I learned is:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             ┌───────────────────┐
             │       User        │
             └─────────┬─────────┘
                       │
                       ▼
             ┌───────────────────┐
             │     CloudFront    │
             │       CDN         │
             └─────────┬─────────┘
                       │
                       ▼
             ┌───────────────────┐
             │    S3 Bucket      │
             │                   │
             │   index.html      │
             │   assets/         │
             └───────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;My React application is built into static files and served through AWS infrastructure.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;This was a relatively small project, but it gave me something more valuable than just a portfolio.&lt;/p&gt;

&lt;p&gt;It gave me experience with the uncomfortable part of development:&lt;/p&gt;

&lt;p&gt;things not working.&lt;/p&gt;

&lt;p&gt;I had to read errors, inspect configuration, understand what AWS was actually doing, find the mismatch, and fix it.&lt;/p&gt;

&lt;p&gt;The index.html/index.html error in particular was frustrating at first.&lt;/p&gt;

&lt;p&gt;But once I understood why it happened, it became one of the most useful lessons from the project.&lt;/p&gt;

&lt;p&gt;I'm still learning AWS, React, and software development, but I'm slowly trying to replace:&lt;/p&gt;

&lt;p&gt;"Copy the code and hope it works"&lt;/p&gt;

&lt;p&gt;with:&lt;/p&gt;

&lt;p&gt;"Understand what each component is doing, then debug when it doesn't."&lt;/p&gt;

&lt;p&gt;And I think that's a much better way to learn development.&lt;/p&gt;

&lt;p&gt;Tech Stack&lt;/p&gt;

&lt;p&gt;Frontend&lt;/p&gt;

&lt;p&gt;React&lt;/p&gt;

&lt;p&gt;Vite&lt;/p&gt;

&lt;p&gt;HTML&lt;/p&gt;

&lt;p&gt;CSS&lt;/p&gt;

&lt;p&gt;JavaScript&lt;/p&gt;

&lt;p&gt;Cloud&lt;/p&gt;

&lt;p&gt;Amazon S3&lt;/p&gt;

&lt;p&gt;Amazon CloudFront&lt;/p&gt;

&lt;p&gt;Development&lt;/p&gt;

&lt;p&gt;VS Code&lt;/p&gt;

&lt;p&gt;npm&lt;/p&gt;

&lt;p&gt;Git/GitHub&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fom7ehsbu9yeiewadbrl3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fom7ehsbu9yeiewadbrl3.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpht96xlpb25wqkfcnv1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpht96xlpb25wqkfcnv1t.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjb13ihamqzx5bizwxwuk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjb13ihamqzx5bizwxwuk.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F81xw82ujdylz34gjwyi9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F81xw82ujdylz34gjwyi9.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fobet6vv2dqxv6vpmb9lf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fobet6vv2dqxv6vpmb9lf.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5mtiibbbu3o6tr6tabf9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5mtiibbbu3o6tr6tabf9.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>infrastructure</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
