<?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: BishalSunuwar202</title>
    <description>The latest articles on DEV Community by BishalSunuwar202 (@bishalsunuwar202).</description>
    <link>https://dev.to/bishalsunuwar202</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%2F1343067%2F3ba6b787-be09-490d-a3cb-4cc819b31e5d.png</url>
      <title>DEV Community: BishalSunuwar202</title>
      <link>https://dev.to/bishalsunuwar202</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bishalsunuwar202"/>
    <language>en</language>
    <item>
      <title>How I Connected a Cloudflare Subdomain to My VPS — And the Gotcha That Got Me</title>
      <dc:creator>BishalSunuwar202</dc:creator>
      <pubDate>Wed, 08 Apr 2026 17:05:56 +0000</pubDate>
      <link>https://dev.to/bishalsunuwar202/how-i-connected-a-cloudflare-subdomain-to-my-vps-and-the-gotcha-that-got-me-36p6</link>
      <guid>https://dev.to/bishalsunuwar202/how-i-connected-a-cloudflare-subdomain-to-my-vps-and-the-gotcha-that-got-me-36p6</guid>
      <description>&lt;p&gt;&lt;strong&gt;The Goal&lt;/strong&gt;&lt;br&gt;
I had a news portal (Nagarik Aawaj) running on a shared VPS at IP:8085. I wanted to give it a proper domain: devdigest.bishalsunuwar.com.np, using Cloudflare for DNS and free SSL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Did&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Registered bishalsunuwar.com.np on Cloudflare&lt;/li&gt;
&lt;li&gt;Added an A record — Name: devdigest, IPv4: my VPS IP, Proxy: ON (orange cloud)&lt;/li&gt;
&lt;li&gt;Set Cloudflare SSL/TLS mode to Full&lt;/li&gt;
&lt;li&gt;Created an nginx server block on the VPS to proxy devdigest.bishalsunuwar.com.np to 127.0.0.1:8085
Simple enough, right? Wrong.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The Problem&lt;/strong&gt;&lt;br&gt;
After everything was set up, visiting &lt;a href="https://devdigest.bishalsunuwar.com.np" rel="noopener noreferrer"&gt;https://devdigest.bishalsunuwar.com.np&lt;/a&gt; loaded a completely different website — gmls.com.np, another project hosted on the same VPS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Debugging Process&lt;/strong&gt;&lt;br&gt;
I ran some tests on the VPS:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;curl -I &lt;a href="http://127.0.0.1:80" rel="noopener noreferrer"&gt;http://127.0.0.1:80&lt;/a&gt; -H "Host: devdigest.bishalsunuwar.com.np"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This returned my Next.js app correctly — so the nginx config on port 80 was working fine.&lt;/p&gt;

&lt;p&gt;But when accessed through Cloudflare, it kept showing the wrong site. That was the clue.&lt;/p&gt;

&lt;p&gt;The Root Cause&lt;br&gt;
When Cloudflare's SSL mode is set to Full, it connects to your server over HTTPS (port 443), not HTTP (port 80).&lt;/p&gt;

&lt;p&gt;My devdigest nginx config only had:&lt;/p&gt;

&lt;p&gt;listen 80;&lt;/p&gt;

&lt;p&gt;It had &lt;code&gt;no port 443 listener&lt;/code&gt;. Meanwhile, the gmls.com.np config had a 443 SSL block. Since nginx had no matching server for devdigest on port 443, it fell back to gmls — the only other config listening on that port.&lt;/p&gt;

&lt;p&gt;The Fix&lt;br&gt;
I added an SSL server block to my devdigest nginx config:&lt;/p&gt;

&lt;p&gt;server {&lt;br&gt;
    listen 443 ssl;&lt;br&gt;
    listen [::]:443 ssl;&lt;br&gt;
    server_name devdigest.bishalsunuwar.com.np;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;

location / {
    proxy_pass http://127.0.0.1:8085;
    # proxy headers...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
The SSL certificate is just Ubuntu's default self-signed "snakeoil" cert. It doesn't matter that it's self-signed because Cloudflare handles the real SSL for visitors. The connection chain is:&lt;/p&gt;

&lt;p&gt;User → HTTPS (valid Cloudflare cert) → Cloudflare → HTTPS (snakeoil cert) → VPS&lt;/p&gt;

&lt;p&gt;After reloading nginx, the subdomain worked perfectly.&lt;/p&gt;

&lt;p&gt;Key Takeaways&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DNS A records don't include port numbers — just the raw IP address&lt;/li&gt;
&lt;li&gt;Cloudflare "Full" SSL connects to your server on port 443 — your nginx must listen on 443, not just 80&lt;/li&gt;
&lt;li&gt;On a shared VPS, nginx falls back to the first available server block if no server_name matches on that port — this is how one site can "hijack" another&lt;/li&gt;
&lt;li&gt;Multiple sites can share port 443 — nginx uses the server_name to route requests, not the port&lt;/li&gt;
&lt;li&gt;Self-signed certs are fine behind Cloudflare — Cloudflare doesn't validate your origin cert in "Full" mode (only "Full Strict" does)
I almost mass googled the entire issue with wrong keywords before slowing down and debugging layer by layer. If you're running multiple projects on a shared VPS behind Cloudflare, I hope this saves you the headache I went through.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Have you ever had a "one line fix" that took hours to find? Drop it in the comments — I'd love to hear your debugging war stories. And if you have questions about Cloudflare, nginx, or VPS setups, ask away — happy to help.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>networking</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Kairos — Fellowship Builder for Nepali Churches</title>
      <dc:creator>BishalSunuwar202</dc:creator>
      <pubDate>Mon, 02 Mar 2026 10:24:46 +0000</pubDate>
      <link>https://dev.to/bishalsunuwar202/kairos-5da2</link>
      <guid>https://dev.to/bishalsunuwar202/kairos-5da2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/weekend-2026-02-28"&gt;DEV Weekend Challenge: Community&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;Nepal has thousands of small Christian fellowship churches — most run entirely by volunteers with no technical background. Every Saturday, a church anchor (presenter) manually types out the week's presentation: song lyrics in Nepali, Bible verses, sermon details, announcements, and prayer points — usually in PowerPoint.&lt;/p&gt;

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

&lt;p&gt;Kairos — Fellowship Builder is an AI-powered church presentation builder designed specifically for Nepali Christian communities.&lt;/p&gt;

&lt;p&gt;An anchor fills in a simple form:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fellowship date&lt;/li&gt;
&lt;li&gt;Anchor name and sermon leader&lt;/li&gt;
&lt;li&gt;Song lyrics (fetched automatically from a Nepali Christian songs library)&lt;/li&gt;
&lt;li&gt;Bible references&lt;/li&gt;
&lt;li&gt;Announcements and prayer points&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://kairos-weld.vercel.app/login" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;kairos-weld.vercel.app&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;




&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/BishalSunuwar202" rel="noopener noreferrer"&gt;
        BishalSunuwar202
      &lt;/a&gt; / &lt;a href="https://github.com/BishalSunuwar202/Kairos" rel="noopener noreferrer"&gt;
        Kairos
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Kairos — Fellowship Builder&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An AI-powered church presentation builder for Nepali Christian fellowship communities. Fill in your fellowship details — anchor name, sermon leader, song lyrics, Bible references, and last prayer name — and AI generates a complete, slide-by-slide presentation in &lt;strong&gt;Nepali (Devanagari script)&lt;/strong&gt;, ready to project fullscreen.&lt;/p&gt;
&lt;p&gt;🌐 &lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://kairos-weld.vercel.app" rel="nofollow noopener noreferrer"&gt;https://kairos-weld.vercel.app&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;AI generates Nepali slide content and preserves names exactly as entered by the user, with Bikram Sambat (BS) date conversion&lt;/li&gt;
&lt;li&gt;AI-generated warm Nepali Christian welcome message for each fellowship&lt;/li&gt;
&lt;li&gt;Fullscreen presenter mode with keyboard navigation (arrow keys, Escape)&lt;/li&gt;
&lt;li&gt;Slide format toolbar: font size, bold, underline, colors, padding, vertical &amp;amp; horizontal text alignment&lt;/li&gt;
&lt;li&gt;Save and manage presentations in a personal library&lt;/li&gt;
&lt;li&gt;Public shareable links — share slides with your congregation (no login required to view)&lt;/li&gt;
&lt;li&gt;Print / export slides to PDF&lt;/li&gt;
&lt;li&gt;Demo mode with a pre-filled sample Nepali presentation&lt;/li&gt;
&lt;li&gt;Google OAuth sign-in&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Stack&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16&lt;/strong&gt; (App Router) +…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/BishalSunuwar202/Kairos" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&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%2Fa2eq3tdlcy3rwcp23bkb.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%2Fa2eq3tdlcy3rwcp23bkb.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;Tech stack:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Framework - Next.js 16 (App Router)&lt;/li&gt;
&lt;li&gt;AI - Gemini 2.5 Flash Lite via Vercel AI SDK (@ai-sdk/google)&lt;/li&gt;
&lt;li&gt;Database &amp;amp; Auth -    Supabase (PostgreSQL + Google OAuth)&lt;/li&gt;
&lt;li&gt;Styling  - Tailwind CSS v4 + shadcn/ui&lt;/li&gt;
&lt;li&gt;State - Zustand&lt;/li&gt;
&lt;li&gt;Deployment - Vercel&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How the AI works:&lt;/p&gt;

&lt;p&gt;The form data is sent to a Next.js API route which calls Gemini 2.5 Flash Lite with a carefully engineered system prompt. The prompt instructs the AI to:&lt;/p&gt;

&lt;p&gt;Output only valid JSON (no markdown)&lt;br&gt;
Write all slide content in Nepali Devanagari&lt;br&gt;
Transliterate English names into Devanagari&lt;br&gt;
Convert the Gregorian fellowship date into Bikram Sambat calendar in Nepali&lt;br&gt;
Generate a warm, faith-appropriate welcome message in Nepali&lt;br&gt;
Split song lyrics into individual slides per section (Verse 1, Chorus, Bridge, etc.)&lt;br&gt;
Follow a fixed slide order: welcome → host → opening prayer → lyrics → sermon → Bible → announcements → closing prayer&lt;br&gt;
Why Gemini 2.5 Flash Lite:&lt;br&gt;
It handles Nepali Devanagari script accurately, understands Bikram Sambat calendar conversion, and is fast enough for real-time generation of 10–15 slides.&lt;/p&gt;

&lt;p&gt;The biggest challenge:&lt;br&gt;
Getting the AI to reliably output parseable JSON while also handling Nepali script, calendar conversion, and name transliteration all in a single prompt. The solution was using generateText (not streaming) and stripping any markdown code fences from the response before parsing.&lt;/p&gt;

&lt;p&gt;This was built to solve a real problem for a real community — and it's already being used.&lt;/p&gt;

&lt;p&gt;DEV username - BishalSunuwar202&lt;/p&gt;

&lt;p&gt;Please do give your feedback on what I can improve.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
