<?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>Forem: Suteerth Subramaniam</title>
    <description>The latest articles on Forem by Suteerth Subramaniam (@iamsuteerth).</description>
    <link>https://forem.com/iamsuteerth</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%2F2867891%2F929361d3-28f9-4e5c-af07-4c30dc4b7bcd.jpeg</url>
      <title>Forem: Suteerth Subramaniam</title>
      <link>https://forem.com/iamsuteerth</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/iamsuteerth"/>
    <language>en</language>
    <item>
      <title>Mastering the Stack: Engineering a Production-Grade Platform from Scratch</title>
      <dc:creator>Suteerth Subramaniam</dc:creator>
      <pubDate>Thu, 05 Jun 2025 16:30:25 +0000</pubDate>
      <link>https://forem.com/iamsuteerth/mastering-the-stack-engineering-a-production-grade-platform-from-scratch-2m7d</link>
      <guid>https://forem.com/iamsuteerth/mastering-the-stack-engineering-a-production-grade-platform-from-scratch-2m7d</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Previously, we took a deep dive into what happens when you press a button on your favorite movie booking platforms! In case you haven't read that one, check it out:&lt;br&gt;&lt;a href="https://dev.to/iamsuteerth/engineering-the-box-office-my-full-stack-movie-booking-platform-unveiled-3kek"&gt;&lt;strong&gt;My Blog: Engineering The Box Office&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have a look at the website (Valid for 14 days from the day of post) - &lt;a href="https://skyfox-frontend.vercel.app/" rel="noopener noreferrer"&gt;Skyfox&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've shared my entire journey of coding this project from start to finish! And as I promised, I'm back with innovative solutions and new features that have transformed my project into a near enterprise-scale startup's MVP. Here's a quick overview of the features I've developed:    &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Admin Dashboard&lt;/strong&gt; 

&lt;ul&gt;
&lt;li&gt;Comprehensive revenue analytics with advanced filtering capabilities.&lt;/li&gt;
&lt;li&gt;Downloadable CSV reports for monthly and yearly data analysis.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Customer Wallet&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Seamless wallet top-up functionality for streamlined bookings.&lt;/li&gt;
&lt;li&gt;Hybrid payment system supporting wallet + card combinations.&lt;/li&gt;
&lt;li&gt;Complete wallet transaction history.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Check In&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Staff/Admin enabled customer check-in via search or QR code scanning,&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Dive Into new Features!
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Admin Dashboard
&lt;/h3&gt;

&lt;p&gt;The sleek UI was designed by me from start to finish and I'm quite proud of the overall design! But beyond aesthetics, this dashboard packs serious analytical power:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Comparative Summary&lt;/strong&gt;: Real-time revenue, bookings, and seat occupancy metrics with month-over-month percentage changes—giving theater owners instant business health insights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download Booking Data&lt;/strong&gt;: Generate &lt;code&gt;.csv&lt;/code&gt; reports for any specified month and year, enabling external analysis and accounting integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visualizations by timeframe&lt;/strong&gt;: Interactive charts that adapt to different timeframes, built with responsive design principles to work seamlessly across devices.&lt;/li&gt;
&lt;/ul&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%2Fjkd7vbcppas814qa6wbu.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%2Fjkd7vbcppas814qa6wbu.png" alt="Admin Dashboard Overview" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Visualizations by specific time&lt;/strong&gt;: Real power lies in specificity. Want data for &lt;code&gt;Interstellar bookings made in the month of May, 2025 at Night&lt;/code&gt; - Done. &lt;/li&gt;
&lt;/ul&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%2Fsfdmnvix8kbqosq5lrd8.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%2Fsfdmnvix8kbqosq5lrd8.png" alt="Admin Dashboard Specific Time" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All the graphs are responsive in nature and will work regardless of your device screen dimensions adapting to the data present in your database!&lt;/em&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%2Fvnswmc8sgrwism57g2lh.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%2Fvnswmc8sgrwism57g2lh.png" alt="Admin Dashboard Stats" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Customer Wallet
&lt;/h3&gt;

&lt;p&gt;A wallet sounds like a very simple feature but in reality it turned out to be a lot more challenging with a simple consideration, &lt;code&gt;you're dealing with people's money&lt;/code&gt; which requires precision, security and proper audit trails in an actual enterprise! So I solved for the same:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wallet Transaction History&lt;/strong&gt;:  Every transaction gets a unique ID and timestamp, creating an immutable history that meets financial compliance standards.&lt;/li&gt;
&lt;/ul&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%2F0yutdqtlx9cirkxhp658.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%2F0yutdqtlx9cirkxhp658.png" alt="Wallet Transaction History" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add Funds&lt;/strong&gt;: A wallet is useless if you can't even add funds to it isn't it?&lt;/li&gt;
&lt;/ul&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%2F5trw9vz0p92bmqyzx5gp.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%2F5trw9vz0p92bmqyzx5gp.png" alt="Add Funds" width="800" height="721"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wallet Movie Bookings&lt;/strong&gt;: Use your wallet funds to instantly book movie tickets!&lt;/li&gt;
&lt;/ul&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%2Fffy7dd8g0le11pyop7qq.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%2Fffy7dd8g0le11pyop7qq.png" alt="Wallet Bookings" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't Have Enough Funds?&lt;/strong&gt;: We've got you covered. You may pay for the remaining amount using cash!&lt;/li&gt;
&lt;/ul&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%2Fz6ohgcw3ahi21fvqge2i.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%2Fz6ohgcw3ahi21fvqge2i.png" alt="Partial Payments" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Customer Check In
&lt;/h3&gt;

&lt;p&gt;As a &lt;code&gt;Staff&lt;/code&gt;/&lt;code&gt;Admin&lt;/code&gt;, you can check-in customers in bulk or individually!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bulk Check-In&lt;/strong&gt;: Search through the paginated bookings by &lt;code&gt;username&lt;/code&gt;/`&lt;code&gt;phone&lt;/code&gt;/&lt;code&gt;booking_id&lt;/code&gt; and check-in multiple customers at once!&lt;/li&gt;
&lt;/ul&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%2F4b7921h6bfzy0v9rjag1.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%2F4b7921h6bfzy0v9rjag1.png" alt="Bulk Check In" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;QR Code Check-In&lt;/strong&gt;: Scan customer tickets with QR codes to check them in!&lt;/li&gt;
&lt;/ul&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%2Fk8hamulkqbei43mf8879.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%2Fk8hamulkqbei43mf8879.png" alt="QR Code Check In" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Don't mind, it works on devices with a camera but my development machine needs an external one :D&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check out the documentation for the backend and frontend codebases!&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: &lt;a href="https://github.com/iamsuteerth/skyfox-backend" rel="noopener noreferrer"&gt;GoLang based codebase&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: &lt;a href="https://github.com/iamsuteerth/skyfox-frontend" rel="noopener noreferrer"&gt;Next.Js based codebase&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  DevOps Deep Dive: Let's go prod!
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why AWS?
&lt;/h3&gt;

&lt;p&gt;Lets face it, AWS architecture diagrams look cool. And I wanted to build one of my own, being an &lt;code&gt;AWS Certified Solutions Architect Associate&lt;/code&gt;. I've created some AWS solutions in the past but all of them were relatively small so I wanted to try out something big. &lt;em&gt;Something enterprise level.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture: Building for scale
&lt;/h3&gt;

&lt;p&gt;The transition from a hobby project to an enterprise grade production level requires deep understanding of the fundamentals.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observability&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design and Architecture&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your project shouldn't just work, it should create a pleasant experience for all your customers. Keeping these in mind, I built this architecture from scratch putting my solution architecting and devops skill to the test!&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%2Flxsvcm1yn1j7lei08trl.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%2Flxsvcm1yn1j7lei08trl.png" alt="Architecture Diagram" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public Subnets Only&lt;/strong&gt;: Initially, I planned private subnets with NAT gateways for "enterprise security." Reality check—the complexity wasn't worth the cost considering that this is a passion project. Public subnets with proper security groups provided the same protection at a fraction of the cost and complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Path-Based Routing&lt;/strong&gt;: The internal ALB routes requests using &lt;code&gt;/payment-service/*&lt;/code&gt; and &lt;code&gt;/movie-service/*&lt;/code&gt; patterns, creating clean service separation without the overhead of service discovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bridge Networking&lt;/strong&gt;: ECS tasks using bridge mode allow containers in the same task to communicate via container names. This enabled seamless sidecar monitoring without complex service discovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure-as-Code with Terraform&lt;/strong&gt;: Every piece of infrastructure is versioned and reproducible. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security by Design&lt;/strong&gt;: Zero secrets in code or containers. Everything sensitive lives in AWS Parameter Store injected at runtime. Even if someone scans the public endpoint, they'll find nothing but 403 errors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Observability: Seeing What Matters
&lt;/h3&gt;

&lt;p&gt;Monitoring isn't just about knowing if your system is up—it's about understanding how it behaves under real conditions. I ended up learning about an engineering paradigm that solo developers rarely explore.&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%2Feuemn3s8trf3l0lx6jms.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%2Feuemn3s8trf3l0lx6jms.png" alt="Grafana Dashboard" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ADOT sidecars collecting metrics from each service.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some of the insights:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API Latency Patterns&lt;/strong&gt;: The &lt;code&gt;/login&lt;/code&gt; endpoint was consistently slower due to how the JWT authentication is implemented. This encouraged better authentication flows such as &lt;code&gt;OAuth2&lt;/code&gt; by &lt;a href="https://www.ory.sh/hydra" rel="noopener noreferrer"&gt;Ory: Hydra&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Malicious Traffic&lt;/strong&gt;: Automated bots constantly scan for &lt;code&gt;/admin&lt;/code&gt;, &lt;code&gt;/.env&lt;/code&gt;, and &lt;code&gt;/api/keys&lt;/code&gt; endpoints—all properly blocked and logged.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Custom ADOT Health Checker
&lt;/h3&gt;

&lt;p&gt;The standard AWS ADOT container health checks were not working in my ECS setup, so I built a custom Go-based health checker. You can check out the implementation details in the &lt;a href="https://github.com/your-repo/skyfox-devops/tree/main/adot" rel="noopener noreferrer"&gt;DevOps repository&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Operational Excellence: Beyond Just Working
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Deployment Strategy&lt;/strong&gt;: Rolling updates with 50% minimum healthy capacity—prioritizing cost efficiency over zero-downtime in my resource-constrained environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-Scaling Intelligence&lt;/strong&gt;: Services scale based on CPU &amp;gt; 70% OR Memory &amp;gt; 80%, with cluster-level scaling preventing resource exhaustion. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost Optimization Wins&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ARM64 Instances&lt;/strong&gt;: t4g.small instances cut compute costs by 20% compared to x86 alternatives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No NAT Gateway&lt;/strong&gt;: Direct internet access eliminated $45/month in unnecessary costs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ECR Lifecycle Policies&lt;/strong&gt;: Automatic cleanup of old container images prevents storage bloat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Container and Service Level Observability&lt;/strong&gt;: Through &lt;code&gt;CloudWatch&lt;/code&gt;, detailed insights about the container performance, service health, logs etc. can be observed providing clear audit trails. Auto clearance of logs after 7 days to stay within budget.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Insights &amp;amp; Technical Breakthroughs
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What I'd Do Differently&lt;/strong&gt;: I initially over-engineered the networking layer with private subnets and complex routing. Sometimes the simpler solution is the better solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unexpected Challenge&lt;/strong&gt;: Getting ADOT sidecars to reliably communicate with application containers. The solution—container links in bridge networking—was elegantly simple once discovered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills Gained&lt;/strong&gt;: This project transformed my understanding of production systems. "Production-ready" isn't just about code that works—it's about code that works reliably, scales predictably, fails gracefully, and provides visibility into its own behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Victory&lt;/strong&gt;: Building a system that I can confidently demo to anyone, anywhere, knowing it will perform consistently and provide real insights into its own operation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full DevOps Documentation&lt;/strong&gt;: For the complete infrastructure setup, deployment strategies, check out the &lt;a href="https://github.com/your-repo/skyfox-devops" rel="noopener noreferrer"&gt;SkyFox DevOps Repository&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;p&gt;This project started from a simple desire to work on the set of features my teammates had built and ended up becoming a journey of learning where I built an enterprise level product on my own. I encountered countless problems and figured out solutions on my own enhancing my ability to think.&lt;/p&gt;

&lt;p&gt;I played the role of a &lt;code&gt;Frontend Engineer&lt;/code&gt;, &lt;code&gt;Backend Engineer&lt;/code&gt;, &lt;code&gt;DevOps Engineer&lt;/code&gt;, &lt;code&gt;SRE&lt;/code&gt; and &lt;code&gt;Product Manager&lt;/code&gt; all at once allowing me to think from 5 different perspectives! This project proves that &lt;strong&gt;&lt;em&gt;there is no limit to learning.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My approach was validated when I heard this quote from my executive director - &lt;strong&gt;&lt;em&gt;"When a developer starts thinking like a project manager, magic happens."&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Let's connect - &lt;a href="https://www.linkedin.com/in/suteerth-subramaniam/" rel="noopener noreferrer"&gt;My LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>webdev</category>
      <category>learning</category>
    </item>
    <item>
      <title>Engineering the Box Office: My Full Stack Movie Booking Platform Unveiled</title>
      <dc:creator>Suteerth Subramaniam</dc:creator>
      <pubDate>Fri, 02 May 2025 12:50:29 +0000</pubDate>
      <link>https://forem.com/iamsuteerth/engineering-the-box-office-my-full-stack-movie-booking-platform-unveiled-3kek</link>
      <guid>https://forem.com/iamsuteerth/engineering-the-box-office-my-full-stack-movie-booking-platform-unveiled-3kek</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Have you ever paused to wonder what really happens when you book a movie ticket online, when you check show details or reserve your favorite seat? I’ve always been fascinated by the complexity beneath that simple click-and building this project gave me the perfect opportunity to explore it firsthand.&lt;/p&gt;

&lt;p&gt;SkyFox Cinema is a modern, full stack movie booking platform designed to help regional theaters embrace digital transformation. My goal was to empower local cinema owners with a robust and scalable system that leverages the latest in software engineering practices-while also challenging myself to solve real-world business and technical problems (this was a fictitious scenario I created for myself)&lt;/p&gt;

&lt;p&gt;Check it out here &lt;a href="https://skyfox-frontend.vercel.app" rel="noopener noreferrer"&gt;signing up as a customer&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%2F0lcrnboeyh5chtrjetlu.jpg" 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%2F0lcrnboeyh5chtrjetlu.jpg" alt="Shows Page" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;NextJS (Frontend)&lt;/li&gt;
&lt;li&gt;Chakra UI and Material UI (UI Libraries)&lt;/li&gt;
&lt;li&gt;Go (Backend, Gin Framework)&lt;/li&gt;
&lt;li&gt;Supabase (Managed Postgres)&lt;/li&gt;
&lt;li&gt;Docker (Containerization)&lt;/li&gt;
&lt;li&gt;AWS (Deployment &amp;amp; S3 Integration)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this blog, I’ll take you behind the curtain of SkyFox Cinema: from designing resilient backend microservices and implementing real-time seat locking, to building a modular, CSS-free frontend and deploying the platform on AWS. You’ll get an insider’s look at the architectural decisions, challenges, and solutions that shaped this project.&lt;/p&gt;

&lt;p&gt;This isn’t a step-by-step tutorial, but a candid reflection on the development journey-highlighting the business impact, technical rigor, and personal growth that came with building a production-grade proof of concept. I was determined to tackle the kinds of challenges that established vendors often charge a premium for: concurrency, security, seamless user experience, and more.&lt;/p&gt;

&lt;p&gt;Whether you’re a developer, a tech leader, or someone curious about what powers your favorite ticketing app, I hope this post offers valuable insights and maybe even sparks your own curiosity.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Built a full-stack movie booking app solo during/after my IDFC FIRST Bank internship.&lt;/li&gt;
&lt;li&gt;Used Go, Next.js, Supabase, AWS, Docker, and more.&lt;/li&gt;
&lt;li&gt;Implemented real-time seat locking, secure image uploads, and RBAC.&lt;/li&gt;
&lt;li&gt;Hosted on Vercel and AWS with microservices on Render.&lt;/li&gt;
&lt;li&gt;Deep dive below on architecture, features, and key lessons.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Motivation
&lt;/h2&gt;

&lt;p&gt;My internship at IDFC FIRST Bank was a turning point in my journey as a developer. Through the Neev Developer Bootcamp, I didn’t just pick up the technical fundamentals but also learned the real value of teamwork and shared goals. Working with my team, “ULTRON,” was a highlight; together, we navigated challenges, celebrated every small win, and discovered how much more is possible when you collaborate. That experience lit a spark in me to push my boundaries even further.&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%2F64djp8gn37e4pzwsfup5.jpg" 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%2F64djp8gn37e4pzwsfup5.jpg" alt="Neev Certificate" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the bootcamp, my curiosity was insatiable. I wanted to take everything I’d learned and see what I could build on my own. I saw clear opportunities for improvement in our original project: &lt;em&gt;the backend could be more RESTful&lt;/em&gt;, &lt;em&gt;the frontend could leverage newer technologies&lt;/em&gt;, and there was a whole world of &lt;em&gt;DevOps and cloud deployment&lt;/em&gt; waiting to be explored. &lt;/p&gt;

&lt;p&gt;My hands-on experience with AWS gave me the confidence to step up-not just as a developer, but as a lead architect and DevOps engineer for a full-stack solution.&lt;/p&gt;

&lt;p&gt;I set out to become a &lt;code&gt;Full Stack++ Developer&lt;/code&gt;-someone who could not only work across the stack, but also connect business needs with technical solutions. This project became my sandbox: I rebuilt every layer, from backend concurrency and microservices to a modern frontend, cloud deployment, and robust security.&lt;/p&gt;

&lt;p&gt;What made this journey truly ambitious was the sheer modularity and scope. Every feature felt like a mini project in itself. In real-world companies, entire teams would tackle these challenges, but I was determined to take on every role, learning through both successes and setbacks &lt;em&gt;(and, of course, plenty of coffee)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Overview and Key Technical Implementations
&lt;/h2&gt;

&lt;p&gt;The architecture of SkyFox Cinema is designed for modularity, security, and real-world reliability-even as a proof of concept. While this isn’t a full-blown enterprise deployment yet, it’s packed with advanced engineering patterns and cloud-native practices.&lt;/p&gt;

&lt;h3&gt;
  
  
  System Architecture at a Glance
&lt;/h3&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%2Fa80yu836fhr23njdd8j6.jpg" 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%2Fa80yu836fhr23njdd8j6.jpg" alt="Backend Architecture" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  SkyFox Cinema is composed of three primary layers:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Next.js and React, hosted on Vercel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend &amp;amp; API Gateway&lt;/strong&gt;: Go backend, containerized and deployed on AWS Elastic Beanstalk, protected by an NGINX reverse proxy acting as an API gateway.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microservices&lt;/strong&gt;: Dedicated movie and payment services, each containerized and hosted on Render, communicating securely with the core backend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database &amp;amp; Storage&lt;/strong&gt;: Supabase (Postgres) for relational data, AWS S3 for profile image storage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Frontend: Modern, Modular, and Delightfully Secure
&lt;/h3&gt;

&lt;p&gt;A showcase of modern web engineering. With Chakra UI and Material UI, the interface is fully responsive and styled-without a single line of custom CSS. Vercel handles deployments and SSL automatically, letting me focus on features, not infrastructure.&lt;/p&gt;

&lt;h4&gt;
  
  
  Highlights:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API Proxy Layer&lt;/strong&gt;: All API calls go through Next.js API routes, keeping backend endpoints and secrets hidden from the client.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role-Based UI&lt;/strong&gt;: The interface dynamically adapts to user roles (customer, staff, admin), ensuring everyone sees only what’s relevant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context-Driven State&lt;/strong&gt;: React Context and custom hooks power real-time data refresh, centralized dialog management, and smooth multi-step flows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security on the Client&lt;/strong&gt;: Sensitive data stays server-side; authentication and authorization use secure cookies and server logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Complex UI Components &amp;amp; User Experience
&lt;/h3&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%2Fiw4k8q3751fyoaiwxgys.jpg" 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%2Fiw4k8q3751fyoaiwxgys.jpg" alt="Customer Booking Journey" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SkyFox Cinema’s UI is built for clarity and engagement. Multi-step signup and booking dialogs, profile update flows, and show cards are all modular and reusable. The booking journey guides users through seat selection, payment, and confirmation-with real-time seat availability and feedback at every step.&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%2F3n201si6zktbkifed2mc.jpg" 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%2F3n201si6zktbkifed2mc.jpg" alt="Signup Page" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Contexts, Reducers, and Custom Hooks
&lt;/h3&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%2Fh5vfstq70j84ar7qwrsk.jpg" 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%2Fh5vfstq70j84ar7qwrsk.jpg" alt="Profile Update" width="800" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;State management is handled with React’s Context API, useReducer, and custom hooks. The &lt;strong&gt;centralized dialog context&lt;/strong&gt; manages all modals, eliminating prop drilling and making it easy to add new dialogs. Complex forms like profile management use useReducer for secure, multi-step updates.&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%2Fsc9gxd7iby1wgdrw2p85.jpg" 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%2Fsc9gxd7iby1wgdrw2p85.jpg" alt="Profile Image Update" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-Time Data Refresh &amp;amp; Cache Invalidation
&lt;/h3&gt;

&lt;p&gt;A dedicated &lt;strong&gt;Shows Context&lt;/strong&gt; ensures that after any booking or show scheduling, all relevant seat maps and show lists refresh instantly-no manual reloads needed. This is achieved via cache invalidation and context-driven updates, so users always see the latest data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Show Scheduling &amp;amp; Management
&lt;/h3&gt;

&lt;p&gt;Admins can &lt;strong&gt;schedule new shows&lt;/strong&gt; with an intuitive dialog-selecting movies, time slots, and pricing. The backend enforces business rules (no past-dated shows or slot conflicts), while the frontend delivers instant feedback and real-time updates.&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%2Fzgyw1nudtvrklc4etxck.jpg" 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%2Fzgyw1nudtvrklc4etxck.jpg" alt="Show Schedule" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Theme, Fonts, and UX Details
&lt;/h3&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%2Fbmxk9rwo7b7p5wg6pgpm.jpg" 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%2Fbmxk9rwo7b7p5wg6pgpm.jpg" alt="Theme Preview" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The theme is fully customized with Chakra UI, featuring brand colors, custom fonts, and responsive breakpoints. Payment forms auto-detect &lt;strong&gt;Visa/Mastercard icons&lt;/strong&gt; via regex and display the right card logo, while skeleton loaders keep the UI polished and user-friendly.&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%2Fba9ha5vflme1dmv5fu56.jpg" 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%2Fba9ha5vflme1dmv5fu56.jpg" alt="Card Comparison" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Backend &amp;amp; Microservices: Resilient and Scalable
&lt;/h3&gt;

&lt;p&gt;The Go (Gin) backend follows clean architecture-controllers, services, and repositories are strictly separated for maintainability. It’s containerized and deployed on AWS Elastic Beanstalk, running behind an NGINX reverse proxy that handles API key validation and rate limiting.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Microservices&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Movie Service&lt;/strong&gt;: Handles movie metadata, decoupled for scalability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment Service&lt;/strong&gt;: Validates payments with strict input checks and is fully covered by TDD, ensuring reliability for critical business logic. &lt;strong&gt;&lt;em&gt;It even simulates a payment failure ;) with a small probability&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Database &amp;amp; Storage: Integrity and Security
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supabase (Postgres)&lt;/strong&gt;: All transactional data-users, bookings, shows, seats, payments-lives in a normalized schema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS S3 for Profile Images&lt;/strong&gt;: Images are uploaded through a secure, multi-step process:

&lt;ul&gt;
&lt;li&gt;The client computes a SHA-256 hash and sends it with the image.&lt;/li&gt;
&lt;li&gt;The backend verifies, rescales, and uploads to S3 using IAM roles (no access keys needed).&lt;/li&gt;
&lt;li&gt;Only a 24-hour presigned URL is ever given to the client, further abstracted through Next.js proxy routes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&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%2F2b0ojgx01p1jefc6r6p2.jpg" 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%2F2b0ojgx01p1jefc6r6p2.jpg" alt="Database Schema" width="800" height="612"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Concurrency, Real-Time Booking, and Data Integrity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Seat Locking with GoRoutines&lt;/strong&gt;:When a user starts booking, the backend launches a goroutine to lock seats for 5 minutes. If the booking isn’t completed, the goroutine releases the seats-no double bookings, no race conditions, even under heavy load.&lt;/li&gt;
&lt;/ul&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%2F8gte4swyddp6se12o89v.jpg" 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%2F8gte4swyddp6se12o89v.jpg" alt="Timer" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Two-Phase Booking&lt;/strong&gt;: Customers reserve seats (pending booking) and then complete payment. Admins can bypass payment for walk-in bookings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PDF and QR Generation&lt;/strong&gt;: On booking confirmation, the backend generates a PDF ticket and QR code on demand. These are streamed to the frontend via secure proxy routes-never exposing raw files or URLs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fgv3z6ta3n61gi1jgwjxr.jpg" 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%2Fgv3z6ta3n61gi1jgwjxr.jpg" alt="PDF Ticket" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Security Features: Defense in Depth
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JWT Tokens&lt;/strong&gt;: Authentication with user roles embedded and validated on every request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RBAC (Role-Based Access Control)&lt;/strong&gt;: Strict role checks on both backend and frontend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Input Validation&lt;/strong&gt;: Every API endpoint validates input at multiple layers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQL Injection Prevention&lt;/strong&gt;: All queries use parameterized statements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SHA-256 Image Validation&lt;/strong&gt;: Ensures profile image integrity before upload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Proxy and Presigned URLs&lt;/strong&gt;: Sensitive operations are handled server-side; only temporary, signed URLs are shared.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separation of Concerns&lt;/strong&gt;: The frontend talks only to its own API layer, which then communicates with the backend-a clean, auditable boundary.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Migrations, Data Seeding, and Error Handling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automated Migrations&lt;/strong&gt;: Versioned migration files keep schema changes consistent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Seeding&lt;/strong&gt;: The backend seeds initial users, movies, and seat maps for quick onboarding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling&lt;/strong&gt;: All errors are standardized, logged, and tagged with unique request IDs for easy troubleshooting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  APIs &amp;amp; Documentation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RESTful APIs&lt;/strong&gt;: The backend exposes a comprehensive set of REST endpoints, all documented with clear request/response schemas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Documentation&lt;/strong&gt;: Explore the full API and data contracts in the &lt;a href="https://github.com/iamsuteerth/skyfox-backend/tree/main/docs" rel="noopener noreferrer"&gt;SkyFox Backend API Docs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Code&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/iamsuteerth/skyfox-backend/tree/main" rel="noopener noreferrer"&gt;Backend Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/iamsuteerth/skyfox-frontend/tree/main" rel="noopener noreferrer"&gt;Frontend Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/iamsuteerth/skyfox-helper/tree/main" rel="noopener noreferrer"&gt;Helper/Microservices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&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%2Fnn90fpu2s2m3jaqmyexl.jpg" 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%2Fnn90fpu2s2m3jaqmyexl.jpg" alt="My Bookings" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges and Solutions
&lt;/h2&gt;

&lt;p&gt;Every ambitious project comes with its own set of “plot twists”-and SkyFox Cinema was no exception. What started as a mission to tackle the problems I missed out on during my internship project simulation quickly spiraled into a full-scale re-engineering adventure. &lt;/p&gt;

&lt;p&gt;Turns out, when you’re in your element &lt;em&gt;(and fueled by enough coffee)&lt;/em&gt;, hours can vanish building a single feature! Here are some of the challenges that truly tested me-and the creative (sometimes stubborn) solutions I found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SHA Validation and Hiding S3 Presigned URL&lt;/strong&gt;: This one was a &lt;code&gt;“problem I invented for myself,”&lt;/code&gt; but it became a masterclass in security and architecture. I wanted to make sure users never saw the S3 presigned URL in their browser’s network tab-because, let’s face it, sharing direct access to your storage bucket isn’t ideal.  &lt;strong&gt;The solution?&lt;/strong&gt; I leveraged Next.js proxy routes, so only the frontend server ever talks to the backend for presigned URL generation and file access. This led me to adopt a clean, industry-standard Client → Frontend → Backend interaction pattern, where sensitive operations are always server-side. &lt;strong&gt;Bonus: it forced me to build a consistent SSR-driven architecture throughout the app.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Question and Password Tokens&lt;/strong&gt;: Nobody asked for security questions or password reset tokens, but I wanted to push my understanding of secure authentication flows. I ended up implementing a dedicated token system for these interactions-so password resets and security question verification are isolated from regular session tokens. Not only did this make the system more robust, it gave me a taste of how enterprise-grade platforms might handle sensitive user flows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency &amp;amp; Simultaneous Bookings&lt;/strong&gt;: Handling two people trying to book the same seat at the exact same time is the classic “race condition” problem. The solution sounds simple: temporarily block the seat. But the technical reality was a wild ride-think &lt;code&gt;GoRoutines&lt;/code&gt;, &lt;code&gt;Worker Pools&lt;/code&gt;, &lt;code&gt;Temporary DB bindings&lt;/code&gt;, &lt;code&gt;Pending states&lt;/code&gt; and a lot of backend/frontend coordination. Making sure the frontend stayed decoupled from business logic (no seat-locking in the browser!) while keeping everything in sync took over &lt;code&gt;40 hours&lt;/code&gt; of deep work and a few &lt;em&gt;existential crises.&lt;/em&gt; But now, double-bookings are a thing of the past.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend: Dialogs, Modals &amp;amp; UI Library Wrangling&lt;/strong&gt;: You’d think building dialogs and modals would be easy, right? Not when you’re integrating two different UI libraries and want everything to look and feel seamless. Making Chakra UI and Material UI play nicely together, ensuring full responsiveness, and keeping the UX smooth took more trial and error than I care to admit. Even the smallest UI component can turn into a mini-project!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DB Architecture&lt;/strong&gt;: Being the &lt;code&gt;Backend Engineer&lt;/code&gt;, &lt;code&gt;Frontend Engineer&lt;/code&gt;, and &lt;code&gt;Database Administrator&lt;/code&gt; all at once is a workout. Designing a schema with the right constraints, cascades, and future-proofing for new features was a lesson in humility. Every table and relationship had to be thought through, especially with features like seat locking and booking status that touch multiple parts of the system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wearing Every Hat (Even Project Manager)&lt;/strong&gt;: With no team to hand things off to, I became my own project manager-planning features, deployments, and roadmaps. Juggling all these roles gave me a new appreciation for how much coordination goes into real-world software projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;SkyFox Cinema is just getting started! Coming up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Check-In&lt;/strong&gt; feature for confirmed bookings, so users can mark their arrival at the theater.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;Admin Dashboard&lt;/strong&gt; with revenue stats, filters, and insights-because data is power.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Customer Wallet&lt;/strong&gt; for card-less and partial payments, making transactions even smoother.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And of course, I’ll be rolling out the full production-grade architecture. Why not now? Well, running that setup in the cloud costs $18 a week (and yes, it could handle thousands of monthly active users with plenty of concurrency!). For now, the POC is more than enough to show what’s possible-and to keep my wallet happy.&lt;/p&gt;

&lt;p&gt;Who knows what challenges (and fun) the next version will bring? Stay tuned!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>go</category>
      <category>aws</category>
    </item>
    <item>
      <title>Building a Modern Portfolio with Next.js, MDX, and AWS</title>
      <dc:creator>Suteerth Subramaniam</dc:creator>
      <pubDate>Sat, 15 Feb 2025 20:26:34 +0000</pubDate>
      <link>https://forem.com/iamsuteerth/building-a-modern-portfolio-with-nextjs-mdx-and-aws-3h</link>
      <guid>https://forem.com/iamsuteerth/building-a-modern-portfolio-with-nextjs-mdx-and-aws-3h</guid>
      <description>&lt;p&gt;👉 &lt;strong&gt;Check out my portfolio website &lt;a href="//suteerth-subramaniam.com"&gt;here&lt;/a&gt; or &lt;a href="//suteerth.in"&gt;here&lt;/a&gt; and let me know what you think!&lt;/strong&gt;  (yes I have two domains ;D)&lt;/p&gt;

&lt;p&gt;A personal portfolio is more than just a website—it's a &lt;strong&gt;digital reflection&lt;/strong&gt; of your journey, achievements, and much more. With that in mind, I set out to create a modern, high-performance portfolio that not only serves as a showcase but also as a platform for &lt;strong&gt;blogs, documenting experiences, and sharing insights&lt;/strong&gt;.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why Next.js and MDX?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I chose &lt;strong&gt;Next.js&lt;/strong&gt; for its powerful features like &lt;strong&gt;server-side rendering (SSR), static site generation (SSG), and dynamic routing&lt;/strong&gt;—all essential for building a &lt;strong&gt;fast and scalable&lt;/strong&gt; portfolio. Additionally, &lt;strong&gt;MDX (Markdown for JSX)&lt;/strong&gt; allows me to write blog posts in Markdown while seamlessly integrating &lt;strong&gt;React components&lt;/strong&gt;, making content more interactive and engaging.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Project Overview&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Tech Stack&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;📌 &lt;strong&gt;Framework:&lt;/strong&gt; Next.js&lt;br&gt;&lt;br&gt;
📌 &lt;strong&gt;Content Management:&lt;/strong&gt; MDX&lt;br&gt;&lt;br&gt;
📌 &lt;strong&gt;Styling:&lt;/strong&gt; Sass + PostCSS&lt;br&gt;&lt;br&gt;
📌 &lt;strong&gt;Syntax Highlighting:&lt;/strong&gt; Prism.js&lt;br&gt;&lt;br&gt;
📌 &lt;strong&gt;Deployment:&lt;/strong&gt; Vercel&lt;br&gt;&lt;br&gt;
📌 &lt;strong&gt;Email &amp;amp; Rate Limits:&lt;/strong&gt; AWS (SES, Lambda, API Gateway, DynamoDB)  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Custom Architecture on AWS&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As an &lt;strong&gt;AWS Certified Solutions Architect Associate&lt;/strong&gt;, I designed a self-sufficient architecture to handle:&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Rate limiting&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Email notifications&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Scalability needs&lt;/strong&gt;  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Features&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;✨ &lt;strong&gt;Dynamic Routing:&lt;/strong&gt; Navigate seamlessly through different sections like &lt;strong&gt;About, Academia, Blog, and Beyond Resume&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;✨ &lt;strong&gt;MDX Integration:&lt;/strong&gt; Write blog posts in Markdown while embedding &lt;strong&gt;React components&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;✨ &lt;strong&gt;Customizable Themes:&lt;/strong&gt; Built using &lt;strong&gt;Sass and PostCSS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;✨ &lt;strong&gt;High-Performance Rendering:&lt;/strong&gt; Optimized for &lt;strong&gt;speed&lt;/strong&gt; with &lt;strong&gt;Static Site Generation (SSG) and Incremental Static Regeneration (ISR)&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;✨ &lt;strong&gt;Syntax Highlighting for Code Snippets:&lt;/strong&gt; Using &lt;strong&gt;Prism.js&lt;/strong&gt;, my blog supports syntax highlighting for technical posts.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Custom Email Service using AWS&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;📩 &lt;strong&gt;Sending emails from my custom domain&lt;/strong&gt; using AWS SES.&lt;br&gt;&lt;br&gt;
📝 &lt;strong&gt;AWS Lambda (written in Golang)&lt;/strong&gt; processes the email requests.&lt;br&gt;&lt;br&gt;
🌍 &lt;strong&gt;API Gateway handles endpoints&lt;/strong&gt; with &lt;strong&gt;DynamoDB-backed rate limiting&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;This ensures a &lt;strong&gt;scalable, efficient, and cost-effective&lt;/strong&gt; email system for my portfolio.  &lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Beyond Tech: Who Am I?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;💡 &lt;strong&gt;FinTech &amp;amp; Cloud Enthusiast&lt;/strong&gt;—Passionate about &lt;strong&gt;building scalable, efficient, and customer-centric solutions&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
🏋️ &lt;strong&gt;Advanced Powerlifter &amp;amp; Fitness Enthusiast&lt;/strong&gt;—Applying &lt;strong&gt;resilience, discipline, and continuous growth&lt;/strong&gt; in all aspects of life.&lt;br&gt;&lt;br&gt;
🔄 &lt;strong&gt;Multipotentialite&lt;/strong&gt;—Constantly exploring and learning across domains.  &lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Let’s Connect!&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;💬 Drop a comment below—let’s talk &lt;strong&gt;tech, cloud, or career growth!&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
🔗 Connect with me on &lt;strong&gt;&lt;a href="https://www.linkedin.com/in/suteerth-subramaniam/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Onwards and upwards!&lt;/strong&gt;  &lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>aws</category>
      <category>career</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
