<?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: Seno Aji</title>
    <description>The latest articles on DEV Community by Seno Aji (@cydnirn).</description>
    <link>https://dev.to/cydnirn</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%2F1072514%2F85d2981b-4ec7-423a-96f5-9d77ac76ca70.jpg</url>
      <title>DEV Community: Seno Aji</title>
      <link>https://dev.to/cydnirn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cydnirn"/>
    <language>en</language>
    <item>
      <title>PhantomQ: A Collaborative Writing Platform with Image Gallery</title>
      <dc:creator>Seno Aji</dc:creator>
      <pubDate>Mon, 13 May 2024 06:53:31 +0000</pubDate>
      <link>https://dev.to/cydnirn/phantomq-a-collaborative-writing-platform-with-image-gallery-23ci</link>
      <guid>https://dev.to/cydnirn/phantomq-a-collaborative-writing-platform-with-image-gallery-23ci</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/netlify"&gt;Netlify Dynamic Site Challenge&lt;/a&gt;: Visual Feast.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/netlify"&gt;Netlify Dynamic Site Challenge&lt;/a&gt;: Build with Blobs.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I create an anonymous writing collaboration app powered by Netlify blobs, and Picture sharing gallery, with Next.js Image component integrated with Netlify Image CDN provide faster accessibility, with customization for sizes and downloads&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;You can try PhantomQ &lt;a href="https://phantomq.netlify/app" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

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

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

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

&lt;p&gt;Though the Tales section might be a bit buggy (Since I'm new at using blobs), the Gallery might not be so&lt;/p&gt;

&lt;h2&gt;
  
  
  Platform Primitives
&lt;/h2&gt;

&lt;p&gt;Next.Js comes with it's own optimizer and further supported by Netlify Image CDN provide more customability, I utilize Netlify CDN to customize the gallery before user downladed them, with various quality&lt;/p&gt;

&lt;p&gt;I also try to implement Netlify Blobs for the Tales Section, people can anonymously collaborate on creating a unified chaotic story&lt;/p&gt;

&lt;p&gt;Because there is rarely any changes to the gallery, I opt-in for the following cache strategy on Netlify Functions to fetch all images&lt;/p&gt;

&lt;p&gt;&lt;code&gt;return Response.json(await res.json(), {&lt;br&gt;
    headers: {&lt;br&gt;
      "Cache-Control": "max-age=604800, public",&lt;br&gt;
      "Netlify-CDN-Cache-Control":&lt;br&gt;
        "public, max-age=259200, stale-while-revalidate=30",&lt;br&gt;
      "Netlify-Cache-Tag": "images",&lt;br&gt;
    },&lt;br&gt;
  });&lt;/code&gt;&lt;/p&gt;

</description>
      <category>netlifychallenge</category>
      <category>devchallenge</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
