<?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>DEV Community: Elsie Rainee</title>
    <description>The latest articles on DEV Community by Elsie Rainee (@elsie-rainee).</description>
    <link>https://dev.to/elsie-rainee</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3662727%2F81e5992b-2f17-4e27-872c-739ffdeaa2a0.png</url>
      <title>DEV Community: Elsie Rainee</title>
      <link>https://dev.to/elsie-rainee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/elsie-rainee"/>
    <language>en</language>
    <item>
      <title>Website Security Best Practices Every Business Should Know in 2026</title>
      <dc:creator>Elsie Rainee</dc:creator>
      <pubDate>Tue, 27 Oct 2026 10:56:24 +0000</pubDate>
      <link>https://dev.to/elsie-rainee/website-security-best-practices-every-business-should-know-in-2026-1cea</link>
      <guid>https://dev.to/elsie-rainee/website-security-best-practices-every-business-should-know-in-2026-1cea</guid>
      <description>&lt;p&gt;Most website breaches do not start with a clever zero-day exploit. They start with an outdated plugin, a reused admin password, or a form that trusts whatever a visitor types into it. In 2026, attackers use automation to scan thousands of sites an hour, so a small gap gets found quickly, whether you run a five-page brochure site or a customer portal.&lt;br&gt;
This guide covers the practical security steps every business should have in place this year, from access control and updates to monitoring, plus a closer look at what regulated industries need to get right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Website Security Needs a Fresh Look in 2026
&lt;/h2&gt;

&lt;p&gt;Three things have changed. Sites now depend on far more third-party code than they did a few years ago, including plugins, scripts, analytics tags, payment widgets, and AI chat tools. Every one of them is a door into your site. Attackers also use AI to write convincing phishing messages and to probe for weaknesses faster. And customers expect more: a browser warning or a breach notice can cost you trust that took years to build.&lt;br&gt;
The good news is that the fundamentals still work. Businesses that handle the basics well avoid most of the damage.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Lock Down Access Control and Authentication
&lt;/h2&gt;

&lt;p&gt;Broken access control sits at the top of most security risk rankings for a reason. It happens when a user can see or change something they should not be able to.&lt;br&gt;
Start with these steps:&lt;br&gt;
• Require multi-factor authentication for every admin, editor, and hosting account.&lt;br&gt;
• Use a password manager and ban reused or shared passwords.&lt;br&gt;
• Give each person the lowest level of access they need to do their job.&lt;br&gt;
• Remove accounts for former employees and agencies the same day they leave.&lt;br&gt;
• Rename or protect default login URLs and limit login attempts.&lt;/p&gt;

&lt;p&gt;Takeaway: If one stolen password can take down your site, your access setup is too loose.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Keep Software, Plugins, and Dependencies Current
&lt;/h2&gt;

&lt;p&gt;Outdated software remains one of the easiest ways in. This covers your CMS, themes, plugins, server software, and any code libraries your developers rely on.&lt;br&gt;
Supply chain risk deserves special attention. The &lt;a href="https://top10.owasp.org/2025/" rel="noopener noreferrer"&gt;OWASP Top 10&lt;/a&gt; for 2025 lists software supply chain failures among its most critical web application risks, which shows how much damage one compromised dependency can cause. Treat every plugin and package as code you are responsible for.&lt;br&gt;
A workable routine looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keep an inventory of every plugin, library, and third-party script on your site.&lt;/li&gt;
&lt;li&gt;Apply security patches within days, not months.&lt;/li&gt;
&lt;li&gt;Delete anything you no longer use. Unused plugins still count as attack surface.&lt;/li&gt;
&lt;li&gt;Test updates on a staging copy before pushing them live.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  3. Enforce HTTPS, Modern TLS, and Security Headers
&lt;/h2&gt;

&lt;p&gt;HTTPS is the minimum, not a bonus. Make sure every page loads over a valid certificate, redirect all HTTP traffic, and disable old TLS versions.&lt;br&gt;
Then add security headers, which tell browsers how to behave when loading your pages:&lt;br&gt;
• Strict-Transport-Security (HSTS) forces secure connections.&lt;br&gt;
• Content-Security-Policy (CSP) limits which scripts and resources can run, which blunts cross-site scripting.&lt;br&gt;
• X-Frame-Options or the frame-ancestors directive prevents clickjacking.&lt;br&gt;
• Referrer-Policy controls how much URL data you share with other sites.&lt;br&gt;
Free scanners can grade your headers in a minute, so there is little reason to skip this step.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Add a Web Application Firewall and Rate Limiting
&lt;/h2&gt;

&lt;p&gt;A web application firewall (WAF) filters malicious traffic before it reaches your site. It blocks common attack patterns such as SQL injection and bot floods. Pair it with rate limiting so a single source cannot hammer your login page or search function.&lt;br&gt;
A WAF is not a substitute for patching. It buys you time and reduces noise, but a vulnerable site behind a firewall is still a vulnerable site.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Secure Forms, APIs, and User Input
&lt;/h2&gt;

&lt;p&gt;Anything that accepts input is a possible entry point. That includes contact forms, search boxes, file uploads, and the APIs behind your mobile app.&lt;br&gt;
• Validate and sanitize input on the server, never only in the browser.&lt;br&gt;
• Use parameterized queries to stop SQL injection.&lt;br&gt;
• Restrict upload file types and scan files before storing them.&lt;br&gt;
• Authenticate every API request and return only the data the caller is allowed to see.&lt;br&gt;
• Add bot protection to forms to cut spam and credential stuffing.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Back Up, Log, and Monitor
&lt;/h2&gt;

&lt;p&gt;Prevention will never be perfect, so plan for recovery. Keep automatic backups stored away from your main server, and test a restore at least twice a year. A backup you have never restored is a guess.&lt;br&gt;
Logging matters just as much. Record logins, permission changes, and failed requests, then set alerts for unusual activity such as logins from new countries or sudden file changes. Many breaches run for weeks before anyone notices, and good logs shorten that window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Secure Website Design for Financial Institutions
&lt;/h2&gt;

&lt;p&gt;Banks, lenders, insurers, and fintech companies hold the data attackers want most, so they face stricter expectations. &lt;a href="https://wpwebinfotech.com/web-design/finance/" rel="noopener noreferrer"&gt;Secure website design for financial&lt;/a&gt; institutions starts at the planning stage rather than at launch, and it usually includes the following:&lt;br&gt;
• Security built into the design. Authentication flows, session timeouts, and transaction confirmations are designed alongside the interface, not added later.&lt;br&gt;
• Strong customer authentication. Multi-factor login, biometric options, and step-up verification for sensitive actions like adding a payee or changing contact details.&lt;br&gt;
• Strict data handling. Encrypt data in transit and at rest, collect only what you need, and mask sensitive values on screen.&lt;br&gt;
• Clear fraud warnings. Interface cues that help customers spot phishing and fake support requests.&lt;br&gt;
• Compliance mapped from day one. Depending on region, this can involve PCI DSS, GDPR, or local banking regulations. Document how each requirement is met.&lt;br&gt;
• Independent testing. Regular penetration tests and code reviews by outside specialists.&lt;/p&gt;

&lt;p&gt;Good security design should not make the experience painful. The best financial sites make the safe path the easy path, with short, clear steps and plain language when something looks risky.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future of Web Design Is Security-Aware
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.webdesignerhub.org/future-of-web-design/" rel="noopener noreferrer"&gt;Future of Web Design&lt;/a&gt; is not only about layout trends and animation. Security is becoming a core design discipline, and designers now work alongside security teams from the first wireframe.&lt;br&gt;
A few shifts are worth watching:&lt;br&gt;
• Passwordless login. Passkeys and biometrics are replacing passwords, which removes the most common point of failure.&lt;br&gt;
• Privacy-first interfaces. Clear consent controls and less data collection are becoming design expectations, not legal afterthoughts.&lt;br&gt;
• Fewer third-party scripts. Teams are trimming bloated tag stacks for speed and for safety.&lt;br&gt;
• AI features with guardrails. Chatbots and personalization tools need limits on what data they can read and show.&lt;br&gt;
• Security as a trust signal. Visible cues, such as clear login alerts and transparent privacy settings, help users feel safe and stay loyal.&lt;/p&gt;

&lt;p&gt;Businesses that treat design and security as one process will ship faster and fix fewer problems after launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Website Security Checklist for 2026
&lt;/h2&gt;

&lt;p&gt;• Multi-factor authentication on every admin and hosting account&lt;br&gt;
• Plugins, themes, and libraries updated and unused ones removed&lt;br&gt;
• HTTPS with HSTS and a content security policy in place&lt;br&gt;
• WAF and rate limiting active&lt;br&gt;
• Input validation and bot protection on all forms and APIs&lt;br&gt;
• Offsite backups with a tested restore&lt;br&gt;
• Logging and alerts for unusual activity&lt;br&gt;
• A written incident response plan with named owners&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQs
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;What is the most common cause of website hacks? &lt;br&gt;
Outdated software and weak or stolen credentials account for a large share of incidents. Patching quickly and enforcing multi-factor authentication closes most of those gaps.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How often should a business run a security audit? &lt;br&gt;
At least once a year, and after any major redesign, platform change, or new integration. Higher-risk sites, such as those handling payments, benefit from more frequent testing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do small businesses really get targeted? &lt;br&gt;
Yes. Automated tools scan the web for known weaknesses regardless of company size, so small sites are often hit simply because they are easier to break into.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is HTTPS enough to keep a website secure? &lt;br&gt;
No. HTTPS protects data in transit, but it does not stop weak passwords, vulnerable plugins, or insecure forms.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Website security in 2026 comes down to steady habits: tight access, fast updates, safe input handling, solid backups, and active monitoring. Regulated sectors need to go further, and the Future of Web Design points toward teams that build security into the experience from the start. Pick two or three items from the checklist, finish them this week, and work through the rest on a schedule.&lt;/p&gt;

</description>
      <category>website</category>
      <category>discuss</category>
    </item>
    <item>
      <title>🤖 Is AI consulting really worth the investment, or is it just prompt engineering wrapped in a bigger invoice? Explore the difference between AI hype and practical business value, from strategy to implementation and measurable outcomes.</title>
      <dc:creator>Elsie Rainee</dc:creator>
      <pubDate>Tue, 27 Oct 2026 08:54:29 +0000</pubDate>
      <link>https://dev.to/elsie-rainee/is-ai-consulting-really-worth-the-investment-or-is-it-just-prompt-engineering-wrapped-in-a-11el</link>
      <guid>https://dev.to/elsie-rainee/is-ai-consulting-really-worth-the-investment-or-is-it-just-prompt-engineering-wrapped-in-a-11el</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/wpwebinfotech/is-ai-consulting-just-prompt-engineering-with-a-bigger-invoice-43df" class="crayons-story__hidden-navigation-link"&gt;Is AI Consulting Just Prompt Engineering With a Bigger Invoice?&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/wpwebinfotech"&gt;
            &lt;img alt="WPWeb Infotech logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F14426%2F32335932-3225-4d21-ba3d-648400eade65.png" class="crayons-logo__image" width="273" height="251"&gt;
          &lt;/a&gt;

          &lt;a href="/elsie-rainee" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3662727%2F81e5992b-2f17-4e27-872c-739ffdeaa2a0.png" alt="elsie-rainee profile" class="crayons-avatar__image" width="288" height="288"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/elsie-rainee" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Elsie Rainee
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Elsie Rainee
                
                
              
              &lt;div id="story-author-preview-content-4926994" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/elsie-rainee" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3662727%2F81e5992b-2f17-4e27-872c-739ffdeaa2a0.png" class="crayons-avatar__image" alt="" width="288" height="288"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Elsie Rainee&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/wpwebinfotech" class="crayons-story__secondary fw-medium"&gt;WPWeb Infotech&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/wpwebinfotech/is-ai-consulting-just-prompt-engineering-with-a-bigger-invoice-43df" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 27&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/wpwebinfotech/is-ai-consulting-just-prompt-engineering-with-a-bigger-invoice-43df" id="article-link-4926994"&gt;
          Is AI Consulting Just Prompt Engineering With a Bigger Invoice?
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/career"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;career&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/wpwebinfotech/is-ai-consulting-just-prompt-engineering-with-a-bigger-invoice-43df" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/wpwebinfotech/is-ai-consulting-just-prompt-engineering-with-a-bigger-invoice-43df#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Is AI Consulting Just Prompt Engineering With a Bigger Invoice?</title>
      <dc:creator>Elsie Rainee</dc:creator>
      <pubDate>Tue, 27 Oct 2026 08:50:38 +0000</pubDate>
      <link>https://dev.to/wpwebinfotech/is-ai-consulting-just-prompt-engineering-with-a-bigger-invoice-43df</link>
      <guid>https://dev.to/wpwebinfotech/is-ai-consulting-just-prompt-engineering-with-a-bigger-invoice-43df</guid>
      <description>&lt;p&gt;A few months ago, a friend showed me a proposal he'd received from an "AI transformation agency." Forty pages, a beautiful deck, and a five-figure monthly retainer. When he asked what they'd actually build, the answer boiled down to: "We'll craft custom prompts for your workflows."&lt;/p&gt;

&lt;p&gt;He looked at me and asked the question in the title.&lt;/p&gt;

&lt;p&gt;It's a fair question, and I don't think the answer is a clean yes or no. Some &lt;a href="https://wpwebinfotech.com/ai/" rel="noopener noreferrer"&gt;AI business consulting services&lt;/a&gt; really are prompt engineering in a nicer blazer. Others are the difference between a demo that wows a boardroom and a system that survives contact with production. The trick is knowing which one you're looking at, whether you're buying it or selling it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cynical case
&lt;/h2&gt;

&lt;p&gt;Let's give the skeptics their due, because they've got a point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The barrier to entry is almost zero.&lt;/strong&gt; Anyone can open a chat window and get a decent result. That's the whole appeal of LLMs. So when a consultant says "I'll write you a great prompt," the client's natural thought is: couldn't I do that?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Prompts are not a moat.&lt;/strong&gt; A well-written system prompt is a few hundred words. It's easy to copy, easy to leak, and often obsolete after the next model update. Charging enterprise rates for something a motivated intern could reproduce in an afternoon is a hard sell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. A lot of the work is repackaged hype.&lt;/strong&gt; "AI strategy," "readiness assessments," and "transformation roadmaps" can be the same slide deck with the logo swapped. If a deliverable could have been produced without ever looking at your data, your codebase, or your team, be suspicious.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Incentives are misaligned.&lt;/strong&gt; Billable hours reward complexity. A consultant who tells you "a single API call and a good template will do" has just talked themselves out of a contract.&lt;/p&gt;

&lt;p&gt;If that were the whole story, the answer would be an easy yes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the cynics miss
&lt;/h2&gt;

&lt;p&gt;Prompting is the visible 10% of a useful AI system. The other 90% is boring, unglamorous, and hard to do well.&lt;/p&gt;

&lt;p&gt;Here's what that 90% looks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data access and quality.&lt;/strong&gt; Where does the context come from? Is it clean, current, permissioned? Most "the AI is dumb" complaints are really "the AI was given garbage."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluation.&lt;/strong&gt; How do you know the system works? "It looked good in five examples" is not an answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration.&lt;/strong&gt; Getting a model's output into your CRM, ticketing system, or deploy pipeline without breaking anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failure handling.&lt;/strong&gt; What happens when the model is confidently wrong, the API times out, or a user pastes in something adversarial?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost and latency.&lt;/strong&gt; The prototype that costs 40 cents per request is a different product from the one you can afford at 100,000 requests a day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;People and process.&lt;/strong&gt; Who reviews the output? Who owns it when it breaks? Do the humans who are supposed to use it actually trust it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that is &lt;a href="https://cloud.google.com/discover/what-is-prompt-engineering" rel="noopener noreferrer"&gt;prompt engineering&lt;/a&gt;. All of it determines whether the project ships.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test that separates real from fake
&lt;/h2&gt;

&lt;p&gt;If I had to pick one practice that divides serious AI work from theater, it's this: &lt;strong&gt;do they build evaluations before they tune anything?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's the idea in a few lines of Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;test_cases&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_labeled_examples&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;support_tickets.jsonl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run_eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_version&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;test_cases&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;call_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt_version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;expected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;v1:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;run_eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;v2:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;run_eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt_v2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the whole concept: a set of real examples, a scoring function, and a number that goes up or down when you change something. Without it, "improving" a prompt is guesswork dressed as craft. With it, you can say "we moved accuracy on your real tickets from 71% to 89%, and here's the regression we caught along the way."&lt;/p&gt;

&lt;p&gt;A consultant who builds this has left you with an asset. A consultant who only hands you a prompt document has left you with a text file.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to evaluate AI business consulting services before you sign
&lt;/h2&gt;

&lt;p&gt;Whether you're a client or a developer weighing a consulting gig, these five questions cut through the fog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What will exist when you leave?&lt;/strong&gt; Code, eval suites, runbooks, trained staff, or just a PDF?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How will we measure success?&lt;/strong&gt; If the answer isn't a metric tied to your business, keep looking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Will you work with our real data?&lt;/strong&gt; Generic demos prove nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's the plan when the model changes?&lt;/strong&gt; Models get deprecated and updated. Good systems are designed for that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What would make you recommend we &lt;em&gt;not&lt;/em&gt; do this?&lt;/strong&gt; Honest consultants have a list. Salespeople don't.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last one is my favorite. The best advice I ever saw from a consultant was "don't use an LLM here, a regex and a lookup table will beat it." It cost the client nothing to implement, and it earned the consultant a long-term relationship.&lt;/p&gt;

&lt;h2&gt;
  
  
  So where does the bigger invoice come from?
&lt;/h2&gt;

&lt;p&gt;When the price of AI business consulting services is justified, it's usually paying for some mix of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pattern recognition.&lt;/strong&gt; Someone who has seen twenty RAG pipelines fail knows the twenty ways they fail. You're buying the shortcut around those mistakes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed.&lt;/strong&gt; An internal team learning this from scratch might take six months to reach what an experienced person does in six weeks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accountability.&lt;/strong&gt; Having a named person responsible for outcomes changes how decisions get made.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Political cover.&lt;/strong&gt; Sometimes the real job is helping an organization agree on a direction. That's legitimate, but it should be priced and described honestly, not hidden inside "AI engineering."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And when the price &lt;em&gt;isn't&lt;/em&gt; justified, it's usually because none of the above is present. It's a prompt library, a workshop, and a slide deck.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note for developers thinking about consulting
&lt;/h2&gt;

&lt;p&gt;If you're a dev considering this path, the market is sending a clear signal: &lt;strong&gt;don't sell prompts, sell outcomes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prompting is table stakes. What clients struggle to find is someone who can say "here's the baseline, here's the eval, here's the integration, here's the cost curve, and here's what could go wrong." If you can do that, you're not a prompt engineer with a bigger invoice. You're an engineer who happens to use LLMs, and that's a much more durable position.&lt;/p&gt;

&lt;p&gt;Also, be honest about the cases where AI isn't the answer. It builds trust, and it keeps your reputation intact when the hype cycle cools.&lt;/p&gt;

&lt;h2&gt;
  
  
  The verdict
&lt;/h2&gt;

&lt;p&gt;Is AI consulting just prompt engineering with a bigger invoice?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sometimes, yes.&lt;/strong&gt; When the engagement is vague, undeliverable, and untethered from your data, you're paying a premium for something you could have done yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Often, no.&lt;/strong&gt; When it includes evaluation, integration, cost modeling, and knowledge transfer, the prompt is the smallest part of what you're buying.&lt;/p&gt;

&lt;p&gt;The practical rule for any AI business consulting services you're considering: follow the artifacts. If, after the engagement, you can point to code, tests, metrics, and people who know how to run it, you bought engineering. If all you can point to is a document of clever phrasing, you bought a very expensive text file.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you hired &lt;a href="https://www.groovyweb.co/blog/ai-consulting-rates-2026" rel="noopener noreferrer"&gt;AI consultants&lt;/a&gt;, or been one? I'd love to hear what separated the good engagements from the bad ones. Drop your experience in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Does AI Development Need Its Own DevOps? We Built One Anyway</title>
      <dc:creator>Elsie Rainee</dc:creator>
      <pubDate>Mon, 26 Oct 2026 09:14:31 +0000</pubDate>
      <link>https://dev.to/wpwebinfotech/does-ai-development-need-its-own-devops-we-built-one-anyway-i18</link>
      <guid>https://dev.to/wpwebinfotech/does-ai-development-need-its-own-devops-we-built-one-anyway-i18</guid>
      <description>&lt;p&gt;Six months ago, we shipped our first LLM-powered feature the way we ship everything else: pull request, code review, green CI, deploy on a Friday afternoon (yes, I know).&lt;/p&gt;

&lt;p&gt;By Monday, support tickets were stacking up. Nothing had crashed, no alerts had fired, and the service had returned 200s all weekend. The answers were quietly getting worse.&lt;/p&gt;

&lt;p&gt;That weekend taught us something uncomfortable. Our DevOps setup was built to answer “is the service up?”, while AI features need it to answer “is the service right?” Those are very different questions.&lt;/p&gt;

&lt;p&gt;This post covers the pipeline we built to answer the second one, what we got wrong along the way, and whether I think AI work really needs its own flavor of DevOps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why our existing pipeline wasn’t enough
&lt;/h2&gt;

&lt;p&gt;Our team works as an &lt;a href="https://wpwebinfotech.com/ai/development/" rel="noopener noreferrer"&gt;AI development agency&lt;/a&gt;, which means we ship across several client codebases with different models, data, and risk tolerances. That variety exposed the gaps fast. Traditional DevOps quietly assumes a few things that stop being true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic behavior:&lt;/strong&gt; Same input, same output. With LLMs, the same input can produce five slightly different answers, and “correct” is a spectrum.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code is the main artifact:&lt;/strong&gt; In AI features, the prompt, model version, retrieval config, and underlying data matter as much as the code, and changing any of them changes behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failures are loud:&lt;/strong&gt; A broken endpoint pages someone. A degraded answer pages no one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost is predictable:&lt;/strong&gt; With LLMs, a single prompt change can double your token spend overnight.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this means DevOps is wrong. It means the definition of done has to expand.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built
&lt;/h2&gt;

&lt;p&gt;We ended up with five layers. Nothing exotic, mostly existing tools wired together with a different mindset.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Prompts and configs as versioned artifacts
&lt;/h3&gt;

&lt;p&gt;Every prompt, model name, temperature, and retrieval setting lives in the repo as config, not as a string buried in a function. Each release gets a version tag, and every request logs which version served it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ai-config/support-bot.yaml&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2.4.1&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;primary-model-v3&lt;/span&gt;
&lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.2&lt;/span&gt;
&lt;span class="na"&gt;prompt_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prompts/support_answer.md&lt;/span&gt;
&lt;span class="na"&gt;retrieval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;top_k&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="na"&gt;min_score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.72&lt;/span&gt;
&lt;span class="na"&gt;fallback_model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;small-model-v2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When quality drops, the first question is “what changed?”, and now we can actually answer it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Eval gates in CI
&lt;/h3&gt;

&lt;p&gt;This was the biggest shift. For each feature, we maintain a golden set of 150 to 300 real examples, scored by a mix of exact checks, rule-based checks, and a model-graded rubric. Every PR that touches a prompt, config, or retrieval code runs the suite.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/ai-evals.yml (simplified)&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run eval suite&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python evals/run.py --suite support-bot --min-score 0.88 --max-regression &lt;/span&gt;&lt;span class="m"&gt;0.03&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A PR fails if the overall score drops below the threshold, or if any category regresses by more than three points. It’s like unit tests for judgment. It’s imperfect, but it catches the dumb regressions before users do.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Shadow mode and staged rollouts
&lt;/h3&gt;

&lt;p&gt;New versions first run in shadow mode: they receive real traffic and generate answers, but users only see the current version. We compare outputs offline, then roll out to 5%, 25%, and 100%, with automatic rollback if quality or cost metrics cross a line.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Observability beyond uptime
&lt;/h3&gt;

&lt;p&gt;Alongside latency and error rate, we track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost per request and per user session&lt;/li&gt;
&lt;li&gt;Retrieval quality (did we fetch relevant context at all?)&lt;/li&gt;
&lt;li&gt;Refusal and fallback rates&lt;/li&gt;
&lt;li&gt;User signals: thumbs down, retries, and “talk to a human” clicks.&lt;/li&gt;
&lt;li&gt;Sampled traces reviewed weekly by a real person&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The weekly human review is low-tech and probably the most valuable item on the list. Dashboards tell you that something drifted. Reading 30 real conversations tells you why.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Kill switches and fallbacks
&lt;/h3&gt;

&lt;p&gt;Every AI feature has a feature flag that turns it off in seconds, plus a graceful fallback: a smaller model, a cached answer, or a plain non-AI path. We rehearse flipping the switch the same way you’d rehearse a failover.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we got wrong
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;We over-trusted model-graded evals:&lt;/strong&gt; Our first rubric scored answers on “helpfulness,” and the grader loved long, confident responses. Scores climbed while users got more annoyed. We fixed it by adding rule-based checks and refreshing the golden set with real failures every month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We built too much before measuring:&lt;/strong&gt; Our first version had a custom dashboard nobody opened. Now we start with logs and a spreadsheet, and only build tooling after we’ve felt the pain twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We ignored data drift:&lt;/strong&gt; Retrieval quality decayed as clients’ documents changed. Nothing in our code had changed, but the system got worse anyway.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A friend who works as an &lt;a href="https://www.groovyweb.co/blog/ai-consulting-rates-2026" rel="noopener noreferrer"&gt;AI consultant&lt;/a&gt; put it bluntly when we showed her the first version: “You’ve built CI for code. Where’s CI for reality?” That comment led directly to scheduled eval runs, not just PR-triggered ones, and to the failure-driven golden set.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pipeline’s first real save
&lt;/h2&gt;

&lt;p&gt;Two months later, a client updated their pricing docs. Our scheduled eval run flagged a 9-point drop in the billing category within hours. The cause: retrieval was pulling the old and new pricing pages together, and the model blended them into a confident, wrong answer. We pinned the document version, re-indexed, and the score recovered the same day. Under our old setup, we’d have found out from an angry customer.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, does AI development need its own DevOps?
&lt;/h2&gt;

&lt;p&gt;My honest answer: it needs the same principles with a wider scope.&lt;/p&gt;

&lt;p&gt;The core of DevOps (short feedback loops, automation, shared ownership, observability) still applies. What changes is what you version, what you test, and what you monitor:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traditional DevOps&lt;/th&gt;
&lt;th&gt;AI-Flavored DevOps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Version the code&lt;/td&gt;
&lt;td&gt;Version code, prompts, models, and data configs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unit and integration tests&lt;/td&gt;
&lt;td&gt;Evals with thresholds and regression checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitor uptime and latency&lt;/td&gt;
&lt;td&gt;Monitor quality, cost, and drift&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Roll back a bad deploy&lt;/td&gt;
&lt;td&gt;Roll back a bad deploy or bad model behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postmortem on outages&lt;/td&gt;
&lt;td&gt;Postmortem on quietly wrong answers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Call it &lt;a href="https://www.reddit.com/r/LLMDevs/comments/1hv9mf6/llmops_explained_what_is_it_and_how_is_it/" rel="noopener noreferrer"&gt;LLMOps, MLOps&lt;/a&gt;, or “DevOps done properly for probabilistic systems,” I don’t mind. The label matters less than the habit: never let “it returned a 200” be your definition of working.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you’re starting from zero
&lt;/h2&gt;

&lt;p&gt;You don’t need our whole stack. Start here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Put your prompts and model settings in version control.&lt;/li&gt;
&lt;li&gt;Build a 50-example eval set from real inputs, even if it’s just a spreadsheet.&lt;/li&gt;
&lt;li&gt;Add a feature flag so you can turn the feature off.&lt;/li&gt;
&lt;li&gt;Log cost per request from day one.&lt;/li&gt;
&lt;li&gt;Read 20 real outputs every week.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Over to you
&lt;/h2&gt;

&lt;p&gt;Does your team treat AI features like regular services, or have you built something custom? I’m especially curious how others handle stale eval sets, and whether anyone has found a model-graded rubric they actually trust. Drop your setup in the comments; I’d love to compare notes.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>webdev</category>
      <category>devdiscuss</category>
    </item>
    <item>
      <title>Is open source still truly open when licensing changes affect developers and businesses? I explores the trade-offs behind recent license changes and what they mean for the open-source community. Worth a read! 💻</title>
      <dc:creator>Elsie Rainee</dc:creator>
      <pubDate>Mon, 26 Oct 2026 08:08:50 +0000</pubDate>
      <link>https://dev.to/elsie-rainee/is-open-source-still-truly-open-when-licensing-changes-affect-developers-and-businesses-elsie-2a86</link>
      <guid>https://dev.to/elsie-rainee/is-open-source-still-truly-open-when-licensing-changes-affect-developers-and-businesses-elsie-2a86</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/elsie-rainee/is-open-source-still-open-a-look-at-recent-license-changes-and-who-they-hurt-3ga" class="crayons-story__hidden-navigation-link"&gt;Is Open Source Still Open? A Look at Recent License Changes and Who They Hurt&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/elsie-rainee" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3662727%2F81e5992b-2f17-4e27-872c-739ffdeaa2a0.png" alt="elsie-rainee profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/elsie-rainee" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Elsie Rainee
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Elsie Rainee
                
                
              
              &lt;div id="story-author-preview-content-4920157" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/elsie-rainee" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3662727%2F81e5992b-2f17-4e27-872c-739ffdeaa2a0.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Elsie Rainee&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/elsie-rainee/is-open-source-still-open-a-look-at-recent-license-changes-and-who-they-hurt-3ga" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 26&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/elsie-rainee/is-open-source-still-open-a-look-at-recent-license-changes-and-who-they-hurt-3ga" id="article-link-4920157"&gt;
          Is Open Source Still Open? A Look at Recent License Changes and Who They Hurt
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devdiscuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devdiscuss&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/elsie-rainee/is-open-source-still-open-a-look-at-recent-license-changes-and-who-they-hurt-3ga" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/elsie-rainee/is-open-source-still-open-a-look-at-recent-license-changes-and-who-they-hurt-3ga#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>discuss</category>
      <category>opensource</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Is Open Source Still Open? A Look at Recent License Changes and Who They Hurt</title>
      <dc:creator>Elsie Rainee</dc:creator>
      <pubDate>Mon, 26 Oct 2026 08:04:36 +0000</pubDate>
      <link>https://dev.to/elsie-rainee/is-open-source-still-open-a-look-at-recent-license-changes-and-who-they-hurt-3ga</link>
      <guid>https://dev.to/elsie-rainee/is-open-source-still-open-a-look-at-recent-license-changes-and-who-they-hurt-3ga</guid>
      <description>&lt;p&gt;A few years ago, I checked a dependency’s license once, at install time, and never again. That habit is getting expensive.&lt;/p&gt;

&lt;p&gt;License changes aren’t new, but they’re happening often enough that “it’s open source” is no longer a permanent property of a project. It’s a status that can change between releases.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern is almost always the same.
&lt;/h2&gt;

&lt;p&gt;The shift nearly always runs one way: from an OSI-approved permissive or copyleft license toward a “source-available” license the Open Source Initiative doesn’t recognize as open source.&lt;/p&gt;

&lt;p&gt;The Business Source License (BSL) is the most common destination. It’s a “delayed open source” license: the vendor sets restrictions up front, and each version converts to a true open-source license after a change date, typically four years out.&lt;/p&gt;

&lt;p&gt;It’s not just the famous cases anymore. A few from this year alone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loki Mode moved from the MIT License to BSL 1.1 effective March 19, 2026.&lt;/li&gt;
&lt;li&gt;Unleash announced in June 2026 that its core repository is moving from Apache 2.0 to AGPLv3. AGPL is OSI-approved, so this one is a different kind of change, but it still affects anyone embedding the code.&lt;/li&gt;
&lt;li&gt;MiniMax moved its M2.7 AI model from MIT to a non-commercial license, which drew immediate backlash.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who it actually hurts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1. Small teams and agencies building on top:&lt;/strong&gt; If your product depends on a library that relicenses, you now have three options: pay, migrate, or fork. Big companies have legal teams for that. A five-person shop usually doesn’t.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2. Contributors:&lt;/strong&gt; People gave their time to a project under one set of terms. When the company controlling it changes the rules, the community’s work becomes part of a product they no longer fully share in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3. Downstream projects:&lt;/strong&gt; Plugins, integrations, and tutorials built around a tool inherit the uncertainty when its license shifts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The fair counterargument
&lt;/h2&gt;

&lt;p&gt;I don’t think vendors are simply villains here. Many of these changes were a response to cloud providers selling managed versions of a project without funding it. Maintainers need a sustainable model, and “be open and hope for donations” has a poor track record.&lt;/p&gt;

&lt;p&gt;It’s also not always one-way. Redis is back under a recognized open-source license for those who choose it, while Valkey continues to be actively developed. Competition between the original and the fork may have pushed both toward better outcomes. Broader data also suggests permissive licensing has been rising, so this isn’t a total collapse of open source.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I do now
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Check who controls the project A single company controlling a project can relicense future versions at any time, while a project run by a neutral foundation with many contributing companies is much harder to change.&lt;/li&gt;
&lt;li&gt;Read the license on every major upgrade, not just at install.&lt;/li&gt;
&lt;li&gt;Pin versions so a surprise change doesn’t land in your next deploy.&lt;/li&gt;
&lt;li&gt;Know your exit. Is there a credible fork? A foundation-backed alternative?&lt;/li&gt;
&lt;li&gt;Set up license-change alerts for your critical dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  So, is open source still open?
&lt;/h2&gt;

&lt;p&gt;My honest answer: the code is still often open. The guarantee isn’t. Open source has always depended on trust, and trust now needs a little due diligence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Over to you:&lt;/strong&gt; Has a license change ever forced your team to migrate? Do you think relicensing is a fair business move, or a betrayal of the community that built the project? Tell me in the comments.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>discuss</category>
      <category>devdiscuss</category>
    </item>
    <item>
      <title>🔌 Respan Gateway takes a plugin-first approach to open-source LLM infrastructure. Explore how its architecture handles model routing, fallbacks, and MCP tools, and what this approach means for building flexible, scalable AI systems.</title>
      <dc:creator>Elsie Rainee</dc:creator>
      <pubDate>Mon, 26 Oct 2026 06:41:21 +0000</pubDate>
      <link>https://dev.to/elsie-rainee/respan-gateway-takes-a-plugin-first-approach-to-open-source-llm-infrastructure-explore-how-its-37k5</link>
      <guid>https://dev.to/elsie-rainee/respan-gateway-takes-a-plugin-first-approach-to-open-source-llm-infrastructure-explore-how-its-37k5</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devstackhub/i-explored-respan-gateway-a-plugin-first-open-source-llm-gateway-4d6b" class="crayons-story__hidden-navigation-link"&gt;I Explored Respan Gateway: A Plugin-First, Open-Source LLM Gateway&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/devstackhub/i-explored-respan-gateway-a-plugin-first-open-source-llm-gateway-4d6b" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Born from a 100k-line legacy code nightmare&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/devstackhub" class="crayons-avatar  crayons-avatar--l  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4081963%2F9d10c5fa-c76e-4c9d-88af-e3f2fced5a62.jpg" alt="devstackhub profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/devstackhub" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Dev Stack Hub
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Dev Stack Hub
                
                
              
              &lt;div id="story-author-preview-content-4891117" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/devstackhub" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4081963%2F9d10c5fa-c76e-4c9d-88af-e3f2fced5a62.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Dev Stack Hub&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/devstackhub/i-explored-respan-gateway-a-plugin-first-open-source-llm-gateway-4d6b" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 21&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devstackhub/i-explored-respan-gateway-a-plugin-first-open-source-llm-gateway-4d6b" id="article-link-4891117"&gt;
          I Explored Respan Gateway: A Plugin-First, Open-Source LLM Gateway
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/llm"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;llm&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devstackhub/i-explored-respan-gateway-a-plugin-first-open-source-llm-gateway-4d6b" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;43&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devstackhub/i-explored-respan-gateway-a-plugin-first-open-source-llm-gateway-4d6b#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              46&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            8 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🔐 Still hardcoding your Google Gemini API key? There’s a safer way! Learn how to manage API keys securely across projects, avoid exposing secrets, and keep your development workflow clean. 🚀</title>
      <dc:creator>Elsie Rainee</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:47:20 +0000</pubDate>
      <link>https://dev.to/elsie-rainee/still-hardcoding-your-google-gemini-api-key-theres-a-safer-way-learn-how-to-manage-api-keys-3fb1</link>
      <guid>https://dev.to/elsie-rainee/still-hardcoding-your-google-gemini-api-key-theres-a-safer-way-learn-how-to-manage-api-keys-3fb1</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/wpwebinfotech/stop-hardcoding-your-google-gemini-api-key-heres-the-setup-i-use-for-every-project-3oh6" class="crayons-story__hidden-navigation-link"&gt;Stop Hardcoding Your Google Gemini API Key. Here’s the Setup I Use for Every Project&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/wpwebinfotech"&gt;
            &lt;img alt="WPWeb Infotech logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F14426%2F32335932-3225-4d21-ba3d-648400eade65.png" class="crayons-logo__image" width="273" height="251"&gt;
          &lt;/a&gt;

          &lt;a href="/elsie-rainee" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3662727%2F81e5992b-2f17-4e27-872c-739ffdeaa2a0.png" alt="elsie-rainee profile" class="crayons-avatar__image" width="288" height="288"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/elsie-rainee" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Elsie Rainee
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Elsie Rainee
                
                
              
              &lt;div id="story-author-preview-content-4904381" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/elsie-rainee" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3662727%2F81e5992b-2f17-4e27-872c-739ffdeaa2a0.png" class="crayons-avatar__image" alt="" width="288" height="288"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Elsie Rainee&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/wpwebinfotech" class="crayons-story__secondary fw-medium"&gt;WPWeb Infotech&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/wpwebinfotech/stop-hardcoding-your-google-gemini-api-key-heres-the-setup-i-use-for-every-project-3oh6" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 23&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/wpwebinfotech/stop-hardcoding-your-google-gemini-api-key-heres-the-setup-i-use-for-every-project-3oh6" id="article-link-4904381"&gt;
          Stop Hardcoding Your Google Gemini API Key. Here’s the Setup I Use for Every Project
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devdiscuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devdiscuss&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/wpwebinfotech/stop-hardcoding-your-google-gemini-api-key-heres-the-setup-i-use-for-every-project-3oh6#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>api</category>
      <category>gemini</category>
      <category>security</category>
    </item>
    <item>
      <title>Stop Hardcoding Your Google Gemini API Key. Here’s the Setup I Use for Every Project</title>
      <dc:creator>Elsie Rainee</dc:creator>
      <pubDate>Fri, 23 Oct 2026 09:46:07 +0000</pubDate>
      <link>https://dev.to/wpwebinfotech/stop-hardcoding-your-google-gemini-api-key-heres-the-setup-i-use-for-every-project-3oh6</link>
      <guid>https://dev.to/wpwebinfotech/stop-hardcoding-your-google-gemini-api-key-heres-the-setup-i-use-for-every-project-3oh6</guid>
      <description>&lt;p&gt;Most tutorials show you how to get a Google Gemini API key and then paste it straight into the code. That’s fine for a 30-second test. It’s a bad habit to carry into a real project.&lt;/p&gt;

&lt;p&gt;Here’s how to get a key, use it, and keep it from becoming a problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Get your Google Gemini API key.
&lt;/h2&gt;

&lt;p&gt;Create a key for free in Google AI Studio. Copy it once, then treat it like a password.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Put it in an environment variable.
&lt;/h2&gt;

&lt;p&gt;Name it &lt;code&gt;GEMINI_API_KEY&lt;/code&gt;. The official client libraries read that variable automatically, so you never have to touch the key in code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS / Linux&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-key-here"&lt;/span&gt;

&lt;span class="c"&gt;# Windows (PowerShell)&lt;/span&gt;
setx GEMINI_API_KEY &lt;span class="s2"&gt;"your-key-here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Make your first request
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="nt"&gt;-U&lt;/span&gt; google-genai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;

&lt;span class="c1"&gt;# Picks up GEMINI_API_KEY from the environment
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-2.5-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# swap for the current model in the docs
&lt;/span&gt;    &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Explain how AI works in a few words&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  JavaScript
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @google/genai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GoogleGenAI&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@google/genai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ai&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GoogleGenAI&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generateContent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// swap for the current model in the docs&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain how AI works in a few words&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No key appears anywhere in the code, which is the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Keep it out of Git
&lt;/h2&gt;

&lt;p&gt;Add this before your first commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.env
.env.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a key ever lands in a commit, deleting the file isn’t enough because it stays in your history. Revoke it and generate a new one.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Never ship it to the browser
&lt;/h2&gt;

&lt;p&gt;This is the mistake I see most. If your frontend calls Gemini directly, your key is visible to anyone who opens DevTools. Put a thin server in between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// server.js (Express)&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GoogleGenAI&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@google/genai&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ai&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GoogleGenAI&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/ask&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generateContent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gemini-2.5-flash&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your frontend calls &lt;code&gt;/api/ask&lt;/code&gt;. The key never leaves the server. Add rate limiting and auth to that endpoint too, or someone will burn through your quota using your own proxy.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. One key per environment
&lt;/h2&gt;

&lt;p&gt;Use separate keys for dev, staging, and production. If one leaks, you revoke one key instead of breaking everything. It also makes usage easier to track.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Key stored in an environment variable&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; in &lt;code&gt;.gitignore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;No key in frontend code&lt;/li&gt;
&lt;li&gt;Server-side proxy with rate limiting&lt;/li&gt;
&lt;li&gt;Separate keys per environment&lt;/li&gt;
&lt;li&gt;A rotation plan before you need one&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;A Google Gemini API key takes two minutes to create and a lot longer to clean up after it leaks. Set up the boring parts first.&lt;/p&gt;

&lt;p&gt;How do you manage your keys? Env files, a secrets manager, something else? Tell me in the comments.&lt;/p&gt;

</description>
      <category>api</category>
      <category>security</category>
      <category>devdiscuss</category>
      <category>discuss</category>
    </item>
    <item>
      <title>How to Design a Modern University Website That Engages Students</title>
      <dc:creator>Elsie Rainee</dc:creator>
      <pubDate>Thu, 22 Oct 2026 13:18:02 +0000</pubDate>
      <link>https://dev.to/elsie-rainee/how-to-design-a-modern-university-website-that-engages-students-4mje</link>
      <guid>https://dev.to/elsie-rainee/how-to-design-a-modern-university-website-that-engages-students-4mje</guid>
      <description>&lt;p&gt;A university website does more work than almost any other digital property. It has to convince a 17-year-old to apply, help a current student find an exam timetable at 11 p.m., and give parents enough confidence to support the decision. When the site fails at any of these, students don’t complain. They leave.&lt;/p&gt;

&lt;p&gt;Good &lt;a href="https://wpwebinfotech.com/web-design/education/" rel="noopener noreferrer"&gt;academic website design&lt;/a&gt; starts with a simple idea: build for the tasks students are trying to finish, not for the way your institution is organized internally. Here is how to do that.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Students Expect From Academic Website Design Today
&lt;/h2&gt;

&lt;p&gt;Students arrive with habits formed by apps and consumer websites. They expect fast load times, clear search, and pages that work on a phone without pinching and zooming.&lt;/p&gt;

&lt;p&gt;They also arrive with specific questions. Prospective students want to know what they can study, what it costs, whether they can get in, and what life on campus is like. Current students want deadlines, portals, and support. If your homepage tries to serve everyone equally, it usually serves no one well.&lt;/p&gt;

&lt;p&gt;A useful first step is to list your top five audiences and the three most common tasks for each. That list should drive every design decision that follows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Navigation Around Tasks, Not Departments
&lt;/h2&gt;

&lt;p&gt;Most university menus mirror the org chart: Schools, Divisions, Offices, Centers. Students don’t think that way. They think in terms of “Apply,” “Courses,” “Fees,” “Housing,” and “Student Support.”&lt;/p&gt;

&lt;p&gt;A few practical rules help here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep the main menu to six or seven clear labels, written in plain language.&lt;/li&gt;
&lt;li&gt;Avoid internal jargon. A student may not know what the “Bursar” or “Registrar” does.&lt;/li&gt;
&lt;li&gt;Put admissions and program search within one click of the homepage.&lt;/li&gt;
&lt;li&gt;Offer a prominent search bar that handles typos and shows suggested results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test your labels with real students. If three of five people hesitate over a menu item, rename it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make Mobile the Default Experience
&lt;/h2&gt;

&lt;p&gt;For many students, a phone is the first and sometimes the only screen they use to research a university. Designing for desktop and then shrinking the layout rarely works.&lt;/p&gt;

&lt;p&gt;Start with the mobile layout and expand upward. Use large tap targets, short forms, and collapsible sections for long content like course lists. Application forms deserve special attention. Every extra field costs you completions, so ask only for what you truly need at the first stage.&lt;/p&gt;

&lt;p&gt;Speed matters just as much. Compress images, avoid autoplay video on the homepage, and test on a mid-range phone with an average connection, not on the fastest device in your office.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give Program and Faculty Pages Real Depth
&lt;/h2&gt;

&lt;p&gt;Program pages are where decisions get made. A thin page with a title and a paragraph of marketing copy won’t help anyone. Strong program pages answer the questions students ask before they apply:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What will I learn, and what do graduates go on to do?&lt;/li&gt;
&lt;li&gt;What are the entry requirements and deadlines?&lt;/li&gt;
&lt;li&gt;What does it cost, and what funding is available?&lt;/li&gt;
&lt;li&gt;Who will teach me?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last question matters more than many teams expect. User research with prospective students, from high schoolers to PhD applicants, showed that they scrutinize faculty pages because they want to know the professors they will learn from, as shown in &lt;a href="https://www.nngroup.com/videos/university-faculty-pages/" rel="noopener noreferrer"&gt;Nielsen Norman Group’s research on faculty pages&lt;/a&gt;. Pages with a clear photo, short bio, research interests, and a way to get in touch build trust far faster than a bare name and email address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Show Campus Life With Real Visuals and Student Voices
&lt;/h2&gt;

&lt;p&gt;Students use your website to work out whether they will fit in. Stock photos of smiling strangers don’t help them do that. Real photos of your actual labs, dining halls, and study spaces do.&lt;/p&gt;

&lt;p&gt;Short student-led videos, day-in-the-life posts, and honest Q&amp;amp;A sections tend to perform better than polished brand films. Keep captions and transcripts available so the content works with sound off and for students who rely on assistive technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat Accessibility and Performance as Baseline Requirements
&lt;/h2&gt;

&lt;p&gt;Accessibility is not an extra feature. Students with disabilities are part of your audience, and many accessibility improvements help everyone. Make sure your site has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sufficient color contrast and readable font sizes&lt;/li&gt;
&lt;li&gt;Full keyboard navigation&lt;/li&gt;
&lt;li&gt;Descriptive alt text on meaningful images&lt;/li&gt;
&lt;li&gt;Properly structured headings that screen readers can follow&lt;/li&gt;
&lt;li&gt;Captions on all video content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run regular audits with automated tools, then back them up with manual testing, since automated checks catch only part of the issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Descriptive Analytics to See What Students Actually Do
&lt;/h2&gt;

&lt;p&gt;Design opinions are easy to find on any university committee. Evidence is harder, and this is where &lt;a href="https://www.sganalytics.com/blog/what-is-descriptive-analytics" rel="noopener noreferrer"&gt;descriptive analytics&lt;/a&gt; earns its place.&lt;/p&gt;

&lt;p&gt;Descriptive analytics is the practice of summarizing past data to understand what has already happened. It doesn’t predict the future or explain every cause. It gives you a clear, factual picture of how students use your site, which is exactly what a redesign needs as a starting point.&lt;/p&gt;

&lt;p&gt;Here are the data points worth reviewing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Top landing pages and exit pages:&lt;/strong&gt; Where do students enter, and where do they leave?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device split:&lt;/strong&gt; What share of visits come from mobile, and how do their behaviors differ from desktop users?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal search terms:&lt;/strong&gt; What are students typing into your search bar? Repeated searches for something usually mean it’s hard to find through the menu.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scroll depth and click patterns:&lt;/strong&gt; Do students reach the entry requirements section on a program page, or do they stop at the top?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application funnel drop-off:&lt;/strong&gt; At which step do people abandon the form?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traffic by source:&lt;/strong&gt; Do students arriving from search behave differently from those arriving from social media or email?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simple example: suppose your analytics show that most visitors to a nursing program page leave before reaching the tuition section, and internal search shows “nursing fees” as a frequent query. That points to a clear fix. Move cost information higher on the page and link to it from the menu.&lt;/p&gt;

&lt;p&gt;Review these numbers monthly, and compare periods around key moments such as application deadlines and open days. Pair the numbers with a few short user interviews or surveys. Analytics tells you what students did. Conversations tell you why.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Practical Checklist for Your Next Redesign
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Define your key audiences and their top tasks.&lt;/li&gt;
&lt;li&gt;Audit existing content and remove outdated pages.&lt;/li&gt;
&lt;li&gt;Rewrite menu labels in plain language.&lt;/li&gt;
&lt;li&gt;Design mobile layouts first.&lt;/li&gt;
&lt;li&gt;Rebuild program and faculty pages around student questions.&lt;/li&gt;
&lt;li&gt;Replace stock imagery with real campus and student content.&lt;/li&gt;
&lt;li&gt;Test accessibility and page speed before launch.&lt;/li&gt;
&lt;li&gt;Set up descriptive analytics dashboards and review them on a fixed schedule.&lt;/li&gt;
&lt;li&gt;Keep improving after launch based on what the data shows.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;1.What makes a good university website?&lt;br&gt;
A good university website helps visitors complete their tasks quickly. That means clear navigation, detailed program pages, fast mobile performance, accessible design, and up-to-date information.&lt;/p&gt;

&lt;p&gt;2.How often should a university redesign its website?&lt;br&gt;
Rather than a full redesign every few years, many institutions do better with continuous improvement guided by analytics and user feedback, with a larger overhaul only when the structure no longer fits student needs.&lt;/p&gt;

&lt;p&gt;3.How does descriptive analytics help academic website design?&lt;br&gt;
It shows what students have actually done on your site, such as which pages they visit, where they leave, and what they search for. That gives design teams factual starting points instead of assumptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The best academic website design comes from understanding students first and the institution’s structure second. Build around real tasks, give program and faculty pages the depth students look for, make mobile the primary experience, and use descriptive analytics to keep checking your assumptions against real behavior. A website built this way stays useful long after launch.&lt;/p&gt;

</description>
      <category>web</category>
      <category>design</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Shopify and QuickBooks can work perfectly until a refund throws everything off. Discover the common reconciliation challenges and how to keep your accounting accurate as your store grows. 🛍️</title>
      <dc:creator>Elsie Rainee</dc:creator>
      <pubDate>Thu, 22 Oct 2026 08:09:52 +0000</pubDate>
      <link>https://dev.to/elsie-rainee/shopify-and-quickbooks-can-work-perfectly-until-a-refund-throws-everything-off-discover-the-common-ckj</link>
      <guid>https://dev.to/elsie-rainee/shopify-and-quickbooks-can-work-perfectly-until-a-refund-throws-everything-off-discover-the-common-ckj</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/wpwebinfotech/our-shopify-quickbooks-integration-balanced-perfectly-until-the-first-refund-hit-59of" class="crayons-story__hidden-navigation-link"&gt;Our Shopify QuickBooks Integration Balanced Perfectly Until the First Refund Hit&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/wpwebinfotech"&gt;
            &lt;img alt="WPWeb Infotech logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F14426%2F32335932-3225-4d21-ba3d-648400eade65.png" class="crayons-logo__image" width="273" height="251"&gt;
          &lt;/a&gt;

          &lt;a href="/elsie-rainee" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3662727%2F81e5992b-2f17-4e27-872c-739ffdeaa2a0.png" alt="elsie-rainee profile" class="crayons-avatar__image" width="288" height="288"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/elsie-rainee" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Elsie Rainee
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Elsie Rainee
                
                
              
              &lt;div id="story-author-preview-content-4894961" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/elsie-rainee" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3662727%2F81e5992b-2f17-4e27-872c-739ffdeaa2a0.png" class="crayons-avatar__image" alt="" width="288" height="288"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Elsie Rainee&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/wpwebinfotech" class="crayons-story__secondary fw-medium"&gt;WPWeb Infotech&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/wpwebinfotech/our-shopify-quickbooks-integration-balanced-perfectly-until-the-first-refund-hit-59of" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 22&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/wpwebinfotech/our-shopify-quickbooks-integration-balanced-perfectly-until-the-first-refund-hit-59of" id="article-link-4894961"&gt;
          Our Shopify QuickBooks Integration Balanced Perfectly Until the First Refund Hit
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devdiscuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devdiscuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/shopify"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;shopify&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/quickbooks"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;quickbooks&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/wpwebinfotech/our-shopify-quickbooks-integration-balanced-perfectly-until-the-first-refund-hit-59of#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            9 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Refunds are often where Shopify and QuickBooks integrations get complicated. Great point about testing these edge cases early, because catching them before they affect financial records can save a lot of cleanup later!</title>
      <dc:creator>Elsie Rainee</dc:creator>
      <pubDate>Thu, 22 Oct 2026 08:09:24 +0000</pubDate>
      <link>https://dev.to/elsie-rainee/refunds-are-often-where-shopify-and-quickbooks-integrations-get-complicated-great-point-about-4l8d</link>
      <guid>https://dev.to/elsie-rainee/refunds-are-often-where-shopify-and-quickbooks-integrations-get-complicated-great-point-about-4l8d</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/wpwebinfotech/our-shopify-quickbooks-integration-balanced-perfectly-until-the-first-refund-hit-59of" class="crayons-story__hidden-navigation-link"&gt;Our Shopify QuickBooks Integration Balanced Perfectly Until the First Refund Hit&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/wpwebinfotech"&gt;
            &lt;img alt="WPWeb Infotech logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F14426%2F32335932-3225-4d21-ba3d-648400eade65.png" class="crayons-logo__image" width="273" height="251"&gt;
          &lt;/a&gt;

          &lt;a href="/elsie-rainee" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3662727%2F81e5992b-2f17-4e27-872c-739ffdeaa2a0.png" alt="elsie-rainee profile" class="crayons-avatar__image" width="288" height="288"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/elsie-rainee" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Elsie Rainee
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Elsie Rainee
                
                
              
              &lt;div id="story-author-preview-content-4894961" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/elsie-rainee" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3662727%2F81e5992b-2f17-4e27-872c-739ffdeaa2a0.png" class="crayons-avatar__image" alt="" width="288" height="288"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Elsie Rainee&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/wpwebinfotech" class="crayons-story__secondary fw-medium"&gt;WPWeb Infotech&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/wpwebinfotech/our-shopify-quickbooks-integration-balanced-perfectly-until-the-first-refund-hit-59of" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 22&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/wpwebinfotech/our-shopify-quickbooks-integration-balanced-perfectly-until-the-first-refund-hit-59of" id="article-link-4894961"&gt;
          Our Shopify QuickBooks Integration Balanced Perfectly Until the First Refund Hit
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devdiscuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devdiscuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/shopify"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;shopify&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/quickbooks"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;quickbooks&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/wpwebinfotech/our-shopify-quickbooks-integration-balanced-perfectly-until-the-first-refund-hit-59of#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            9 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>api</category>
      <category>backend</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
