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

# Mark Hanna

> Articles written by Mark Hanna.

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

  <div className="flex flex-wrap gap-3">
    <a href="https://github.com/jackrabbithanna" 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>
  </div>
</div>

<div className="blog-card-grid">
  <a href="/posts/hands-on/civicrm-with-wordpress-bedrock-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/civicrm-drupal-11-on-upsun/UpsunxSkvare-800x300.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/civicrm-drupal-11-on-upsun/UpsunxSkvare-800x300.webp" alt="CiviCRM with WordPress Bedrock 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, June 30th 2026</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">CiviCRM with WordPress Bedrock on Upsun</h3>
      <p className="blog-card-desc">A guide to deploying CiviCRM on top of a Bedrock-based WordPress installation on Upsun, utilizing an optimized Composer template and MariaDB schemas.</p>
    </div>
  </a>

  <a href="/posts/hands-on/civicrm-drupal-11-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/civicrm-drupal-11-on-upsun/UpsunxSkvare-800x300.webp` !== '' && (
          <div className="blog-card-img-wrap">
            <img src="/images/posts/hands-on/civicrm-drupal-11-on-upsun/UpsunxSkvare-800x300.webp" alt="Installing CiviCRM with Drupal 11 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">Friday, December 19th 2025</span>
      </div>

      <h3 className="blog-card-title group-hover:text-accent transition-colors">Installing CiviCRM with Drupal 11 on Upsun</h3>
      <p className="blog-card-desc">Learn how to install CiviCRM with Drupal 11 on Upsun, from config.yml and databases to cron, caching, extensions and Skvare’s best-practice template.</p>
    </div>
  </a>
</div>
