> ## Documentation Index
> Fetch the complete documentation index at: https://developer.upsun.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Guillaume Moigneu

> Articles written by Guillaume Moigneu.

export const ShowMore = ({children, className = '', id = 'posts', btnClassName = ''}) => {
  const hash = 'show-all-' + id;
  const [expanded, setExpanded] = useState(false);
  useEffect(() => {
    const check = () => {
      if (window.location.hash === '#' + hash) {
        setExpanded(true);
      }
    };
    check();
    window.addEventListener('hashchange', check);
    return () => window.removeEventListener('hashchange', check);
  }, [hash]);
  const wrapClass = expanded ? className : className + ' blog-paginated';
  return <div>
      <div className={wrapClass}>
        {children}
      </div>
      {!expanded && <div className={btnClassName} style={{
    marginTop: '2rem',
    textAlign: 'center'
  }}>
          <a href={'#' + hash} style={{
    display: 'inline-flex',
    alignItems: 'center',
    gap: '0.5rem',
    padding: '0.75rem 1.5rem',
    borderRadius: '9999px',
    border: '1px solid #e5e7eb',
    fontSize: '0.875rem',
    fontWeight: 500,
    color: '#374151',
    textDecoration: 'none'
  }}>
            Show all posts ▾
          </a>
        </div>}
    </div>;
};

<div className="flex items-center gap-4 mb-8 not-prose">
  <img src="https://github.com/gmoigneu.png?size=128" alt="Guillaume Moigneu" className="w-16 h-16 rounded-full" />

  <div className="flex flex-wrap gap-3">
    <a href="https://github.com/gmoigneu" target="_blank" rel="noopener noreferrer" className="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full border border-gray-200 dark:border-white/10 text-sm text-gray-700 dark:text-gray-300 hover:border-primary dark:hover:border-primary-light transition-colors">GitHub</a>
    <a href="https://www.linkedin.com/in/guillaumemoigneu/" target="_blank" rel="noopener noreferrer" className="inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full border border-gray-200 dark:border-white/10 text-sm text-gray-700 dark:text-gray-300 hover:border-primary dark:hover:border-primary-light transition-colors">LinkedIn</a>
  </div>
</div>

<ShowMore id="author-gmoigneu-articles" className="blog-card-grid">
  <a href="/posts/ai/aiweekly-2026-04-27" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/aiweekly-2026-04-27/aiweekly.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/aiweekly-2026-04-27/aiweekly.webp" alt="AI Weekly Review - Apr. 27th 2026" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, April 27th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">AI Weekly Review - Apr. 27th 2026</h3>
      <p className="blog-card-desc">A press, Youtube and Github review of everything AI</p>
    </div>
  </a>

  <a href="/posts/ai/aiweekly-2026-04-13" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/aiweekly-2026-04-13/aiweekly.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/aiweekly-2026-04-13/aiweekly.webp" alt="AI Weekly Review - Apr. 13th 2026" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, April 13th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">AI Weekly Review - Apr. 13th 2026</h3>
      <p className="blog-card-desc">A press, Youtube and Github review of everything AI</p>
    </div>
  </a>

  <a href="/posts/ai/aiweekly-2026-04-07" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/aiweekly-2026-04-07/aiweekly.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/aiweekly-2026-04-07/aiweekly.webp" alt="AI Weekly Review - Apr. 7th 2026" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Tuesday, April 7th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">AI Weekly Review - Apr. 7th 2026</h3>
      <p className="blog-card-desc">A press, Youtube and Github review of everything AI</p>
    </div>
  </a>

  <a href="/posts/ai/aiweekly-2026-03-30" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/aiweekly-2026-03-30/aiweekly.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/aiweekly-2026-03-30/aiweekly.webp" alt="AI Weekly Review - Mar. 30th 2026" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, March 30th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">AI Weekly Review - Mar. 30th 2026</h3>
      <p className="blog-card-desc">A press, Youtube and Github review of everything AI</p>
    </div>
  </a>

  <a href="/posts/ai/stuck-on-localhost" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/stuck-on-localhost/stuck-on-localhost.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/stuck-on-localhost/stuck-on-localhost.webp" alt="Your agents are stuck on localhost. Upsun isn't." className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Thursday, March 26th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Your agents are stuck on localhost. Upsun isn't.</h3>
      <p className="blog-card-desc">Coding agents made engineers faster, but cycle time hasn't budged. Background agents running on GitHub, GitLab, and Claude Code can break the bottleneck by producing PRs that Upsun deploys and validates automatically. A practical guide to setting it up with real YAML configs, infrastructure-as-code workflows, and preview environments.</p>
    </div>
  </a>

  <a href="/posts/ai/aiweekly-2026-03-23" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/aiweekly-2026-03-23/aiweekly.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/aiweekly-2026-03-23/aiweekly.webp" alt="AI Weekly Review - Mar. 23rd 2026" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, March 23rd 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">AI Weekly Review - Mar. 23rd 2026</h3>
      <p className="blog-card-desc">A press, Youtube and Github review of everything AI</p>
    </div>
  </a>

  <a href="/posts/ai/aiweekly-2026-03-16" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/aiweekly-2026-03-16/aiweekly.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/aiweekly-2026-03-16/aiweekly.webp" alt="AI Weekly Review - Mar. 16th 2026" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, March 16th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">AI Weekly Review - Mar. 16th 2026</h3>
      <p className="blog-card-desc">A press, Youtube and Github review of everything AI</p>
    </div>
  </a>

  <a href="/posts/ai/aiweekly-2026-03-09" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/aiweekly-2026-03-09/aiweekly.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/aiweekly-2026-03-09/aiweekly.webp" alt="AI Weekly Review - Mar. 9th 2026" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, March 9th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">AI Weekly Review - Mar. 9th 2026</h3>
      <p className="blog-card-desc">A press, Youtube and Github review of everything AI</p>
    </div>
  </a>

  <a href="/posts/ai/aiweekly-2026-03-02" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/aiweekly-2026-03-02/aiweekly.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/aiweekly-2026-03-02/aiweekly.webp" alt="AI Weekly Review - Mar. 2nd 2026" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, March 2nd 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">AI Weekly Review - Mar. 2nd 2026</h3>
      <p className="blog-card-desc">A press, Youtube and Github review of everything AI</p>
    </div>
  </a>

  <a href="/posts/ai/aiweekly-2026-02-23" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/aiweekly-2026-02-23/aiweekly.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/aiweekly-2026-02-23/aiweekly.webp" alt="AI Weekly Review - Feb. 23th 2026" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, February 23rd 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">AI Weekly Review - Feb. 23th 2026</h3>
      <p className="blog-card-desc">A press, Youtube and Github review of everything AI</p>
    </div>
  </a>

  <a href="/posts/ai/agents-md-less-is-more" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/agents-md-less-is-more/agents-md-less-is-more.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/agents-md-less-is-more/agents-md-less-is-more.webp" alt="The research is in: your AGENTS.md is probably too long" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, February 23rd 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">The research is in: your AGENTS.md is probably too long</h3>
      <p className="blog-card-desc">Research shows comprehensive AGENTS.md files actually hurt coding agent performance. Learn why less is more and how to build context files that work.</p>
    </div>
  </a>

  <a href="/posts/ai/aiweekly-2026-02-17" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/aiweekly-2026-02-17/aiweekly.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/aiweekly-2026-02-17/aiweekly.webp" alt="AI Weekly Review - Feb. 17th 2026" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Tuesday, February 17th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">AI Weekly Review - Feb. 17th 2026</h3>
      <p className="blog-card-desc">A press, Youtube and Github review of everything AI</p>
    </div>
  </a>

  <a href="/posts/ai/making-coding-agents-reliable" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/making-coding-agents-reliable/making-coding-agents-reliable.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/making-coding-agents-reliable/making-coding-agents-reliable.webp" alt="Making coding agents (Claude Code, Codex, etc.) reliable" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Tuesday, February 17th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Making coding agents (Claude Code, Codex, etc.) reliable</h3>
      <p className="blog-card-desc">The bottleneck for AI coding agents isn't model capability. It's your verification infrastructure. Here's how to fix that.</p>
    </div>
  </a>

  <a href="/posts/ai/git-worktrees-for-parallel-ai-coding-agents" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/git-worktrees-for-parallel-ai-coding-agents/git-worktrees-for-parallel-ai-coding-agents.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/git-worktrees-for-parallel-ai-coding-agents/git-worktrees-for-parallel-ai-coding-agents.webp" alt="Git worktrees for parallel AI coding agents" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Wednesday, February 11th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Git worktrees for parallel AI coding agents</h3>
      <p className="blog-card-desc">Learn how git worktrees enable parallel AI agent workflows, their limitations, and what an ideal orchestration tool needs.</p>
    </div>
  </a>

  <a href="/posts/ai/will-ai-make-software-companies-worthless" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/will-ai-make-software-companies-worthless/thumbnail.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/will-ai-make-software-companies-worthless/thumbnail.webp" alt="Will AI make software companies worthless?" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`ai` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        ai
                      </span>
                    )}

        <span className="text-xs text-subtle">Friday, January 30th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Will AI make software companies worthless?</h3>
      <p className="blog-card-desc">If anyone can build software with AI, do software companies still matter? The answer is more nuanced than you might think.</p>
    </div>
  </a>

  <a href="/posts/hands-on/how-to-use-harlequin-sql-ide-with-upsun" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/hands-on/how-to-use-harlequin-sql-ide-with-upsun/harlequin-interface.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/how-to-use-harlequin-sql-ide-with-upsun/harlequin-interface.webp" alt="How to Use Harlequin SQL IDE with Upsun" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`hands-on` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        hands-on
                      </span>
                    )}

        <span className="text-xs text-subtle">Wednesday, January 14th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">How to Use Harlequin SQL IDE with Upsun</h3>
      <p className="blog-card-desc">Learn two ways to connect Harlequin SQL IDE to your Upsun PostgreSQL database: using local SSH tunnels or deploying Harlequin directly on the platform.</p>
    </div>
  </a>

  <a href="/posts/discussions/the-universal-commerce-protocol-and-the-inevitable-rise-of-agentic-commerce" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/discussions/the-universal-commerce-protocol-and-the-inevitable-rise-of-agentic-commerce/ucp.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/discussions/the-universal-commerce-protocol-and-the-inevitable-rise-of-agentic-commerce/ucp.webp" alt="The universal commerce protocol and the inevitable rise of agentic commerce" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`discussions` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        discussions
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, January 12th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">The universal commerce protocol and the inevitable rise of agentic commerce</h3>
      <p className="blog-card-desc">Fifteen years ago, I believed the trajectory of digital commerce was destined for a singular, consolidated fate. To me, the technological landscape was fracturing rapidly; the desktop monopoly had shattered, giving way to the mobile web, native applications, and the nascent experiments of Google Glass and early IoT devices. In my view, for independent brands and retailers, this multiplication of channels represented a terrifying escalation in technical complexity. To sell effectively, I thought a merchant needed not just a website, but a mobile-responsive design, an iOS app, an Android app, and integrations with a growing roster of marketplaces.</p>
    </div>
  </a>

  <a href="/posts/discussions/nextjs-cve-2025-66478" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/discussions/nextjs-cve-2025-66478/nextjs-cve-2025-29927.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/discussions/nextjs-cve-2025-66478/nextjs-cve-2025-29927.webp" alt="Critical Next.js Security Update: CVE-2025-66478 Affects RSC" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`discussions` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        discussions
                      </span>
                    )}

        <span className="text-xs text-subtle">Thursday, December 4th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Critical Next.js Security Update: CVE-2025-66478 Affects RSC</h3>
      <p className="blog-card-desc">Remote code execution vulnerability in Next.js 15.x and 16.x App Router requires immediate patching. Learn how to secure your applications.</p>
    </div>
  </a>

  <a href="/posts/hands-on/ai-use-case-generate-load-test-scenarios" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/hands-on/ai-use-case-generate-load-test-scenarios/ai-use-case-generate-load-test-scenarios.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/ai-use-case-generate-load-test-scenarios/ai-use-case-generate-load-test-scenarios.webp" alt="AI use-case: Generate load test scenarios with MCPs" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`hands-on` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        hands-on
                      </span>
                    )}

        <span className="text-xs text-subtle">Thursday, November 27th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">AI use-case: Generate load test scenarios with MCPs</h3>
      <p className="blog-card-desc">Automate Locust load testing by combining Chrome MCP and Context7 to generate realistic user behavior patterns with Claude Code.</p>
    </div>
  </a>

  <a href="/posts/insights/my-terminal-setup-mac-linux" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/insights/my-terminal-setup-mac-linux/thumbnail.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/insights/my-terminal-setup-mac-linux/thumbnail.webp" alt="My terminal setup (Mac & Linux)" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`insights` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        insights
                      </span>
                    )}

        <span className="text-xs text-subtle">Wednesday, November 26th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">My terminal setup (Mac & Linux)</h3>
      <p className="blog-card-desc">A no-nonsense guide to transforming your terminal from painful to powerful with GhostTTY, NeoVim, and Claude Code</p>
    </div>
  </a>

  <a href="/posts/how-it-works/event-loop-monitoring-in-nextjs-performance-guide" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/how-it-works/event-loop-monitoring-in-nextjs-performance-guide/event-loop-monitoring-in-nextjs-performance-guide.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/how-it-works/event-loop-monitoring-in-nextjs-performance-guide/event-loop-monitoring-in-nextjs-performance-guide.webp" alt="Event Loop Monitoring in Next.js: Performance Guide" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`how-it-works` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        how-it-works
                      </span>
                    )}

        <span className="text-xs text-subtle">Friday, October 24th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Event Loop Monitoring in Next.js: Performance Guide</h3>
      <p className="blog-card-desc">Learn to implement event loop monitoring in Next.js applications to identify blocking operations, optimize performance, and scale confidently with production-ready code.</p>
    </div>
  </a>

  <a href="/posts/how-it-works/autoscaling-deep-dive" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/how-it-works/autoscaling-deep-dive/autoscaling-deep-dive.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/how-it-works/autoscaling-deep-dive/autoscaling-deep-dive.webp" alt="Auto-scaling on Upsun Flex. A deep dive." className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`how-it-works` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        how-it-works
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, October 20th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Auto-scaling on Upsun Flex. A deep dive.</h3>
      <p className="blog-card-desc">Learn how Upsun's autoscaling dynamically adjusts application instances based on CPU usage, ensuring performance during traffic spikes while optimizing costs.</p>
    </div>
  </a>

  <a href="/posts/tutorials/deploying-open-source-on-upsun" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/tutorials/deploying-open-source-on-upsun/deploying-open-source-on-upsun.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/tutorials/deploying-open-source-on-upsun/deploying-open-source-on-upsun.webp" alt="Deploying open-source projects on Upsun: Snipe-IT as an example" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`tutorials` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        tutorials
                      </span>
                    )}

        <span className="text-xs text-subtle">Tuesday, October 7th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Deploying open-source projects on Upsun: Snipe-IT as an example</h3>
      <p className="blog-card-desc">Learn how to deploy any GitHub-hosted open-source project on Upsun by forking repositories, configuring for deployment, and keeping your fork synchronized with upstream updates.</p>
    </div>
  </a>

  <a href="/posts/how-it-works/explore-plan-execute-methodology" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/how-it-works/explore-plan-execute-methodology/explore-plan-execute-methodology.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/how-it-works/explore-plan-execute-methodology/explore-plan-execute-methodology.webp" alt="Mastering the Explore, Plan, Execute methodology for AI-assisted development" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`how-it-works` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        how-it-works
                      </span>
                    )}

        <span className="text-xs text-subtle">Friday, October 3rd 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Mastering the Explore, Plan, Execute methodology for AI-assisted development</h3>
      <p className="blog-card-desc">Learn how to transform AI coding assistants from eager juniors into rockstar developers using proven context strategies, quality assurance, and the three-phase workflow</p>
    </div>
  </a>

  <a href="/posts/tutorials/building-async-processing-pipelines-with-fastapi-and-celery-on-upsun" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/tutorials/building-async-processing-pipelines-with-fastapi-and-celery-on-upsun/building-async-processing-pipelines-with-fastapi-and-celery-on-upsun.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/tutorials/building-async-processing-pipelines-with-fastapi-and-celery-on-upsun/building-async-processing-pipelines-with-fastapi-and-celery-on-upsun.webp" alt="Building async processing pipelines with FastAPI and Celery on Upsun" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`tutorials` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        tutorials
                      </span>
                    )}

        <span className="text-xs text-subtle">Friday, October 3rd 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Building async processing pipelines with FastAPI and Celery on Upsun</h3>
      <p className="blog-card-desc">Learn how to build production-ready async processing pipelines using FastAPI and Celery on Upsun. From architecture design to deployment, discover how to handle long-running tasks without blocking your API responses.</p>
    </div>
  </a>

  <a href="/posts/hands-on/building-internal-ai-agents-for-our-teams-on-upsun" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/hands-on/building-internal-ai-agents-for-our-teams-on-upsun/building-internal-ai-agents-for-our-teams-on-upsun.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/building-internal-ai-agents-for-our-teams-on-upsun/building-internal-ai-agents-for-our-teams-on-upsun.webp" alt="Building internal AI agents for our teams on Upsun" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`hands-on` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        hands-on
                      </span>
                    )}

        <span className="text-xs text-subtle">Tuesday, September 30th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Building internal AI agents for our teams on Upsun</h3>
      <p className="blog-card-desc">Learn how to build and deploy production-ready AI agents on Upsun using Google's ADK, ChromaDB vector database, and Retrieval-Augmented Generation (RAG) to create context-aware, domain-specific agents for your team.</p>
    </div>
  </a>

  <a href="/posts/ai/upsun-mcp-announcement" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/ai/upsun-mcp-announcement/upsun-mcp-announcement.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/upsun-mcp-announcement/upsun-mcp-announcement.webp" alt="Introducing the Upsun MCP server: bring Upsun into your LLMs" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`featured` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        featured
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, September 22nd 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Introducing the Upsun MCP server: bring Upsun into your LLMs</h3>
      <p className="blog-card-desc">Manage your Upsun infrastructure directly through AI assistants with our new Model Context Protocol server - now in beta at mcp.upsun.com</p>
    </div>
  </a>

  <a href="/posts/hands-on/store-embeddings-in-chroma-with-persistent-storage-nodejs-and-python-examples" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/hands-on/store-embeddings-in-chroma-with-persistent-storage-nodejs-and-python-examples/thumbnail.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/store-embeddings-in-chroma-with-persistent-storage-nodejs-and-python-examples/thumbnail.webp" alt="Store embeddings in chroma with persistent storage (nodejs and python examples)" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`hands-on` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        hands-on
                      </span>
                    )}

        <span className="text-xs text-subtle">Wednesday, September 3rd 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Store embeddings in chroma with persistent storage (nodejs and python examples)</h3>
      <p className="blog-card-desc">Learn how to implement Chroma with persistent storage on Upsun using both Node.js and Python, including document ingestion and embedding storage.</p>
    </div>
  </a>

  <a href="/posts/hands-on/connect-multiple-projects-applications-or-services-together" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/hands-on/connect-multiple-projects-applications-or-services-together/connect-multiple-projects-applications-or-services-together.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/connect-multiple-projects-applications-or-services-together/connect-multiple-projects-applications-or-services-together.webp" alt="Connect multiple projects applications or services together" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`hands-on` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        hands-on
                      </span>
                    )}

        <span className="text-xs text-subtle">Friday, August 15th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Connect multiple projects applications or services together</h3>
      <p className="blog-card-desc">Learn how to use Chisel to securely connect applications and services across different Upsun projects, with a practical MariaDB replication example.</p>
    </div>
  </a>

  <a href="/posts/insights/why-your-readme-matters-more-than-ai-configuration-files" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/insights/why-your-readme-matters-more-than-ai-configuration-files/why-your-readme-matters-more-than-ai-configuration-files.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/insights/why-your-readme-matters-more-than-ai-configuration-files/why-your-readme-matters-more-than-ai-configuration-files.webp" alt="AGENTS.md: Why your README matters more than AI configuration files" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`insights` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        insights
                      </span>
                    )}

        <span className="text-xs text-subtle">Tuesday, August 12th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">AGENTS.md: Why your README matters more than AI configuration files</h3>
      <p className="blog-card-desc">AGENTS.md promises to standardize AI coding assistant configuration, but the real solution is writing better READMEs that serve both humans and AI agents</p>
    </div>
  </a>

  <a href="/posts/insights/why-python-developers-should-switch-to-uv" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/insights/why-python-developers-should-switch-to-uv/why-python-developers-should-switch-to-uv.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/insights/why-python-developers-should-switch-to-uv/why-python-developers-should-switch-to-uv.webp" alt="Why Python developers should switch to uv" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`insights` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        insights
                      </span>
                    )}

        <span className="text-xs text-subtle">Thursday, August 7th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Why Python developers should switch to uv</h3>
      <p className="blog-card-desc">Learn how uv, the revolutionary Python package manager, delivers 100x faster installations and streamlines project management with automatic virtual environments and dependency tracking.</p>
    </div>
  </a>

  <a href="/posts/hands-on/gitlab-push-solution" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/hands-on/gitlab-push-solution/manualjob.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/gitlab-push-solution/manualjob.webp" alt="Synchronize your air-gapped GitLab with Upsun" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`hands-on` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        hands-on
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, July 21st 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Synchronize your air-gapped GitLab with Upsun</h3>
      <p className="blog-card-desc">Configure GitLab CI/CD to deploy to Upsun from private air-gapped GitLab instances using push-based workflows and API automation</p>
    </div>
  </a>

  <a href="/posts/insights/why-configuration-as-code-beats-click-and-deploy" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/insights/why-configuration-as-code-beats-click-and-deploy/configuration-as-code.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/insights/why-configuration-as-code-beats-click-and-deploy/configuration-as-code.webp" alt="Git-Driven Infrastructure: Why Configuration as Code Beats Click-and-Deploy" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`insights` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        insights
                      </span>
                    )}

        <span className="text-xs text-subtle">Thursday, June 12th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Git-Driven Infrastructure: Why Configuration as Code Beats Click-and-Deploy</h3>
      <p className="blog-card-desc">Discover why YAML-driven infrastructure outperforms point-and-click deployment for scalable, maintainable applications. Learn best practices for configuration as code.</p>
    </div>
  </a>

  <a href="/posts/how-it-works/mcp-interaction-types-article" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/how-it-works/mcp-interaction-types-article/mcp-interaction-types-article.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/how-it-works/mcp-interaction-types-article/mcp-interaction-types-article.webp" alt="Beyond Tool Calling: Understanding MCP's Three Core Interaction Types" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`how-it-works` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        how-it-works
                      </span>
                    )}

        <span className="text-xs text-subtle">Saturday, June 7th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Beyond Tool Calling: Understanding MCP's Three Core Interaction Types</h3>
      <p className="blog-card-desc">Discover how prompts, resources, and tools work together in the Model Context Protocol to create richer AI application experiences beyond simple tool calling.</p>
    </div>
  </a>

  <a href="/posts/hands-on/deploy-mcp-servers-on-upsun" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/hands-on/deploy-mcp-servers-on-upsun/deploy-mcp-servers-on-upsun.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/deploy-mcp-servers-on-upsun/deploy-mcp-servers-on-upsun.webp" alt="Build and deploy AI-Native Applications with MCP Servers on Upsun" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`hands-on` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        hands-on
                      </span>
                    )}

        <span className="text-xs text-subtle">Thursday, June 5th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Build and deploy AI-Native Applications with MCP Servers on Upsun</h3>
      <p className="blog-card-desc">Learn how Model Context Protocol servers work with different transports and deploy them to Upsun for scalable AI-powered applications</p>
    </div>
  </a>

  <a href="/posts/insights/advanced-prompting-techniques-for-coding" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/insights/advanced-prompting-techniques-for-coding/advanced-prompting-techniques-for-coding.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/insights/advanced-prompting-techniques-for-coding/advanced-prompting-techniques-for-coding.webp" alt="Advanced prompting techniques for complex coding tasks" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`insights` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        insights
                      </span>
                    )}

        <span className="text-xs text-subtle">Thursday, May 8th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Advanced prompting techniques for complex coding tasks</h3>
      <p className="blog-card-desc">This articles will give you an overview of prompting strategies that help coding assistants reason through difficult problems and produce higher-quality solutions.</p>
    </div>
  </a>

  <a href="/posts/hands-on/pytorch-running-on-upsun" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/hands-on/pytorch-running-on-upsun/pytorch.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/pytorch-running-on-upsun/pytorch.webp" alt="How to run PyTorch in an Upsun application?" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`hands-on` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        hands-on
                      </span>
                    )}

        <span className="text-xs text-subtle">Thursday, May 1st 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">How to run PyTorch in an Upsun application?</h3>
      <p className="blog-card-desc">Learn how to deploy a sentiment analysis application powered by PyTorch and FastAPI on the Upsun cloud platform</p>
    </div>
  </a>

  <a href="/posts/how-tos/context7-mcp" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/how-tos/context7-mcp/context7-mcp.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/how-tos/context7-mcp/context7-mcp.webp" alt="Upsun documentation is now available via the Context7 MCP" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`how-tos` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        how-tos
                      </span>
                    )}

        <span className="text-xs text-subtle">Thursday, May 1st 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Upsun documentation is now available via the Context7 MCP</h3>
      <p className="blog-card-desc">Access Upsun documentation directly from your AI workflows using Context7's Model Context Protocol integration</p>
    </div>
  </a>

  <a href="/posts/hands-on/postgres-mcp-on-upsun" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/hands-on/postgres-mcp-on-upsun/postgres-mcp-on-upsun.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/postgres-mcp-on-upsun/postgres-mcp-on-upsun.webp" alt="Using PostgreSQL MCP with Upsun Remote Database" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`hands-on` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        hands-on
                      </span>
                    )}

        <span className="text-xs text-subtle">Wednesday, April 30th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Using PostgreSQL MCP with Upsun Remote Database</h3>
      <p className="blog-card-desc">Learn how to set up an MCP server to connect your Upsun PostgreSQL database to language models like Claude or IDE like VSCode GitHub Copilot and Cursor, enabling natural language data queries without writing SQL.</p>
    </div>
  </a>

  <a href="/posts/hands-on/route-ids-env" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/hands-on/route-ids-env/route-ids-env.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/route-ids-env/route-ids-env.webp" alt="How to automatically inject multi-app endpoints as environment variables" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`hands-on` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        hands-on
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, April 28th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">How to automatically inject multi-app endpoints as environment variables</h3>
      <p className="blog-card-desc">Learn how to use Upsun route identifiers and the PLATFORM\_ROUTES variable to easily get and use the hostnames of dynamically deployed applications in your project.</p>
    </div>
  </a>

  <a href="/posts/tutorials/oauth-nextjs-laravel" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/tutorials/oauth-nextjs-laravel/oauth-nextjs-laravel.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/tutorials/oauth-nextjs-laravel/oauth-nextjs-laravel.webp" alt="OAuth authentication between Next.js and Laravel Passport" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`tutorials` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        tutorials
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, April 28th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">OAuth authentication between Next.js and Laravel Passport</h3>
      <p className="blog-card-desc">Learn how to implement secure OAuth authentication between a Next.js frontend and Laravel backend using Passport with the Authorization Code Flow and PKCE.</p>
    </div>
  </a>

  <a href="/posts/unknown/nextjs-cve-2025-2997" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/unknown/nextjs-cve-2025-2997/nextjs-cve-2025-29927.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/unknown/nextjs-cve-2025-2997/nextjs-cve-2025-29927.webp" alt="Next.js Security Vulnerability (CVE-2025-29927): What Upsun Users Need to Know" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`featured` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        featured
                      </span>
                    )}

        <span className="text-xs text-subtle">Tuesday, March 25th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Next.js Security Vulnerability (CVE-2025-29927): What Upsun Users Need to Know</h3>
      <p className="blog-card-desc">A comprehensive guide to understanding and addressing the recent Next.js security vulnerability CVE-2025-29927 for applications deployed on Upsun.</p>
    </div>
  </a>

  <a href="/posts/releases/elixir-118-release-available" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/releases/elixir-118-release-available/elixir-118-release-available-thumbnail.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/releases/elixir-118-release-available/elixir-118-release-available-thumbnail.webp" alt="Apologies to the Elixir community: 1.18 release now available" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`releases` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        releases
                      </span>
                    )}

        <span className="text-xs text-subtle">Wednesday, February 26th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Apologies to the Elixir community: 1.18 release now available</h3>
      <p className="blog-card-desc">Elixir 1.18 is now available on Upsun and Platform.sh with type checking, LSP improvements, and built-in JSON support.</p>
    </div>
  </a>

  <a href="/posts/hands-on/deploying-chainlit-with-rag" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/hands-on/deploying-chainlit-with-rag/chainlit-thumbnail.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/deploying-chainlit-with-rag/chainlit-thumbnail.webp" alt="Experiment with Chainlit AI interface with RAG on Upsun" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`hands-on` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        hands-on
                      </span>
                    )}

        <span className="text-xs text-subtle">Tuesday, January 14th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Experiment with Chainlit AI interface with RAG on Upsun</h3>
      <p className="blog-card-desc">Learn to deploy production-ready RAG applications with Chainlit and Python on Upsun. Tutorial covers OpenAI Assistants integration, llama\_index implementation, and secure authentication.</p>
    </div>
  </a>

  <a href="/posts/tutorials/laravel-rest-api-on-upsun" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/tutorials/laravel-rest-api-on-upsun/laravel-rest-api.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/tutorials/laravel-rest-api-on-upsun/laravel-rest-api.webp" alt="Creating and deploying a Laravel REST API on Upsun in 10 minutes" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`tutorials` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        tutorials
                      </span>
                    )}

        <span className="text-xs text-subtle">Friday, November 15th 2024</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Creating and deploying a Laravel REST API on Upsun in 10 minutes</h3>
      <p className="blog-card-desc">Follow this comprehensive guide to build and deploy a modern Laravel REST API on Upsun's cloud platform. We'll walk through setting up your local development environment, creating API endpoints, and deploying to production with a custom domain. This tutorial is perfect for developers looking to quickly ship production-ready Laravel applications without dealing with complex infrastructure management.</p>
    </div>
  </a>

  <a href="/posts/tutorials/rails8-upsun-tutorial" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/tutorials/rails8-upsun-tutorial/rails8-thumbnail.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/tutorials/rails8-upsun-tutorial/rails8-thumbnail.webp" alt="Deploy your first Rails 8 application on Upsun" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`tutorials` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        tutorials
                      </span>
                    )}

        <span className="text-xs text-subtle">Wednesday, October 23rd 2024</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Deploy your first Rails 8 application on Upsun</h3>
      <p className="blog-card-desc">Learn how to build and deploy a modern Rails 8 blog application on Upsun's cloud platform. This hands-on tutorial walks you through local development setup, creating a feature-rich blog application, and deploying it to production with proper monitoring and scaling. Discover why Platform-as-a-Service remains relevant even with Rails 8's new deployment features, and learn best practices for cloud deployment. Perfect for developers wanting to quickly ship production-ready Rails applications without managing complex infrastructure.</p>
    </div>
  </a>

  <a href="/posts/discussions/understanding-cors" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/discussions/understanding-cors/CORS.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/discussions/understanding-cors/CORS.webp" alt="Understanding Cross-Origin Resource Sharing (CORS)" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`discussions` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        discussions
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, September 30th 2024</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Understanding Cross-Origin Resource Sharing (CORS)</h3>
      <p className="blog-card-desc">Learn about Cross-Origin Resource Sharing (CORS), a crucial web security mechanism. Understand its importance, key concepts, and implementation in Symfony, Next.js, and Laravel. Includes practical examples and tips for testing with curl and Postman, plus Platform.sh configuration guidance.</p>
    </div>
  </a>

  <a href="/posts/discussions/preview-environments-a-developers-secret-weapon" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/discussions/preview-environments-a-developers-secret-weapon/branches.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/discussions/preview-environments-a-developers-secret-weapon/branches.webp" alt="Preview Environments" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`discussions` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        discussions
                      </span>
                    )}

        <span className="text-xs text-subtle">Thursday, September 19th 2024</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Preview Environments</h3>
      <p className="blog-card-desc">Discover how preview environments transform software deployment, reducing stress and improving code quality. Learn about the six essential components for implementing preview environments, including Git, infrastructure as code, and automated DNS management. Find out why preview environments are crucial for catching bugs, testing performance, and enhancing collaboration between technical and non-technical team members. Explore how Upsun's platform leverages preview environments to streamline the development process and deliver higher-quality software products.</p>
    </div>
  </a>

  <a href="/posts/hands-on/harnessing-power-embeddings" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/devcenter.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/devcenter.webp" alt="Harnessing the power of Embeddings: a real-world example of a watch recommendation app using a vector database." className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`hands-on` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        hands-on
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, May 20th 2024</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Harnessing the power of Embeddings: a real-world example of a watch recommendation app using a vector database.</h3>
      <p className="blog-card-desc">Learn how to build a real-world watch recommendation application using embeddings and a vector database. This tutorial covers using Postgres with pgvector, Laravel, React, OpenAI, and Groq, deployed on Upsun.</p>
    </div>
  </a>

  <a href="/posts/tutorials/deploying-remixjs-app-on-upsun" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/devcenter.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/devcenter.webp" alt="Deploying a Remix JS app on Upsun in 5 minutes" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`tutorials` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        tutorials
                      </span>
                    )}

        <span className="text-xs text-subtle">Friday, March 1st 2024</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Deploying a Remix JS app on Upsun in 5 minutes</h3>
      <p className="blog-card-desc">Learn how to deploy a Remix JS application on Upsun in just 5 minutes. This tutorial covers creating a project, setting up the Node.js server, and deploying your app.</p>
    </div>
  </a>

  <a href="/posts/tutorials/deploying-laravel-with-horizon-on-upsun" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/devcenter.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/devcenter.webp" alt="Deploying Laravel with Horizon on Upsun" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`tutorials` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        tutorials
                      </span>
                    )}

        <span className="text-xs text-subtle">Wednesday, February 28th 2024</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Deploying Laravel with Horizon on Upsun</h3>
      <p className="blog-card-desc">Learn how to deploy a Laravel application with Redis queues and Horizon on Upsun, including PostgreSQL database setup, environment configuration, and domain management.</p>
    </div>
  </a>

  <a href="/posts/unknown/are-your-websites-ready-to-handle-traffic-peaks-this-holiday-season" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`/images/posts/unknown/are-your-websites-ready-to-handle-traffic-peaks-this-holiday-season/are-your-websites-ready-to-handle-traffic-peaks-this-holiday-season.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/unknown/are-your-websites-ready-to-handle-traffic-peaks-this-holiday-season/are-your-websites-ready-to-handle-traffic-peaks-this-holiday-season.webp" alt="Are your websites ready to handle traffic peaks this holiday season?" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`platformsh-blog` !== '' && (
                      <span className="text-xs font-semibold uppercase tracking-wider px-2 py-0.5 rounded-md bg-accent-badge border border-accent-soft text-accent">
                        platformsh-blog
                      </span>
                    )}

        <span className="text-xs text-subtle">Monday, November 28th 2022</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Are your websites ready to handle traffic peaks this holiday season?</h3>
      <p className="blog-card-desc">Discover how to optimize your website for increased holiday traffic. Learn best practices for performance and customer experience during the busy sales season.</p>
    </div>
  </a>
</ShowMore>
