> ## 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.

# Florent Huck

> Articles written by Florent Huck.

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/flovntp.png?size=128" alt="Florent Huck" className="w-16 h-16 rounded-full" />

  <div className="flex flex-wrap gap-3">
    <a href="https://github.com/flovntp" 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/florenthuck" 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-flovntp-articles" className="blog-card-grid">
  <a href="/posts/ai/opencode-token-optimization" 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/opencode-token-optimization/opencode-tokens.png` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/opencode-token-optimization/opencode-tokens.png" alt="How to slash OpenCode Token costs by 90% on Upsun" 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, June 2nd 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">How to slash OpenCode Token costs by 90% on Upsun</h3>
      <p className="blog-card-desc">Cut your OpenCode token usage by up to 90% on Upsun with three community plugins: OpenSlimedit, opencode-dcp, and opencode-snip. Step-by-step guide to install and configure them on your existing deployment, with benchmarks, troubleshooting, and best practices.</p>
    </div>
  </a>

  <a href="/posts/ai/opencode-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/ai/opencode-on-upsun/opencode-thumbnail.png` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/ai/opencode-on-upsun/opencode-thumbnail.png" alt="How to Host OpenCode on Upsun" 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, May 19th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">How to Host OpenCode on Upsun</h3>
      <p className="blog-card-desc">Deploy an OpenCode AI coding agent on Upsun with a single git push. This tutorial covers configuration, persistent storage, LLM API keys, and remote MCP server integration.</p>
    </div>
  </a>

  <a href="/posts/use-cases/n8n-upgrade-with-postgresql-and-redis" 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/use-cases/n8n-upgrade-postgresql-redis/n8n-postgresql-redis-thumbnail.svg` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/use-cases/n8n-upgrade-postgresql-redis/n8n-postgresql-redis-thumbnail.svg" alt="Scale n8n with PostgreSQL and Redis 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">Wednesday, April 29th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Scale n8n with PostgreSQL and Redis on Upsun</h3>
      <p className="blog-card-desc">Upgrade your n8n instance from SQLite to PostgreSQL and add Redis caching for better performance, scalability, and reliability. Step-by-step guide for Upsun.</p>
    </div>
  </a>

  <a href="/posts/core-concepts/meta-upsun-validation-schema-dx-improvement" 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="How Meta-Upsun improved Validation Schema and Developer eXperience" className="blog-card-img" />
          </div>
        )}

    <div className="blog-card-body">
      <div className="flex items-center gap-2">
        {`core-concepts` !== '' && (
                      <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">
                        core-concepts
                      </span>
                    )}

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

      <h3 className="blog-card-title group-hover:text-accent transition-colors">How Meta-Upsun improved Validation Schema and Developer eXperience</h3>
      <p className="blog-card-desc">The introduction of Meta-Upsun enabled dynamic validation schemas and version enumeration for Upsun services and runtimes, significantly improving developer experience.</p>
    </div>
  </a>

  <a href="/posts/how-tos/meta-version-updater-introduction" 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/meta-version-updater-introduction/red-background.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/how-tos/meta-version-updater-introduction/red-background.webp" alt="Automating Runtime and Service Tracking with Meta Version Updater" 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">Wednesday, April 1st 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Automating Runtime and Service Tracking with Meta Version Updater</h3>
      <p className="blog-card-desc">Meta is Upsun’s shared reference layer for runtimes, services, regions, and extensions. Learn why we built it, how it works, and how it powers the next generation of Upsun documentation and tooling.</p>
    </div>
  </a>

  <a href="/posts/how-it-works/meta-reference-source-introduction" 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/meta-reference-source-introduction/meta.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/how-it-works/meta-reference-source-introduction/meta.webp" alt="Centralising Upsun Technical References with Meta-Upsun" 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">Wednesday, March 25th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Centralising Upsun Technical References with Meta-Upsun</h3>
      <p className="blog-card-desc">How Upsun centralised runtime, service, region, and PHP reference data into a single public API to improve consistency, automation, and documentation accuracy.</p>
    </div>
  </a>

  <a href="/posts/releases/upsun-node-sdk-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/releases/upsun-node-sdk-announcement/upsun-sdk-node.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/releases/upsun-node-sdk-announcement/upsun-sdk-node.webp" alt="Announcing the Official Upsun Node.js SDK" 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 25th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Announcing the Official Upsun Node.js SDK</h3>
      <p className="blog-card-desc">Discover how the Upsun Node SDK simplifies API access and speeds up integrations, with clear documentation and modern tooling.</p>
    </div>
  </a>

  <a href="/posts/releases/php-85-release" 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/php-85-release/elephant-84.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/releases/php-85-release/elephant-84.webp" alt="PHP 8.5 is here!" 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">Thursday, November 20th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">PHP 8.5 is here!</h3>
      <p className="blog-card-desc">What if the next PHP revolution made no noise but completely transformed your developer daily life?</p>
    </div>
  </a>

  <a href="/posts/releases/upsun-php-sdk-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/releases/upsun-php-sdk-announcement/upsun-sdk-php.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/releases/upsun-php-sdk-announcement/upsun-sdk-php.webp" alt="Introducing the Upsun PHP SDK" 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">Tuesday, November 4th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Introducing the Upsun PHP SDK</h3>
      <p className="blog-card-desc">Discover how the Upsun PHP SDK simplifies API access and speeds up integrations, with clear documentation and modern tooling.</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/how-tos/composer1-rip" 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/composer1-rip/composer-migrate-v1-v2.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/how-tos/composer1-rip/composer-migrate-v1-v2.webp" alt="Composer 1 is dead – Upgrade to Composer 2 now" 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">Tuesday, September 9th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Composer 1 is dead – Upgrade to Composer 2 now</h3>
      <p className="blog-card-desc">Composer 1 has reached end of life and is no longer available on Upsun and Platform.sh. Learn why it’s no longer possible to rely on Composer 1, what errors you’ll see, and how to safely upgrade your project to Composer 2.</p>
    </div>
  </a>

  <a href="/posts/use-cases/n8n-saved-my-life" 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/use-cases/n8n-saved-my-life/social-media.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/use-cases/n8n-saved-my-life/social-media.webp" alt="How n8n saved our Advocacy impact on Social Media!" 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">Thursday, July 3rd 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">How n8n saved our Advocacy impact on Social Media!</h3>
      <p className="blog-card-desc">Learn how n8n workflows improve internal communication and amplify our Advocacy social media impact.</p>
    </div>
  </a>

  <a href="/posts/hands-on/nocode-n8n" 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/nocode-n8n/nocode-n8n-thumbnail.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/nocode-n8n/nocode-n8n-thumbnail.webp" alt="NoCode with Upsun: Supercharge Your Automation with Zero Code" 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, May 14th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">NoCode with Upsun: Supercharge Your Automation with Zero Code</h3>
      <p className="blog-card-desc">Learn how to leverage Upsun to deploy powerful NoCode tools like n8n for workflow automation. Fast setup, secure hosting, and real-world use cases — all without writing code.</p>
    </div>
  </a>

  <a href="/posts/releases/vscode-extension" 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/vscode-extension/visual-studio-code.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/releases/vscode-extension/visual-studio-code.webp" alt="Supercharge your workflow with the Upsun VSCode Extension" 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, May 6th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Supercharge your workflow with the Upsun VSCode Extension</h3>
      <p className="blog-card-desc">If you're working on Upsun projects with VSCode, the **Upsun VSCode extension** is an essential tool to enhance your development experience. Learn more...</p>
    </div>
  </a>

  <a href="/posts/how-tos/validate-yaml-config" 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/validate-yaml-config/logo-yaml.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/how-tos/validate-yaml-config/logo-yaml.webp" alt="Making .upsun/config.yaml easier to edit with IDE autocomplete and validation" 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">Tuesday, May 6th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Making .upsun/config.yaml easier to edit with IDE autocomplete and validation</h3>
      <p className="blog-card-desc">Boost your productivity and eliminate configuration errors with real-time autocompletion and validation for your .upsun/config.yaml — discover how to enhance your IDE experience in just a few simple steps!</p>
    </div>
  </a>

  <a href="/posts/tutorials/deploying-clamav-service" className="blog-card group rounded-xl bg-card border-theme card-hover shadow-sm hover:shadow-md transition-all overflow-hidden flex flex-col">
    {`https://www.clamav.net/assets/clamav-trademark.png` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="https://www.clamav.net/assets/clamav-trademark.png" alt="Deploy ClamAV on Upsun, on service mode." 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">Thursday, April 24th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Deploy ClamAV on Upsun, on service mode.</h3>
      <p className="blog-card-desc">Learn how to deploy ClamAV service on Upsun. This tutorial covers ClamAV integration on service scan mode.</p>
    </div>
  </a>

  <a href="/posts/hands-on/install-gh-asset-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/install-gh-asset-on-upsun/github.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/install-gh-asset-on-upsun/github.webp" alt="Up(sun) and ready with GitHub release assets installation" 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, April 10th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Up(sun) and ready with GitHub release assets installation</h3>
      <p className="blog-card-desc">Discover how to install any GitHub release asset you want in your Upsun project.</p>
    </div>
  </a>

  <a href="/posts/tutorials/sfcon2024-decouple-frontend" 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/sfcon2024-decouple-frontend/decouple-frontend.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/tutorials/sfcon2024-decouple-frontend/decouple-frontend.webp" alt="Decouple your Symfony frontend using Next.js" 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, March 24th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Decouple your Symfony frontend using Next.js</h3>
      <p className="blog-card-desc">How to decouple your frontend from your backend, using a Symfony project as backend and adding a Next.js application for frontend.</p>
    </div>
  </a>

  <a href="/posts/releases/llms-introduction" 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/llms-introduction/llms-introduction.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/releases/llms-introduction/llms-introduction.webp" alt="Upsun and Platform.sh Docs are now llms.txt compatible!" 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">Friday, February 14th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Upsun and Platform.sh Docs are now llms.txt compatible!</h3>
      <p className="blog-card-desc">We’re thrilled to announce that both [Upsun Documentation](https://docs.upsun.com) and [Platform.sh Documentation](https://docs.platform.sh) are now fully compatible with [llms.txt proposed standard](https://llmstxt.org/)!</p>
    </div>
  </a>

  <a href="/posts/how-tos/install-pandoc-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/how-tos/install-pandoc-on-upsun/pandoc.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/how-tos/install-pandoc-on-upsun/pandoc.webp" alt="Up(sun) and ready with Pandoc" 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">Wednesday, February 12th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Up(sun) and ready with Pandoc</h3>
      <p className="blog-card-desc">With the recent growth in enthusiasm for AI assistants, you may be looking for how these assistants can provide technical information about your product.</p>
    </div>
  </a>

  <a href="/posts/how-tos/blackfire-google-alert-markers-interfaces" 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/blackfire-google-alert-markers-interfaces/blackfire-marker-list.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/how-tos/blackfire-google-alert-markers-interfaces/blackfire-marker-list.webp" alt="Import multiple RSS Feeds on your Blackfire timeline + extra interfaces" 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">Tuesday, November 5th 2024</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Import multiple RSS Feeds on your Blackfire timeline + extra interfaces</h3>
      <p className="blog-card-desc">We saw in the [previous episode](/posts/how-tos/blackfire-google-alert-markers) how to automatically add context on your Blackfire timeline from an RSS Feed (Google Alert),</p>
    </div>
  </a>

  <a href="/posts/how-tos/blackfire-google-alert-markers" 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/blackfire-google-alert-markers/google-alert-marker.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/how-tos/blackfire-google-alert-markers/google-alert-marker.webp" alt="Add context on your Blackfire timeline from a Google Alerts RSS Feed" 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">Monday, October 7th 2024</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Add context on your Blackfire timeline from a Google Alerts RSS Feed</h3>
      <p className="blog-card-desc">Observing your application is essential to be able to find what needs (and what does not need) to be optimized.</p>
    </div>
  </a>

  <a href="/posts/how-tos/automate-with-gatling-1" 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/automate-with-gatling-1/gatling.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/how-tos/automate-with-gatling-1/gatling.webp" alt="How to automate load tests with Gatling" 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">Friday, September 20th 2024</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">How to automate load tests with Gatling</h3>
      <p className="blog-card-desc">When I was on your side of the keyboard, developing cool and funny applications (more or less :D), load tests were (most of the time) executed a few days before going live.</p>
    </div>
  </a>

  <a href="/posts/tutorials/how-to-host-multiple-applications" 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/how-to-host-multiple-applications/multiple-application-blog.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/tutorials/how-to-host-multiple-applications/multiple-application-blog.webp" alt="How to host a multiple-application project on Platform.sh" 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, August 16th 2024</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">How to host a multiple-application project on Platform.sh</h3>
      <p className="blog-card-desc">Learn how to host and configure multiple-application projects on Platform.sh with this step-by-step guide.</p>
    </div>
  </a>
</ShowMore>
