<?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: TagorenathV</title>
    <description>The latest articles on DEV Community by TagorenathV (@tagorenathv).</description>
    <link>https://dev.to/tagorenathv</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%2F703643%2F679224af-6134-4f4c-9f1a-d52b39077ab9.png</url>
      <title>DEV Community: TagorenathV</title>
      <link>https://dev.to/tagorenathv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tagorenathv"/>
    <language>en</language>
    <item>
      <title>Supabase: Easy to Ship. Hard to Maintain.</title>
      <dc:creator>TagorenathV</dc:creator>
      <pubDate>Tue, 24 Feb 2026 04:21:41 +0000</pubDate>
      <link>https://dev.to/tagorenathv/supabase-easy-to-ship-hard-to-maintain-1f9i</link>
      <guid>https://dev.to/tagorenathv/supabase-easy-to-ship-hard-to-maintain-1f9i</guid>
      <description>&lt;p&gt;In the modern founder's toolkit, &lt;em&gt;Supabase&lt;/em&gt; is the ultimate accelerator. Personally, we've replaced Firebase with Supabase for most of our projects, and it has become our default starting point for a while.&lt;/p&gt;

&lt;p&gt;Supabase bundles the world's most powerful database (&lt;strong&gt;&lt;em&gt;Postgres&lt;/em&gt;&lt;/strong&gt;) with everything else: Authentication, Data APIs, Edge functions, Realtime subscriptions, Storage, and Vector embeddings. It makes the "&lt;em&gt;Zero to One&lt;/em&gt;" phase feel like magic.&lt;/p&gt;

&lt;p&gt;Over time, experience has taught me a hard lesson: &lt;strong&gt;Shipping is just Step One&lt;/strong&gt;. The true shades of a product only emerge once the traffic starts flowing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Development vs. Production
&lt;/h2&gt;

&lt;p&gt;When we are building, we optimize for velocity. We measure progress by features shipped. We move fast, we push changes quickly, we break things, and we celebrate when we hit "Live".&lt;/p&gt;

&lt;p&gt;But production plays by different rules. Once traffic starts flowing in, we are no longer optimizing for features; we are optimizing for &lt;strong&gt;stability/predictability&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Suddenly, the questions change to :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the system predictable?&lt;/li&gt;
&lt;li&gt;Are users seeing consistent performance?&lt;/li&gt;
&lt;li&gt;Can we handle growth without surprises?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Development hides complexity. Production exposes it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Postgres: Great Power with Responsibility
&lt;/h2&gt;

&lt;p&gt;Supabase, being built on Postgres, is both its greatest strength and its most underappreciated responsibility. Postgres is genuinely extraordinary; it's powerful and reliable. But once we're live, we start seeing the other side of that power: operational responsibility.&lt;/p&gt;

&lt;p&gt;When our application is live, we need answers to questions that don't show up during development, and a standard dashboard doesn't always warn us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are there missing indexes slowing down the 99th percentile of users?&lt;/li&gt;
&lt;li&gt;Are long-running queries blocking others?&lt;/li&gt;
&lt;li&gt;Do we have connection saturation?&lt;/li&gt;
&lt;li&gt;Is table bloat accumulating over time, thereby throttling performance?&lt;/li&gt;
&lt;li&gt;Are locks affecting performance?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We learned this the hard way. Six months after launch, our p99 response times had been silently climbing for weeks. No alert had fired. We dug in and found a missing index on a query that ran perfectly during testing with a few hundred rows, but was doing a full sequential scan across two million in production. Nobody warned us. &lt;em&gt;We just happened to look&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Most of the time, we handle these things reactively. We either wait for a user to complain or for the application to go down.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reactive Pattern
&lt;/h2&gt;

&lt;p&gt;If we're honest, the default operating mode for most early-stage teams is reactive. We respond to fires instead of preventing them. Not because we're careless, but because when we're moving fast, monitoring feels like a "&lt;em&gt;later&lt;/em&gt;" problem. And "&lt;em&gt;later&lt;/em&gt;" has a way of arriving without warning.&lt;/p&gt;

&lt;p&gt;This is what I've come to think of as the &lt;strong&gt;Operational Maturity gap&lt;/strong&gt;. It's not a code problem or a product problem. It's the gap between a system that was built to ship and a system that was built to run. Most startups fall into it somewhere between their first thousand users and their first serious incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stability is the Ultimate Feature
&lt;/h2&gt;

&lt;p&gt;Users don't care about our stack. They care if it works, if it's fast, if it's reliable. To retain our users on our platform, we have to move beyond just &lt;em&gt;managed services&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;We need "&lt;strong&gt;consolidated visibility&lt;/strong&gt;". We need to know how our platform is behaving before the bottleneck becomes a crash. We need to measure confidence.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Shipping fast is a competitive advantage. But staying stable is how we actually build trust, and trust is what builds a business.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>supabase</category>
      <category>postgres</category>
      <category>startup</category>
      <category>learning</category>
    </item>
    <item>
      <title>Building a Serverless Slack App using Python and AWS SAM</title>
      <dc:creator>TagorenathV</dc:creator>
      <pubDate>Sun, 28 Jan 2024 19:43:09 +0000</pubDate>
      <link>https://dev.to/tagorenathv/building-a-serverless-slack-app-using-python-and-aws-sam-4om7</link>
      <guid>https://dev.to/tagorenathv/building-a-serverless-slack-app-using-python-and-aws-sam-4om7</guid>
      <description>&lt;p&gt;Slack, a widely used collaboration platform, enables teams to communicate, share files, and collaborate effectively. By integrating custom Slack apps, teams can enhance this experience by automating tasks and adding unique functionalities tailored to their specific needs.&lt;/p&gt;

&lt;p&gt;One way to deploy Slack apps is through a serverless architecture, which offers several advantages such as scalability, cost-efficiency, reduced operational burden, and increased development speed.&lt;/p&gt;

&lt;p&gt;This guide will walk you through the process of building a serverless Slack app using AWS and Python. It provides a step-by-step approach to leverage these benefits and enhance Slack's capabilities effectively and efficiently.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡You can find the complete code for this tutorial at the following link: &lt;a href="https://github.com/tagorenathv/serverless-slack-app/tree/master"&gt;GitHub Repository&lt;/a&gt;. &lt;br&gt;
Dive in to explore and use the code for building your serverless Slack app.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 0: Setup
&lt;/h2&gt;

&lt;p&gt;Before starting your serverless Slack app project, ensure you have the following set up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An AWS account for deploying and managing your app.&lt;/li&gt;
&lt;li&gt;AWS CLI is installed on your machine for easy AWS services interaction.&lt;/li&gt;
&lt;li&gt;AWS SAM (Serverless Application Model) for streamlining serverless app development.&lt;/li&gt;
&lt;li&gt;Python and pip for writing your app and managing dependencies.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With these tools, you're ready to build and deploy your serverless Slack app efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Create a new AWS SAM project
&lt;/h2&gt;

&lt;p&gt;To begin building your serverless Slack app, use the AWS SAM CLI to create a new project. Open your terminal and run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sam init --runtime python3.10 --name serverless-slack-app --app-template hello-world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will create a new AWS SAM project with a basic "Hello World" function. It sets up the necessary structure and files for your app as below:&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%2F8p20xjb2bo1otf84anvw.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%2F8p20xjb2bo1otf84anvw.png" alt="Image description" width="290" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Configure the Slack app
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create a New App:&lt;/strong&gt; To interact with the Slack platform, you need an app. To set up your Slack app, visit &lt;a href="https://api.slack.com/apps"&gt;https://api.slack.com/apps&lt;/a&gt;, click on “Create New App”, select “From Scratch”, then enter your “App Name” and choose the workspace you want to install it in.&lt;/li&gt;
&lt;/ul&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%2Fa4pd2jq7uf58bew1erpm.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%2Fa4pd2jq7uf58bew1erpm.png" alt="Image description" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Configure OAuth &amp;amp; Permissions:&lt;/strong&gt; Go to the 'OAuth &amp;amp; Permissions' tab. Specify the scopes your app requires to operate. These scopes define the permissions your app has in the Slack workspace, like sending messages or accessing user data.&lt;/li&gt;
&lt;/ul&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%2F5o5i7s6qa6bwddi0b98o.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%2F5o5i7s6qa6bwddi0b98o.png" alt="Image description" width="800" height="653"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Install App to Workspace:&lt;/strong&gt; Once the permissions are set, install the app to your workspace. This step might prompt you to authorize the app with the specified permissions.&lt;/li&gt;
&lt;/ul&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%2Fjbvnfayuzgbvsy7lervd.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%2Fjbvnfayuzgbvsy7lervd.png" alt="Image description" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Obtain API Credentials:&lt;/strong&gt; Once the App is installed, you can find an OAuth token. This we will be using further in our app to communicate with Slack.&lt;/li&gt;
&lt;/ul&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%2Fbsdx2dqa2j94pd07wcnd.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%2Fbsdx2dqa2j94pd07wcnd.png" alt="Image description" width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Implement the Slack functionality
&lt;/h3&gt;

&lt;p&gt;Navigate to the AWS SAM project and follow these steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;slack-sdk&lt;/code&gt; dependency to &lt;code&gt;requirements.txt&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;In &lt;code&gt;app.py&lt;/code&gt; file implement the necessary code to handle Slack events and commands. 
As part of the blog, we will have code to respond url_verification challenge &amp;amp; app_mention.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Parse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;incoming&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;event&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Slack&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;slack_event&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;json.loads(event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Check&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;verification&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;during&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;event&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;subscription&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;process&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;slack_event.get(&lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url_verification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Respond&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;challenge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;token&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;verify&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;endpoint&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"statusCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;slack_event.get(&lt;/span&gt;&lt;span class="s2"&gt;"challenge"&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;elif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;slack_event.get(&lt;/span&gt;&lt;span class="s2"&gt;"event"&lt;/span&gt;&lt;span class="err"&gt;):&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Extract&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;event&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;data&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;slack_event.get(&lt;/span&gt;&lt;span class="s2"&gt;"event"&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;event_type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;data.get(&lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Check&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;event&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;an&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;app&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mention&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;event_type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"app_mention"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;channel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;event&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;data&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;channel_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;data.get(&lt;/span&gt;&lt;span class="s2"&gt;"channel"&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Post&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;greeting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;channel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;where&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;app&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;was&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mentioned&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;client.chat_postMessage(channel=channel_id,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;text=&lt;/span&gt;&lt;span class="s2"&gt;"👋 Hello there! I'm Serverless Slack App, here to make your day a little easier. 😊"&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;return&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can leverage the power of Python to process events and perform operations with Slack, such as sending messages, retrieving information, or triggering external services. The Python Slack SDK provides an interface for interacting with the Slack API, simplifying development.&lt;/p&gt;

&lt;p&gt;Slack's Block Kit is a UI framework for creating rich and interactive app interfaces. It allows you to build engaging messages and modals, enhancing the user experience. By combining the Python Slack SDK with Block Kit, you can develop user-friendly Slack apps that provide a seamless and engaging interaction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Deploy the app
&lt;/h3&gt;

&lt;p&gt;Once you have implemented the desired functionality for your serverless Slack app, it's time to deploy it to AWS Lambda. This allows your app to run in a serverless environment without the need to manage servers or infrastructure. &lt;/p&gt;

&lt;p&gt;Update &lt;code&gt;template.yaml&lt;/code&gt; file as below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove the below blocks:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# remove Events section in HelloWorldFunction under resources:&lt;/span&gt;
&lt;span class="na"&gt;Events&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;HelloWorld&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Api&lt;/span&gt; &lt;span class="c1"&gt;# More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api&lt;/span&gt;
    &lt;span class="na"&gt;Properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;Path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/hello&lt;/span&gt;
      &lt;span class="na"&gt;Method&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;get&lt;/span&gt;

&lt;span class="c1"&gt;# remove HelloWorldApi section in Outputs:&lt;/span&gt;
&lt;span class="na"&gt;HelloWorldApi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;API&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Gateway&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;endpoint&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;URL&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Prod&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;stage&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;World&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;function"&lt;/span&gt;
  &lt;span class="na"&gt;Value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;!Sub&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add below blocks:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Add under HelloWorldFunction in resources section:&lt;/span&gt;
&lt;span class="na"&gt;FunctionUrlConfig&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;AuthType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NONE&lt;/span&gt;
  &lt;span class="na"&gt;InvokeMode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;BUFFERED&lt;/span&gt;
  &lt;span class="na"&gt;Cors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;AllowCredentials&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="na"&gt;AllowMethods&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;POST&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;GET&lt;/span&gt;
    &lt;span class="na"&gt;AllowOrigins&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
&lt;span class="na"&gt;Policies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;AWSLambdaExecute&lt;/span&gt;
&lt;span class="na"&gt;Environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;SLACK_BOT_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;your slack oauth2 token here&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To deploy your app, run the following command in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sam build
sam deploy --guided
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AWS SAM CLI will guide you through the deployment process, prompting you to configure the deployment options and resources. Ensure to provide the necessary information, such as the AWS region, app name, and credentials.&lt;/p&gt;

&lt;p&gt;Once deployed, you will see Cloudformation outputs as:&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%2Ft806gnqeohi78lmz9zfb.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%2Ft806gnqeohi78lmz9zfb.png" alt="Image description" width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: &lt;strong&gt;Subscribe to Bot Events&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To set up event handling, go to the "Event Subscriptions" section in your Slack app settings and paste the Lambda Function URL you received after deploying your app. Slack will automatically send a verification challenge to this URL to validate the connection. Once Slack successfully verifies the URL, your app will be ready to receive and respond to events from Slack. Add required bot user events and save.&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%2F7dykyj83mnhqavr0vbbd.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%2F7dykyj83mnhqavr0vbbd.png" alt="Image description" width="800" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Test
&lt;/h3&gt;

&lt;p&gt;After setting up your serverless Slack app, it’s essential to test it to ensure it responds correctly within your Slack workspace. Mention your app in a channel by typing &lt;code&gt;@serverless-slack-app Hello&lt;/code&gt;. If everything is configured properly, the app should reply with a greeting. This confirmation indicates that your app is operational and ready to interact with users in your workspace.&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%2Fioqxkiuxm9ntmkzk6m8v.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%2Fioqxkiuxm9ntmkzk6m8v.png" alt="Image description" width="569" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Github repo for this blog: &lt;a href="https://github.com/tagorenathv/serverless-slack-app"&gt;https://github.com/tagorenathv/serverless-slack-app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Serverless ShiftRoster app link: &lt;a href="https://github.com/tagorenathv/slack-shift-roster"&gt;https://github.com/tagorenathv/slack-shift-roster&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;New slack workspace link: &lt;a href="https://slack.com/get-started#/createnew"&gt;https://slack.com/get-started#/createnew&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Slack Python guide: &lt;a href="https://slack.dev/bolt-python/tutorial/getting-started"&gt;https://slack.dev/bolt-python/tutorial/getting-started&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AWS SAM: &lt;a href="https://docs.aws.amazon.com/serverless-application-model/"&gt;https://docs.aws.amazon.com/serverless-application-model/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Wrapping Up&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Wrapping up, you now have a foundational serverless Slack bot, poised for expansion and customization. The journey doesn't end here; the Slack API, coupled with Python's versatility, opens up a plethora of opportunities for further development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stay curious, keep coding!🚀&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>slack</category>
      <category>python</category>
      <category>aws</category>
      <category>serverless</category>
    </item>
    <item>
      <title>IoT-SaaS: Web App using ReactJS, MongoDB Atlas &amp; Realm</title>
      <dc:creator>TagorenathV</dc:creator>
      <pubDate>Tue, 11 Jan 2022 12:41:56 +0000</pubDate>
      <link>https://dev.to/tagorenathv/iot-saas-web-app-using-reactjs-mongodb-atlas-realm-48gb</link>
      <guid>https://dev.to/tagorenathv/iot-saas-web-app-using-reactjs-mongodb-atlas-realm-48gb</guid>
      <description>&lt;h3&gt;
  
  
  Overview of My Submission
&lt;/h3&gt;

&lt;p&gt;Nowadays, SaaS platforms &amp;amp; IoT devices are gaining popularity in a variety of use-cases. I built a prototype for IoT based SaaS platform for aquaculture. Users can register to the platform, subscribe to a device and get Real-Time alerts and Dashboards on the fly. Importantly, Pay-as-you-use.&lt;/p&gt;

&lt;p&gt;Though IoT use cases primarily focus on Timeseries collections, I tried to include random features as much as possible to experience different MongoDB features with this proto-type project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;Prime Time&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/tagorenathv/iot-saas"&gt;https://github.com/tagorenathv/iot-saas&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tool Stack Used
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;All data stored in &lt;code&gt;MongoDB Atlas&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Timeseries collection&lt;/code&gt; for storing sensor_data with granularity and expireAfterSeconds defined&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Atlas Search&lt;/code&gt;: Search Index on device collection for fields: title with analyzers &amp;amp; mapping defined for Autocompletition functianality&lt;/li&gt;
&lt;li&gt;Text Index on device collection for fields: title and description for &lt;code&gt;Full-Text search&lt;/code&gt; functionality, including spell corrections&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Scheduled-Triggers&lt;/code&gt; for:

&lt;ul&gt;
&lt;li&gt;simulating data &lt;/li&gt;
&lt;li&gt;calculating aggregated sensor data values &lt;/li&gt;
&lt;li&gt;generating bills every month&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Database-Triggers&lt;/code&gt; on every aggregated-value to check alert condition and insert into alert collection if any&lt;/li&gt;
&lt;li&gt;Used &lt;code&gt;Realm-Functions&lt;/code&gt; for performing data manipulations present in MongoDB Atlas collections&lt;/li&gt;
&lt;li&gt;Frontend made with React JS, ant.design UI library and used &lt;code&gt;Realm-Web-Client&lt;/code&gt; SDK for calling Realm-Functions&lt;/li&gt;
&lt;li&gt;Used Email/Password provider of &lt;code&gt;Realm-Authentication&lt;/code&gt; for UI authentication&lt;/li&gt;
&lt;li&gt;Applied &lt;code&gt;Realm-DataAccess Rules&lt;/code&gt; for added layer of Authorization for each collection&lt;/li&gt;
&lt;li&gt;Hosted react application on &lt;code&gt;Realm-Hosting&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Demo
&lt;/h3&gt;

&lt;p&gt;To Watch: &lt;a href="https://watch.screencastify.com/v/GIhh6PDvAx6WIoXJ1K6g"&gt;Link-1&lt;/a&gt; or &lt;a href="https://drive.google.com/file/d/1WX0zJvo65LyWddyfbZUBdVFOW58BaP7f/view?usp=sharing"&gt;Link-2&lt;/a&gt;&lt;br&gt;
To Experience: &lt;a href="https://iot-saas-user-umzdm.mongodbstitch.com/"&gt;iot-saas&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Wana Try?
&lt;/h3&gt;

&lt;p&gt;Please follow &lt;a href="https://github.com/tagorenathv/iot-saas#setup-guide"&gt;README&lt;/a&gt; file for setup details and also to understand how different MongoDB services are combined together to perform some action in this project&lt;/p&gt;

&lt;h3&gt;
  
  
  Take-Aways
&lt;/h3&gt;

&lt;p&gt;My Take-Aways on MongoDB ecosystem after this project&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MongoDB ecosystem has evolved at its best, making developers life easy and bringing ideas into existance with matter of clicks! Importantly, no need to go for other services. One stop solution for all your usecases.&lt;/li&gt;
&lt;li&gt;Want Autocomplete feature? Use Atlas-Search. No more replicating data to Elasticsearch&lt;/li&gt;
&lt;li&gt;Want Timeseries feature? Use Timeseries collection. Utilize granularity and expireAfterSeconds for data archivals and performance enhacement Out-of-the-box. (P.S: Use Atlas cluster from v5.0 for Timeseries collections)&lt;/li&gt;
&lt;li&gt;Want Full-Text search feature? Create Text-Index on collection. No more replicating data to Elasticsearch&lt;/li&gt;
&lt;li&gt;Want Authentication? Use Realm-Authentication&lt;/li&gt;
&lt;li&gt;Want Authorization? Use Realm-Rules&lt;/li&gt;
&lt;li&gt;Want Event-Driven triggers both Scheduled &amp;amp; Database? - Use Realm-Triggers&lt;/li&gt;
&lt;li&gt;Want to access data Serverlessly without backend? Use Realm-Client SDKs or Enable HTTP Endpoints&lt;/li&gt;
&lt;li&gt;Want to host your application? Use Realm-Hosting&lt;/li&gt;
&lt;li&gt;and lot lot lot more out-of-the-box&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What else could be better?
&lt;/h3&gt;

&lt;p&gt;PS.: In my opinion&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Times I felt, documentation is misleading. Navigations could be more clear&lt;/li&gt;
&lt;li&gt;Folders uploading not available at Realm-Hosting UI. Need to create folders and upload files individually if needed. Would save time if this is available from UI&lt;/li&gt;
&lt;li&gt;At Realm-Deployment,  it would be helpful to modify all json configuration files and deploy from UI itself. External &amp;amp; Github actions are quite helpful thought.&lt;/li&gt;
&lt;li&gt;Eagerly waiting for Flutter Realm-SDK GA. Can't wait to use two best things for a project 🔥🔥🔥&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;React UI library - &lt;a href="https://ant.design/components/overview/"&gt;ant.design&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.atlas.mongodb.com/getting-started/"&gt;MongoDB Atlas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.mongodb.com/realm/functions/"&gt;Realm-Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.mongodb.com/realm/triggers/trigger-types/"&gt;Realm-Triggers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.mongodb.com/realm/web/"&gt;Realm-Web Client SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.mongodb.com/realm/rules/"&gt;Realm-Rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.mongodb.com/realm/authentication/"&gt;Realm-Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.mongodb.com/realm/hosting/"&gt;Realm-Hosting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/developer/how-to/build-ci-cd-pipelines-realm-apps-github-actions/"&gt;Realm Github CI/CD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PS:&lt;/strong&gt; Project is built and hosted with MongoDB ecosystem and ❤️&lt;/p&gt;

</description>
      <category>atlashackathon</category>
      <category>mongodb</category>
      <category>javascript</category>
      <category>serverless</category>
    </item>
  </channel>
</rss>
