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

# DrupalCamp Florida 2024: sharing takeaways from the experts

> I had the pleasure of returning to DrupalCamp FL (DCFL) again this year and even now in its sixteenth year, DCFL 2024 was as lively and energetic as ever.

export const PostMeta = ({data = {}}) => {
  const {author, date, image} = data;
  const authors = Array.isArray(author) ? author : author ? [author] : [];
  const resolveAuthor = slug => {
    const entry = AUTHOR_MAP[slug] || ({});
    const name = entry.name || slug;
    const github = entry.github || null;
    const linkedin = entry.linkedin || null;
    const url = github ? `https://github.com/${github}` : linkedin || null;
    const avatarUrl = github ? `https://github.com/${github}.png?size=64` : null;
    return {
      name,
      url,
      avatarUrl
    };
  };
  const formattedDate = date ? new Date(date).toLocaleDateString('en-US', {
    year: 'numeric',
    month: 'long',
    day: 'numeric'
  }) : null;
  if (!image && authors.length === 0 && !formattedDate) return null;
  const AUTHOR_MAP = {
    "aaron-collier": {
      "name": "Aaron Collier"
    },
    "aaron-dudenhofer": {
      "name": "Aaron Dudenhofer"
    },
    "aaron-porter": {
      "name": "Aaron Porter"
    },
    "adriaan-odendaal": {
      "name": "Adriaan Odendaal"
    },
    "ajmal": {
      "name": "Ajmal Siddiqui"
    },
    "akalipetis": {
      "name": "Antonis Kalipetis"
    },
    "alexander-varwijk": {
      "name": "Alexander Varwijk"
    },
    "alicia-bevilacqua": {
      "name": "Alicia Bevilacqua"
    },
    "amelie-deguerry": {
      "name": "Amelie Deguerry"
    },
    "anacidre": {
      "name": "Ana Cidre",
      "linkedin": "https://www.linkedin.com/in/ana-cidre"
    },
    "andoni": {
      "name": "Andoni Auzmendi"
    },
    "andrei-taranu": {
      "name": "Andrei (Alex) Taranu",
      "linkedin": "https://www.linkedin.com/in/andrei-alex-taranu/"
    },
    "andrew-baxter": {
      "name": "Andrew Baxter"
    },
    "andrew-melck": {
      "name": "Andrew Melck"
    },
    "antoine-crochet-damais": {
      "name": "Antoine Crochet Damais"
    },
    "augustin-delaporte": {
      "name": "Augustin Delaporte",
      "linkedin": "https://www.linkedin.com/in/augustindelaporte/"
    },
    "branislav-bujisic": {
      "name": "Branislav Bujisic"
    },
    "carl-smith": {
      "name": "Carl Smith"
    },
    "caroline-leroy": {
      "name": "Caroline Leroy"
    },
    "cati-mayer": {
      "name": "Cati Mayer"
    },
    "catplat": {
      "name": "C Trinkwon"
    },
    "ceelolulu": {
      "name": "Celeste van der Watt"
    },
    "chadwcarlson": {
      "name": "Chad Carlson",
      "github": "chadwcarlson",
      "linkedin": "https://www.linkedin.com/in/chadwcarlson"
    },
    "chris-ward": {
      "name": "Chris Ward"
    },
    "chris-yates": {
      "name": "Chris Yates"
    },
    "christian-sieber": {
      "name": "Christian Sieber"
    },
    "christopher-lockheardt": {
      "name": "Christopher Lockheardt"
    },
    "christopher-skene": {
      "name": "Christopher Skene"
    },
    "chuck-morgan": {
      "name": "Chuck Morgan"
    },
    "corey-dockendorf": {
      "name": "Corey Dockendorf"
    },
    "crell": {
      "name": "Crell"
    },
    "damz": {
      "name": "Damz"
    },
    "dan-morrison": {
      "name": "Dan Morrison"
    },
    "davidbonachera": {
      "name": "David Bonachera",
      "github": "davidbonachera",
      "linkedin": "https://www.linkedin.com/in/davidbonachera"
    },
    "dereliahmet1": {
      "name": "Ahmet Faruk Dereli"
    },
    "devicezero": {
      "name": "Jonas Kröger",
      "github": "devicezero",
      "linkedin": "https://www.linkedin.com/in/jonaskroeger/"
    },
    "doug-goldberg": {
      "name": "Doug Goldberg"
    },
    "duncan-naves": {
      "name": "Duncan Naves",
      "github": "duncannaves",
      "linkedin": "https://www.linkedin.com/in/duncan-naves-a94423aa"
    },
    "erika-bustamante": {
      "name": "Erika Bustamante"
    },
    "fabpot": {
      "name": "Fabien Potencier"
    },
    "flovntp": {
      "name": "Florent Huck",
      "github": "flovntp",
      "linkedin": "https://www.linkedin.com/in/florenthuck"
    },
    "fred-plais": {
      "name": "Fred Plais"
    },
    "gauthier-garnier": {
      "name": "Gauthier Garnier"
    },
    "gilzow": {
      "name": "Paul Gilzow"
    },
    "gmoigneu": {
      "name": "Guillaume Moigneu",
      "github": "gmoigneu",
      "linkedin": "https://www.linkedin.com/in/guillaumemoigneu/"
    },
    "gregqualls": {
      "name": "Greg Qualls"
    },
    "guguss": {
      "name": "Augustin Delaporte"
    },
    "haylee-millar": {
      "name": "Haylee Millar"
    },
    "ivana-kotur": {
      "name": "Ivana Kotur"
    },
    "jackrabbithanna": {
      "name": "Mark Hanna"
    },
    "jared-wright": {
      "name": "Jared Wright",
      "github": "jww-sh",
      "linkedin": "https://www.linkedin.com/in/jaredwaynewright"
    },
    "jessica-orozco": {
      "name": "Jessica Orozco"
    },
    "joey-stanford": {
      "name": "Joey Stanford"
    },
    "john-grubb": {
      "name": "John Grubb"
    },
    "jonas-kruger": {
      "name": "Jonas Kruger"
    },
    "kathryn-frazer": {
      "name": "Kathryn Frazer"
    },
    "kemiojo": {
      "name": "Kemi Elizabeth Ojogbede"
    },
    "kieronsambrook-smith": {
      "name": "Kieronsambrook Smith"
    },
    "laurent-arnoud": {
      "name": "Laurent Arnoud",
      "linkedin": "https://www.linkedin.com/in/laurent-arnoud-861b44121/"
    },
    "letoya-boyne": {
      "name": "Letoya Boyne"
    },
    "lolautruche": {
      "name": "Jérôme Vieilledent"
    },
    "lyly-lepinay": {
      "name": "Lyly Lepinay"
    },
    "manauwar-alam": {
      "name": "Manauwar Alam"
    },
    "marc-antoine-porri": {
      "name": "Marc Antoine Porri"
    },
    "maria-antinkaapo": {
      "name": "Maria Antinkaapo"
    },
    "maria-de-anton": {
      "name": "Maria De Anton"
    },
    "mark-dorison": {
      "name": "Mark Dorison"
    },
    "markus-hausammann": {
      "name": "Markus Hausammann"
    },
    "mary-thomas": {
      "name": "Mary Thomas"
    },
    "mathias-bolt-lesniak": {
      "name": "Mathias Bolt Lesniak"
    },
    "mathieu-strauch": {
      "name": "Mathieu Strauch"
    },
    "matthias-van-woensel": {
      "name": "Matthias Van Woensel",
      "linkedin": "https://www.linkedin.com/in/matthias-van-woensel-267a069"
    },
    "michael-sharp": {
      "name": "Michael Sharp"
    },
    "mupsi": {
      "name": "Marine Gandy"
    },
    "natalie-harper": {
      "name": "Natalie Harper"
    },
    "ngommenginger": {
      "name": "Nicolas Gommenginger",
      "linkedin": "https://www.linkedin.com/in/nicolas-gommenginger"
    },
    "nicholas-bennison": {
      "name": "Nicholas Bennison"
    },
    "nicholas-vahalik": {
      "name": "Nicholas Vahalik"
    },
    "nick-hardiman": {
      "name": "Nick Hardiman"
    },
    "nickanderegg": {
      "name": "Nickanderegg"
    },
    "nicolas-grekas": {
      "name": "Nicolas Grekas",
      "github": "nicolas-grekas",
      "linkedin": "https://www.linkedin.com/in/nicolasgrekas/"
    },
    "niti-malwade": {
      "name": "Niti Malwade"
    },
    "opensocialteam": {
      "name": "Opensocialteam"
    },
    "ori-pekelman": {
      "name": "Ori Pekelman"
    },
    "otavio-santana": {
      "name": "Otavio Santana"
    },
    "palwandi": {
      "name": "Pawan Alwandi",
      "github": "pawpy",
      "linkedin": "https://www.linkedin.com/in/pawanalwandi"
    },
    "patrick-boest": {
      "name": "Patrick Boest"
    },
    "patrick-dawkins": {
      "name": "Patrick Dawkins",
      "github": "pjcdawkins",
      "linkedin": "https://www.linkedin.com/in/patrickdawkins"
    },
    "patrick-klima": {
      "name": "Patrick Klima"
    },
    "pjcdawkins": {
      "name": "Pjcdawkins"
    },
    "prineet-kaurbhurji": {
      "name": "Prineet Kaurbhurji"
    },
    "quentin-sinig": {
      "name": "Quentin Sinig"
    },
    "ralt": {
      "name": "Florian Margaine",
      "github": "ralt",
      "linkedin": "https://www.linkedin.com/in/florian-margaine-43971136"
    },
    "ramanathanramakrishnamurthy": {
      "name": "Ramanathanramakrishnamurthy"
    },
    "remi-lejeune": {
      "name": "Rémi Lejeune"
    },
    "ribel": {
      "name": "Taras Kruts"
    },
    "robert-douglass": {
      "name": "Robert Douglass"
    },
    "rudy-weber": {
      "name": "Rudy Weber"
    },
    "ryan-hicks": {
      "name": "Ryan Hicks"
    },
    "sabri-helal": {
      "name": "Sabri Helal"
    },
    "savannah-bergeron": {
      "name": "Savannah Bergeron"
    },
    "shannon-vettes": {
      "name": "Shannon Vettes"
    },
    "shawn-ogasawara": {
      "name": "Shawn Ogasawara",
      "linkedin": "https://www.linkedin.com/in/shawn-ogasawara-83a9a0/"
    },
    "shawna-spoor": {
      "name": "Shawna Spoor"
    },
    "shedrack-akintayo": {
      "name": "Shedrack Akintayo"
    },
    "simon-ruggier": {
      "name": "Simon Ruggier"
    },
    "sophie-van-der-kindere": {
      "name": "Sophie Van Der Kindere"
    },
    "stefanos-thampis": {
      "name": "Stefanos Thampis"
    },
    "stephen-weinberg": {
      "name": "Stephen Weinberg"
    },
    "sukhman-virk": {
      "name": "Sukhman Virk"
    },
    "sumaira-nazir": {
      "name": "Sumaira Nazir"
    },
    "sumer": {
      "name": "Sümer Cip"
    },
    "syed-raza": {
      "name": "Syed Raza"
    },
    "tamara-bacchia": {
      "name": "Tamara Bacchia"
    },
    "tara-arnold": {
      "name": "Tara Arnold"
    },
    "theosakamg": {
      "name": "Mickael Gaillard",
      "github": "theosakamg"
    },
    "thomasdiluccio": {
      "name": "Thomas di Luccio"
    },
    "tim-anderson": {
      "name": "Tim Anderson"
    },
    "tom-helmer-hansen": {
      "name": "Tom Helmer Hansen"
    },
    "tylermills": {
      "name": "Tyler Mills"
    },
    "upsun": {
      "name": "Upsun"
    },
    "veronika-tolkachova": {
      "name": "Veronika Tolkachova",
      "linkedin": "https://www.linkedin.com/in/veronika-tolkachova-169167a2"
    },
    "vince-parker": {
      "name": "Vince Parker"
    },
    "vinnie-russo": {
      "name": "Vincenzo Russo"
    },
    "vrobert78": {
      "name": "Vincent Robert",
      "github": "vrobert78",
      "linkedin": "https://www.linkedin.com/in/vincent-robert-498a883"
    },
    "yuriy-babenko": {
      "name": "Yuriy Babenko"
    },
    "yuriy-gerasimov": {
      "name": "Yuriy Gerasimov"
    }
  };
  return <div className="post-meta">
      {(authors.length > 0 || formattedDate) && <div className="post-meta-info">
          {authors.length > 0 && <div className="post-meta-authors">
              {authors.map(slug => {
    const {name, url, avatarUrl} = resolveAuthor(slug);
    const inner = <>
                    {avatarUrl && <img src={avatarUrl} alt={name} className="post-meta-avatar" />}
                    <span className="post-meta-author-name">{name}</span>
                  </>;
    return url ? <a key={slug} href={url} target="_blank" rel="noopener noreferrer" className="post-meta-author">
                    {inner}
                  </a> : <span key={slug} className="post-meta-author">{inner}</span>;
  })}
            </div>}
          {authors.length > 0 && formattedDate && <span className="post-meta-separator" aria-hidden="true">·</span>}
          {formattedDate && <span className="post-meta-date">{formattedDate}</span>}
        </div>}
      {image && <img src={image} alt="" className="post-meta-image" aria-hidden="true" />}
    </div>;
};

<PostMeta data={{ author: ["gilzow"], date: "2024-03-25", image: "/images/posts/unknown/drupal-camp-florida-2024/drupal-camp-florida-2024.webp" }} />

<Tip>
  This post was originally published on the Platform.sh blog and reflects information from the time of publication.
</Tip>

I had the pleasure of returning to [DrupalCamp FL](https://www.fldrupal.camp/) (DCFL) again this year and even now in its sixteenth year, DCFL 2024 was as lively and energetic as ever. Approximately 130 people descended upon [Florida Technical College](https://www.ftccollege.edu/) to share their experiences and knowledge surrounding Drupal and I’m here to share the highlights!

<img src="https://mintcdn.com/upsun-c9761871/OR9CPqO13fyi9LoK/images/posts/unknown/drupal-camp-florida-2024/3_Photo_607ea73f2a.webp?fit=max&auto=format&n=OR9CPqO13fyi9LoK&q=85&s=4da312b448cb460584cf183228245a83" alt="" width="3000" height="4000" data-path="images/posts/unknown/drupal-camp-florida-2024/3_Photo_607ea73f2a.webp" />

The challenge with DCFL's structure is that there are five concurrent sessions during each session block, which makes it particularly challenging to choose which one you want to attend. In each session block, I was forced to miss at least one session I really wanted to see but luckily, all of the sessions were recorded and are now available on [the DCFL website](https://www.fldrupal.camp/).

### **Tips for technical documentation with Kurt Trowbridge**

Given that I don't do much directly in Drupal anymore, I decided to start the day with [*Documentation for developers: A gift to your future self*](https://www.fldrupal.camp/session/documentation-developers-gift-your-future-self) by [Kurt Trowbridge](https://www.drupal.org/u/kurttrowbridge). Documentation is a crucial part of developer relations given it is often one of the first touchpoints a developer has with your product so I hoped that Kurt would challenge some of my conceptions about what constitutes good documentation and possibly bring up some ideas I had overlooked, and I was not let down.

While Kurt brought up some points I already agree with—including documentation being everyone's responsibility and making documentation part of your definition of done—he also shared the concept of chunking which I had not thought of previously in relation to our documentation strategy.

If you're not familiar with chunking, it refers to the concept of grouping information into *chunks* to reduce the overall number of items to remember in an effort to improve our ability to recall the information later from memory. The concept was created by cognitive psychologist George Miller in 1956 and published as [an article](https://en.wikipedia.org/wiki/The%5FMagical%5FNumber%5FSeven,%5FPlus%5For%5FMinus%5FTwo) in Psychological Review. It explains why it is easier to remember the number 5,732,562,145 as (573) 256-2145 by *chunking* the information into distinct groups of information, our brains are more efficient at committing it to memory and later recalling it. I remember Miller's Law from my college psychology classes but had never considered it in terms of how it might be applied to technical documentation. We're now discussing internally how we might use this concept to break up some of the more dense documentation into more easily digestible, and memorable chunks.

Another thing Kurt mentioned that really resonated with me is to document where you're going to see it. We have fairly thorough documentation; almost everything you can do is explained in the documentation. However, we still see issues where customers are confused and ask questions that are answered in the docs. There's obviously a disconnect and this statement gave me pause; maybe we're not surfacing the information they need where they'll see it. We're now going back and trying to see where we can inject this information so it's exposed more directly where a developer is most likely to see it when needed.

### **Git going with GitHub Actions**

The next session was my session! [*Introduction to GitHub Actions: Understanding Key Terms and Building Your First GitHub Action*](https://www.fldrupal.camp/session/introduction-github-actions-understanding-key-terms-and-building-your-first-github-action)—[recording now available](https://www.youtube.com/watch?v=q-Dm2lre1Gg). I had a great group of attendees who were engaged and willing to interact as we moved through the materials, walking through the steps of building our first GitHub workflow, our first GitHub action, and then combining the two to begin the journey of automating tasks surrounding our codebase.

<img src="https://mintcdn.com/upsun-c9761871/OR9CPqO13fyi9LoK/images/posts/unknown/drupal-camp-florida-2024/1_Photo_4377878a3c.webp?fit=max&auto=format&n=OR9CPqO13fyi9LoK&q=85&s=52bd5429682b4f0cc062f8cc15cfbb6d" alt="" width="4000" height="3000" data-path="images/posts/unknown/drupal-camp-florida-2024/1_Photo_4377878a3c.webp" />

### **Tighten up your Drupal code with PHPStan**

After a fabulous taco lunch, catered by [Gringos Locos](http://gringoslocos.com/)—I highly recommend if you ever have a chance to visit one of their locations—it was back to learning. The next session for me was [*Tighten up your Drupal code using PHPStan*](https://www.fldrupal.camp/session/tighten-your-drupal-code-using-phpstan) with [Matt Glaman](https://www.drupal.org/u/mglaman). I've used PHPStan numerous times in the past, but since I haven't done much PHP development over the last year or so, I was a bit behind on where the project is currently. Not only has it been busy keeping up with the latest PHP versions, but they've greatly improved its capabilities in improving your code, catching bugs and issues, and overall improving the developer experience. But the most surprising thing I learned is that Drupal core and contributed modules now run PHPStan for every commit against [Rule Level 0](https://phpstan.org/user-guide/rule-levels), with an [active initiative to move the entire codebase to passing Rule Level 2](https://www.drupal.org/project/drupal/issues/3322735).

### **Accessibility through alternative text with AmyJune Hineline**

Next up was [Beyond "99 Red Balloons" - A Pragmatic guide to alternative text](https://www.fldrupal.camp/session/beyond-99-red-balloons-pragmatic-guide-alternative-text) with [AmyJune Hineline](https://www.drupal.org/u/volkswagenchick). While I do still generate content, I generally do not need to worry about being responsible for alternative text for images. Nevertheless, I have a deep passion for all things accessibility; not to mention, AmyJune and I have known each other for many years but I've never had an opportunity to see her give a presentation and I was not disappointed. Using classic album covers from the past four decades as her examples, she covered various ways the image could be described and how that description might change based on the context around the image. She shared a statement from Eric Meyers that resonated with me, "When you call something an 'edge case' you're really just defining the edges of what you care about." Given everyone will face a disability at some point, accessibility touches us at all. It was refreshing to see others feel the same that accessibility to content and an online experience should be available for everyone, and that there is no edge case when it comes to accessibility.

But the biggest *ah-ha* moment for me was when she showed how you can have Google provide live captions when giving a presentation using Google Slides. As long as your computer mic can pick up your voice it will add the captions to the top or bottom of your presentation. Then, if the presentation is recorded (like they were at DrupalCamp) they're burned into the recording. I sincerely wish I had known about this for the last couple of years as I would have added it to every presentation but now I know for the future.

### **Why Drupal developers should be using Laravel**

The last full presentation I attended was [*Why Drupal developers should also be using Laravel*](https://www.fldrupal.camp/session/why-drupal-developers-should-also-be-using-laravel) by [Lee Walker](https://www.drupal.org/u/mr%5Fscumbag). The core idea was that if you have any CRUD-style requirements, it's far easier and more efficient to build it in Laravel instead of in Drupal. In addition, most developers' experience and knowledge in Drupal will directly transfer over to Laravel. Lee also gave a walk-through of the various offerings in the Laravel ecosystem, as well as the various offerings available for learning Laravel, like [Bootcamp Laravel](https://bootcamp.laravel.com/) and [Laracasts](https://laracasts.com/). He also discussed how great care is given to the Laravel docs; from what he described every docs page is touched when a new update comes out. I've always been impressed with the quality of Laravel's documentation, and somehow am now even *more* impressed.

### **Quickfire takeaways from DrupalCamp Florida 2024**

DrupalCamp ended with Lightning Talks: short, 5-minute or less impromptu sessions that anyone can volunteer to do. There were the typical calls for attending DrupalCamp Asheville and random facts about Florida—I did not know Florida is one of the few places that has both alligators **and** crocodiles and has 6 different species of monkeys— but also several other interesting items I was unaware of including:

* [Coderabbit](https://coderabbit.ai/): an AI-based code review tool for your pull requests. Particularly useful if you're a team of one and don't like having to review and approve your own code reviews
* [https://claude.ai/](https://claude.ai/): an alternative to ChatGPT
* [Stable Cascade](https://stability.ai/news/introducing-stable-cascade): a text-to-image AI generation tool
* Microsoft's Co-pilot can use ChatGPT 3.5 and gives you 30 requests per day
* [Cursor.sh](https://cursor.sh/): an AI-powered pair-programming tool
* There is a somewhat [long, passionate debate](https://www.drupal.org/project/drupal/issues/3082958) over whether the Drupal Recommended project should include a .gitignore file by default, or an example.gitignore, or nothing
* Even though [DDEV](https://ddev.com/) was not officially at this year's DrupalCamp FL, it did make a surprise appearance—one of the door prizes they gave away was a DDEV pillowcase. I had no idea such a thing even existed, but as it turns out, you can [buy your very own DDEV ](https://ddev.threadless.com/designs/ddev-darklogo/home/throw-pillow)pillowcase if you desire.
* F.A.S.T. stroke detection
  * F = Face drooping
  * A = Arm weakness
  * S = Speech issues/difficulties
  * T = time to call 911

<img src="https://mintcdn.com/upsun-c9761871/OR9CPqO13fyi9LoK/images/posts/unknown/drupal-camp-florida-2024/2_Photo_54df275074.webp?fit=max&auto=format&n=OR9CPqO13fyi9LoK&q=85&s=b1f27c039861114c6405871e40770007" alt="" width="4000" height="3000" data-path="images/posts/unknown/drupal-camp-florida-2024/2_Photo_54df275074.webp" />

I'd like to thank all the organizers of DrupalCamp Florida again for putting together a well-orchestrated conference and a solid line-up of presenters and presentations. I hope I'm able to join you again next year!
