<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Smriti &amp; Sujata</title>
  <atom:link href="https://team-portfolio-acy.pages.dev//rss.xml" rel="self" type="application/rss+xml" />
  <link>https://team-portfolio-acy.pages.dev//</link>
  <description>A small software studio in Kathmandu helping organizations and individuals design, build, launch, and maintain useful websites and software.</description>
  <language>en</language>
  <lastBuildDate>Thu, 03 Sep 2026 11:06:22 +0000</lastBuildDate>
  <item>
    <title>How I built this site — design, code to production</title>
    <link>https://team-portfolio-acy.pages.dev//blog/hello-blog/</link>
    <guid isPermaLink="true">https://team-portfolio-acy.pages.dev//blog/hello-blog/</guid>
    <pubDate>Mon, 15 Dec 2025 00:00:00 +0000</pubDate>
    <description>The story behind the redesign — handing my old portfolio to Repaint for a visual overhaul, then rebuilding it from the design in Jekyll with SCSS, GSAP, and Decap CMS.</description>
    <category>Meta</category>
    <content:encoded><![CDATA[<p>I had an old portfolio that I’d outgrown — it did the job for a while, but it had stopped looking like the work I actually do today. So I shipped this redesign. Here’s how it came together.</p>

<h2 id="step-1--hand-the-redesign-to-repaint">Step 1 — Hand the redesign to Repaint</h2>

<p>I used <a href="https://repaint.com">Repaint</a> as a design reference for the visual direction. It helped establish the typography pairing (Inter / Newsreader / JetBrains Mono), a calm light/dark colour palette, a card-led project layout, and the eyebrow + numbered section pattern used throughout the site. The implementation and content remain tailored to our studio.</p>

<h2 id="step-2--implementation-jekyll-the-boring-static-site-generator">Step 2 — Implementation: Jekyll, the boring static-site generator</h2>

<p>The codebase is plain <a href="https://jekyllrb.com">Jekyll</a>. No Node build step, no React, no hydration. It compiles to static HTML and ships.</p>

<p><br />
I think jekyll is a very good alternative to js heavy sites for the simple portfolio like mine so I opted for jekyll, also I had worked with it a lot ever since I started working at <a href="https://biralo.studio">Biralo Studio</a>, so this was a good option for me to rebuild with jekyll.</p>

<h2 id="step-3--scss-for-the-design-system">Step 3 — SCSS for the design system</h2>

<p>All styles live in <code class="language-plaintext highlighter-rouge">_sass/</code> as modular SCSS partials — one per concern: <code class="language-plaintext highlighter-rouge">_card.scss</code>, <code class="language-plaintext highlighter-rouge">_button.scss</code>, <code class="language-plaintext highlighter-rouge">_typography.scss</code>, <code class="language-plaintext highlighter-rouge">_grid.scss</code>, <code class="language-plaintext highlighter-rouge">_post.scss</code>, and so on. A single <code class="language-plaintext highlighter-rouge">index.scss</code> pulls them in. Jekyll compiles it inline into <code class="language-plaintext highlighter-rouge">&lt;style&gt;</code> via the <code class="language-plaintext highlighter-rouge">scssify</code> filter.</p>

<p><br /></p>

<p>The design tokens (colours, spacing, type ramp, breakpoints) live in <code class="language-plaintext highlighter-rouge">_variables.scss</code> and <code class="language-plaintext highlighter-rouge">_breakpoints.scss</code>, so light/dark mode and responsive rules are one source of truth rather than scattered media queries.</p>

<h2 id="step-4--gsap-for-motion">Step 4 — GSAP for motion</h2>

<p>I’m not good with designs and animations so animation is minimal. The small bits of motion across the site — the subtle reveals, the things that animate as you interact — run on <a href="https://gsap.com">GSAP</a>. Loaded once from a CDN, used sparingly enough that you’d barely notice it’s there until you tried to remove it. The goal was for the site to feel alive without feeling busy.</p>

<h2 id="step-5--decap-cms-so-i-can-write-from-anywhere">Step 5 — Decap CMS so I can write from anywhere</h2>

<p>I didn’t want to be SSH-ing into a laptop every time I wanted to add a blog post or update a project description. So the site has <a href="https://decapcms.org">Decap CMS</a> (formerly Netlify CMS) wired up at <code class="language-plaintext highlighter-rouge">/admin/</code>.</p>

<p>It’s a tiny SPA that authenticates against GitHub, lets me edit the markdown files through a friendly form UI, and commits the changes straight back to the repo. The schema lives in <code class="language-plaintext highlighter-rouge">admin/config.yml</code> — collections for blog posts, projects, skills, plus file collections for every <code class="language-plaintext highlighter-rouge">_data/*.yml</code> (hero, footer, CTA, etc).</p>

<blockquote>
  <p>Net effect: I can update the site from my phone in five minutes if I want to.</p>
</blockquote>

<h2 id="a-few-extras-the-design-didnt-ask-for">A few extras the design didn’t ask for</h2>

<p>The Repaint design covered the visual side. I layered a few engineering decisions on top:</p>

<blockquote>
  <ul>
    <li><strong>Two engineers, one repo.</strong> The site keeps the content model simple so a small team can maintain the design, projects, and writing together.</li>
    <li><strong>Minimal SEO.</strong> Pure-Liquid <code class="language-plaintext highlighter-rouge">sitemap.xml</code>, <code class="language-plaintext highlighter-rouge">robots.txt</code>, RSS feed (no plugins, no Gemfile), <code class="language-plaintext highlighter-rouge">og:</code> and <code class="language-plaintext highlighter-rouge">twitter:</code> cards on every page, JSON-LD structured data (<code class="language-plaintext highlighter-rouge">WebSite</code> + <code class="language-plaintext highlighter-rouge">Person</code> on the home, <code class="language-plaintext highlighter-rouge">CreativeWork</code> on each project), and per-page <code class="language-plaintext highlighter-rouge">meta_title</code> / <code class="language-plaintext highlighter-rouge">meta_description</code> overrides.</li>
    <li><strong>Cloudflare hosting + ccTLD.</strong> <code class="language-plaintext highlighter-rouge">sujatachaudhary.com.np</code> runs behind Cloudflare’s global CDN. Total monthly cost: $0.</li>
    <li><strong>Auto-TLS on the apex domain</strong> via Cloudflare. No certbot rotation, no nginx config to babysit.</li>
  </ul>
</blockquote>

<h2 id="whats-next">What’s next</h2>

<p>Now that the site exists in a shape I’m happy with, the writing can start. The next few posts will be the engineering side — backend systems, agentic AI infrastructure at <a href="https://biralo.studio">Biralo Studio</a>, and the things that surprised me along the way.</p>

<p>If you want to work with us, the <a href="/about/">about page</a> has more about the team and how we work.</p>
]]></content:encoded>
  </item>
  <item>
    <title>Microservices, quietly: what a small team actually needs</title>
    <link>https://team-portfolio-acy.pages.dev//blog/microservices-quietly/</link>
    <guid isPermaLink="true">https://team-portfolio-acy.pages.dev//blog/microservices-quietly/</guid>
    <pubDate>Sat, 01 Nov 2025 00:00:00 +0000</pubDate>
    <description>Microservices get a bad rap, mostly because people copy the FAANG version. Here is the much smaller, much saner version we run.</description>
    <category>Architecture</category>
    <content:encoded><![CDATA[<p>Microservices got a bad rap, mostly because people copy the FAANG version. Here is the much smaller, much saner version we run — and the parts that actually matter when your team fits in one room.</p>

<p>Every microservices article on the internet is written by someone who either runs Netflix or really wants you to think they do. The version most of us actually need is much smaller, much saner, and almost embarrassing to admit out loud.</p>

<blockquote>
  <p>Most teams do not need microservices. Some teams do. And almost no team needs the version they read about on Hacker News.</p>
</blockquote>

<h2 id="the-version-we-actually-run">The version we actually run</h2>

<p>In one of our software systems, we run a small microservices setup for an agentic content platform. Here is the practical version of it.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gateway        — public HTTP, auth, routing
agents-api     — orchestrates the agent runs
agents-runner  — does the heavy LLM stuff
writer-svc     — drafts and rewrites
review-svc     — critiques and edits
storage-svc    — Postgres + S3 wrapper
queue          — RabbitMQ
infra          — Docker + Coolify on a couple of VPSes
</code></pre></div></div>

<p>That is the whole map. No service mesh. No Kubernetes. No 100-page README. The team is small, the services are small, and the boundaries are picked to match how the work actually flows — not how a textbook says they should.</p>

<h2 id="what-earned-its-keep">What earned its keep</h2>

<h3 id="1-queues-not-chains">1. Queues, not chains</h3>

<p>Every long-running step goes through RabbitMQ. The agents-api does not call the writer-svc directly; it drops a job on a queue, the writer-svc picks it up. If the writer crashes mid-job, the message comes back. If we need to scale writing, we add another writer. The rest of the system does not need to know.</p>

<h3 id="2-grpc-for-the-boring-stuff">2. gRPC for the boring stuff</h3>

<p>Inside the cluster, services talk over gRPC. Strict contracts mean breaking changes scream at us at build time, not at 3am. Outside, the gateway still speaks REST, because nobody wants to debug Protobuf in a browser.</p>

<h3 id="3-coolify-as-the-platform-team">3. Coolify as the platform team</h3>

<p>We deploy with Git pushes. SSL, env vars, restarts, logs — Coolify handles the boring parts so I can spend my brain on the system, not on YAML.</p>

<h2 id="what-we-skipped-on-purpose">What we skipped, on purpose</h2>

<p>No Kubernetes. No service mesh. No event store. No CQRS. No saga framework. No bespoke message envelope schema. Every one of these is a fine tool — but every one of them is also a tax, and we cannot afford the tax yet.</p>

<h2 id="the-actual-rule">The actual rule</h2>

<blockquote>
  <p>Split a service when keeping it together hurts more than splitting it will. Not before.</p>
</blockquote>

<p>That is most of it. The rest is just paying attention to the seams. Real posts go up here as I find time, but if the agents AI platform is the thing you want to read about, that one is coming next.</p>
]]></content:encoded>
  </item>
  <item>
    <title>When gRPC finally clicked (for me) and when I still pick REST</title>
    <link>https://team-portfolio-acy.pages.dev//blog/grpc-vs-rest/</link>
    <guid isPermaLink="true">https://team-portfolio-acy.pages.dev//blog/grpc-vs-rest/</guid>
    <pubDate>Fri, 10 Oct 2025 00:00:00 +0000</pubDate>
    <description>A short, opinionated guide to when gRPC pays for itself and when REST is still the right answer.</description>
    <category>Decisions</category>
    <content:encoded><![CDATA[<p>A short, opinionated guide to when gRPC pays for itself and when REST is still the right answer. With examples from our agentic AI platform — including the parts I got wrong first.</p>

<h2 id="the-moment-it-clicked">The moment it clicked</h2>

<p>I had spent two days chasing a payload-shape bug between two of our services. JSON, no schema, “we agreed on it in Slack.” A colleague rewrote both ends in gRPC over an afternoon. The bug class disappeared. The conversation moved from <em>what shape is this?</em> to <em>what should this do?</em></p>

<h2 id="when-i-reach-for-grpc">When I reach for gRPC</h2>

<ul>
  <li>Service-to-service calls inside the cluster.</li>
  <li>Anywhere streaming or backpressure actually matters.</li>
  <li>Cross-language calls where the type system is the contract.</li>
</ul>

<h2 id="when-i-still-pick-rest">When I still pick REST</h2>

<ul>
  <li>Anything a browser will touch.</li>
  <li>Webhooks and public APIs.</li>
  <li>One-off scripts and admin tools where curl matters.</li>
</ul>

<p>The rule that finally settled it for me: <strong>use gRPC where the consumer is a program you also own; use REST where the consumer is the rest of the internet.</strong></p>
]]></content:encoded>
  </item>
</channel>
</rss>
