<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Eric Portis</title>
    <description>The latest articles on Forem by Eric Portis (@ericportis).</description>
    <link>https://forem.com/ericportis</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3642042%2Faf3bae2d-213a-453e-b88c-624ded5d51af.jpg</url>
      <title>Forem: Eric Portis</title>
      <link>https://forem.com/ericportis</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ericportis"/>
    <language>en</language>
    <item>
      <title>Ship Your Next Great Web App in Record Time with create-cloudinary-react</title>
      <dc:creator>Eric Portis</dc:creator>
      <pubDate>Tue, 07 Apr 2026 19:53:07 +0000</pubDate>
      <link>https://forem.com/cloudinary/ship-your-next-great-web-app-in-record-time-with-create-cloudinary-react-2coa</link>
      <guid>https://forem.com/cloudinary/ship-your-next-great-web-app-in-record-time-with-create-cloudinary-react-2coa</guid>
      <description>&lt;p&gt;Over the past year or two, we've been having a lot of conversations about the future of Cloudinary's &lt;a href="https://www.cloudinary.dev" rel="noopener noreferrer"&gt;Libraries&lt;/a&gt; and &lt;a href="https://cloudinary.com/documentation/cloudinary_sdks" rel="noopener noreferrer"&gt;SDKs&lt;/a&gt;. The conversations have been wide-ranging: the future of front-end frameworks, coding, and AI. It's all been a bit dizzying, and hard to wrap our heads around.&lt;/p&gt;

&lt;p&gt;Late last year, my colleague Raya Straus brought us back down to earth with some good old-fashioned user research. By engaging users in conversations about their current day-to-day experiences, Raya got us to stop worrying about the future, and start thinking about ways we could make developers more successful with Cloudinary &lt;em&gt;right now.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We released the first fruit of Raya's research last month: &lt;a href="https://github.com/cloudinary-devs/create-cloudinary-react" rel="noopener noreferrer"&gt;Cloudinary's React Starter Kit&lt;/a&gt;. If you're building a green-field, media-focused React app, and you're using LLM-powered development tools, we think &lt;code&gt;npx create-cloudinary-react&lt;/code&gt; is the best way to get started.&lt;/p&gt;

&lt;p&gt;Before we get into what it is, let's talk about how and why we built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Learned From React SDK User Research
&lt;/h2&gt;

&lt;p&gt;We limited our research scope to two of our most popular SDKs: &lt;a href="https://cloudinary.com/documentation/react_integration" rel="noopener noreferrer"&gt;React&lt;/a&gt; and &lt;a href="https://next.cloudinary.dev" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt;. We looked at every piece of user feedback for those two SDKs that we could find: support tickets, GitHub issues, chat transcripts, survey responses, and even a number of individual conversations held over email and Zoom, after we reached out to top SDK users.&lt;/p&gt;

&lt;p&gt;Once we'd collected and digested it all, three things stuck out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Many developers struggle to &lt;em&gt;get started&lt;/em&gt;. The least fun part of any development project is setting up a working development environment; a handful of common config problems are tripping up many developers before they can take their first steps with Cloudinary.&lt;/li&gt;
&lt;li&gt;Once set up, features that solve common use cases were straightforward and people were quickly successful. Cloudinary and our SDKs do a great job of solving common use cases with a minimum of fuss. Great!&lt;/li&gt;
&lt;li&gt;But once use cases get more advanced, developers start to struggle again. Cloudinary is a mature product, and &lt;em&gt;can&lt;/em&gt; do &lt;em&gt;all sorts of things&lt;/em&gt;, but advanced features are more complicated to use. Niche functionality often has fiddlier syntax, less clear error messages, and trickier-to-find documentation. So even though the features are there, developers run into walls when trying to use them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyr2nrznnt15tjvhphsy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyr2nrznnt15tjvhphsy.png" alt="A line chart. The x axis is labelled, " width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How the React Starter Kit Works
&lt;/h2&gt;

&lt;p&gt;So, the question we ended up with, was: How can we help developers who are just getting started with Cloudinary, &lt;em&gt;and&lt;/em&gt; folks with complex use cases?&lt;/p&gt;

&lt;p&gt;We think we can address both with one new tool: &lt;code&gt;npx create-cloudinary-react&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Type that into a terminal near you and you'll be led through a wizard, which will ask you a few questions about your environment. Then, &lt;em&gt;it&lt;/em&gt; will spin up a working React project for you, using Vite as a build tool, and handle all of the configuration that people who are just starting to use Cloudinary with React so often get stuck on. The resulting project starts with a simple, one-page website that accepts and displays user-generated image uploads.&lt;/p&gt;

&lt;p&gt;In addition to doing basic configuration, the wizard &lt;em&gt;also&lt;/em&gt; installs &lt;a href="https://cloudinary.com/documentation/cloudinary_llm_mcp" rel="noopener noreferrer"&gt;Cloudinary's LLM-specific tools&lt;/a&gt;, and puts &lt;a href="https://github.com/cloudinary-devs/create-cloudinary-react/blob/main/templates/.cursorrules.template" rel="noopener noreferrer"&gt;a bunch of rules and troubleshooting guidance to help LLMs with Cloudinary's APIs&lt;/a&gt; wherever your particular LLM-powered coding environment looks for context.&lt;/p&gt;

&lt;p&gt;We derived these rules from our user research, by feeding all of the feedback we received about using Cloudinary's React SDK into an LLM and asking it to write rules to address that feedback. From there, we refined, added, and subtracted rules based on our experiences of using and helping other folks use Cloudinary.&lt;/p&gt;

&lt;p&gt;Those rules, in addition to our other LLM-specific tools, significantly improve LLMs' results when prompted with complex tasks.  To show off those capabilities, the initial built project offers a handful of example prompts which you can copy, paste into your agent, and hit the ground running.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;create-cloudinary-react&lt;/code&gt;, we believe we've built something that helps &lt;em&gt;everyone&lt;/em&gt; get started, and &lt;em&gt;also&lt;/em&gt; helps folks who have gone beyond common use cases use all of the nooks and crannies of Cloudinary's extensive feature set. &lt;/p&gt;

&lt;h2&gt;
  
  
  See the React Starter Kit in Action
&lt;/h2&gt;

&lt;p&gt;Here's &lt;code&gt;create-cloudinary-react&lt;/code&gt; in action:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/gmzYabZFUHo"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How the React Starter Kit performed at Hack Canada 2026
&lt;/h2&gt;

&lt;p&gt;After a few rounds of internal development and testing, we soft-launched the React Starter Kit a few weeks ago -- just before we participated as a sponsor in this year's &lt;a href="https://hackcanada.org/" rel="noopener noreferrer"&gt;Hack Canada&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;A hackathon is a perfect environment for this kind of tool, and the results blew us away. Participants leveraged the Starter Kit to produce some &lt;a href="https://hack-canada-2026.devpost.com/submissions/search?utf8=%E2%9C%93&amp;amp;prize_filter%5Bprizes%5D%5B%5D=97781" rel="noopener noreferrer"&gt;truly incredible projects&lt;/a&gt;, and cited &lt;code&gt;create-cloudinary-react&lt;/code&gt; as part of their success.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ERRFRz6LQZs"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/pJzrU2F_3r8"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/A5McD0WwqzM"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;That was all the validation we needed to add a &lt;a href="https://cloudinary.com/documentation/react_starter_kit" rel="noopener noreferrer"&gt;React Starter Kit walk through to our documentation&lt;/a&gt; and announce it in this very blog post.&lt;/p&gt;

&lt;p&gt;So, go! &lt;a href="https://github.com/cloudinary-devs/create-cloudinary-react" rel="noopener noreferrer"&gt;Try it out!&lt;/a&gt; And tell us what you think in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>react</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Hacktoberfest as a First-Time Maintainer</title>
      <dc:creator>Eric Portis</dc:creator>
      <pubDate>Fri, 19 Dec 2025 20:02:29 +0000</pubDate>
      <link>https://forem.com/cloudinary/hacktoberfest-as-a-first-time-maintainer-2pkn</link>
      <guid>https://forem.com/cloudinary/hacktoberfest-as-a-first-time-maintainer-2pkn</guid>
      <description>&lt;p&gt;Earlier this year, I took over maintenance duties on &lt;a href="https://github.com/cloudinary-community" rel="noopener noreferrer"&gt;Cloudinary's Community Libraries&lt;/a&gt;. Fast forward a few months, and my team was gearing up to participate in Digital Ocean's annual &lt;a href="https://hacktoberfest.com" rel="noopener noreferrer"&gt;Hacktoberfest&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Reader, I was worried.&lt;/p&gt;

&lt;p&gt;I was still very much familiarizing myself with how the libraries worked, and trying to wrap my head around their issue backlogs. And while I'd never participated in a Hacktoberfest in any capacity before, I had read some &lt;a href="https://joel.net/how-one-guy-ruined-hacktoberfest2020-drama" rel="noopener noreferrer"&gt;scary&lt;/a&gt; &lt;a href="https://domenic.me/hacktoberfest/" rel="noopener noreferrer"&gt;things&lt;/a&gt; from other maintainers, who complained of an annual avalanche of spam.&lt;/p&gt;

&lt;p&gt;What’s worse than an avalanche? A &lt;em&gt;turbo&lt;/em&gt;-avalanche powered by the recent explosion of AI-powered coding tools. As September drew to a close, I imagined hundreds of AI-written PRs coming in, each hundreds of lines long, all based on prompts that poorly understood the underlying issues, containing code that the submitters themselves didn't understand, but which we would be expected to review.&lt;/p&gt;

&lt;p&gt;The good news: It wasn't that bad. While the underlying incentive structures of Hacktoberfest &lt;em&gt;did&lt;/em&gt; generate some spam, and while almost all of that spam smelled like AI, our team was able to get ahead of many problems with strong policies, and would have been able to prevent many more with a bit of additional preparation and planning. &lt;/p&gt;

&lt;p&gt;The worst PRs were about as bad as I expected, but there weren't as many of them as I'd feared, and the best PRs were actually, &lt;em&gt;dare I say&lt;/em&gt;, really good? Hackathon participants tackled some of the issues I'd been putting off addressing for months, helping me push the libraries forward.&lt;/p&gt;

&lt;p&gt;All in all, while participation as a maintainer did take a &lt;em&gt;lot&lt;/em&gt; of time (and we're in active discussions about whether or not we want to participate next year), it also provided some tangible value, without overwhelming us. And hopefully it helped some folks get more comfortable with the mechanics of open source along the way.&lt;/p&gt;

&lt;p&gt;If you're thinking about participating as a maintainer in years to come, read on to learn about what worked for us — and what didn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Narrowing Scope
&lt;/h2&gt;

&lt;p&gt;The &lt;em&gt;best&lt;/em&gt; decision we made was to limit participation to fixes for a specific set of existing issues, which we identified with a &lt;code&gt;Hacktoberfest&lt;/code&gt; tag. This addressed a few issues:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We had a clear mandate to quickly close any drive-by, low-value PRs (e.g. "improve docs").&lt;/li&gt;
&lt;li&gt;We could spend our time during Hacktoberfest reviewing PRs rather than trying to reproduce new issues or define new features.&lt;/li&gt;
&lt;li&gt;We could further limit contributions to issues whose fixes would be reasonably straightforward, allowing for quick reviews.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It was a good theory! In practice, we applied the &lt;code&gt;Hacktoberfest&lt;/code&gt; tag fairly liberally, and &lt;em&gt;did&lt;/em&gt; spend some time reproducing issues, specifying new features, and reviewing complex PRs. This led to a lot of work and some very long review delays.&lt;/p&gt;

&lt;p&gt;We weren't stingy enough with the tag because we set a goal for how many contributions we wanted to accept by the end of the month, &lt;em&gt;up front&lt;/em&gt;, and tagged that many issues, rather than seeing how many issues were going to be a good fit for Hacktoberfest first, and using &lt;em&gt;that&lt;/em&gt; number to set the goal.&lt;/p&gt;

&lt;p&gt;We had good reasons to set a number ahead of time. For one, it's always good to define a success metric up front so that you can quantify (and communicate) success or failure; we set the quota based on the number of successful submissions that we received in &lt;a href="https://cloudinary.com/blog/hacktoberfest-open-source-celebration-cloudinary" rel="noopener noreferrer"&gt;2024&lt;/a&gt;?utm_source=dev-dot-to&amp;amp;utm_content=hacktoberfest2025). For two, we were offering our own swag (a plushie Cloudinary unicorn) to contributors of accepted PRs, and it's best to know how many of those you're going to need well ahead of time.&lt;/p&gt;

&lt;p&gt;The end result, though, was a &lt;code&gt;Hacktoberfest&lt;/code&gt; tag on a number of issues that I only poorly or vaguely understood, which came back to bite us later.&lt;/p&gt;

&lt;p&gt;Knowing that we had a quota to hit did motivate me to do one good thing; I did a full docs review and identified and filed a handful of minor issues, which would be easy to fix and review. It would have been much (much!) faster to fix these myself, as soon as I identified them, but:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I wouldn't have done the docs review without Hacktoberfest.&lt;/li&gt;
&lt;li&gt;One of the best things Hacktoberfest does is invite people who are new to open source to learn the mechanics of it. In some ways, it doesn't matter what the contributions are, as long as new contributors are "getting their feet wet" forking, committing, PRing, and responding to feedback.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, the stage was set. As October came around, the PRs started to come in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hacktoberfest Begins
&lt;/h2&gt;

&lt;p&gt;Most of the PRs we received for the month came in during the first week. People were also very good at identifying which issues would be easiest to fix. All of my "easy" issues were taken off of the board immediately. We received a number of the predicted nonsensical drive-bys that were easy to close, but after that, it was time to chew through dozens of substantive PRs.&lt;/p&gt;

&lt;p&gt;It wasn't long before I started to regret that we'd applied the tag to some poorly defined and understood issues. The most embarrassing of these was: Someone submitted a "fix" for an issue, but their changes seemed unrelated to the problem at hand. Turns out, the issue had &lt;em&gt;already&lt;/em&gt; been fixed a year ago, as part of a much broader update, but the issue was never closed. My guess at what happened is that the submitter fed the issue into Cursor, which, being asked to solve a solved problem, did its best.&lt;/p&gt;

&lt;p&gt;It was clear that many submissions were created with the help of AI. It was also clear — both in the initial PRs that came in and in the reviews and discussions that followed — that the humans behind these submissions had varying levels of understanding of what they were trying to accomplish, and how their PRs were accomplishing it. The more understanding they had, the better things went. A number of follow-up conversations — where we tried to clarify the issue or suggest possible alternate paths forward — went nowhere, leading to closed PRs and wasted time on both sides.&lt;/p&gt;

&lt;p&gt;However, the quality of the highest-quality submissions was well beyond my expectations. A handful of contributors clearly understood the underlying frameworks better than I do, and took the time to suggest thoughtful solutions to nuanced problems that we hadn't yet been able to tackle. I'm extremely grateful for their time and effort, which was worth far more than a unicorn plushie and a Digital Ocean T-shirt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overwhelmed, but Just a Little
&lt;/h2&gt;

&lt;p&gt;Because a number of the issues turned out to be rather thorny (and because I and the other technical reviewers had more to do in October than review Hacktoberfest PRs), review times stretched to weeks, which I know was frustrating for contributors. In a couple of cases, we were not able to either accept or reject PRs before the November 15 deadline. We sent those contributors a unicorn anyway, but if the real purpose of Hacktoberfest is to familiarize folks with the mechanics of open source, learning that things are surprisingly complicated and your code might never land isn't a great lesson. Again, I wish we'd been a little more careful about which issues we invited people to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worth It?
&lt;/h2&gt;

&lt;p&gt;From Cloudinary's side, it's hard to measure the value of a thing like Hacktoberfest. Our community library docs are in better shape now, and dozens of small fixes that would have been easy to put off have now been done. In addition, we made real progress on a handful of meaty issues that I'd been putting off tackling for months. And, hopefully, the participants are more familiar with Cloudinary and our SDKs, and are more likely to use us as they continue to build and grow their careers.&lt;/p&gt;

&lt;p&gt;At the same time, the slow (and in a couple of cases, unresolved) reviews may have had the opposite effect, driving participants away. And the cost in time to Cloudinary was real, as we prioritized Hacktoberfest work over other projects in October and November.&lt;/p&gt;

&lt;p&gt;Personally, I'm definitely glad I did it, once. Whether we as a company decide to do it again next year remains to be seen.&lt;/p&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Cloudinary ❤️ developers&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ready to level up your media workflow? Start using Cloudinary for free and build better visual experiences today.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👉 &lt;strong&gt;&lt;a href="https://cloudinary.com/users/register_free?utm_campaign=4870-&amp;amp;utm_medium=employee_referral&amp;amp;utm_source=dev-dot-to&amp;amp;utm_content=hacktoberfest-maintainer" rel="noopener noreferrer"&gt;Create your free account&lt;/a&gt;&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>community</category>
    </item>
  </channel>
</rss>
